@jsonstudio/rcc 0.89.683 → 0.89.912
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/dist/build-info.js +2 -2
- package/dist/cli.js +164 -116
- package/dist/cli.js.map +1 -1
- package/dist/client/anthropic/anthropic-protocol-client.js +42 -1
- package/dist/client/anthropic/anthropic-protocol-client.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +4 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/commands/camoufox-backfill.d.ts +2 -0
- package/dist/commands/camoufox-backfill.js +33 -0
- package/dist/commands/camoufox-backfill.js.map +1 -0
- package/dist/commands/camoufox-fp.d.ts +2 -0
- package/dist/commands/camoufox-fp.js +86 -0
- package/dist/commands/camoufox-fp.js.map +1 -0
- package/dist/commands/oauth.d.ts +2 -0
- package/dist/commands/oauth.js +170 -0
- package/dist/commands/oauth.js.map +1 -0
- package/dist/commands/provider-update.js +439 -2
- package/dist/commands/provider-update.js.map +1 -1
- package/dist/commands/quota-status.d.ts +2 -0
- package/dist/commands/quota-status.js +80 -0
- package/dist/commands/quota-status.js.map +1 -0
- package/dist/commands/token-daemon.js +12 -1
- package/dist/commands/token-daemon.js.map +1 -1
- package/dist/config/provider-v2-loader.d.ts +16 -0
- package/dist/config/provider-v2-loader.js +84 -0
- package/dist/config/provider-v2-loader.js.map +1 -0
- package/dist/config/routecodex-config-loader.js +27 -4
- package/dist/config/routecodex-config-loader.js.map +1 -1
- package/dist/config/system-prompts/codex-cli.txt +1 -0
- package/dist/config/virtual-router-builder.d.ts +9 -0
- package/dist/config/virtual-router-builder.js +34 -0
- package/dist/config/virtual-router-builder.js.map +1 -0
- package/dist/config/virtual-router-types.d.ts +25 -0
- package/dist/config/virtual-router-types.js +30 -0
- package/dist/config/virtual-router-types.js.map +1 -0
- package/dist/manager/index.d.ts +10 -0
- package/dist/manager/index.js +27 -0
- package/dist/manager/index.js.map +1 -0
- package/dist/manager/modules/health/index.d.ts +22 -0
- package/dist/manager/modules/health/index.js +82 -0
- package/dist/manager/modules/health/index.js.map +1 -0
- package/dist/manager/modules/quota/index.d.ts +57 -0
- package/dist/manager/modules/quota/index.js +426 -0
- package/dist/manager/modules/quota/index.js.map +1 -0
- package/dist/manager/modules/routing/index.d.ts +17 -0
- package/dist/manager/modules/routing/index.js +61 -0
- package/dist/manager/modules/routing/index.js.map +1 -0
- package/dist/manager/modules/token/index.d.ts +10 -0
- package/dist/manager/modules/token/index.js +58 -0
- package/dist/manager/modules/token/index.js.map +1 -0
- package/dist/manager/storage/base-store.d.ts +6 -0
- package/dist/manager/storage/base-store.js +2 -0
- package/dist/manager/storage/base-store.js.map +1 -0
- package/dist/manager/storage/file-store.d.ts +25 -0
- package/dist/manager/storage/file-store.js +117 -0
- package/dist/manager/storage/file-store.js.map +1 -0
- package/dist/manager/types.d.ts +9 -0
- package/dist/manager/types.js +2 -0
- package/dist/manager/types.js.map +1 -0
- package/dist/message-center/index.d.ts +5 -0
- package/dist/message-center/index.js +6 -0
- package/dist/message-center/index.js.map +1 -0
- package/dist/message-center/message-center.d.ts +93 -0
- package/dist/message-center/message-center.js +189 -0
- package/dist/message-center/message-center.js.map +1 -0
- package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -0
- package/dist/providers/auth/antigravity-userinfo-helper.js +102 -0
- package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/iflow-cookie-auth.d.ts +27 -0
- package/dist/providers/auth/iflow-cookie-auth.js +209 -0
- package/dist/providers/auth/iflow-cookie-auth.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle.js +29 -22
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/token-scanner/index.js +16 -1
- package/dist/providers/auth/token-scanner/index.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.d.ts +16 -0
- package/dist/providers/core/config/camoufox-launcher.js +314 -0
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -0
- package/dist/providers/core/config/oauth-flows.d.ts +9 -0
- package/dist/providers/core/config/oauth-flows.js +50 -19
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.d.ts +6 -0
- package/dist/providers/core/config/provider-oauth-configs.js +12 -0
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +26 -3
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/antigravity-quota-client.d.ts +10 -0
- package/dist/providers/core/runtime/antigravity-quota-client.js +88 -0
- package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -0
- package/dist/providers/core/runtime/base-provider.d.ts +2 -1
- package/dist/providers/core/runtime/base-provider.js +93 -34
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +42 -10
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.js +24 -0
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +0 -3
- package/dist/providers/core/runtime/http-transport-provider.js +32 -136
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/provider-error-classifier.js +18 -10
- package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
- package/dist/providers/core/runtime/rate-limit-manager.d.ts +6 -0
- package/dist/providers/core/runtime/rate-limit-manager.js +23 -0
- package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
- package/dist/providers/core/runtime/responses-provider.js +17 -19
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -0
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +3 -2
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/strategies/oauth-device-flow.d.ts +1 -0
- package/dist/providers/core/strategies/oauth-device-flow.js +3 -2
- package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
- package/dist/providers/core/strategies/oauth-hybrid-flow.d.ts +1 -0
- package/dist/providers/core/strategies/oauth-hybrid-flow.js +3 -2
- package/dist/providers/core/strategies/oauth-hybrid-flow.js.map +1 -1
- package/dist/providers/core/utils/http-client.js +43 -1
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/providers/mock/mock-provider-runtime.js +4 -4
- package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
- package/dist/providers/profile/provider-profile-loader.js +13 -1
- package/dist/providers/profile/provider-profile-loader.js.map +1 -1
- package/dist/providers/profile/provider-profile.d.ts +5 -0
- package/dist/scripts/camoufox/gen-fingerprint-env.py +171 -0
- package/dist/scripts/camoufox/launch-auth.mjs +617 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.d.ts +3 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +138 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.d.ts +3 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +166 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.d.ts +3 -0
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +109 -0
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/status-handler.d.ts +3 -0
- package/dist/server/runtime/http-server/daemon-admin/status-handler.js +43 -0
- package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +19 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.js +27 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -0
- package/dist/server/runtime/http-server/executor-provider.d.ts +1 -0
- package/dist/server/runtime/http-server/executor-provider.js +26 -0
- package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.d.ts +16 -0
- package/dist/server/runtime/http-server/executor-response.js +164 -0
- package/dist/server/runtime/http-server/executor-response.js.map +1 -0
- package/dist/server/runtime/http-server/index.d.ts +6 -0
- package/dist/server/runtime/http-server/index.js +121 -53
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +3 -0
- package/dist/server/runtime/http-server/request-executor.js +73 -21
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.d.ts +5 -0
- package/dist/server/runtime/http-server/routes.js +45 -1
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/types.d.ts +1 -0
- package/dist/server/utils/client-connection-state.d.ts +8 -0
- package/dist/server/utils/client-connection-state.js +52 -0
- package/dist/server/utils/client-connection-state.js.map +1 -0
- package/dist/server/utils/request-id-manager.js +21 -3
- package/dist/server/utils/request-id-manager.js.map +1 -1
- package/dist/token-daemon/history-store.d.ts +2 -0
- package/dist/token-daemon/history-store.js +6 -2
- package/dist/token-daemon/history-store.js.map +1 -1
- package/dist/token-daemon/index.js +36 -5
- package/dist/token-daemon/index.js.map +1 -1
- package/dist/token-daemon/leader-lock.d.ts +11 -0
- package/dist/token-daemon/leader-lock.js +79 -0
- package/dist/token-daemon/leader-lock.js.map +1 -0
- package/dist/token-daemon/message-bus-integrator.d.ts +98 -0
- package/dist/token-daemon/message-bus-integrator.js +144 -0
- package/dist/token-daemon/message-bus-integrator.js.map +1 -0
- package/dist/token-daemon/provider-registry.d.ts +22 -0
- package/dist/token-daemon/provider-registry.js +201 -0
- package/dist/token-daemon/provider-registry.js.map +1 -0
- package/dist/token-daemon/token-daemon.d.ts +8 -0
- package/dist/token-daemon/token-daemon.js +196 -11
- package/dist/token-daemon/token-daemon.js.map +1 -1
- package/dist/token-portal/local-token-portal.d.ts +1 -0
- package/dist/token-portal/local-token-portal.js +18 -0
- package/dist/token-portal/local-token-portal.js.map +1 -1
- package/dist/token-portal/render.js +1 -0
- package/dist/token-portal/render.js.map +1 -1
- package/dist/tools/error-log.d.ts +31 -0
- package/dist/tools/error-log.js +117 -0
- package/dist/tools/error-log.js.map +1 -0
- package/dist/tools/stats-request-events.d.ts +2 -0
- package/dist/tools/stats-request-events.js +16 -0
- package/dist/tools/stats-request-events.js.map +1 -0
- package/dist/tools/stats-usage.d.ts +31 -0
- package/dist/tools/stats-usage.js +206 -0
- package/dist/tools/stats-usage.js.map +1 -0
- package/package.json +9 -4
- package/scripts/analyze-codex-error-failures.mjs +111 -0
- package/scripts/analyze-usage-estimate.mjs +240 -0
- package/scripts/camoufox/gen-fingerprint-env.py +171 -0
- package/scripts/camoufox/launch-auth.mjs +617 -0
- package/scripts/classify-codex-samples.mjs +251 -0
- package/scripts/cleanup-codex-error-samples.mjs +88 -0
- package/scripts/compare-codex-rccx.mjs +268 -0
- package/scripts/copy-compat-assets.mjs +18 -0
- package/scripts/install-release.sh +1 -1
- package/scripts/local-replay-openai-response.mjs +1 -2
- package/scripts/pack-mode.mjs +16 -6
- package/scripts/replay-codex-sample.mjs +24 -2
- package/scripts/responses-compare-server.mjs +119 -0
- package/scripts/tests/apply-patch-loop.mjs +266 -7
- package/scripts/tests/exec-command-loop.mjs +165 -0
- package/scripts/tool-classification-report.ts +281 -0
- package/scripts/verification/samples/openai-chat-list-local-files.json +1 -1
- package/scripts/verify-apply-patch.mjs +28 -17
- package/scripts/verify-codex-error-samples.mjs +102 -0
- package/scripts/verify-e2e-toolcall.mjs +71 -4
- package/scripts/virtual-router-shadow-v2-real.mjs +143 -0
- package/scripts/virtual-router-shadow-v2.mjs +122 -0
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Antigravity OAuth helper utilities.
|
|
3
3
|
* Mirrors the logic implemented in gcli2api for resolving project metadata.
|
|
4
4
|
*/
|
|
5
|
+
import fs from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
5
8
|
import { logOAuthDebug } from './oauth-logger.js';
|
|
6
9
|
const DEFAULT_ANTIGRAVITY_API_BASE = 'https://daily-cloudcode-pa.sandbox.googleapis.com';
|
|
7
10
|
const DEFAULT_USER_AGENT = 'antigravity/1.11.3 windows/amd64';
|
|
@@ -11,6 +14,29 @@ const METADATA_PAYLOAD = {
|
|
|
11
14
|
pluginType: 'GEMINI'
|
|
12
15
|
};
|
|
13
16
|
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
17
|
+
const expandHome = (p) => {
|
|
18
|
+
if (!p || typeof p !== 'string') {
|
|
19
|
+
return p;
|
|
20
|
+
}
|
|
21
|
+
if (p.startsWith('~/')) {
|
|
22
|
+
const home = process.env.HOME || os.homedir() || '';
|
|
23
|
+
return path.join(home, p.slice(2));
|
|
24
|
+
}
|
|
25
|
+
return p;
|
|
26
|
+
};
|
|
27
|
+
async function readJsonFile(filePath) {
|
|
28
|
+
try {
|
|
29
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
30
|
+
const parsed = raw.trim() ? JSON.parse(raw) : null;
|
|
31
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
14
40
|
const extractProjectId = (value) => {
|
|
15
41
|
if (typeof value === 'string' && value.trim()) {
|
|
16
42
|
return value.trim();
|
|
@@ -35,6 +61,35 @@ const normalizedBase = (base) => {
|
|
|
35
61
|
const candidate = (base && base.trim()) || envBase || DEFAULT_ANTIGRAVITY_API_BASE;
|
|
36
62
|
return candidate.replace(/\/+$/, '');
|
|
37
63
|
};
|
|
64
|
+
function extractAccessTokenFromSnapshot(snapshot) {
|
|
65
|
+
const lower = snapshot.access_token;
|
|
66
|
+
const upper = snapshot.AccessToken;
|
|
67
|
+
const value = typeof lower === 'string'
|
|
68
|
+
? lower
|
|
69
|
+
: typeof upper === 'string'
|
|
70
|
+
? upper
|
|
71
|
+
: undefined;
|
|
72
|
+
if (value && value.trim()) {
|
|
73
|
+
return value.trim();
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
function hasProjectMetadata(snapshot) {
|
|
78
|
+
if (typeof snapshot.project_id === 'string' && snapshot.project_id) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (typeof snapshot.projectId === 'string' && snapshot.projectId) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
const projects = snapshot.projects;
|
|
85
|
+
if (Array.isArray(projects) && projects.length > 0) {
|
|
86
|
+
const hasProject = projects.some((proj) => proj && typeof proj === 'object' && typeof proj.projectId === 'string');
|
|
87
|
+
if (hasProject) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
38
93
|
async function tryLoadCodeAssist(apiBase, headers) {
|
|
39
94
|
const requestUrl = `${apiBase}/v1internal:loadCodeAssist`;
|
|
40
95
|
const response = await fetch(requestUrl, {
|
|
@@ -130,6 +185,9 @@ export async function fetchAntigravityProjectId(accessToken, apiBase) {
|
|
|
130
185
|
return undefined;
|
|
131
186
|
}
|
|
132
187
|
}
|
|
188
|
+
export function buildAntigravityHeaders(accessToken) {
|
|
189
|
+
return buildHeaders(accessToken);
|
|
190
|
+
}
|
|
133
191
|
export function resolveAntigravityApiBase(explicit) {
|
|
134
192
|
return normalizedBase(explicit);
|
|
135
193
|
}
|
|
@@ -137,4 +195,48 @@ export const ANTIGRAVITY_HELPER_DEFAULTS = {
|
|
|
137
195
|
apiBase: DEFAULT_ANTIGRAVITY_API_BASE,
|
|
138
196
|
userAgent: DEFAULT_USER_AGENT
|
|
139
197
|
};
|
|
198
|
+
export async function ensureAntigravityTokenProjectMetadata(tokenFilePath, apiBaseHint) {
|
|
199
|
+
const resolved = expandHome(tokenFilePath);
|
|
200
|
+
if (!resolved) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const snapshot = await readJsonFile(resolved);
|
|
204
|
+
if (!snapshot) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
if (hasProjectMetadata(snapshot)) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
const accessToken = extractAccessTokenFromSnapshot(snapshot);
|
|
211
|
+
if (!accessToken) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
const projectId = await fetchAntigravityProjectId(accessToken, apiBaseHint);
|
|
215
|
+
if (!projectId) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
snapshot.project_id = projectId;
|
|
219
|
+
snapshot.projectId = projectId;
|
|
220
|
+
const projectsNode = snapshot.projects;
|
|
221
|
+
if (!Array.isArray(projectsNode) || projectsNode.length === 0) {
|
|
222
|
+
snapshot.projects = [{ projectId }];
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const exists = projectsNode.some((proj) => proj && typeof proj === 'object' && typeof proj.projectId === 'string'
|
|
226
|
+
? proj.projectId === projectId
|
|
227
|
+
: false);
|
|
228
|
+
if (!exists) {
|
|
229
|
+
projectsNode.push({ projectId });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
await fs.writeFile(resolved, `${JSON.stringify(snapshot, null, 2)}\n`, 'utf-8');
|
|
234
|
+
logOAuthDebug(`[OAuth] Antigravity: ensured project_id=${projectId} for ${resolved}`);
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
logOAuthDebug(`[OAuth] Antigravity: failed to persist project_id for ${resolved} - ${error instanceof Error ? error.message : String(error)}`);
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
140
242
|
//# sourceMappingURL=antigravity-userinfo-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"antigravity-userinfo-helper.js","sourceRoot":"","sources":["../../../src/providers/auth/antigravity-userinfo-helper.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"antigravity-userinfo-helper.js","sourceRoot":"","sources":["../../../src/providers/auth/antigravity-userinfo-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iFlow Cookie-based Authentication Provider
|
|
3
|
+
*
|
|
4
|
+
* 使用浏览器导出的 iFlow Cookie(BXAuth)获取并维护 API Key,避免频繁走 OAuth 授权码流程。
|
|
5
|
+
* 请求阶段始终以 `Authorization: Bearer <apiKey>` 调用 https://apis.iflow.cn/v1/chat/completions。
|
|
6
|
+
*/
|
|
7
|
+
import type { IAuthProvider, AuthStatus } from './auth-interface.js';
|
|
8
|
+
import type { UnknownObject } from '../../modules/pipeline/types/common-types.js';
|
|
9
|
+
export declare class IflowCookieAuthProvider implements IAuthProvider {
|
|
10
|
+
readonly type: "apikey";
|
|
11
|
+
private readonly config;
|
|
12
|
+
private status;
|
|
13
|
+
private isInitialized;
|
|
14
|
+
private apiKey;
|
|
15
|
+
private expireTime;
|
|
16
|
+
private email;
|
|
17
|
+
constructor(config: UnknownObject);
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
buildHeaders(): Record<string, string>;
|
|
20
|
+
validateCredentials(): Promise<boolean>;
|
|
21
|
+
cleanup(): Promise<void>;
|
|
22
|
+
getStatus(): AuthStatus;
|
|
23
|
+
private resolveCookie;
|
|
24
|
+
private fetchApiKeyInfo;
|
|
25
|
+
private refreshApiKey;
|
|
26
|
+
private updateStatus;
|
|
27
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iFlow Cookie-based Authentication Provider
|
|
3
|
+
*
|
|
4
|
+
* 使用浏览器导出的 iFlow Cookie(BXAuth)获取并维护 API Key,避免频繁走 OAuth 授权码流程。
|
|
5
|
+
* 请求阶段始终以 `Authorization: Bearer <apiKey>` 调用 https://apis.iflow.cn/v1/chat/completions。
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import fsPromises from 'fs/promises';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
function asNonEmptyString(value) {
|
|
11
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : '';
|
|
12
|
+
}
|
|
13
|
+
function expandHome(p) {
|
|
14
|
+
if (!p) {
|
|
15
|
+
return p;
|
|
16
|
+
}
|
|
17
|
+
if (p.startsWith('~/')) {
|
|
18
|
+
const home = process.env.HOME || '';
|
|
19
|
+
return p.replace(/^~\//, `${home}/`);
|
|
20
|
+
}
|
|
21
|
+
return p;
|
|
22
|
+
}
|
|
23
|
+
export class IflowCookieAuthProvider {
|
|
24
|
+
type = 'apikey';
|
|
25
|
+
config;
|
|
26
|
+
status;
|
|
27
|
+
isInitialized = false;
|
|
28
|
+
apiKey = null;
|
|
29
|
+
expireTime = null;
|
|
30
|
+
email = null;
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this.config = (config || {});
|
|
33
|
+
this.status = {
|
|
34
|
+
isAuthenticated: false,
|
|
35
|
+
isValid: false,
|
|
36
|
+
lastValidated: 0
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async initialize() {
|
|
40
|
+
try {
|
|
41
|
+
const cookie = await this.resolveCookie();
|
|
42
|
+
if (!cookie) {
|
|
43
|
+
this.updateStatus(false, false, 'cookie missing');
|
|
44
|
+
throw new Error('IflowCookieAuthProvider: cookie not provided');
|
|
45
|
+
}
|
|
46
|
+
// 对齐 CLIProxyAPI 的流程:先获取现有 API Key 信息,再刷新一次确保最新。
|
|
47
|
+
const initial = await this.fetchApiKeyInfo(cookie);
|
|
48
|
+
const name = asNonEmptyString(initial.name);
|
|
49
|
+
const keyData = await this.refreshApiKey(cookie, name || initial.name || '');
|
|
50
|
+
const apiKey = asNonEmptyString(keyData.apiKey);
|
|
51
|
+
if (!apiKey) {
|
|
52
|
+
this.updateStatus(false, false, 'api key missing from cookie flow');
|
|
53
|
+
throw new Error('IflowCookieAuthProvider: missing api key in response');
|
|
54
|
+
}
|
|
55
|
+
this.apiKey = apiKey;
|
|
56
|
+
this.expireTime = asNonEmptyString(keyData.expireTime);
|
|
57
|
+
this.email = asNonEmptyString(keyData.name);
|
|
58
|
+
this.updateStatus(true, true);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const msg = error instanceof Error ? error.message : String(error || '');
|
|
62
|
+
this.updateStatus(false, false, msg);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
this.isInitialized = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
buildHeaders() {
|
|
70
|
+
if (!this.isInitialized || !this.apiKey) {
|
|
71
|
+
throw new Error('IflowCookieAuthProvider not initialized');
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async validateCredentials() {
|
|
78
|
+
if (!this.isInitialized || !this.apiKey) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// 简单校验:存在 apiKey 即视为有效;过期判断由服务端和上层重试/刷新策略负责。
|
|
82
|
+
this.updateStatus(true, true);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
async cleanup() {
|
|
86
|
+
this.apiKey = null;
|
|
87
|
+
this.expireTime = null;
|
|
88
|
+
this.email = null;
|
|
89
|
+
this.isInitialized = false;
|
|
90
|
+
this.updateStatus(false, false, 'cleanup');
|
|
91
|
+
}
|
|
92
|
+
getStatus() {
|
|
93
|
+
return { ...this.status };
|
|
94
|
+
}
|
|
95
|
+
// ---- helpers ----
|
|
96
|
+
async resolveCookie() {
|
|
97
|
+
// 1) 显式 cookie 字段
|
|
98
|
+
const direct = asNonEmptyString(this.config.cookie);
|
|
99
|
+
if (direct) {
|
|
100
|
+
return direct;
|
|
101
|
+
}
|
|
102
|
+
// 2) cookieFile / tokenFile 指向的文件
|
|
103
|
+
const fileCandidates = [];
|
|
104
|
+
const cookieFile = asNonEmptyString(this.config.cookieFile);
|
|
105
|
+
if (cookieFile) {
|
|
106
|
+
fileCandidates.push(cookieFile);
|
|
107
|
+
}
|
|
108
|
+
const tokenFile = asNonEmptyString(this.config.tokenFile);
|
|
109
|
+
if (tokenFile) {
|
|
110
|
+
fileCandidates.push(tokenFile);
|
|
111
|
+
}
|
|
112
|
+
for (const candidate of fileCandidates) {
|
|
113
|
+
const filePath = expandHome(candidate);
|
|
114
|
+
try {
|
|
115
|
+
const txt = await fsPromises.readFile(filePath, 'utf8');
|
|
116
|
+
const content = txt.trim();
|
|
117
|
+
if (content) {
|
|
118
|
+
return content;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// ignore and try next candidate
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// 3) 环境变量 IFLOW_COOKIE
|
|
126
|
+
const envCookie = asNonEmptyString(process.env.IFLOW_COOKIE);
|
|
127
|
+
if (envCookie) {
|
|
128
|
+
return envCookie;
|
|
129
|
+
}
|
|
130
|
+
return '';
|
|
131
|
+
}
|
|
132
|
+
async fetchApiKeyInfo(cookie) {
|
|
133
|
+
const endpoint = 'https://platform.iflow.cn/api/openapi/apikey';
|
|
134
|
+
const headers = {
|
|
135
|
+
Cookie: cookie,
|
|
136
|
+
Accept: 'application/json, text/plain, */*',
|
|
137
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
|
|
138
|
+
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
139
|
+
Connection: 'keep-alive'
|
|
140
|
+
};
|
|
141
|
+
const resp = await fetch(endpoint, {
|
|
142
|
+
method: 'GET',
|
|
143
|
+
headers
|
|
144
|
+
});
|
|
145
|
+
const bodyText = await resp.text();
|
|
146
|
+
if (!resp.ok) {
|
|
147
|
+
throw new Error(`iflow cookie GET request failed: status=${resp.status} body=${bodyText.slice(0, 200)}`);
|
|
148
|
+
}
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = JSON.parse(bodyText);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error(`iflow cookie GET decode failed: ${error.message || String(error)}`);
|
|
155
|
+
}
|
|
156
|
+
if (!parsed.success || !parsed.data) {
|
|
157
|
+
throw new Error(`iflow cookie GET not successful: ${asNonEmptyString(parsed.message)}`);
|
|
158
|
+
}
|
|
159
|
+
return parsed.data;
|
|
160
|
+
}
|
|
161
|
+
async refreshApiKey(cookie, name) {
|
|
162
|
+
const trimmedName = asNonEmptyString(name);
|
|
163
|
+
if (!trimmedName) {
|
|
164
|
+
// 若缺少 name,则直接重用 fetchApiKeyInfo 的结果
|
|
165
|
+
return await this.fetchApiKeyInfo(cookie);
|
|
166
|
+
}
|
|
167
|
+
const endpoint = 'https://platform.iflow.cn/api/openapi/apikey';
|
|
168
|
+
const headers = {
|
|
169
|
+
Cookie: cookie,
|
|
170
|
+
'Content-Type': 'application/json',
|
|
171
|
+
Accept: 'application/json, text/plain, */*',
|
|
172
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
|
|
173
|
+
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
174
|
+
Connection: 'keep-alive',
|
|
175
|
+
Origin: 'https://platform.iflow.cn',
|
|
176
|
+
Referer: 'https://platform.iflow.cn/'
|
|
177
|
+
};
|
|
178
|
+
const body = JSON.stringify({ name: trimmedName });
|
|
179
|
+
const resp = await fetch(endpoint, {
|
|
180
|
+
method: 'POST',
|
|
181
|
+
headers,
|
|
182
|
+
body
|
|
183
|
+
});
|
|
184
|
+
const bodyText = await resp.text();
|
|
185
|
+
if (!resp.ok) {
|
|
186
|
+
throw new Error(`iflow cookie POST request failed: status=${resp.status} body=${bodyText.slice(0, 200)}`);
|
|
187
|
+
}
|
|
188
|
+
let parsed;
|
|
189
|
+
try {
|
|
190
|
+
parsed = JSON.parse(bodyText);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new Error(`iflow cookie POST decode failed: ${error.message || String(error)}`);
|
|
194
|
+
}
|
|
195
|
+
if (!parsed.success || !parsed.data) {
|
|
196
|
+
throw new Error(`iflow cookie POST not successful: ${asNonEmptyString(parsed.message)}`);
|
|
197
|
+
}
|
|
198
|
+
return parsed.data;
|
|
199
|
+
}
|
|
200
|
+
updateStatus(isAuthenticated, isValid, message) {
|
|
201
|
+
this.status = {
|
|
202
|
+
isAuthenticated,
|
|
203
|
+
isValid,
|
|
204
|
+
lastValidated: Date.now(),
|
|
205
|
+
error: message
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=iflow-cookie-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iflow-cookie-auth.js","sourceRoot":"","sources":["../../../src/providers/auth/iflow-cookie-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AA4BxB,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,uBAAuB;IACzB,IAAI,GAAG,QAAiB,CAAC;IAEjB,MAAM,CAAoB;IACnC,MAAM,CAAa;IACnB,aAAa,GAAG,KAAK,CAAC;IACtB,MAAM,GAAkB,IAAI,CAAC;IAC7B,UAAU,GAAkB,IAAI,CAAC;IACjC,KAAK,GAAkB,IAAI,CAAC;IAEpC,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAAsB,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,iDAAiD;YACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,kCAAkC,CAAC,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,6CAA6C;QAC7C,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,oBAAoB;IAEZ,KAAK,CAAC,aAAa;QACzB,kBAAkB;QAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,kCAAkC;QAClC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,SAAS,EAAE,CAAC;YACd,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACxD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAc;QAC1C,MAAM,QAAQ,GAAG,8CAA8C,CAAC;QAChE,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,mCAAmC;YAC3C,YAAY,EACV,uHAAuH;YACzH,iBAAiB,EAAE,yBAAyB;YAC5C,UAAU,EAAE,YAAY;SACzB,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACjC,MAAM,EAAE,KAAK;YACb,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,CAAC,MAAM,SAAS,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;QAED,IAAI,MAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAwB,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,mCAAoC,KAAe,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,oCAAoC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CACvE,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,IAAY;QACtD,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,qCAAqC;YACrC,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,8CAA8C,CAAC;QAChE,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,MAAM;YACd,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,mCAAmC;YAC3C,YAAY,EACV,uHAAuH;YACzH,iBAAiB,EAAE,yBAAyB;YAC5C,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,4BAA4B;SACtC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAEnD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,4CAA4C,IAAI,CAAC,MAAM,SAAS,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,IAAI,MAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAwB,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,oCAAqC,KAAe,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,qCAAqC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CACxE,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAEO,YAAY,CAAC,eAAwB,EAAE,OAAgB,EAAE,OAAgB;QAC/E,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe;YACf,OAAO;YACP,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createProviderOAuthStrategy, getProviderOAuthConfig } from '../core/config/provider-oauth-configs.js';
|
|
1
|
+
import { createProviderOAuthStrategy, getProviderOAuthConfig, resolveOAuthBrowserPreference } from '../core/config/provider-oauth-configs.js';
|
|
2
2
|
import { OAuthFlowType } from '../core/config/oauth-flows.js';
|
|
3
3
|
import fs from 'fs/promises';
|
|
4
4
|
import fsSync from 'fs';
|
|
@@ -274,13 +274,6 @@ function evaluateTokenState(token, providerType) {
|
|
|
274
274
|
else {
|
|
275
275
|
validAccess = (hasApiKey || hasAccess) && !isExpiredOrNear;
|
|
276
276
|
}
|
|
277
|
-
// 对 gemini-cli / antigravity,缺少 project 元数据视为无效凭证,
|
|
278
|
-
// 行为上等价于 gcli2api 要求凭证里必须有 project_id。
|
|
279
|
-
if (isGeminiCliFamily(providerType) && validAccess) {
|
|
280
|
-
if (!hasGeminiProjectMetadata(token)) {
|
|
281
|
-
validAccess = false;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
277
|
return { hasApiKey, hasAccess, expiresAt, isExpiredOrNear, validAccess };
|
|
285
278
|
}
|
|
286
279
|
function logTokenSnapshot(providerType, token, endpoints) {
|
|
@@ -599,19 +592,21 @@ function logOAuthSetup(providerType, defaults, overrides, endpoints, client, tok
|
|
|
599
592
|
function createStrategy(providerType, overrides, tokenFilePath) {
|
|
600
593
|
return createProviderOAuthStrategy(providerType, overrides, tokenFilePath);
|
|
601
594
|
}
|
|
602
|
-
async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFilePath, openBrowser, forceTokenReset) {
|
|
595
|
+
async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFilePath, openBrowser, forceTokenReset, forceReauth) {
|
|
603
596
|
const execute = async () => {
|
|
604
597
|
let backupFile = null;
|
|
605
598
|
if (forceTokenReset) {
|
|
599
|
+
// 仅做备份,不再删除原始 token 文件,避免在用户中断流程时造成不可恢复的丢失。
|
|
600
|
+
// 对于强制重新授权的场景,ensureValidOAuthToken 会忽略现有 token 状态并直接进入交互式流程。
|
|
606
601
|
backupFile = await backupTokenFile(tokenFilePath);
|
|
607
602
|
}
|
|
608
603
|
try {
|
|
609
604
|
if (providerType === 'iflow') {
|
|
610
|
-
await runIflowAuthorizationSequence(providerType, overrides, tokenFilePath);
|
|
605
|
+
await runIflowAuthorizationSequence(providerType, overrides, tokenFilePath, forceReauth);
|
|
611
606
|
}
|
|
612
607
|
else {
|
|
613
608
|
const strategy = createStrategy(providerType, overrides, tokenFilePath);
|
|
614
|
-
const authed = await strategy.authenticate?.({ openBrowser });
|
|
609
|
+
const authed = await strategy.authenticate?.({ openBrowser, forceReauthorize: forceReauth });
|
|
615
610
|
await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, 'acquired');
|
|
616
611
|
}
|
|
617
612
|
await discardBackupFile(backupFile);
|
|
@@ -642,21 +637,21 @@ async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFil
|
|
|
642
637
|
interactiveTail = queued.then(() => undefined, () => undefined);
|
|
643
638
|
await queued;
|
|
644
639
|
}
|
|
645
|
-
async function runIflowAuthorizationSequence(providerType, overrides, tokenFilePath) {
|
|
640
|
+
async function runIflowAuthorizationSequence(providerType, overrides, tokenFilePath, forceReauth) {
|
|
646
641
|
const authCodeOverrides = { ...overrides, flowType: OAuthFlowType.AUTHORIZATION_CODE };
|
|
647
642
|
try {
|
|
648
|
-
await executeAuthFlow(providerType, authCodeOverrides, tokenFilePath);
|
|
643
|
+
await executeAuthFlow(providerType, authCodeOverrides, tokenFilePath, forceReauth);
|
|
649
644
|
return;
|
|
650
645
|
}
|
|
651
646
|
catch (firstError) {
|
|
652
647
|
logOAuthDebug(`[OAuth] auth_code flow failed: ${firstError instanceof Error ? firstError.message : String(firstError || '')}`);
|
|
653
648
|
}
|
|
654
649
|
const deviceOverrides = { ...overrides, flowType: OAuthFlowType.DEVICE_CODE };
|
|
655
|
-
await executeAuthFlow(providerType, deviceOverrides, tokenFilePath);
|
|
650
|
+
await executeAuthFlow(providerType, deviceOverrides, tokenFilePath, forceReauth);
|
|
656
651
|
}
|
|
657
|
-
async function executeAuthFlow(providerType, overrides, tokenFilePath) {
|
|
652
|
+
async function executeAuthFlow(providerType, overrides, tokenFilePath, forceReauth) {
|
|
658
653
|
const strategy = createStrategy(providerType, overrides, tokenFilePath);
|
|
659
|
-
const authed = await strategy.authenticate?.({ openBrowser: true });
|
|
654
|
+
const authed = await strategy.authenticate?.({ openBrowser: true, forceReauthorize: forceReauth });
|
|
660
655
|
await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, overrides.flowType ? `acquired (${String(overrides.flowType)})` : 'acquired');
|
|
661
656
|
}
|
|
662
657
|
export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
@@ -685,7 +680,7 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
|
685
680
|
const openBrowser = opts.openBrowser ?? envAutoOpen;
|
|
686
681
|
const forceReauth = opts.forceReauthorize === true || String(process.env.ROUTECODEX_OAUTH_FORCE_REAUTH || '0') === '1';
|
|
687
682
|
const runPromise = (async () => {
|
|
688
|
-
const defaults = getProviderOAuthConfig(providerType);
|
|
683
|
+
const defaults = getProviderOAuthConfig(providerType, {});
|
|
689
684
|
const { overrides, endpoints, client } = await buildOverrides(providerType, defaults, auth, openBrowser, tokenFilePath);
|
|
690
685
|
logOAuthSetup(providerType, defaults, overrides, endpoints, client, tokenFilePath, openBrowser, forceReauth);
|
|
691
686
|
const strategy = createStrategy(providerType, overrides, tokenFilePath);
|
|
@@ -747,8 +742,22 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
|
747
742
|
logOAuthDebug('[OAuth] refresh failed, attempting interactive authorization...');
|
|
748
743
|
}
|
|
749
744
|
}
|
|
750
|
-
|
|
751
|
-
|
|
745
|
+
try {
|
|
746
|
+
await runInteractiveAuthorizationFlow(providerType, overrides, tokenFilePath, openBrowser, forceReauth || hadExistingTokenFile, forceReauth);
|
|
747
|
+
updateThrottle(cacheKey);
|
|
748
|
+
}
|
|
749
|
+
catch (error) {
|
|
750
|
+
const message = error instanceof Error ? error.message : String(error || '');
|
|
751
|
+
// 当本地回调端口已被占用(例如已有其他 OAuth 工具在监听同一端口)时,
|
|
752
|
+
// 将其视为“暂时无法进行交互式授权”,不再向上抛出致命错误,以免阻塞整个服务器启动。
|
|
753
|
+
// 保持现有 token 不变,让后续真实请求决定是否需要修复。
|
|
754
|
+
if (message.includes('Failed to start callback server')) {
|
|
755
|
+
console.error(`[OAuth] interactive authorization skipped (callback server error): ${message}`);
|
|
756
|
+
updateThrottle(cacheKey);
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
throw error;
|
|
760
|
+
}
|
|
752
761
|
})();
|
|
753
762
|
inFlight.set(cacheKey, runPromise);
|
|
754
763
|
try {
|
|
@@ -780,12 +789,10 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
|
|
|
780
789
|
}
|
|
781
790
|
// 基本令牌失效判定:只看典型 OAuth 文案
|
|
782
791
|
let looksInvalid = /invalid[_-]?token|invalid[_-]?grant|unauthenticated|unauthorized|token has expired|access token expired/.test(lower);
|
|
783
|
-
// 对于 iflow / qwen,保留基于 401/403
|
|
784
|
-
// 同时将部分上游使用的 406 也视作“认证失效”,与 401 统一处理。
|
|
792
|
+
// 对于 iflow / qwen,保留基于 401/403 的宽松判定,避免破坏既有行为。
|
|
785
793
|
if (!looksInvalid && (pt === 'iflow' || pt === 'qwen')) {
|
|
786
794
|
if (statusCode === 401 ||
|
|
787
795
|
statusCode === 403 ||
|
|
788
|
-
statusCode === 406 ||
|
|
789
796
|
/\b401\b|\b403\b|40308/.test(msg)) {
|
|
790
797
|
looksInvalid = true;
|
|
791
798
|
}
|