@jeffreycao/copilot-api 1.10.8 → 1.10.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +17 -14
  2. package/README.zh-CN.md +17 -14
  3. package/dist/auth-CeZtnQE_.js +116 -0
  4. package/dist/auth-CeZtnQE_.js.map +1 -0
  5. package/dist/{check-usage-BdXGp1Wr.js → check-usage-CTShKCvR.js} +3 -4
  6. package/dist/{check-usage-BdXGp1Wr.js.map → check-usage-CTShKCvR.js.map} +1 -1
  7. package/dist/{proxy-DvlF9a-7.js → config-ztdkLu9o.js} +83 -70
  8. package/dist/config-ztdkLu9o.js.map +1 -0
  9. package/dist/{debug-C_TBkyUw.js → debug-BVHmoCzY.js} +17 -7
  10. package/dist/debug-BVHmoCzY.js.map +1 -0
  11. package/dist/main.js +5 -5
  12. package/dist/{mcp-CTb-DbQH.js → mcp-DZgcvqQY.js} +2 -2
  13. package/dist/{mcp-CTb-DbQH.js.map → mcp-DZgcvqQY.js.map} +1 -1
  14. package/dist/{server-BRFLAT4z.js → server-D5O9IzAY.js} +1770 -1668
  15. package/dist/server-D5O9IzAY.js.map +1 -0
  16. package/dist/{start-Bzfnxzlh.js → start-BhPxHgu8.js} +4 -6
  17. package/dist/{start-Bzfnxzlh.js.map → start-BhPxHgu8.js.map} +1 -1
  18. package/dist/token-1SfgxCRm.js +1875 -0
  19. package/dist/token-1SfgxCRm.js.map +1 -0
  20. package/dist/{tool-search-D3SN0jX-.js → tool-search-wA-fLduL.js} +1 -1
  21. package/dist/{tool-search-D3SN0jX-.js.map → tool-search-wA-fLduL.js.map} +1 -1
  22. package/package.json +2 -2
  23. package/dist/auth-BHa2OHXf.js +0 -45
  24. package/dist/auth-BHa2OHXf.js.map +0 -1
  25. package/dist/debug-C_TBkyUw.js.map +0 -1
  26. package/dist/paths-DC-mqCY3.js +0 -30
  27. package/dist/paths-DC-mqCY3.js.map +0 -1
  28. package/dist/proxy-DvlF9a-7.js.map +0 -1
  29. package/dist/server-BRFLAT4z.js.map +0 -1
  30. package/dist/token-Dj8XsAxn.js +0 -170
  31. package/dist/token-Dj8XsAxn.js.map +0 -1
  32. package/dist/utils-jHLgqAq2.js +0 -657
  33. package/dist/utils-jHLgqAq2.js.map +0 -1
