@codeworksh/aikit 0.11.0 → 0.12.0-canary.50.1.g9fe7a616
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/cli.mjs +3 -3
- package/{copilot-JLgwmznn.mjs → copilot-DvUXC6Kx.mjs} +2 -2
- package/{copilot-JLgwmznn.mjs.map → copilot-DvUXC6Kx.mjs.map} +1 -1
- package/{copilot-headers-BvQ3FFn-.mjs → copilot-headers-BLnBaJyp.mjs} +2 -2
- package/{copilot-headers-BvQ3FFn-.mjs.map → copilot-headers-BLnBaJyp.mjs.map} +1 -1
- package/{github-copilot-C7oJ2Tfp.mjs → github-copilot-BcmOr0jd.mjs} +2 -2
- package/{github-copilot-C7oJ2Tfp.mjs.map → github-copilot-BcmOr0jd.mjs.map} +1 -1
- package/github-copilot-llyP2NK4.mjs +3 -0
- package/index.d.mts +3 -3
- package/index.mjs +5 -5
- package/index.mjs.map +1 -1
- package/model-Cjp-Dr8V.mjs +13955 -0
- package/model-Cjp-Dr8V.mjs.map +1 -0
- package/{model-DCfjY0fS.d.mts → model-D3wc9-u4.d.mts} +42 -19
- package/modelgen-DXMmI80T.mjs +731 -0
- package/modelgen-DXMmI80T.mjs.map +1 -0
- package/modelgen.d.mts +20 -3
- package/modelgen.mjs +61 -2
- package/modelgen.mjs.map +1 -0
- package/oauth/github/copilot.mjs +1 -1
- package/{openai-codex-Dj0oh0UV.mjs → openai-codex-C1Yb02kM.mjs} +2 -2
- package/{openai-codex-Dj0oh0UV.mjs.map → openai-codex-C1Yb02kM.mjs.map} +1 -1
- package/openai-codex-CHxShIN3.mjs +2 -0
- package/package.json +10 -10
- package/{registry-CfGgGfSs.mjs → registry-u49t0S4S.mjs} +4 -4
- package/{registry-CfGgGfSs.mjs.map → registry-u49t0S4S.mjs.map} +1 -1
- package/github-copilot-CLJx-bcP.mjs +0 -3
- package/model-D-FoGzVN.mjs +0 -522
- package/model-D-FoGzVN.mjs.map +0 -1
- package/modelgen-D6UBM1fq.mjs +0 -561
- package/modelgen-D6UBM1fq.mjs.map +0 -1
- package/openai-codex-CIBVNhQx.mjs +0 -2
package/cli.mjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { r as OpenAICodexOAuthClient, t as JsonOpenAICodexAuthStorage } from "./codex-CLDBTrFm.mjs";
|
|
3
|
-
import { t as ModelgenCommand } from "./modelgen-
|
|
4
|
-
import { i as JsonGitHubCopilotAuthStorage, r as GitHubCopilotOAuthClient } from "./copilot-
|
|
3
|
+
import { t as ModelgenCommand } from "./modelgen-DXMmI80T.mjs";
|
|
4
|
+
import { i as JsonGitHubCopilotAuthStorage, r as GitHubCopilotOAuthClient } from "./copilot-DvUXC6Kx.mjs";
|
|
5
5
|
import { n as promptLine, t as openBrowser } from "./interactive-eoNnscGB.mjs";
|
|
6
6
|
import { a as oauthNotice, c as summarizeGitHubCopilot, i as oauthLoginIssue, l as summarizeOpenAICodex, n as checkOAuthProvider, r as formatOAuthSummary, s as oauthRefreshIssue } from "./summary-C_QyCVWa.mjs";
|
|
7
7
|
import yargs from "yargs";
|
|
8
8
|
import { hideBin } from "yargs/helpers";
|
|
9
9
|
//#region package.json
|
|
10
|
-
var version = "0.
|
|
10
|
+
var version = "0.12.0-canary.50.1.g9fe7a616";
|
|
11
11
|
//#endregion
|
|
12
12
|
//#region src/cli/oauth.ts
|
|
13
13
|
async function runOpenAICodexAuth(args) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as pollDeviceCode, n as isObject, r as readEnv, t as JsonAuthStorage } from "./storage-v6qjTQ0v.mjs";
|
|
2
|
-
import { n as GITHUB_COPILOT_STATIC_HEADERS, t as GITHUB_COPILOT_API_VERSION } from "./copilot-headers-
|
|
2
|
+
import { n as GITHUB_COPILOT_STATIC_HEADERS, t as GITHUB_COPILOT_API_VERSION } from "./copilot-headers-BLnBaJyp.mjs";
|
|
3
3
|
//#region src/oauth/github/copilot.ts
|
|
4
4
|
/**
|
|
5
5
|
* GitHub Copilot OAuth.
|
|
@@ -422,4 +422,4 @@ async function getGitHubCopilotApiKey(options = {}) {
|
|
|
422
422
|
//#endregion
|
|
423
423
|
export { createGitHubCopilotDeviceFlow as a, fetchGitHubCopilotUser as c, gitHubCopilotBaseUrl as d, gitHubCopilotEntitlementError as f, pollGitHubCopilotDeviceToken as h, JsonGitHubCopilotAuthStorage as i, getGitHubCopilotApiKey as l, normalizeGitHubDomain as m, GITHUB_COPILOT_PROVIDER_ID as n, enableGitHubCopilotModels as o, gitHubCopilotHeaders as p, GitHubCopilotOAuthClient as r, fetchGitHubCopilotModels as s, GITHUB_COPILOT_API_KEY_ENV as t, gitHubApiDomain as u };
|
|
424
424
|
|
|
425
|
-
//# sourceMappingURL=copilot-
|
|
425
|
+
//# sourceMappingURL=copilot-DvUXC6Kx.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-JLgwmznn.mjs","names":[],"sources":["../../src/oauth/github/copilot.ts"],"sourcesContent":["/**\n * GitHub Copilot OAuth.\n *\n * The device flow yields a plain GitHub OAuth token (`ghu_`/`gho_`), which the\n * Copilot API accepts directly as a Bearer credential — no session-token\n * exchange and no refresh path. `getGitHubCopilotApiKey` resolves a token from\n * `COPILOT_GITHUB_TOKEN` or the codework auth.json store, and nothing else;\n * `GitHubCopilotOAuthClient#login` performs the device flow.\n */\n\nimport {\n\tGITHUB_COPILOT_API_VERSION,\n\tGITHUB_COPILOT_STATIC_HEADERS,\n} from \"../../providers/github-copilot/copilot-headers.ts\";\nimport { pollDeviceCode } from \"../devcode.ts\";\nimport { JsonAuthStorage, isObject, readEnv } from \"../storage.ts\";\n\nexport const GITHUB_COPILOT_API_KEY_ENV = \"COPILOT_GITHUB_TOKEN\";\n\n// The official GitHub Copilot OAuth client id — the same one copilot.vim,\n// copilot.lua, and pi use, so the consent screen shows \"GitHub Copilot\".\nconst CLIENT_ID = \"Iv1.b507a08c87ecfe98\";\nconst SCOPE = \"read:user\";\nconst DEFAULT_DOMAIN = \"github.com\";\nconst DEFAULT_BASE_URL = \"https://api.githubcopilot.com\";\nconst USER_API_VERSION = \"2025-04-01\";\nconst DEFAULT_PROVIDER_ID = \"github-copilot\";\nexport const GITHUB_COPILOT_PROVIDER_ID = DEFAULT_PROVIDER_ID;\nconst DEFAULT_MODELS_RETRY = { maxRetries: 2, maxElapsedMs: 5000 };\n\nexport type GitHubCopilotOAuthCredentials = {\n\t/** GitHub OAuth token (`ghu_`/`gho_`), used directly as the Copilot Bearer credential. */\n\taccess: string;\n\t/** Same token; kept for shape parity with other OAuth credentials. */\n\trefresh: string;\n\t/** Always 0 — GitHub OAuth tokens do not expire; re-login only on persistent 401. */\n\texpires: number;\n\tenterpriseUrl?: string;\n\t/** `endpoints.api` from `/copilot_internal/user` — the plan-specific Copilot API host. */\n\tapiEndpoint?: string;\n\t/** Model ids visible to the account at login time, from `GET {base}/models`. */\n\tavailableModelIds?: string[];\n};\n\nexport type GitHubCopilotDeviceFlow = {\n\tdeviceCode: string;\n\tuserCode: string;\n\tverificationUri: string;\n\tintervalSeconds: number;\n\texpiresInSeconds?: number;\n};\n\nexport type GitHubCopilotUser = {\n\tchatEnabled?: boolean;\n\tcanSignupForLimited?: boolean;\n\tapiEndpoint?: string;\n};\n\nexport type GitHubCopilotRemoteModel = {\n\tid: string;\n\tsupportedEndpoints: string[];\n\tpolicyState?: string;\n\tpickerEnabled: boolean;\n\ttoolCalls: boolean;\n};\n\nexport type GitHubCopilotLoginOptions = {\n\tenterpriseUrl?: string | undefined;\n\t/** Enable `policy.state === \"unconfigured\"` catalog models after login. Off by default — it writes account policy. */\n\tenableModels?: boolean | undefined;\n\tsignal?: AbortSignal | undefined;\n\tfetch?: typeof globalThis.fetch | undefined;\n\tonAuth: (info: { url: string; userCode: string; instructions?: string | undefined }) => void;\n\tonProgress?: ((message: string) => void) | undefined;\n};\n\nexport interface GitHubCopilotAuthStorage {\n\tget(): Promise<GitHubCopilotOAuthCredentials | undefined>;\n\tset(credentials: GitHubCopilotOAuthCredentials): Promise<void>;\n\tclear(): Promise<void>;\n}\n\nexport type JsonGitHubCopilotAuthStorageOptions = {\n\tpath?: string;\n\tproviderId?: string;\n};\n\ntype FetchLike = typeof globalThis.fetch;\n\nfunction fetchWith(options: { fetch?: FetchLike | undefined }): FetchLike {\n\treturn options.fetch ?? globalThis.fetch;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"GitHub Copilot login cancelled\"));\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(new Error(\"GitHub Copilot login cancelled\"));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nexport function normalizeGitHubDomain(input: string | undefined): string | undefined {\n\tconst trimmed = input?.trim();\n\tif (!trimmed) return undefined;\n\ttry {\n\t\tconst url = trimmed.includes(\"://\") ? new URL(trimmed) : new URL(`https://${trimmed}`);\n\t\treturn url.hostname;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** The `api.` host serving `copilot_internal/*` for a given GitHub domain. */\nexport function gitHubApiDomain(domain: string): string {\n\treturn domain === DEFAULT_DOMAIN ? \"api.github.com\" : `api.${domain}`;\n}\n\n/** The Copilot inference host for a credential or enterprise domain. */\nexport function gitHubCopilotBaseUrl(options?: {\n\tenterpriseUrl?: string | undefined;\n\tapiEndpoint?: string | undefined;\n}): string {\n\tconst apiEndpoint = options?.apiEndpoint;\n\tif (typeof apiEndpoint === \"string\" && apiEndpoint) return apiEndpoint.replace(/\\/+$/, \"\");\n\tconst domain = normalizeGitHubDomain(options?.enterpriseUrl);\n\treturn domain ? `https://copilot-api.${domain}` : DEFAULT_BASE_URL;\n}\n\n/**\n * GitHub reports Copilot access on `/copilot_internal/user`; OAuth itself\n * succeeds for any GitHub account, so this is the only signal that the account\n * can chat.\n */\nexport function gitHubCopilotEntitlementError(user: {\n\tchat_enabled?: boolean | undefined;\n\tcan_signup_for_limited?: boolean | undefined;\n}): string | undefined {\n\tif (user.chat_enabled !== false) return undefined;\n\tif (user.can_signup_for_limited) {\n\t\treturn \"This GitHub account is not signed up for GitHub Copilot. Sign up for Copilot Free at https://github.com/features/copilot/plans and connect again.\";\n\t}\n\treturn \"This GitHub account does not have GitHub Copilot access. It needs an active Copilot subscription or a seat assigned by an organization.\";\n}\n\nexport async function createGitHubCopilotDeviceFlow(\n\toptions: { domain?: string | undefined; fetch?: FetchLike | undefined; signal?: AbortSignal | undefined } = {},\n): Promise<GitHubCopilotDeviceFlow> {\n\tconst domain = options.domain ?? DEFAULT_DOMAIN;\n\tconst response = await fetchWith(options)(`https://${domain}/login/device/code`, {\n\t\tmethod: \"POST\",\n\t\theaders: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n\t\tbody: JSON.stringify({ client_id: CLIENT_ID, scope: SCOPE }),\n\t\tsignal: options.signal ?? null,\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(`GitHub device code request failed (${response.status})`);\n\t}\n\n\tconst data: unknown = await response.json();\n\tif (!isObject(data)) throw new Error(\"Invalid GitHub device code response\");\n\tconst { device_code, user_code, verification_uri, interval, expires_in } = data;\n\tif (\n\t\ttypeof device_code !== \"string\" ||\n\t\ttypeof user_code !== \"string\" ||\n\t\ttypeof verification_uri !== \"string\" ||\n\t\t(interval !== undefined && typeof interval !== \"number\") ||\n\t\t(expires_in !== undefined && typeof expires_in !== \"number\")\n\t) {\n\t\tthrow new Error(\"Invalid GitHub device code response fields\");\n\t}\n\n\t// The verification URI is opened in the user's browser; force it to be a URL\n\t// so `open` cannot be tricked into launching something else.\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(verification_uri);\n\t} catch {\n\t\tthrow new Error(\"Untrusted verification_uri in GitHub device code response\");\n\t}\n\tif (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n\t\tthrow new Error(\"Untrusted verification_uri in GitHub device code response\");\n\t}\n\n\treturn {\n\t\tdeviceCode: device_code,\n\t\tuserCode: user_code,\n\t\tverificationUri: parsed.href,\n\t\tintervalSeconds: typeof interval === \"number\" && interval > 0 ? interval : 5,\n\t\t...(typeof expires_in === \"number\" && { expiresInSeconds: expires_in }),\n\t};\n}\n\nexport async function pollGitHubCopilotDeviceToken(\n\tflow: GitHubCopilotDeviceFlow,\n\toptions: { domain?: string | undefined; fetch?: FetchLike | undefined; signal?: AbortSignal | undefined } = {},\n): Promise<string> {\n\tconst domain = options.domain ?? DEFAULT_DOMAIN;\n\tconst send = fetchWith(options);\n\n\treturn pollDeviceCode<string>({\n\t\tintervalSeconds: flow.intervalSeconds,\n\t\t...(flow.expiresInSeconds !== undefined && { expiresInSeconds: flow.expiresInSeconds }),\n\t\twaitBeforeFirstPoll: true,\n\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\tpoll: async () => {\n\t\t\tconst response = await send(`https://${domain}/login/oauth/access_token`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\t\tdevice_code: flow.deviceCode,\n\t\t\t\t\tgrant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n\t\t\t\t}),\n\t\t\t\tsignal: options.signal ?? null,\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\treturn { status: \"failed\", message: `GitHub device token poll failed (${response.status})` };\n\t\t\t}\n\n\t\t\tconst data: unknown = await response.json();\n\t\t\tif (!isObject(data)) return { status: \"failed\", message: \"Invalid GitHub device token response\" };\n\n\t\t\tif (typeof data.access_token === \"string\" && data.access_token) {\n\t\t\t\treturn { status: \"complete\", value: data.access_token };\n\t\t\t}\n\n\t\t\tconst error = typeof data.error === \"string\" ? data.error : undefined;\n\t\t\tif (error === \"authorization_pending\") return { status: \"pending\" };\n\t\t\tif (error === \"slow_down\") {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"slow_down\",\n\t\t\t\t\t...(typeof data.interval === \"number\" && data.interval > 0 && { intervalSeconds: data.interval }),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst description = typeof data.error_description === \"string\" ? `: ${data.error_description}` : \"\";\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tmessage: `GitHub device authorization failed: ${error ?? \"unknown error\"}${description}`,\n\t\t\t};\n\t\t},\n\t});\n}\n\n/**\n * Look up the account's Copilot entitlement and per-plan API endpoint.\n *\n * A failed or malformed lookup returns `undefined` rather than denying login —\n * only an explicit `chat_enabled: false` answer blocks.\n */\nexport async function fetchGitHubCopilotUser(\n\ttoken: string,\n\toptions: { domain?: string | undefined; fetch?: FetchLike | undefined; signal?: AbortSignal | undefined } = {},\n): Promise<GitHubCopilotUser | undefined> {\n\tconst domain = options.domain ?? DEFAULT_DOMAIN;\n\ttry {\n\t\tconst response = await fetchWith(options)(`https://${gitHubApiDomain(domain)}/copilot_internal/user`, {\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t\"User-Agent\": GITHUB_COPILOT_STATIC_HEADERS[\"User-Agent\"],\n\t\t\t\t\"X-GitHub-Api-Version\": USER_API_VERSION,\n\t\t\t},\n\t\t\tsignal: options.signal ?? null,\n\t\t});\n\t\tif (!response.ok) return undefined;\n\t\tconst data: unknown = await response.json();\n\t\tif (!isObject(data)) return undefined;\n\t\tconst endpoints = isObject(data.endpoints) ? data.endpoints : undefined;\n\t\treturn {\n\t\t\t...(typeof data.chat_enabled === \"boolean\" && { chatEnabled: data.chat_enabled }),\n\t\t\t...(typeof data.can_signup_for_limited === \"boolean\" && { canSignupForLimited: data.can_signup_for_limited }),\n\t\t\t...(typeof endpoints?.api === \"string\" && endpoints.api && { apiEndpoint: endpoints.api.replace(/\\/+$/, \"\") }),\n\t\t};\n\t} catch (error) {\n\t\tif (options.signal?.aborted) throw error;\n\t\treturn undefined;\n\t}\n}\n\nasync function fetchWithRateLimitRetry(\n\tsend: FetchLike,\n\turl: string,\n\tinit: RequestInit,\n\toptions: { signal?: AbortSignal; maxRetries: number; maxElapsedMs: number },\n): Promise<Response> {\n\tconst deadline = Date.now() + options.maxElapsedMs;\n\tfor (let retry = 0; ; retry++) {\n\t\tconst response = await send(url, { ...init, signal: options.signal ?? null });\n\t\tif (response.status !== 429 || retry >= options.maxRetries) return response;\n\n\t\tconst retryAfter = response.headers.get(\"retry-after\");\n\t\tlet delayMs = 500 * 2 ** retry;\n\t\tif (retryAfter) {\n\t\t\tconst seconds = Number.parseFloat(retryAfter);\n\t\t\tdelayMs = Number.isNaN(seconds) ? Date.parse(retryAfter) - Date.now() : seconds * 1000;\n\t\t\tif (!Number.isFinite(delayMs)) return response;\n\t\t}\n\t\tdelayMs = Math.max(0, delayMs);\n\t\tif (delayMs >= deadline - Date.now()) return response;\n\t\tawait response.body?.cancel();\n\t\tawait sleep(delayMs, options.signal);\n\t}\n}\n\n/**\n * The account-visible Copilot model catalog. `GET {base}/models` is the ground\n * truth for endpoint routing (`supported_endpoints`) and enablement (`policy`,\n * `model_picker_enabled`) — models.dev has no equivalent data.\n */\nexport async function fetchGitHubCopilotModels(\n\ttoken: string,\n\toptions: {\n\t\tbaseURL?: string | undefined;\n\t\tdomain?: string | undefined;\n\t\tfetch?: FetchLike | undefined;\n\t\tsignal?: AbortSignal | undefined;\n\t\tmaxRetries?: number | undefined;\n\t\tmaxElapsedMs?: number | undefined;\n\t} = {},\n): Promise<GitHubCopilotRemoteModel[]> {\n\tconst baseURL = options.baseURL ?? gitHubCopilotBaseUrl({ enterpriseUrl: options.domain });\n\tconst response = await fetchWithRateLimitRetry(\n\t\tfetchWith(options),\n\t\t`${baseURL}/models`,\n\t\t{\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t...GITHUB_COPILOT_STATIC_HEADERS,\n\t\t\t\t\"X-GitHub-Api-Version\": GITHUB_COPILOT_API_VERSION,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t\tmaxRetries: options.maxRetries ?? DEFAULT_MODELS_RETRY.maxRetries,\n\t\t\tmaxElapsedMs: options.maxElapsedMs ?? DEFAULT_MODELS_RETRY.maxElapsedMs,\n\t\t},\n\t);\n\tif (!response.ok) {\n\t\tthrow new Error(`GitHub Copilot models request failed (${response.status})`);\n\t}\n\n\tconst data: unknown = await response.json();\n\tconst list = isObject(data) ? data.data : undefined;\n\tif (!Array.isArray(list)) throw new Error(\"Invalid GitHub Copilot models response\");\n\n\treturn list.flatMap((raw) => {\n\t\tif (!isObject(raw) || typeof raw.id !== \"string\") return [];\n\t\tconst capabilities = isObject(raw.capabilities) ? raw.capabilities : undefined;\n\t\tconst supports = isObject(capabilities?.supports) ? capabilities.supports : undefined;\n\t\tconst policy = isObject(raw.policy) ? raw.policy : undefined;\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: raw.id,\n\t\t\t\tsupportedEndpoints: Array.isArray(raw.supported_endpoints)\n\t\t\t\t\t? raw.supported_endpoints.filter((entry): entry is string => typeof entry === \"string\")\n\t\t\t\t\t: [],\n\t\t\t\t...(typeof policy?.state === \"string\" && { policyState: policy.state }),\n\t\t\t\tpickerEnabled: raw.model_picker_enabled === true,\n\t\t\t\ttoolCalls: supports?.tool_calls !== false,\n\t\t\t},\n\t\t];\n\t});\n}\n\n/**\n * Enable models the account has not configured yet (`policy.state ===\n * \"unconfigured\"`). Best effort per model; a rate limit that outlives the\n * retry budget stops the batch.\n */\nexport async function enableGitHubCopilotModels(\n\ttoken: string,\n\tmodelIds: readonly string[],\n\toptions: {\n\t\tbaseURL?: string | undefined;\n\t\tdomain?: string | undefined;\n\t\tfetch?: FetchLike | undefined;\n\t\tsignal?: AbortSignal | undefined;\n\t} = {},\n): Promise<string[]> {\n\tconst baseURL = options.baseURL ?? gitHubCopilotBaseUrl({ enterpriseUrl: options.domain });\n\tconst send = fetchWith(options);\n\tconst enabled: string[] = [];\n\tfor (const modelId of modelIds) {\n\t\ttry {\n\t\t\tconst response = await fetchWithRateLimitRetry(\n\t\t\t\tsend,\n\t\t\t\t`${baseURL}/models/${modelId}/policy`,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t\t\t...GITHUB_COPILOT_STATIC_HEADERS,\n\t\t\t\t\t\t\"openai-intent\": \"chat-policy\",\n\t\t\t\t\t\t\"x-interaction-type\": \"chat-policy\",\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ state: \"enabled\" }),\n\t\t\t\t},\n\t\t\t\t{ ...(options.signal !== undefined && { signal: options.signal }), maxRetries: 2, maxElapsedMs: 5000 },\n\t\t\t);\n\t\t\tif (response.status === 429) break;\n\t\t\tif (response.ok) enabled.push(modelId);\n\t\t} catch (error) {\n\t\t\tif (options.signal?.aborted) throw error;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn enabled;\n}\n\nfunction isGitHubCopilotCredentials(value: unknown): value is GitHubCopilotOAuthCredentials {\n\tif (!isObject(value)) return false;\n\treturn typeof value.access === \"string\" && typeof value.refresh === \"string\" && typeof value.expires === \"number\";\n}\n\nexport class JsonGitHubCopilotAuthStorage implements GitHubCopilotAuthStorage {\n\tprivate readonly storage: JsonAuthStorage<GitHubCopilotOAuthCredentials>;\n\n\tconstructor(options: JsonGitHubCopilotAuthStorageOptions = {}) {\n\t\tthis.storage = new JsonAuthStorage({\n\t\t\tproviderId: options.providerId ?? DEFAULT_PROVIDER_ID,\n\t\t\tisCredentials: isGitHubCopilotCredentials,\n\t\t\t...(options.path !== undefined && { path: options.path }),\n\t\t});\n\t}\n\n\tget path(): string {\n\t\treturn this.storage.path;\n\t}\n\n\tget providerId(): string {\n\t\treturn this.storage.providerId;\n\t}\n\n\tget(): Promise<GitHubCopilotOAuthCredentials | undefined> {\n\t\treturn this.storage.get();\n\t}\n\n\tset(credentials: GitHubCopilotOAuthCredentials): Promise<void> {\n\t\treturn this.storage.set(credentials);\n\t}\n\n\tclear(): Promise<void> {\n\t\treturn this.storage.clear();\n\t}\n}\n\nexport type GitHubCopilotOAuthClientOptions = {\n\tstorage?: GitHubCopilotAuthStorage;\n};\n\nexport class GitHubCopilotOAuthClient {\n\treadonly storage: GitHubCopilotAuthStorage;\n\n\tconstructor(options: GitHubCopilotOAuthClientOptions = {}) {\n\t\tthis.storage = options.storage ?? new JsonGitHubCopilotAuthStorage();\n\t}\n\n\tasync login(options: GitHubCopilotLoginOptions): Promise<GitHubCopilotOAuthCredentials> {\n\t\tconst enterpriseUrl = options.enterpriseUrl?.trim() || undefined;\n\t\tconst domain = normalizeGitHubDomain(enterpriseUrl) ?? DEFAULT_DOMAIN;\n\t\tif (enterpriseUrl && !normalizeGitHubDomain(enterpriseUrl)) {\n\t\t\tthrow new Error(\"Invalid GitHub Enterprise URL/domain\");\n\t\t}\n\n\t\tconst flow = await createGitHubCopilotDeviceFlow({ domain, fetch: options.fetch, signal: options.signal });\n\t\toptions.onAuth({\n\t\t\turl: flow.verificationUri,\n\t\t\tuserCode: flow.userCode,\n\t\t\tinstructions: \"Complete the GitHub device authorization to finish GitHub Copilot authentication.\",\n\t\t});\n\n\t\tconst access = await pollGitHubCopilotDeviceToken(flow, {\n\t\t\tdomain,\n\t\t\tfetch: options.fetch,\n\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t});\n\n\t\tconst user = await fetchGitHubCopilotUser(access, { domain, fetch: options.fetch, signal: options.signal });\n\t\tconst denied = user\n\t\t\t? gitHubCopilotEntitlementError({\n\t\t\t\t\tchat_enabled: user.chatEnabled,\n\t\t\t\t\tcan_signup_for_limited: user.canSignupForLimited,\n\t\t\t\t})\n\t\t\t: undefined;\n\t\tif (denied) throw new Error(denied);\n\n\t\tconst apiEndpoint =\n\t\t\tuser?.apiEndpoint ?? gitHubCopilotBaseUrl({ enterpriseUrl: domain === DEFAULT_DOMAIN ? undefined : domain });\n\n\t\toptions.onProgress?.(\"Fetching available Copilot models...\");\n\t\tlet availableModelIds: string[] | undefined;\n\t\tlet unconfigured: string[] = [];\n\t\ttry {\n\t\t\tconst models = await fetchGitHubCopilotModels(access, {\n\t\t\t\tbaseURL: apiEndpoint,\n\t\t\t\tfetch: options.fetch,\n\t\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t\t});\n\t\t\tconst usable = models.filter((model) => model.toolCalls && model.policyState !== \"disabled\");\n\t\t\tconst pickerIds = usable.filter((model) => model.pickerEnabled).map((model) => model.id);\n\t\t\t// Some Individual accounts report picker=false for every model despite\n\t\t\t// enabled policies; only that endpoint gets the policy fallback.\n\t\t\tconst host = new URL(apiEndpoint).hostname;\n\t\t\tconst policyFallback = pickerIds.length === 0 && host === \"api.individual.githubcopilot.com\";\n\t\t\tavailableModelIds = pickerIds.length\n\t\t\t\t? pickerIds\n\t\t\t\t: policyFallback\n\t\t\t\t\t? usable.filter((model) => model.policyState === \"enabled\").map((model) => model.id)\n\t\t\t\t\t: [];\n\t\t\tunconfigured = usable.filter((model) => model.policyState === \"unconfigured\").map((model) => model.id);\n\t\t} catch (error) {\n\t\t\tif (options.signal?.aborted) throw error;\n\t\t\toptions.onProgress?.(\"Could not fetch the Copilot model catalog; continuing without it.\");\n\t\t}\n\n\t\tif (options.enableModels && unconfigured.length > 0) {\n\t\t\toptions.onProgress?.(\"Enabling Copilot models...\");\n\t\t\tconst enabled = await enableGitHubCopilotModels(access, unconfigured, {\n\t\t\t\tbaseURL: apiEndpoint,\n\t\t\t\tfetch: options.fetch,\n\t\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t\t});\n\t\t\tavailableModelIds = [...new Set([...(availableModelIds ?? []), ...enabled])];\n\t\t}\n\n\t\tconst credentials: GitHubCopilotOAuthCredentials = {\n\t\t\taccess,\n\t\t\trefresh: access,\n\t\t\texpires: 0,\n\t\t\t...(domain !== DEFAULT_DOMAIN && { enterpriseUrl: domain }),\n\t\t\tapiEndpoint,\n\t\t\t...(availableModelIds !== undefined && availableModelIds.length > 0 && { availableModelIds }),\n\t\t};\n\t\tawait this.storage.set(credentials);\n\t\treturn credentials;\n\t}\n\n\t/** The stored `ghu_` token, returned as-is — it never expires. */\n\tasync getCredentials(): Promise<GitHubCopilotOAuthCredentials | undefined> {\n\t\treturn this.storage.get();\n\t}\n\n\tasync getApiKey(): Promise<string | undefined> {\n\t\treturn (await this.getCredentials())?.access;\n\t}\n\n\tasync getHeaders(): Promise<Record<string, string> | undefined> {\n\t\tconst credentials = await this.getCredentials();\n\t\treturn credentials ? gitHubCopilotHeaders(credentials) : undefined;\n\t}\n\n\tasync logout(): Promise<void> {\n\t\tawait this.storage.clear();\n\t}\n}\n\nexport function gitHubCopilotHeaders(credentials: GitHubCopilotOAuthCredentials): Record<string, string> {\n\treturn {\n\t\tAuthorization: `Bearer ${credentials.access}`,\n\t\t...GITHUB_COPILOT_STATIC_HEADERS,\n\t\t\"X-GitHub-Api-Version\": GITHUB_COPILOT_API_VERSION,\n\t};\n}\n\n/**\n * Resolve the GitHub Copilot API credential: `COPILOT_GITHUB_TOKEN` first, then\n * an explicit `auth --github-copilot` login from codework auth.json.\n *\n * Nothing else is consulted, by design. `GITHUB_TOKEN` and `GH_TOKEN` are\n * usually set for git or `gh` and carry no Copilot access — in GitHub Actions\n * `GITHUB_TOKEN` is a workflow token — so reading them turns a working login\n * into an unexplained 401. Credentials another application stored for itself\n * (an editor's Copilot sign-in) are not consulted either: a token codework was\n * never given should not silently become the identity its runs bill and act as.\n *\n * Returns undefined when nothing is available; the device flow only runs via\n * `GitHubCopilotOAuthClient#login`.\n */\nexport async function getGitHubCopilotApiKey(\n\toptions: GitHubCopilotOAuthClientOptions = {},\n): Promise<string | undefined> {\n\tconst dedicated = readEnv(GITHUB_COPILOT_API_KEY_ENV);\n\tif (dedicated) return dedicated;\n\n\treturn new GitHubCopilotOAuthClient(options).getApiKey();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"copilot-DvUXC6Kx.mjs","names":[],"sources":["../../src/oauth/github/copilot.ts"],"sourcesContent":["/**\n * GitHub Copilot OAuth.\n *\n * The device flow yields a plain GitHub OAuth token (`ghu_`/`gho_`), which the\n * Copilot API accepts directly as a Bearer credential — no session-token\n * exchange and no refresh path. `getGitHubCopilotApiKey` resolves a token from\n * `COPILOT_GITHUB_TOKEN` or the codework auth.json store, and nothing else;\n * `GitHubCopilotOAuthClient#login` performs the device flow.\n */\n\nimport {\n\tGITHUB_COPILOT_API_VERSION,\n\tGITHUB_COPILOT_STATIC_HEADERS,\n} from \"../../providers/github-copilot/copilot-headers.ts\";\nimport { pollDeviceCode } from \"../devcode.ts\";\nimport { JsonAuthStorage, isObject, readEnv } from \"../storage.ts\";\n\nexport const GITHUB_COPILOT_API_KEY_ENV = \"COPILOT_GITHUB_TOKEN\";\n\n// The official GitHub Copilot OAuth client id — the same one copilot.vim,\n// copilot.lua, and pi use, so the consent screen shows \"GitHub Copilot\".\nconst CLIENT_ID = \"Iv1.b507a08c87ecfe98\";\nconst SCOPE = \"read:user\";\nconst DEFAULT_DOMAIN = \"github.com\";\nconst DEFAULT_BASE_URL = \"https://api.githubcopilot.com\";\nconst USER_API_VERSION = \"2025-04-01\";\nconst DEFAULT_PROVIDER_ID = \"github-copilot\";\nexport const GITHUB_COPILOT_PROVIDER_ID = DEFAULT_PROVIDER_ID;\nconst DEFAULT_MODELS_RETRY = { maxRetries: 2, maxElapsedMs: 5000 };\n\nexport type GitHubCopilotOAuthCredentials = {\n\t/** GitHub OAuth token (`ghu_`/`gho_`), used directly as the Copilot Bearer credential. */\n\taccess: string;\n\t/** Same token; kept for shape parity with other OAuth credentials. */\n\trefresh: string;\n\t/** Always 0 — GitHub OAuth tokens do not expire; re-login only on persistent 401. */\n\texpires: number;\n\tenterpriseUrl?: string;\n\t/** `endpoints.api` from `/copilot_internal/user` — the plan-specific Copilot API host. */\n\tapiEndpoint?: string;\n\t/** Model ids visible to the account at login time, from `GET {base}/models`. */\n\tavailableModelIds?: string[];\n};\n\nexport type GitHubCopilotDeviceFlow = {\n\tdeviceCode: string;\n\tuserCode: string;\n\tverificationUri: string;\n\tintervalSeconds: number;\n\texpiresInSeconds?: number;\n};\n\nexport type GitHubCopilotUser = {\n\tchatEnabled?: boolean;\n\tcanSignupForLimited?: boolean;\n\tapiEndpoint?: string;\n};\n\nexport type GitHubCopilotRemoteModel = {\n\tid: string;\n\tsupportedEndpoints: string[];\n\tpolicyState?: string;\n\tpickerEnabled: boolean;\n\ttoolCalls: boolean;\n};\n\nexport type GitHubCopilotLoginOptions = {\n\tenterpriseUrl?: string | undefined;\n\t/** Enable `policy.state === \"unconfigured\"` catalog models after login. Off by default — it writes account policy. */\n\tenableModels?: boolean | undefined;\n\tsignal?: AbortSignal | undefined;\n\tfetch?: typeof globalThis.fetch | undefined;\n\tonAuth: (info: { url: string; userCode: string; instructions?: string | undefined }) => void;\n\tonProgress?: ((message: string) => void) | undefined;\n};\n\nexport interface GitHubCopilotAuthStorage {\n\tget(): Promise<GitHubCopilotOAuthCredentials | undefined>;\n\tset(credentials: GitHubCopilotOAuthCredentials): Promise<void>;\n\tclear(): Promise<void>;\n}\n\nexport type JsonGitHubCopilotAuthStorageOptions = {\n\tpath?: string;\n\tproviderId?: string;\n};\n\ntype FetchLike = typeof globalThis.fetch;\n\nfunction fetchWith(options: { fetch?: FetchLike | undefined }): FetchLike {\n\treturn options.fetch ?? globalThis.fetch;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"GitHub Copilot login cancelled\"));\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(new Error(\"GitHub Copilot login cancelled\"));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nexport function normalizeGitHubDomain(input: string | undefined): string | undefined {\n\tconst trimmed = input?.trim();\n\tif (!trimmed) return undefined;\n\ttry {\n\t\tconst url = trimmed.includes(\"://\") ? new URL(trimmed) : new URL(`https://${trimmed}`);\n\t\treturn url.hostname;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** The `api.` host serving `copilot_internal/*` for a given GitHub domain. */\nexport function gitHubApiDomain(domain: string): string {\n\treturn domain === DEFAULT_DOMAIN ? \"api.github.com\" : `api.${domain}`;\n}\n\n/** The Copilot inference host for a credential or enterprise domain. */\nexport function gitHubCopilotBaseUrl(options?: {\n\tenterpriseUrl?: string | undefined;\n\tapiEndpoint?: string | undefined;\n}): string {\n\tconst apiEndpoint = options?.apiEndpoint;\n\tif (typeof apiEndpoint === \"string\" && apiEndpoint) return apiEndpoint.replace(/\\/+$/, \"\");\n\tconst domain = normalizeGitHubDomain(options?.enterpriseUrl);\n\treturn domain ? `https://copilot-api.${domain}` : DEFAULT_BASE_URL;\n}\n\n/**\n * GitHub reports Copilot access on `/copilot_internal/user`; OAuth itself\n * succeeds for any GitHub account, so this is the only signal that the account\n * can chat.\n */\nexport function gitHubCopilotEntitlementError(user: {\n\tchat_enabled?: boolean | undefined;\n\tcan_signup_for_limited?: boolean | undefined;\n}): string | undefined {\n\tif (user.chat_enabled !== false) return undefined;\n\tif (user.can_signup_for_limited) {\n\t\treturn \"This GitHub account is not signed up for GitHub Copilot. Sign up for Copilot Free at https://github.com/features/copilot/plans and connect again.\";\n\t}\n\treturn \"This GitHub account does not have GitHub Copilot access. It needs an active Copilot subscription or a seat assigned by an organization.\";\n}\n\nexport async function createGitHubCopilotDeviceFlow(\n\toptions: { domain?: string | undefined; fetch?: FetchLike | undefined; signal?: AbortSignal | undefined } = {},\n): Promise<GitHubCopilotDeviceFlow> {\n\tconst domain = options.domain ?? DEFAULT_DOMAIN;\n\tconst response = await fetchWith(options)(`https://${domain}/login/device/code`, {\n\t\tmethod: \"POST\",\n\t\theaders: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n\t\tbody: JSON.stringify({ client_id: CLIENT_ID, scope: SCOPE }),\n\t\tsignal: options.signal ?? null,\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(`GitHub device code request failed (${response.status})`);\n\t}\n\n\tconst data: unknown = await response.json();\n\tif (!isObject(data)) throw new Error(\"Invalid GitHub device code response\");\n\tconst { device_code, user_code, verification_uri, interval, expires_in } = data;\n\tif (\n\t\ttypeof device_code !== \"string\" ||\n\t\ttypeof user_code !== \"string\" ||\n\t\ttypeof verification_uri !== \"string\" ||\n\t\t(interval !== undefined && typeof interval !== \"number\") ||\n\t\t(expires_in !== undefined && typeof expires_in !== \"number\")\n\t) {\n\t\tthrow new Error(\"Invalid GitHub device code response fields\");\n\t}\n\n\t// The verification URI is opened in the user's browser; force it to be a URL\n\t// so `open` cannot be tricked into launching something else.\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(verification_uri);\n\t} catch {\n\t\tthrow new Error(\"Untrusted verification_uri in GitHub device code response\");\n\t}\n\tif (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n\t\tthrow new Error(\"Untrusted verification_uri in GitHub device code response\");\n\t}\n\n\treturn {\n\t\tdeviceCode: device_code,\n\t\tuserCode: user_code,\n\t\tverificationUri: parsed.href,\n\t\tintervalSeconds: typeof interval === \"number\" && interval > 0 ? interval : 5,\n\t\t...(typeof expires_in === \"number\" && { expiresInSeconds: expires_in }),\n\t};\n}\n\nexport async function pollGitHubCopilotDeviceToken(\n\tflow: GitHubCopilotDeviceFlow,\n\toptions: { domain?: string | undefined; fetch?: FetchLike | undefined; signal?: AbortSignal | undefined } = {},\n): Promise<string> {\n\tconst domain = options.domain ?? DEFAULT_DOMAIN;\n\tconst send = fetchWith(options);\n\n\treturn pollDeviceCode<string>({\n\t\tintervalSeconds: flow.intervalSeconds,\n\t\t...(flow.expiresInSeconds !== undefined && { expiresInSeconds: flow.expiresInSeconds }),\n\t\twaitBeforeFirstPoll: true,\n\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\tpoll: async () => {\n\t\t\tconst response = await send(`https://${domain}/login/oauth/access_token`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\t\tdevice_code: flow.deviceCode,\n\t\t\t\t\tgrant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n\t\t\t\t}),\n\t\t\t\tsignal: options.signal ?? null,\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\treturn { status: \"failed\", message: `GitHub device token poll failed (${response.status})` };\n\t\t\t}\n\n\t\t\tconst data: unknown = await response.json();\n\t\t\tif (!isObject(data)) return { status: \"failed\", message: \"Invalid GitHub device token response\" };\n\n\t\t\tif (typeof data.access_token === \"string\" && data.access_token) {\n\t\t\t\treturn { status: \"complete\", value: data.access_token };\n\t\t\t}\n\n\t\t\tconst error = typeof data.error === \"string\" ? data.error : undefined;\n\t\t\tif (error === \"authorization_pending\") return { status: \"pending\" };\n\t\t\tif (error === \"slow_down\") {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"slow_down\",\n\t\t\t\t\t...(typeof data.interval === \"number\" && data.interval > 0 && { intervalSeconds: data.interval }),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst description = typeof data.error_description === \"string\" ? `: ${data.error_description}` : \"\";\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tmessage: `GitHub device authorization failed: ${error ?? \"unknown error\"}${description}`,\n\t\t\t};\n\t\t},\n\t});\n}\n\n/**\n * Look up the account's Copilot entitlement and per-plan API endpoint.\n *\n * A failed or malformed lookup returns `undefined` rather than denying login —\n * only an explicit `chat_enabled: false` answer blocks.\n */\nexport async function fetchGitHubCopilotUser(\n\ttoken: string,\n\toptions: { domain?: string | undefined; fetch?: FetchLike | undefined; signal?: AbortSignal | undefined } = {},\n): Promise<GitHubCopilotUser | undefined> {\n\tconst domain = options.domain ?? DEFAULT_DOMAIN;\n\ttry {\n\t\tconst response = await fetchWith(options)(`https://${gitHubApiDomain(domain)}/copilot_internal/user`, {\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t\"User-Agent\": GITHUB_COPILOT_STATIC_HEADERS[\"User-Agent\"],\n\t\t\t\t\"X-GitHub-Api-Version\": USER_API_VERSION,\n\t\t\t},\n\t\t\tsignal: options.signal ?? null,\n\t\t});\n\t\tif (!response.ok) return undefined;\n\t\tconst data: unknown = await response.json();\n\t\tif (!isObject(data)) return undefined;\n\t\tconst endpoints = isObject(data.endpoints) ? data.endpoints : undefined;\n\t\treturn {\n\t\t\t...(typeof data.chat_enabled === \"boolean\" && { chatEnabled: data.chat_enabled }),\n\t\t\t...(typeof data.can_signup_for_limited === \"boolean\" && { canSignupForLimited: data.can_signup_for_limited }),\n\t\t\t...(typeof endpoints?.api === \"string\" && endpoints.api && { apiEndpoint: endpoints.api.replace(/\\/+$/, \"\") }),\n\t\t};\n\t} catch (error) {\n\t\tif (options.signal?.aborted) throw error;\n\t\treturn undefined;\n\t}\n}\n\nasync function fetchWithRateLimitRetry(\n\tsend: FetchLike,\n\turl: string,\n\tinit: RequestInit,\n\toptions: { signal?: AbortSignal; maxRetries: number; maxElapsedMs: number },\n): Promise<Response> {\n\tconst deadline = Date.now() + options.maxElapsedMs;\n\tfor (let retry = 0; ; retry++) {\n\t\tconst response = await send(url, { ...init, signal: options.signal ?? null });\n\t\tif (response.status !== 429 || retry >= options.maxRetries) return response;\n\n\t\tconst retryAfter = response.headers.get(\"retry-after\");\n\t\tlet delayMs = 500 * 2 ** retry;\n\t\tif (retryAfter) {\n\t\t\tconst seconds = Number.parseFloat(retryAfter);\n\t\t\tdelayMs = Number.isNaN(seconds) ? Date.parse(retryAfter) - Date.now() : seconds * 1000;\n\t\t\tif (!Number.isFinite(delayMs)) return response;\n\t\t}\n\t\tdelayMs = Math.max(0, delayMs);\n\t\tif (delayMs >= deadline - Date.now()) return response;\n\t\tawait response.body?.cancel();\n\t\tawait sleep(delayMs, options.signal);\n\t}\n}\n\n/**\n * The account-visible Copilot model catalog. `GET {base}/models` is the ground\n * truth for endpoint routing (`supported_endpoints`) and enablement (`policy`,\n * `model_picker_enabled`) — models.dev has no equivalent data.\n */\nexport async function fetchGitHubCopilotModels(\n\ttoken: string,\n\toptions: {\n\t\tbaseURL?: string | undefined;\n\t\tdomain?: string | undefined;\n\t\tfetch?: FetchLike | undefined;\n\t\tsignal?: AbortSignal | undefined;\n\t\tmaxRetries?: number | undefined;\n\t\tmaxElapsedMs?: number | undefined;\n\t} = {},\n): Promise<GitHubCopilotRemoteModel[]> {\n\tconst baseURL = options.baseURL ?? gitHubCopilotBaseUrl({ enterpriseUrl: options.domain });\n\tconst response = await fetchWithRateLimitRetry(\n\t\tfetchWith(options),\n\t\t`${baseURL}/models`,\n\t\t{\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t...GITHUB_COPILOT_STATIC_HEADERS,\n\t\t\t\t\"X-GitHub-Api-Version\": GITHUB_COPILOT_API_VERSION,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t\tmaxRetries: options.maxRetries ?? DEFAULT_MODELS_RETRY.maxRetries,\n\t\t\tmaxElapsedMs: options.maxElapsedMs ?? DEFAULT_MODELS_RETRY.maxElapsedMs,\n\t\t},\n\t);\n\tif (!response.ok) {\n\t\tthrow new Error(`GitHub Copilot models request failed (${response.status})`);\n\t}\n\n\tconst data: unknown = await response.json();\n\tconst list = isObject(data) ? data.data : undefined;\n\tif (!Array.isArray(list)) throw new Error(\"Invalid GitHub Copilot models response\");\n\n\treturn list.flatMap((raw) => {\n\t\tif (!isObject(raw) || typeof raw.id !== \"string\") return [];\n\t\tconst capabilities = isObject(raw.capabilities) ? raw.capabilities : undefined;\n\t\tconst supports = isObject(capabilities?.supports) ? capabilities.supports : undefined;\n\t\tconst policy = isObject(raw.policy) ? raw.policy : undefined;\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: raw.id,\n\t\t\t\tsupportedEndpoints: Array.isArray(raw.supported_endpoints)\n\t\t\t\t\t? raw.supported_endpoints.filter((entry): entry is string => typeof entry === \"string\")\n\t\t\t\t\t: [],\n\t\t\t\t...(typeof policy?.state === \"string\" && { policyState: policy.state }),\n\t\t\t\tpickerEnabled: raw.model_picker_enabled === true,\n\t\t\t\ttoolCalls: supports?.tool_calls !== false,\n\t\t\t},\n\t\t];\n\t});\n}\n\n/**\n * Enable models the account has not configured yet (`policy.state ===\n * \"unconfigured\"`). Best effort per model; a rate limit that outlives the\n * retry budget stops the batch.\n */\nexport async function enableGitHubCopilotModels(\n\ttoken: string,\n\tmodelIds: readonly string[],\n\toptions: {\n\t\tbaseURL?: string | undefined;\n\t\tdomain?: string | undefined;\n\t\tfetch?: FetchLike | undefined;\n\t\tsignal?: AbortSignal | undefined;\n\t} = {},\n): Promise<string[]> {\n\tconst baseURL = options.baseURL ?? gitHubCopilotBaseUrl({ enterpriseUrl: options.domain });\n\tconst send = fetchWith(options);\n\tconst enabled: string[] = [];\n\tfor (const modelId of modelIds) {\n\t\ttry {\n\t\t\tconst response = await fetchWithRateLimitRetry(\n\t\t\t\tsend,\n\t\t\t\t`${baseURL}/models/${modelId}/policy`,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t\t\t...GITHUB_COPILOT_STATIC_HEADERS,\n\t\t\t\t\t\t\"openai-intent\": \"chat-policy\",\n\t\t\t\t\t\t\"x-interaction-type\": \"chat-policy\",\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ state: \"enabled\" }),\n\t\t\t\t},\n\t\t\t\t{ ...(options.signal !== undefined && { signal: options.signal }), maxRetries: 2, maxElapsedMs: 5000 },\n\t\t\t);\n\t\t\tif (response.status === 429) break;\n\t\t\tif (response.ok) enabled.push(modelId);\n\t\t} catch (error) {\n\t\t\tif (options.signal?.aborted) throw error;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn enabled;\n}\n\nfunction isGitHubCopilotCredentials(value: unknown): value is GitHubCopilotOAuthCredentials {\n\tif (!isObject(value)) return false;\n\treturn typeof value.access === \"string\" && typeof value.refresh === \"string\" && typeof value.expires === \"number\";\n}\n\nexport class JsonGitHubCopilotAuthStorage implements GitHubCopilotAuthStorage {\n\tprivate readonly storage: JsonAuthStorage<GitHubCopilotOAuthCredentials>;\n\n\tconstructor(options: JsonGitHubCopilotAuthStorageOptions = {}) {\n\t\tthis.storage = new JsonAuthStorage({\n\t\t\tproviderId: options.providerId ?? DEFAULT_PROVIDER_ID,\n\t\t\tisCredentials: isGitHubCopilotCredentials,\n\t\t\t...(options.path !== undefined && { path: options.path }),\n\t\t});\n\t}\n\n\tget path(): string {\n\t\treturn this.storage.path;\n\t}\n\n\tget providerId(): string {\n\t\treturn this.storage.providerId;\n\t}\n\n\tget(): Promise<GitHubCopilotOAuthCredentials | undefined> {\n\t\treturn this.storage.get();\n\t}\n\n\tset(credentials: GitHubCopilotOAuthCredentials): Promise<void> {\n\t\treturn this.storage.set(credentials);\n\t}\n\n\tclear(): Promise<void> {\n\t\treturn this.storage.clear();\n\t}\n}\n\nexport type GitHubCopilotOAuthClientOptions = {\n\tstorage?: GitHubCopilotAuthStorage;\n};\n\nexport class GitHubCopilotOAuthClient {\n\treadonly storage: GitHubCopilotAuthStorage;\n\n\tconstructor(options: GitHubCopilotOAuthClientOptions = {}) {\n\t\tthis.storage = options.storage ?? new JsonGitHubCopilotAuthStorage();\n\t}\n\n\tasync login(options: GitHubCopilotLoginOptions): Promise<GitHubCopilotOAuthCredentials> {\n\t\tconst enterpriseUrl = options.enterpriseUrl?.trim() || undefined;\n\t\tconst domain = normalizeGitHubDomain(enterpriseUrl) ?? DEFAULT_DOMAIN;\n\t\tif (enterpriseUrl && !normalizeGitHubDomain(enterpriseUrl)) {\n\t\t\tthrow new Error(\"Invalid GitHub Enterprise URL/domain\");\n\t\t}\n\n\t\tconst flow = await createGitHubCopilotDeviceFlow({ domain, fetch: options.fetch, signal: options.signal });\n\t\toptions.onAuth({\n\t\t\turl: flow.verificationUri,\n\t\t\tuserCode: flow.userCode,\n\t\t\tinstructions: \"Complete the GitHub device authorization to finish GitHub Copilot authentication.\",\n\t\t});\n\n\t\tconst access = await pollGitHubCopilotDeviceToken(flow, {\n\t\t\tdomain,\n\t\t\tfetch: options.fetch,\n\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t});\n\n\t\tconst user = await fetchGitHubCopilotUser(access, { domain, fetch: options.fetch, signal: options.signal });\n\t\tconst denied = user\n\t\t\t? gitHubCopilotEntitlementError({\n\t\t\t\t\tchat_enabled: user.chatEnabled,\n\t\t\t\t\tcan_signup_for_limited: user.canSignupForLimited,\n\t\t\t\t})\n\t\t\t: undefined;\n\t\tif (denied) throw new Error(denied);\n\n\t\tconst apiEndpoint =\n\t\t\tuser?.apiEndpoint ?? gitHubCopilotBaseUrl({ enterpriseUrl: domain === DEFAULT_DOMAIN ? undefined : domain });\n\n\t\toptions.onProgress?.(\"Fetching available Copilot models...\");\n\t\tlet availableModelIds: string[] | undefined;\n\t\tlet unconfigured: string[] = [];\n\t\ttry {\n\t\t\tconst models = await fetchGitHubCopilotModels(access, {\n\t\t\t\tbaseURL: apiEndpoint,\n\t\t\t\tfetch: options.fetch,\n\t\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t\t});\n\t\t\tconst usable = models.filter((model) => model.toolCalls && model.policyState !== \"disabled\");\n\t\t\tconst pickerIds = usable.filter((model) => model.pickerEnabled).map((model) => model.id);\n\t\t\t// Some Individual accounts report picker=false for every model despite\n\t\t\t// enabled policies; only that endpoint gets the policy fallback.\n\t\t\tconst host = new URL(apiEndpoint).hostname;\n\t\t\tconst policyFallback = pickerIds.length === 0 && host === \"api.individual.githubcopilot.com\";\n\t\t\tavailableModelIds = pickerIds.length\n\t\t\t\t? pickerIds\n\t\t\t\t: policyFallback\n\t\t\t\t\t? usable.filter((model) => model.policyState === \"enabled\").map((model) => model.id)\n\t\t\t\t\t: [];\n\t\t\tunconfigured = usable.filter((model) => model.policyState === \"unconfigured\").map((model) => model.id);\n\t\t} catch (error) {\n\t\t\tif (options.signal?.aborted) throw error;\n\t\t\toptions.onProgress?.(\"Could not fetch the Copilot model catalog; continuing without it.\");\n\t\t}\n\n\t\tif (options.enableModels && unconfigured.length > 0) {\n\t\t\toptions.onProgress?.(\"Enabling Copilot models...\");\n\t\t\tconst enabled = await enableGitHubCopilotModels(access, unconfigured, {\n\t\t\t\tbaseURL: apiEndpoint,\n\t\t\t\tfetch: options.fetch,\n\t\t\t\t...(options.signal !== undefined && { signal: options.signal }),\n\t\t\t});\n\t\t\tavailableModelIds = [...new Set([...(availableModelIds ?? []), ...enabled])];\n\t\t}\n\n\t\tconst credentials: GitHubCopilotOAuthCredentials = {\n\t\t\taccess,\n\t\t\trefresh: access,\n\t\t\texpires: 0,\n\t\t\t...(domain !== DEFAULT_DOMAIN && { enterpriseUrl: domain }),\n\t\t\tapiEndpoint,\n\t\t\t...(availableModelIds !== undefined && availableModelIds.length > 0 && { availableModelIds }),\n\t\t};\n\t\tawait this.storage.set(credentials);\n\t\treturn credentials;\n\t}\n\n\t/** The stored `ghu_` token, returned as-is — it never expires. */\n\tasync getCredentials(): Promise<GitHubCopilotOAuthCredentials | undefined> {\n\t\treturn this.storage.get();\n\t}\n\n\tasync getApiKey(): Promise<string | undefined> {\n\t\treturn (await this.getCredentials())?.access;\n\t}\n\n\tasync getHeaders(): Promise<Record<string, string> | undefined> {\n\t\tconst credentials = await this.getCredentials();\n\t\treturn credentials ? gitHubCopilotHeaders(credentials) : undefined;\n\t}\n\n\tasync logout(): Promise<void> {\n\t\tawait this.storage.clear();\n\t}\n}\n\nexport function gitHubCopilotHeaders(credentials: GitHubCopilotOAuthCredentials): Record<string, string> {\n\treturn {\n\t\tAuthorization: `Bearer ${credentials.access}`,\n\t\t...GITHUB_COPILOT_STATIC_HEADERS,\n\t\t\"X-GitHub-Api-Version\": GITHUB_COPILOT_API_VERSION,\n\t};\n}\n\n/**\n * Resolve the GitHub Copilot API credential: `COPILOT_GITHUB_TOKEN` first, then\n * an explicit `auth --github-copilot` login from codework auth.json.\n *\n * Nothing else is consulted, by design. `GITHUB_TOKEN` and `GH_TOKEN` are\n * usually set for git or `gh` and carry no Copilot access — in GitHub Actions\n * `GITHUB_TOKEN` is a workflow token — so reading them turns a working login\n * into an unexplained 401. Credentials another application stored for itself\n * (an editor's Copilot sign-in) are not consulted either: a token codework was\n * never given should not silently become the identity its runs bill and act as.\n *\n * Returns undefined when nothing is available; the device flow only runs via\n * `GitHubCopilotOAuthClient#login`.\n */\nexport async function getGitHubCopilotApiKey(\n\toptions: GitHubCopilotOAuthClientOptions = {},\n): Promise<string | undefined> {\n\tconst dedicated = readEnv(GITHUB_COPILOT_API_KEY_ENV);\n\tif (dedicated) return dedicated;\n\n\treturn new GitHubCopilotOAuthClient(options).getApiKey();\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { h as isAnthropicAdaptiveThinkingModel } from "./model-Cjp-Dr8V.mjs";
|
|
2
2
|
//#region src/providers/github-copilot/copilot-headers.ts
|
|
3
3
|
/**
|
|
4
4
|
* Copilot request identity.
|
|
@@ -101,4 +101,4 @@ function applyCopilotHeaders(headers, options) {
|
|
|
101
101
|
//#endregion
|
|
102
102
|
export { copilotRequestMetadata as i, GITHUB_COPILOT_STATIC_HEADERS as n, applyCopilotHeaders as r, GITHUB_COPILOT_API_VERSION as t };
|
|
103
103
|
|
|
104
|
-
//# sourceMappingURL=copilot-headers-
|
|
104
|
+
//# sourceMappingURL=copilot-headers-BLnBaJyp.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-headers-
|
|
1
|
+
{"version":3,"file":"copilot-headers-BLnBaJyp.mjs","names":[],"sources":["../../src/providers/github-copilot/copilot-headers.ts"],"sourcesContent":["/**\n * Copilot request identity.\n *\n * Every inference request must look like it came from the Copilot Chat client:\n * the static headers identify that client, while `x-initiator` and\n * `Copilot-Vision-Request` describe the serialized body.\n */\n\nimport { isAnthropicAdaptiveThinkingModel } from \"../../model/model.ts\";\n\nexport const GITHUB_COPILOT_API_VERSION = \"2026-08-01\";\n\nexport const GITHUB_COPILOT_STATIC_HEADERS = {\n\t\"User-Agent\": \"GitHubCopilotChat/0.35.0\",\n\t\"Editor-Version\": \"vscode/1.107.0\",\n\t\"Editor-Plugin-Version\": \"copilot-chat/0.35.0\",\n\t\"Copilot-Integration-Id\": \"vscode-chat\",\n} as const;\n\n/** `X-Interaction-Type` is `conversation-{type}`; only `agent` is wired today. */\nexport type GitHubCopilotInteractionType = \"agent\" | \"subagent\" | \"background\" | \"compaction\";\n\n// Copilot rejects these betas on adaptive-thinking Claude models.\nconst ADAPTIVE_UNSUPPORTED_BETAS = new Set([\n\t\"interleaved-thinking-2025-05-14\",\n\t\"fine-grained-tool-streaming-2025-05-14\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ntype RequestMetadata = { agent: boolean; vision: boolean };\n\nfunction responsesMetadata(input: unknown): RequestMetadata {\n\tconst list = Array.isArray(input) ? input : [];\n\tconst last = list[list.length - 1];\n\tlet vision = false;\n\tfor (const item of list) {\n\t\tif (!isRecord(item) || !Array.isArray(item.content)) continue;\n\t\tif (item.content.some((part) => isRecord(part) && part.type === \"input_image\")) vision = true;\n\t}\n\treturn { agent: isRecord(last) && last.role !== \"user\", vision };\n}\n\nfunction completionsMetadata(messages: unknown): RequestMetadata {\n\tconst list = Array.isArray(messages) ? messages : [];\n\tconst last = list[list.length - 1];\n\tlet vision = false;\n\tfor (const message of list) {\n\t\tif (!isRecord(message) || !Array.isArray(message.content)) continue;\n\t\tif (message.content.some((part) => isRecord(part) && part.type === \"image_url\")) vision = true;\n\t}\n\treturn { agent: isRecord(last) && last.role !== \"user\", vision };\n}\n\nfunction messagesMetadata(messages: unknown): RequestMetadata {\n\tconst list = Array.isArray(messages) ? messages : [];\n\tconst last = list[list.length - 1];\n\tlet vision = false;\n\tfor (const message of list) {\n\t\tif (!isRecord(message) || !Array.isArray(message.content)) continue;\n\t\tfor (const part of message.content) {\n\t\t\tif (!isRecord(part)) continue;\n\t\t\tif (part.type === \"image\") vision = true;\n\t\t\tif (\n\t\t\t\tpart.type === \"tool_result\" &&\n\t\t\t\tArray.isArray(part.content) &&\n\t\t\t\tpart.content.some((inner) => isRecord(inner) && inner.type === \"image\")\n\t\t\t) {\n\t\t\t\tvision = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst content = isRecord(last) && Array.isArray(last.content) ? last.content : [];\n\t// A trailing user turn that only carries tool_result parts is still an agent\n\t// step — it answers a tool call, not a human prompt.\n\tconst agent =\n\t\t!isRecord(last) || last.role !== \"user\" || !content.some((part) => isRecord(part) && part.type !== \"tool_result\");\n\treturn { agent, vision };\n}\n\n/** Derive `x-initiator` and `Copilot-Vision-Request` inputs from the serialized body. */\nexport function copilotRequestMetadata(url: string, body: unknown): RequestMetadata {\n\tif (!isRecord(body)) return { agent: false, vision: false };\n\tif (url.includes(\"/responses\")) return responsesMetadata(body.input);\n\tif (Array.isArray(body.messages)) {\n\t\treturn url.includes(\"/completions\") ? completionsMetadata(body.messages) : messagesMetadata(body.messages);\n\t}\n\treturn { agent: false, vision: false };\n}\n\nexport function applyCopilotHeaders(\n\theaders: Headers,\n\toptions: {\n\t\ttoken: string;\n\t\turl: string;\n\t\tbody: unknown;\n\t\tsessionId?: string;\n\t\tinteractionType?: GitHubCopilotInteractionType;\n\t},\n): void {\n\t// Whatever the adapters configured (API key, x-api-key) is replaced by the\n\t// resolved Copilot token; OAuth `ghu_`/`gho_` tokens are Bearer credentials.\n\theaders.delete(\"authorization\");\n\theaders.delete(\"x-api-key\");\n\theaders.set(\"Authorization\", `Bearer ${options.token}`);\n\n\tfor (const [key, value] of Object.entries(GITHUB_COPILOT_STATIC_HEADERS)) {\n\t\theaders.set(key, value);\n\t}\n\theaders.set(\"Openai-Intent\", \"conversation-edits\");\n\theaders.set(\"X-GitHub-Api-Version\", GITHUB_COPILOT_API_VERSION);\n\n\tconst interactionType = `conversation-${options.interactionType ?? \"agent\"}`;\n\theaders.set(\"X-Interaction-Type\", interactionType);\n\tif (options.sessionId) headers.set(\"X-Interaction-Id\", options.sessionId);\n\n\t// `x-initiator` can only escalate to `agent`, never back to `user` — a\n\t// non-agent interaction or an agent-shaped body overrides a declared `user`.\n\tif (interactionType !== \"conversation-agent\") {\n\t\theaders.set(\"x-initiator\", \"agent\");\n\t}\n\tconst metadata = copilotRequestMetadata(options.url, options.body);\n\tif (metadata.agent) {\n\t\theaders.set(\"x-initiator\", \"agent\");\n\t} else if (!headers.has(\"x-initiator\")) {\n\t\theaders.set(\"x-initiator\", \"user\");\n\t}\n\tif (metadata.vision) {\n\t\theaders.set(\"Copilot-Vision-Request\", \"true\");\n\t}\n\n\tconst model = isRecord(options.body) && typeof options.body.model === \"string\" ? options.body.model : undefined;\n\tconst beta = headers.get(\"anthropic-beta\");\n\tif (model && beta && isAnthropicAdaptiveThinkingModel(model)) {\n\t\tconst kept = beta\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter((entry) => entry && !ADAPTIVE_UNSUPPORTED_BETAS.has(entry));\n\t\tif (kept.length > 0) {\n\t\t\theaders.set(\"anthropic-beta\", kept.join(\",\"));\n\t\t} else {\n\t\t\theaders.delete(\"anthropic-beta\");\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as applyCopilotHeaders } from "./copilot-headers-
|
|
1
|
+
import { r as applyCopilotHeaders } from "./copilot-headers-BLnBaJyp.mjs";
|
|
2
2
|
import { LoadAPIKeyError, NoSuchModelError } from "@ai-sdk/provider";
|
|
3
3
|
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
4
4
|
import { createOpenAI } from "@ai-sdk/openai";
|
|
@@ -123,4 +123,4 @@ const githubCopilot = createGitHubCopilot();
|
|
|
123
123
|
//#endregion
|
|
124
124
|
export { createCopilotFetch as a, githubCopilot as i, GITHUB_COPILOT_PROVIDER_NAME as n, createGitHubCopilot as r, GITHUB_COPILOT_DEFAULT_BASE_URL as t };
|
|
125
125
|
|
|
126
|
-
//# sourceMappingURL=github-copilot-
|
|
126
|
+
//# sourceMappingURL=github-copilot-BcmOr0jd.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-copilot-C7oJ2Tfp.mjs","names":[],"sources":["../../src/providers/github-copilot/copilot-fetch.ts","../../src/providers/github-copilot/copilot-provider.ts"],"sourcesContent":["import { LoadAPIKeyError } from \"@ai-sdk/provider\";\nimport { applyCopilotHeaders, type GitHubCopilotInteractionType } from \"./copilot-headers.ts\";\n\nexport type GitHubCopilotApiKey = string | (() => string | PromiseLike<string | undefined> | undefined);\n\nexport type CopilotFetchOptions = {\n\t/** Static token or async resolver — e.g. `() => getGitHubCopilotApiKey()`. */\n\tapiKey?: GitHubCopilotApiKey;\n\t/** Upstream fetch implementation; defaults to `globalThis.fetch`. */\n\tfetch?: typeof globalThis.fetch;\n\t/** Sent as `X-Interaction-Id` so Copilot can group requests by session. */\n\tsessionId?: string;\n\tinteractionType?: GitHubCopilotInteractionType;\n};\n\n// Only the Copilot-specific variable: GITHUB_TOKEN and GH_TOKEN are usually set\n// for git or `gh` and have no Copilot access.\nconst API_KEY_ENV = \"COPILOT_GITHUB_TOKEN\";\n\nasync function resolveToken(apiKey: GitHubCopilotApiKey | undefined): Promise<string> {\n\tconst resolved = typeof apiKey === \"function\" ? await apiKey() : apiKey;\n\tif (resolved) return resolved;\n\tconst fromEnv = typeof process === \"undefined\" ? undefined : process.env[API_KEY_ENV];\n\tif (fromEnv) return fromEnv;\n\tthrow new LoadAPIKeyError({\n\t\tmessage: `GitHub Copilot API key is missing. Set ${API_KEY_ENV}, pass an apiKey, or authenticate with \\`aikit auth --github-copilot\\`.`,\n\t});\n}\n\nfunction parseJson(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text) as unknown;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Wrap an upstream fetch with Copilot auth and request metadata. The wrapped\n * call replaces adapter-set auth headers, injects the Copilot identity\n * headers, and derives `x-initiator` / `Copilot-Vision-Request` from the\n * serialized JSON body without consuming it.\n */\nexport function createCopilotFetch(options: CopilotFetchOptions = {}): typeof globalThis.fetch {\n\tconst upstream = options.fetch ?? globalThis.fetch;\n\treturn async (input, init) => {\n\t\tconst token = await resolveToken(options.apiKey);\n\t\tconst headers = new Headers(init?.headers);\n\t\tconst url = input instanceof URL ? input.href : typeof input === \"string\" ? input : input.url;\n\t\tconst body = typeof init?.body === \"string\" ? parseJson(init.body) : undefined;\n\t\tapplyCopilotHeaders(headers, {\n\t\t\ttoken,\n\t\t\turl,\n\t\t\tbody,\n\t\t\t...(options.sessionId !== undefined && { sessionId: options.sessionId }),\n\t\t\t...(options.interactionType !== undefined && { interactionType: options.interactionType }),\n\t\t});\n\t\treturn upstream(input, { ...init, headers });\n\t};\n}\n","/**\n * GitHub Copilot provider.\n *\n * Copilot exposes three inference protocols on one host — OpenAI Chat\n * Completions (`/chat/completions`), OpenAI Responses (`/responses`), and\n * Anthropic Messages (`/v1/messages`) — so this provider composes the official\n * AI SDK adapters behind one `ProviderV4` and routes each model through\n * `api.method`. Auth and Copilot request headers are applied inside the shared\n * fetch wrapper, which is why the adapters receive a placeholder key: their\n * headers never reach the wire.\n */\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { NoSuchModelError, type LanguageModelV4, type ProviderV4 } from \"@ai-sdk/provider\";\nimport { createCopilotFetch, type GitHubCopilotApiKey } from \"./copilot-fetch.ts\";\nimport type { GitHubCopilotInteractionType } from \"./copilot-headers.ts\";\n\nexport const GITHUB_COPILOT_DEFAULT_BASE_URL = \"https://api.githubcopilot.com\";\nexport const GITHUB_COPILOT_PROVIDER_NAME = \"github-copilot\";\n\nconst PLACEHOLDER_API_KEY = \"github-copilot\";\n\nexport interface GitHubCopilotProvider extends ProviderV4 {\n\t/** Chat Completions — the generic fallback for third-party models. */\n\t(modelId: string): LanguageModelV4;\n\tlanguageModel(modelId: string): LanguageModelV4;\n\t/** `POST /chat/completions` — Gemini, Kimi, and other third-party models. */\n\tchat(modelId: string): LanguageModelV4;\n\t/** `POST /responses` — GPT, Grok, OSWE, and MAI models. */\n\tresponses(modelId: string): LanguageModelV4;\n\t/** `POST /v1/messages` — Claude models. */\n\tmessages(modelId: string): LanguageModelV4;\n}\n\nexport interface GitHubCopilotProviderSettings {\n\t/**\n\t * Copilot API host. Defaults to `https://api.githubcopilot.com`; OAuth\n\t * credentials can carry a plan-specific `apiEndpoint` that overrides this.\n\t */\n\tbaseURL?: string;\n\t/**\n\t * GitHub OAuth token (`ghu_`/`gho_`) or an async resolver, e.g.\n\t * `() => getGitHubCopilotApiKey()`. Falls back to `COPILOT_GITHUB_TOKEN`.\n\t */\n\tapiKey?: GitHubCopilotApiKey;\n\t/** Extra headers merged into every request. */\n\theaders?: Record<string, string>;\n\t/** Custom fetch implementation, applied underneath the Copilot wrapper. */\n\tfetch?: typeof globalThis.fetch;\n\t/** Sent as `X-Interaction-Id` so Copilot can group requests by session. */\n\tsessionId?: string;\n\tinteractionType?: GitHubCopilotInteractionType;\n\t/** Forwarded to the Chat Completions adapter only. */\n\ttransformRequestBody?: (body: Record<string, unknown>) => Record<string, unknown>;\n}\n\nexport function createGitHubCopilot(options: GitHubCopilotProviderSettings = {}): GitHubCopilotProvider {\n\tconst baseURL = (options.baseURL ?? GITHUB_COPILOT_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\tconst fetch = createCopilotFetch({\n\t\t...(options.apiKey !== undefined && { apiKey: options.apiKey }),\n\t\t...(options.fetch !== undefined && { fetch: options.fetch }),\n\t\t...(options.sessionId !== undefined && { sessionId: options.sessionId }),\n\t\t...(options.interactionType !== undefined && { interactionType: options.interactionType }),\n\t});\n\tconst headers = options.headers !== undefined ? { headers: options.headers } : {};\n\n\tconst chat = createOpenAICompatible({\n\t\tname: GITHUB_COPILOT_PROVIDER_NAME,\n\t\tbaseURL,\n\t\tapiKey: PLACEHOLDER_API_KEY,\n\t\t...headers,\n\t\tfetch,\n\t\tincludeUsage: true,\n\t\t...(options.transformRequestBody !== undefined && { transformRequestBody: options.transformRequestBody }),\n\t});\n\tconst responses = createOpenAI({\n\t\tname: GITHUB_COPILOT_PROVIDER_NAME,\n\t\tbaseURL,\n\t\tapiKey: PLACEHOLDER_API_KEY,\n\t\t...headers,\n\t\tfetch,\n\t});\n\tconst messages = createAnthropic({\n\t\tname: GITHUB_COPILOT_PROVIDER_NAME,\n\t\t// The Anthropic adapter appends /messages to its baseURL.\n\t\tbaseURL: `${baseURL}/v1`,\n\t\tauthToken: PLACEHOLDER_API_KEY,\n\t\t...headers,\n\t\tfetch,\n\t});\n\n\tconst provider = function (modelId: string): LanguageModelV4 {\n\t\tif (new.target) {\n\t\t\tthrow new Error(\"github copilot model function cannot be called with the new keyword.\");\n\t\t}\n\t\treturn chat.chatModel(modelId);\n\t};\n\tprovider.specificationVersion = \"v4\" as const;\n\tprovider.languageModel = (modelId: string) => chat.chatModel(modelId);\n\tprovider.chat = (modelId: string) => chat.chatModel(modelId);\n\tprovider.responses = (modelId: string) => responses.responses(modelId);\n\tprovider.messages = (modelId: string) => messages.messages(modelId);\n\tprovider.embeddingModel = (modelId: string) => {\n\t\tthrow new NoSuchModelError({\n\t\t\tmodelId,\n\t\t\tmodelType: \"embeddingModel\",\n\t\t\tmessage: \"github copilot does not expose embedding models\",\n\t\t});\n\t};\n\tprovider.textEmbeddingModel = provider.embeddingModel;\n\tprovider.imageModel = (modelId: string) => {\n\t\tthrow new NoSuchModelError({\n\t\t\tmodelId,\n\t\t\tmodelType: \"imageModel\",\n\t\t\tmessage: \"github copilot does not expose image models\",\n\t\t});\n\t};\n\n\treturn provider;\n}\n\nexport const githubCopilot = createGitHubCopilot();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"github-copilot-BcmOr0jd.mjs","names":[],"sources":["../../src/providers/github-copilot/copilot-fetch.ts","../../src/providers/github-copilot/copilot-provider.ts"],"sourcesContent":["import { LoadAPIKeyError } from \"@ai-sdk/provider\";\nimport { applyCopilotHeaders, type GitHubCopilotInteractionType } from \"./copilot-headers.ts\";\n\nexport type GitHubCopilotApiKey = string | (() => string | PromiseLike<string | undefined> | undefined);\n\nexport type CopilotFetchOptions = {\n\t/** Static token or async resolver — e.g. `() => getGitHubCopilotApiKey()`. */\n\tapiKey?: GitHubCopilotApiKey;\n\t/** Upstream fetch implementation; defaults to `globalThis.fetch`. */\n\tfetch?: typeof globalThis.fetch;\n\t/** Sent as `X-Interaction-Id` so Copilot can group requests by session. */\n\tsessionId?: string;\n\tinteractionType?: GitHubCopilotInteractionType;\n};\n\n// Only the Copilot-specific variable: GITHUB_TOKEN and GH_TOKEN are usually set\n// for git or `gh` and have no Copilot access.\nconst API_KEY_ENV = \"COPILOT_GITHUB_TOKEN\";\n\nasync function resolveToken(apiKey: GitHubCopilotApiKey | undefined): Promise<string> {\n\tconst resolved = typeof apiKey === \"function\" ? await apiKey() : apiKey;\n\tif (resolved) return resolved;\n\tconst fromEnv = typeof process === \"undefined\" ? undefined : process.env[API_KEY_ENV];\n\tif (fromEnv) return fromEnv;\n\tthrow new LoadAPIKeyError({\n\t\tmessage: `GitHub Copilot API key is missing. Set ${API_KEY_ENV}, pass an apiKey, or authenticate with \\`aikit auth --github-copilot\\`.`,\n\t});\n}\n\nfunction parseJson(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text) as unknown;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Wrap an upstream fetch with Copilot auth and request metadata. The wrapped\n * call replaces adapter-set auth headers, injects the Copilot identity\n * headers, and derives `x-initiator` / `Copilot-Vision-Request` from the\n * serialized JSON body without consuming it.\n */\nexport function createCopilotFetch(options: CopilotFetchOptions = {}): typeof globalThis.fetch {\n\tconst upstream = options.fetch ?? globalThis.fetch;\n\treturn async (input, init) => {\n\t\tconst token = await resolveToken(options.apiKey);\n\t\tconst headers = new Headers(init?.headers);\n\t\tconst url = input instanceof URL ? input.href : typeof input === \"string\" ? input : input.url;\n\t\tconst body = typeof init?.body === \"string\" ? parseJson(init.body) : undefined;\n\t\tapplyCopilotHeaders(headers, {\n\t\t\ttoken,\n\t\t\turl,\n\t\t\tbody,\n\t\t\t...(options.sessionId !== undefined && { sessionId: options.sessionId }),\n\t\t\t...(options.interactionType !== undefined && { interactionType: options.interactionType }),\n\t\t});\n\t\treturn upstream(input, { ...init, headers });\n\t};\n}\n","/**\n * GitHub Copilot provider.\n *\n * Copilot exposes three inference protocols on one host — OpenAI Chat\n * Completions (`/chat/completions`), OpenAI Responses (`/responses`), and\n * Anthropic Messages (`/v1/messages`) — so this provider composes the official\n * AI SDK adapters behind one `ProviderV4` and routes each model through\n * `api.method`. Auth and Copilot request headers are applied inside the shared\n * fetch wrapper, which is why the adapters receive a placeholder key: their\n * headers never reach the wire.\n */\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { NoSuchModelError, type LanguageModelV4, type ProviderV4 } from \"@ai-sdk/provider\";\nimport { createCopilotFetch, type GitHubCopilotApiKey } from \"./copilot-fetch.ts\";\nimport type { GitHubCopilotInteractionType } from \"./copilot-headers.ts\";\n\nexport const GITHUB_COPILOT_DEFAULT_BASE_URL = \"https://api.githubcopilot.com\";\nexport const GITHUB_COPILOT_PROVIDER_NAME = \"github-copilot\";\n\nconst PLACEHOLDER_API_KEY = \"github-copilot\";\n\nexport interface GitHubCopilotProvider extends ProviderV4 {\n\t/** Chat Completions — the generic fallback for third-party models. */\n\t(modelId: string): LanguageModelV4;\n\tlanguageModel(modelId: string): LanguageModelV4;\n\t/** `POST /chat/completions` — Gemini, Kimi, and other third-party models. */\n\tchat(modelId: string): LanguageModelV4;\n\t/** `POST /responses` — GPT, Grok, OSWE, and MAI models. */\n\tresponses(modelId: string): LanguageModelV4;\n\t/** `POST /v1/messages` — Claude models. */\n\tmessages(modelId: string): LanguageModelV4;\n}\n\nexport interface GitHubCopilotProviderSettings {\n\t/**\n\t * Copilot API host. Defaults to `https://api.githubcopilot.com`; OAuth\n\t * credentials can carry a plan-specific `apiEndpoint` that overrides this.\n\t */\n\tbaseURL?: string;\n\t/**\n\t * GitHub OAuth token (`ghu_`/`gho_`) or an async resolver, e.g.\n\t * `() => getGitHubCopilotApiKey()`. Falls back to `COPILOT_GITHUB_TOKEN`.\n\t */\n\tapiKey?: GitHubCopilotApiKey;\n\t/** Extra headers merged into every request. */\n\theaders?: Record<string, string>;\n\t/** Custom fetch implementation, applied underneath the Copilot wrapper. */\n\tfetch?: typeof globalThis.fetch;\n\t/** Sent as `X-Interaction-Id` so Copilot can group requests by session. */\n\tsessionId?: string;\n\tinteractionType?: GitHubCopilotInteractionType;\n\t/** Forwarded to the Chat Completions adapter only. */\n\ttransformRequestBody?: (body: Record<string, unknown>) => Record<string, unknown>;\n}\n\nexport function createGitHubCopilot(options: GitHubCopilotProviderSettings = {}): GitHubCopilotProvider {\n\tconst baseURL = (options.baseURL ?? GITHUB_COPILOT_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\tconst fetch = createCopilotFetch({\n\t\t...(options.apiKey !== undefined && { apiKey: options.apiKey }),\n\t\t...(options.fetch !== undefined && { fetch: options.fetch }),\n\t\t...(options.sessionId !== undefined && { sessionId: options.sessionId }),\n\t\t...(options.interactionType !== undefined && { interactionType: options.interactionType }),\n\t});\n\tconst headers = options.headers !== undefined ? { headers: options.headers } : {};\n\n\tconst chat = createOpenAICompatible({\n\t\tname: GITHUB_COPILOT_PROVIDER_NAME,\n\t\tbaseURL,\n\t\tapiKey: PLACEHOLDER_API_KEY,\n\t\t...headers,\n\t\tfetch,\n\t\tincludeUsage: true,\n\t\t...(options.transformRequestBody !== undefined && { transformRequestBody: options.transformRequestBody }),\n\t});\n\tconst responses = createOpenAI({\n\t\tname: GITHUB_COPILOT_PROVIDER_NAME,\n\t\tbaseURL,\n\t\tapiKey: PLACEHOLDER_API_KEY,\n\t\t...headers,\n\t\tfetch,\n\t});\n\tconst messages = createAnthropic({\n\t\tname: GITHUB_COPILOT_PROVIDER_NAME,\n\t\t// The Anthropic adapter appends /messages to its baseURL.\n\t\tbaseURL: `${baseURL}/v1`,\n\t\tauthToken: PLACEHOLDER_API_KEY,\n\t\t...headers,\n\t\tfetch,\n\t});\n\n\tconst provider = function (modelId: string): LanguageModelV4 {\n\t\tif (new.target) {\n\t\t\tthrow new Error(\"github copilot model function cannot be called with the new keyword.\");\n\t\t}\n\t\treturn chat.chatModel(modelId);\n\t};\n\tprovider.specificationVersion = \"v4\" as const;\n\tprovider.languageModel = (modelId: string) => chat.chatModel(modelId);\n\tprovider.chat = (modelId: string) => chat.chatModel(modelId);\n\tprovider.responses = (modelId: string) => responses.responses(modelId);\n\tprovider.messages = (modelId: string) => messages.messages(modelId);\n\tprovider.embeddingModel = (modelId: string) => {\n\t\tthrow new NoSuchModelError({\n\t\t\tmodelId,\n\t\t\tmodelType: \"embeddingModel\",\n\t\t\tmessage: \"github copilot does not expose embedding models\",\n\t\t});\n\t};\n\tprovider.textEmbeddingModel = provider.embeddingModel;\n\tprovider.imageModel = (modelId: string) => {\n\t\tthrow new NoSuchModelError({\n\t\t\tmodelId,\n\t\t\tmodelType: \"imageModel\",\n\t\t\tmessage: \"github copilot does not expose image models\",\n\t\t});\n\t};\n\n\treturn provider;\n}\n\nexport const githubCopilot = createGitHubCopilot();\n"],"mappings":"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"}
|
package/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ProviderToProtocol, c as getModel, d as model_d_exports, f as modelsAreEqual, i as KnownProviderEnum, l as getModels, n as ActiveThinkingLevel, o as TModel, p as registry, r as Info, s as ThinkingBudgets$1, t as APIMethodEnum, u as getProviders } from "./model-
|
|
1
|
+
import { a as ProviderToProtocol, c as getModel, d as model_d_exports, f as modelsAreEqual, i as KnownProviderEnum, l as getModels, n as ActiveThinkingLevel, o as TModel, p as registry, r as Info, s as ThinkingBudgets$1, t as APIMethodEnum, u as getProviders } from "./model-D3wc9-u4.mjs";
|
|
2
2
|
import { t as failure_d_exports } from "./failure-5Wjd-qFH.mjs";
|
|
3
3
|
import Type$2, { Static, Static as Static$1, TSchema, TSchema as TSchema$1, Type, Type as Type$1 } from "typebox";
|
|
4
4
|
import { APICallError, LanguageModelV3, LanguageModelV4, ProviderV3, ProviderV4 } from "@ai-sdk/provider";
|
|
@@ -8,7 +8,7 @@ import { OpenAICompatibleLanguageModelChatOptions, OpenAICompatibleLanguageModel
|
|
|
8
8
|
import { GoogleGenerativeAIProviderSettings, GoogleLanguageModelOptions } from "@ai-sdk/google";
|
|
9
9
|
import { GoogleVertexProviderSettings } from "@ai-sdk/google-vertex";
|
|
10
10
|
import { GoogleVertexAnthropicProviderSettings } from "@ai-sdk/google-vertex/anthropic";
|
|
11
|
-
import {
|
|
11
|
+
import { XaiLanguageModelResponsesOptions, XaiProviderSettings } from "@ai-sdk/xai";
|
|
12
12
|
import { OpenRouterProviderOptions, OpenRouterProviderSettings } from "@openrouter/ai-sdk-provider";
|
|
13
13
|
declare namespace event_d_exports {
|
|
14
14
|
export { LLMMessageEvent, LLMMessageEventSchema, LLMMessageEventType };
|
|
@@ -6170,7 +6170,7 @@ type AISDKOptions<TFactoryOptions, TProviderOptions extends ProviderOptionBag =
|
|
|
6170
6170
|
};
|
|
6171
6171
|
type OpenAILanguageOptions = OpenAILanguageModelResponsesOptions | OpenAILanguageModelChatOptions | OpenAILanguageModelCompletionOptions;
|
|
6172
6172
|
type OpenAICompatibleLanguageOptions = OpenAICompatibleLanguageModelChatOptions | OpenAICompatibleLanguageModelCompletionOptions;
|
|
6173
|
-
type XaiLanguageOptions = XaiLanguageModelResponsesOptions
|
|
6173
|
+
type XaiLanguageOptions = XaiLanguageModelResponsesOptions;
|
|
6174
6174
|
type GitHubCopilotLanguageOptions = AnthropicLanguageModelOptions | OpenAILanguageModelResponsesOptions | OpenAICompatibleLanguageModelChatOptions;
|
|
6175
6175
|
type OpenAIOptions = AISDKOptions<OpenAIProviderSettings, {
|
|
6176
6176
|
openai?: OpenAILanguageOptions;
|
package/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { C as ToolCallSchema, E as transformMessages, S as AssistantMessageSchema, T as message_exports, g as shortHash, n as createOpenAICodex, r as openaiCodex, v as openAICodexTools, w as createAssistantMessage$1, x as resolveOpenAICodexToolConstraint } from "./openai-codex-
|
|
2
|
+
import { E as NamedError, _ as modelsAreEqual, a as KnownProviderEnumSchema, b as registry, f as getModel, g as model_exports, i as KnownProviderEnum, l as calculateCost, m as getProviders, n as APIMethodEnumSchema, p as getModels, r as ActiveThinkingLevel, s as ThinkingBudgets$1, t as APIMethodEnum, u as clampThinkingLevel, x as thinkingTokenBudgetField, y as optionsKey } from "./model-Cjp-Dr8V.mjs";
|
|
3
|
+
import { C as ToolCallSchema, E as transformMessages, S as AssistantMessageSchema, T as message_exports, g as shortHash, n as createOpenAICodex, r as openaiCodex, v as openAICodexTools, w as createAssistantMessage$1, x as resolveOpenAICodexToolConstraint } from "./openai-codex-C1Yb02kM.mjs";
|
|
4
4
|
import { r as normalize, t as failure_exports } from "./failure-DFQNKc-O.mjs";
|
|
5
|
-
import { i as packageForModel, o as resolveLanguageModel, r as loadProviderFactory } from "./registry-
|
|
6
|
-
import { i as githubCopilot, r as createGitHubCopilot } from "./github-copilot-
|
|
5
|
+
import { i as packageForModel, o as resolveLanguageModel, r as loadProviderFactory } from "./registry-u49t0S4S.mjs";
|
|
6
|
+
import { i as githubCopilot, r as createGitHubCopilot } from "./github-copilot-BcmOr0jd.mjs";
|
|
7
7
|
import Type$2, { Type, Type as Type$1 } from "typebox";
|
|
8
8
|
import { APICallError } from "@ai-sdk/provider";
|
|
9
9
|
import { RetryError, jsonSchema, streamText } from "ai";
|
|
@@ -1747,7 +1747,7 @@ const stream$1 = (model, context, options) => {
|
|
|
1747
1747
|
toolChoice: runtimeOptions.toolChoice,
|
|
1748
1748
|
activeTools,
|
|
1749
1749
|
maxOutputTokens: resolveMaxOutputTokens(model, plan),
|
|
1750
|
-
temperature: runtimeOptions.temperature,
|
|
1750
|
+
temperature: model.compat?.supportsTemperature === false ? void 0 : runtimeOptions.temperature,
|
|
1751
1751
|
providerOptions,
|
|
1752
1752
|
include: { requestBody: true },
|
|
1753
1753
|
abortSignal: runtimeOptions.signal,
|