@@ -1,170 +0,0 @@
1
- import { t as PATHS } from "./paths-DC-mqCY3.js";
2
- import { C as isOpencodeOauthApp, I as state, S as githubUserHeaders, b as getOauthUrls, d as sleep, f as getCopilotUsage, p as HTTPError, v as getGitHubApiBaseUrl, x as githubHeaders, y as getOauthAppConfig } from "./utils-jHLgqAq2.js";
3
- import consola from "consola";
4
- import fs from "node:fs/promises";
5
- import { setTimeout } from "node:timers/promises";
6
- //#region src/services/github/get-copilot-token.ts
7
- const getCopilotToken = async () => {
8
- const response = await fetch(`${getGitHubApiBaseUrl()}/copilot_internal/v2/token`, { headers: githubHeaders(state) });
9
- if (!response.ok) {
10
- const errorText = await response.clone().text();
11
- consola.error("Failed to get Copilot token response body", errorText);
12
- throw new HTTPError("Failed to get Copilot token", response);
13
- }
14
- return await response.json();
15
- };
16
- //#endregion
17
- //#region src/services/github/get-device-code.ts
18
- async function getDeviceCode() {
19
- const { clientId, headers, scope } = getOauthAppConfig();
20
- const { deviceCodeUrl } = getOauthUrls();
21
- const response = await fetch(deviceCodeUrl, {
22
- method: "POST",
23
- headers,
24
- body: JSON.stringify({
25
- client_id: clientId,
26
- scope
27
- })
28
- });
29
- if (!response.ok) throw new HTTPError("Failed to get device code", response);
30
- return await response.json();
31
- }
32
- //#endregion
33
- //#region src/services/github/get-user.ts
34
- async function getGitHubUser(githubToken) {
35
- const resolvedGithubToken = githubToken ?? state.githubToken;
36
- if (!resolvedGithubToken) throw new Error("GitHub token not found");
37
- const authState = {
38
- ...state,
39
- githubToken: resolvedGithubToken
40
- };
41
- const response = await fetch(`${getGitHubApiBaseUrl()}/user`, { headers: githubUserHeaders(authState) });
42
- if (!response.ok) throw new HTTPError("Failed to get GitHub user", response);
43
- return await response.json();
44
- }
45
- //#endregion
46
- //#region src/services/github/poll-access-token.ts
47
- async function pollAccessToken(deviceCode) {
48
- const { clientId, headers } = getOauthAppConfig();
49
- const { accessTokenUrl } = getOauthUrls();
50
- const sleepDuration = (deviceCode.interval + 1) * 1e3;
51
- consola.debug(`Polling access token with interval of ${sleepDuration}ms`);
52
- while (true) {
53
- const response = await fetch(accessTokenUrl, {
54
- method: "POST",
55
- headers,
56
- body: JSON.stringify({
57
- client_id: clientId,
58
- device_code: deviceCode.device_code,
59
- grant_type: "urn:ietf:params:oauth:grant-type:device_code"
60
- })
61
- });
62
- if (!response.ok) {
63
- await sleep(sleepDuration);
64
- consola.error("Failed to poll access token:", await response.text());
65
- continue;
66
- }
67
- const json = await response.json();
68
- consola.debug("Polling access token response:", json);
69
- const { access_token } = json;
70
- if (access_token) return access_token;
71
- else await sleep(sleepDuration);
72
- }
73
- }
74
- //#endregion
75
- //#region src/lib/token.ts
76
- let copilotRefreshLoopController = null;
77
- const stopCopilotRefreshLoop = () => {
78
- if (!copilotRefreshLoopController) return;
79
- copilotRefreshLoopController.abort();
80
- copilotRefreshLoopController = null;
81
- };
82
- const readGithubToken = () => fs.readFile(PATHS.GITHUB_TOKEN_PATH, "utf8");
83
- const writeGithubToken = (token) => fs.writeFile(PATHS.GITHUB_TOKEN_PATH, token);
84
- const setupCopilotToken = async () => {
85
- if (isOpencodeOauthApp()) {
86
- if (!state.githubToken) throw new Error(`opencode token not found`);
87
- state.copilotToken = state.githubToken;
88
- consola.debug("GitHub Copilot token set from opencode auth token");
89
- if (state.showToken) consola.info("Copilot token:", state.copilotToken);
90
- stopCopilotRefreshLoop();
91
- return;
92
- }
93
- const { token, refresh_in } = await getCopilotToken();
94
- state.copilotToken = token;
95
- consola.debug("GitHub Copilot Token fetched successfully!");
96
- if (state.showToken) consola.info("Copilot token:", token);
97
- stopCopilotRefreshLoop();
98
- const controller = new AbortController();
99
- copilotRefreshLoopController = controller;
100
- runCopilotRefreshLoop(refresh_in, controller.signal).catch(() => {
101
- consola.warn("Copilot token refresh loop stopped");
102
- }).finally(() => {
103
- if (copilotRefreshLoopController === controller) copilotRefreshLoopController = null;
104
- });
105
- };
106
- const REFRESH_POLL_INTERVAL_MS = 15e3;
107
- const EARLY_REFRESH_BUFFER_MS = 6e4;
108
- const RETRY_REFRESH_DELAY_MS = 15e3;
109
- const MIN_REFRESH_DELAY_MS = 1e3;
110
- const getRefreshDeadlineMs = (refreshIn, nowMs = Date.now()) => nowMs + Math.max(refreshIn * 1e3 - EARLY_REFRESH_BUFFER_MS, MIN_REFRESH_DELAY_MS);
111
- const getRefreshPollDelayMs = (refreshAtMs, nowMs = Date.now()) => Math.min(Math.max(refreshAtMs - nowMs, 0), REFRESH_POLL_INTERVAL_MS);
112
- const runCopilotRefreshLoop = async (refreshIn, signal) => {
113
- let refreshAtMs = getRefreshDeadlineMs(refreshIn);
114
- while (!signal.aborted) {
115
- const nextDelayMs = getRefreshPollDelayMs(refreshAtMs);
116
- if (nextDelayMs > 0) {
117
- await setTimeout(nextDelayMs, void 0, { signal });
118
- continue;
119
- }
120
- consola.debug("Refreshing Copilot token");
121
- try {
122
- const { token, refresh_in } = await getCopilotToken();
123
- state.copilotToken = token;
124
- refreshAtMs = getRefreshDeadlineMs(refresh_in);
125
- consola.debug("Copilot token refreshed");
126
- if (state.showToken) consola.info("Refreshed Copilot token:", token);
127
- } catch (error) {
128
- consola.error("Failed to refresh Copilot token:", error);
129
- refreshAtMs = Date.now() + RETRY_REFRESH_DELAY_MS;
130
- consola.warn(`Retrying Copilot token refresh in ${RETRY_REFRESH_DELAY_MS / 1e3}s`);
131
- }
132
- }
133
- };
134
- async function setupGitHubToken(options) {
135
- try {
136
- const githubToken = await readGithubToken();
137
- if (githubToken && !options?.force) {
138
- state.githubToken = githubToken;
139
- if (state.showToken) consola.info("GitHub token:", githubToken);
140
- await logUser();
141
- return;
142
- }
143
- consola.info("Not logged in, getting new access token");
144
- const response = await getDeviceCode();
145
- consola.debug("Device code response:", response);
146
- consola.info(`Please enter the code "${response.user_code}" in ${response.verification_uri}`);
147
- const token = await pollAccessToken(response);
148
- await writeGithubToken(token);
149
- state.githubToken = token;
150
- if (state.showToken) consola.info("GitHub token:", token);
151
- await logUser();
152
- } catch (error) {
153
- if (error instanceof HTTPError) {
154
- consola.error("Failed to get GitHub token:", await error.response.json());
155
- throw error;
156
- }
157
- consola.error("Failed to get GitHub token:", error);
158
- throw error;
159
- }
160
- }
161
- async function logUser() {
162
- const user = await getGitHubUser();
163
- state.userName = user.login;
164
- consola.info(`Logged in as ${user.login}`);
165
- state.copilotApiUrl = (await getCopilotUsage()).endpoints.api;
166
- }
167
- //#endregion
168
- export { setupCopilotToken as n, setupGitHubToken as r, logUser as t };
169
-
170
- //# sourceMappingURL=token-Dj8XsAxn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-Dj8XsAxn.js","names":["delay"],"sources":["../src/services/github/get-copilot-token.ts","../src/services/github/get-device-code.ts","../src/services/github/get-user.ts","../src/services/github/poll-access-token.ts","../src/lib/token.ts"],"sourcesContent":["import consola from \"consola\"\n\nimport { getGitHubApiBaseUrl, githubHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const getCopilotToken = async () => {\n const response = await fetch(\n `${getGitHubApiBaseUrl()}/copilot_internal/v2/token`,\n {\n headers: githubHeaders(state),\n },\n )\n\n if (!response.ok) {\n const errorText = await response.clone().text()\n consola.error(\"Failed to get Copilot token response body\", errorText)\n\n throw new HTTPError(\"Failed to get Copilot token\", response)\n }\n\n return (await response.json()) as GetCopilotTokenResponse\n}\n\n// Trimmed for the sake of simplicity\ninterface GetCopilotTokenResponse {\n expires_at: number\n refresh_in: number\n token: string\n}\n","import { getOauthAppConfig, getOauthUrls } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\n\nexport async function getDeviceCode(): Promise<DeviceCodeResponse> {\n const { clientId, headers, scope } = getOauthAppConfig()\n const { deviceCodeUrl } = getOauthUrls()\n\n const response = await fetch(deviceCodeUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n client_id: clientId,\n scope,\n }),\n })\n\n if (!response.ok) throw new HTTPError(\"Failed to get device code\", response)\n\n return (await response.json()) as DeviceCodeResponse\n}\n\nexport interface DeviceCodeResponse {\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n}\n","import { getGitHubApiBaseUrl, githubUserHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport async function getGitHubUser(githubToken?: string) {\n const resolvedGithubToken = githubToken ?? state.githubToken\n if (!resolvedGithubToken) {\n throw new Error(\"GitHub token not found\")\n }\n\n const authState = { ...state, githubToken: resolvedGithubToken }\n const response = await fetch(`${getGitHubApiBaseUrl()}/user`, {\n headers: githubUserHeaders(authState),\n })\n\n if (!response.ok) throw new HTTPError(\"Failed to get GitHub user\", response)\n\n return (await response.json()) as GithubUserResponse\n}\n\n// Trimmed for the sake of simplicity\ninterface GithubUserResponse {\n login: string\n}\n","import consola from \"consola\"\n\nimport { getOauthAppConfig, getOauthUrls } from \"~/lib/api-config\"\nimport { sleep } from \"~/lib/utils\"\n\nimport type { DeviceCodeResponse } from \"./get-device-code\"\n\nexport async function pollAccessToken(\n deviceCode: DeviceCodeResponse,\n): Promise<string> {\n const { clientId, headers } = getOauthAppConfig()\n const { accessTokenUrl } = getOauthUrls()\n\n // Interval is in seconds, we need to multiply by 1000 to get milliseconds\n // I'm also adding another second, just to be safe\n const sleepDuration = (deviceCode.interval + 1) * 1000\n consola.debug(`Polling access token with interval of ${sleepDuration}ms`)\n\n while (true) {\n const response = await fetch(accessTokenUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n client_id: clientId,\n device_code: deviceCode.device_code,\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n }),\n })\n\n if (!response.ok) {\n await sleep(sleepDuration)\n consola.error(\"Failed to poll access token:\", await response.text())\n\n continue\n }\n\n const json = await response.json()\n consola.debug(\"Polling access token response:\", json)\n\n const { access_token } = json as AccessTokenResponse\n\n if (access_token) {\n return access_token\n } else {\n await sleep(sleepDuration)\n }\n }\n}\n\ninterface AccessTokenResponse {\n access_token: string\n token_type: string\n scope: string\n}\n","import consola from \"consola\"\nimport fs from \"node:fs/promises\"\nimport { setTimeout as delay } from \"node:timers/promises\"\n\nimport { isOpencodeOauthApp } from \"~/lib/api-config\"\nimport { PATHS } from \"~/lib/paths\"\nimport { getCopilotToken } from \"~/services/github/get-copilot-token\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { getDeviceCode } from \"~/services/github/get-device-code\"\nimport { getGitHubUser } from \"~/services/github/get-user\"\nimport { pollAccessToken } from \"~/services/github/poll-access-token\"\n\nimport { HTTPError } from \"./error\"\nimport { state } from \"./state\"\n\nlet copilotRefreshLoopController: AbortController | null = null\n\nexport const stopCopilotRefreshLoop = () => {\n if (!copilotRefreshLoopController) {\n return\n }\n\n copilotRefreshLoopController.abort()\n copilotRefreshLoopController = null\n}\n\nconst readGithubToken = () => fs.readFile(PATHS.GITHUB_TOKEN_PATH, \"utf8\")\n\nconst writeGithubToken = (token: string) =>\n fs.writeFile(PATHS.GITHUB_TOKEN_PATH, token)\n\nexport const setupCopilotToken = async () => {\n if (isOpencodeOauthApp()) {\n if (!state.githubToken) throw new Error(`opencode token not found`)\n\n state.copilotToken = state.githubToken\n\n consola.debug(\"GitHub Copilot token set from opencode auth token\")\n if (state.showToken) {\n consola.info(\"Copilot token:\", state.copilotToken)\n }\n\n stopCopilotRefreshLoop()\n return\n }\n\n const { token, refresh_in } = await getCopilotToken()\n state.copilotToken = token\n\n // Display the Copilot token to the screen\n consola.debug(\"GitHub Copilot Token fetched successfully!\")\n if (state.showToken) {\n consola.info(\"Copilot token:\", token)\n }\n\n stopCopilotRefreshLoop()\n\n const controller = new AbortController()\n copilotRefreshLoopController = controller\n\n runCopilotRefreshLoop(refresh_in, controller.signal)\n .catch(() => {\n consola.warn(\"Copilot token refresh loop stopped\")\n })\n .finally(() => {\n if (copilotRefreshLoopController === controller) {\n copilotRefreshLoopController = null\n }\n })\n}\n\nconst REFRESH_POLL_INTERVAL_MS = 15_000\nconst EARLY_REFRESH_BUFFER_MS = 60_000\nconst RETRY_REFRESH_DELAY_MS = 15_000\nconst MIN_REFRESH_DELAY_MS = 1_000\n\nexport const getRefreshDeadlineMs = (\n refreshIn: number,\n nowMs: number = Date.now(),\n) =>\n nowMs\n + Math.max(refreshIn * 1000 - EARLY_REFRESH_BUFFER_MS, MIN_REFRESH_DELAY_MS)\n\n// Use short wall-clock chunks so the next wake after sleep notices elapsed time\n// quickly, without relying on the server's absolute expires_at matching local time.\nexport const getRefreshPollDelayMs = (\n refreshAtMs: number,\n nowMs: number = Date.now(),\n) => Math.min(Math.max(refreshAtMs - nowMs, 0), REFRESH_POLL_INTERVAL_MS)\n\nconst runCopilotRefreshLoop = async (\n refreshIn: number,\n signal: AbortSignal,\n) => {\n let refreshAtMs = getRefreshDeadlineMs(refreshIn)\n\n while (!signal.aborted) {\n const nextDelayMs = getRefreshPollDelayMs(refreshAtMs)\n if (nextDelayMs > 0) {\n await delay(nextDelayMs, undefined, { signal })\n continue\n }\n\n consola.debug(\"Refreshing Copilot token\")\n\n try {\n const { token, refresh_in } = await getCopilotToken()\n state.copilotToken = token\n refreshAtMs = getRefreshDeadlineMs(refresh_in)\n consola.debug(\"Copilot token refreshed\")\n if (state.showToken) {\n consola.info(\"Refreshed Copilot token:\", token)\n }\n } catch (error) {\n consola.error(\"Failed to refresh Copilot token:\", error)\n refreshAtMs = Date.now() + RETRY_REFRESH_DELAY_MS\n consola.warn(\n `Retrying Copilot token refresh in ${RETRY_REFRESH_DELAY_MS / 1000}s`,\n )\n }\n }\n}\n\ninterface SetupGitHubTokenOptions {\n force?: boolean\n}\n\nexport async function setupGitHubToken(\n options?: SetupGitHubTokenOptions,\n): Promise<void> {\n try {\n const githubToken = await readGithubToken()\n\n if (githubToken && !options?.force) {\n state.githubToken = githubToken\n if (state.showToken) {\n consola.info(\"GitHub token:\", githubToken)\n }\n await logUser()\n\n return\n }\n\n consola.info(\"Not logged in, getting new access token\")\n const response = await getDeviceCode()\n consola.debug(\"Device code response:\", response)\n\n consola.info(\n `Please enter the code \"${response.user_code}\" in ${response.verification_uri}`,\n )\n\n const token = await pollAccessToken(response)\n await writeGithubToken(token)\n state.githubToken = token\n\n if (state.showToken) {\n consola.info(\"GitHub token:\", token)\n }\n await logUser()\n } catch (error) {\n if (error instanceof HTTPError) {\n consola.error(\"Failed to get GitHub token:\", await error.response.json())\n throw error\n }\n\n consola.error(\"Failed to get GitHub token:\", error)\n throw error\n }\n}\n\nexport async function logUser() {\n const user = await getGitHubUser()\n state.userName = user.login\n consola.info(`Logged in as ${user.login}`)\n\n const copilotUser = await getCopilotUsage()\n state.copilotApiUrl = copilotUser.endpoints.api\n}\n"],"mappings":"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"}