@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.
Files changed (215) hide show
  1. package/README.md +44 -0
  2. package/dist/build-info.js +2 -2
  3. package/dist/cli.js +164 -116
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/anthropic/anthropic-protocol-client.js +42 -1
  6. package/dist/client/anthropic/anthropic-protocol-client.js.map +1 -1
  7. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +4 -1
  8. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  9. package/dist/commands/camoufox-backfill.d.ts +2 -0
  10. package/dist/commands/camoufox-backfill.js +33 -0
  11. package/dist/commands/camoufox-backfill.js.map +1 -0
  12. package/dist/commands/camoufox-fp.d.ts +2 -0
  13. package/dist/commands/camoufox-fp.js +86 -0
  14. package/dist/commands/camoufox-fp.js.map +1 -0
  15. package/dist/commands/oauth.d.ts +2 -0
  16. package/dist/commands/oauth.js +170 -0
  17. package/dist/commands/oauth.js.map +1 -0
  18. package/dist/commands/provider-update.js +439 -2
  19. package/dist/commands/provider-update.js.map +1 -1
  20. package/dist/commands/quota-status.d.ts +2 -0
  21. package/dist/commands/quota-status.js +80 -0
  22. package/dist/commands/quota-status.js.map +1 -0
  23. package/dist/commands/token-daemon.js +12 -1
  24. package/dist/commands/token-daemon.js.map +1 -1
  25. package/dist/config/provider-v2-loader.d.ts +16 -0
  26. package/dist/config/provider-v2-loader.js +84 -0
  27. package/dist/config/provider-v2-loader.js.map +1 -0
  28. package/dist/config/routecodex-config-loader.js +27 -4
  29. package/dist/config/routecodex-config-loader.js.map +1 -1
  30. package/dist/config/system-prompts/codex-cli.txt +1 -0
  31. package/dist/config/virtual-router-builder.d.ts +9 -0
  32. package/dist/config/virtual-router-builder.js +34 -0
  33. package/dist/config/virtual-router-builder.js.map +1 -0
  34. package/dist/config/virtual-router-types.d.ts +25 -0
  35. package/dist/config/virtual-router-types.js +30 -0
  36. package/dist/config/virtual-router-types.js.map +1 -0
  37. package/dist/manager/index.d.ts +10 -0
  38. package/dist/manager/index.js +27 -0
  39. package/dist/manager/index.js.map +1 -0
  40. package/dist/manager/modules/health/index.d.ts +22 -0
  41. package/dist/manager/modules/health/index.js +82 -0
  42. package/dist/manager/modules/health/index.js.map +1 -0
  43. package/dist/manager/modules/quota/index.d.ts +57 -0
  44. package/dist/manager/modules/quota/index.js +426 -0
  45. package/dist/manager/modules/quota/index.js.map +1 -0
  46. package/dist/manager/modules/routing/index.d.ts +17 -0
  47. package/dist/manager/modules/routing/index.js +61 -0
  48. package/dist/manager/modules/routing/index.js.map +1 -0
  49. package/dist/manager/modules/token/index.d.ts +10 -0
  50. package/dist/manager/modules/token/index.js +58 -0
  51. package/dist/manager/modules/token/index.js.map +1 -0
  52. package/dist/manager/storage/base-store.d.ts +6 -0
  53. package/dist/manager/storage/base-store.js +2 -0
  54. package/dist/manager/storage/base-store.js.map +1 -0
  55. package/dist/manager/storage/file-store.d.ts +25 -0
  56. package/dist/manager/storage/file-store.js +117 -0
  57. package/dist/manager/storage/file-store.js.map +1 -0
  58. package/dist/manager/types.d.ts +9 -0
  59. package/dist/manager/types.js +2 -0
  60. package/dist/manager/types.js.map +1 -0
  61. package/dist/message-center/index.d.ts +5 -0
  62. package/dist/message-center/index.js +6 -0
  63. package/dist/message-center/index.js.map +1 -0
  64. package/dist/message-center/message-center.d.ts +93 -0
  65. package/dist/message-center/message-center.js +189 -0
  66. package/dist/message-center/message-center.js.map +1 -0
  67. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -0
  68. package/dist/providers/auth/antigravity-userinfo-helper.js +102 -0
  69. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
  70. package/dist/providers/auth/iflow-cookie-auth.d.ts +27 -0
  71. package/dist/providers/auth/iflow-cookie-auth.js +209 -0
  72. package/dist/providers/auth/iflow-cookie-auth.js.map +1 -0
  73. package/dist/providers/auth/oauth-lifecycle.js +29 -22
  74. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  75. package/dist/providers/auth/token-scanner/index.js +16 -1
  76. package/dist/providers/auth/token-scanner/index.js.map +1 -1
  77. package/dist/providers/core/config/camoufox-launcher.d.ts +16 -0
  78. package/dist/providers/core/config/camoufox-launcher.js +314 -0
  79. package/dist/providers/core/config/camoufox-launcher.js.map +1 -0
  80. package/dist/providers/core/config/oauth-flows.d.ts +9 -0
  81. package/dist/providers/core/config/oauth-flows.js +50 -19
  82. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  83. package/dist/providers/core/config/provider-oauth-configs.d.ts +6 -0
  84. package/dist/providers/core/config/provider-oauth-configs.js +12 -0
  85. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  86. package/dist/providers/core/config/service-profiles.js +26 -3
  87. package/dist/providers/core/config/service-profiles.js.map +1 -1
  88. package/dist/providers/core/runtime/antigravity-quota-client.d.ts +10 -0
  89. package/dist/providers/core/runtime/antigravity-quota-client.js +88 -0
  90. package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -0
  91. package/dist/providers/core/runtime/base-provider.d.ts +2 -1
  92. package/dist/providers/core/runtime/base-provider.js +93 -34
  93. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  94. package/dist/providers/core/runtime/gemini-cli-http-provider.js +42 -10
  95. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  96. package/dist/providers/core/runtime/http-request-executor.js +24 -0
  97. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  98. package/dist/providers/core/runtime/http-transport-provider.d.ts +0 -3
  99. package/dist/providers/core/runtime/http-transport-provider.js +32 -136
  100. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  101. package/dist/providers/core/runtime/provider-error-classifier.js +18 -10
  102. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  103. package/dist/providers/core/runtime/rate-limit-manager.d.ts +6 -0
  104. package/dist/providers/core/runtime/rate-limit-manager.js +23 -0
  105. package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
  106. package/dist/providers/core/runtime/responses-provider.js +17 -19
  107. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  108. package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -0
  109. package/dist/providers/core/strategies/oauth-auth-code-flow.js +3 -2
  110. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  111. package/dist/providers/core/strategies/oauth-device-flow.d.ts +1 -0
  112. package/dist/providers/core/strategies/oauth-device-flow.js +3 -2
  113. package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
  114. package/dist/providers/core/strategies/oauth-hybrid-flow.d.ts +1 -0
  115. package/dist/providers/core/strategies/oauth-hybrid-flow.js +3 -2
  116. package/dist/providers/core/strategies/oauth-hybrid-flow.js.map +1 -1
  117. package/dist/providers/core/utils/http-client.js +43 -1
  118. package/dist/providers/core/utils/http-client.js.map +1 -1
  119. package/dist/providers/mock/mock-provider-runtime.js +4 -4
  120. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  121. package/dist/providers/profile/provider-profile-loader.js +13 -1
  122. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  123. package/dist/providers/profile/provider-profile.d.ts +5 -0
  124. package/dist/scripts/camoufox/gen-fingerprint-env.py +171 -0
  125. package/dist/scripts/camoufox/launch-auth.mjs +617 -0
  126. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.d.ts +3 -0
  127. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +138 -0
  128. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -0
  129. package/dist/server/runtime/http-server/daemon-admin/providers-handler.d.ts +3 -0
  130. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +166 -0
  131. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -0
  132. package/dist/server/runtime/http-server/daemon-admin/quota-handler.d.ts +3 -0
  133. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +109 -0
  134. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -0
  135. package/dist/server/runtime/http-server/daemon-admin/status-handler.d.ts +3 -0
  136. package/dist/server/runtime/http-server/daemon-admin/status-handler.js +43 -0
  137. package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -0
  138. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +19 -0
  139. package/dist/server/runtime/http-server/daemon-admin-routes.js +27 -0
  140. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -0
  141. package/dist/server/runtime/http-server/executor-provider.d.ts +1 -0
  142. package/dist/server/runtime/http-server/executor-provider.js +26 -0
  143. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  144. package/dist/server/runtime/http-server/executor-response.d.ts +16 -0
  145. package/dist/server/runtime/http-server/executor-response.js +164 -0
  146. package/dist/server/runtime/http-server/executor-response.js.map +1 -0
  147. package/dist/server/runtime/http-server/index.d.ts +6 -0
  148. package/dist/server/runtime/http-server/index.js +121 -53
  149. package/dist/server/runtime/http-server/index.js.map +1 -1
  150. package/dist/server/runtime/http-server/request-executor.d.ts +3 -0
  151. package/dist/server/runtime/http-server/request-executor.js +73 -21
  152. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  153. package/dist/server/runtime/http-server/routes.d.ts +5 -0
  154. package/dist/server/runtime/http-server/routes.js +45 -1
  155. package/dist/server/runtime/http-server/routes.js.map +1 -1
  156. package/dist/server/runtime/http-server/types.d.ts +1 -0
  157. package/dist/server/utils/client-connection-state.d.ts +8 -0
  158. package/dist/server/utils/client-connection-state.js +52 -0
  159. package/dist/server/utils/client-connection-state.js.map +1 -0
  160. package/dist/server/utils/request-id-manager.js +21 -3
  161. package/dist/server/utils/request-id-manager.js.map +1 -1
  162. package/dist/token-daemon/history-store.d.ts +2 -0
  163. package/dist/token-daemon/history-store.js +6 -2
  164. package/dist/token-daemon/history-store.js.map +1 -1
  165. package/dist/token-daemon/index.js +36 -5
  166. package/dist/token-daemon/index.js.map +1 -1
  167. package/dist/token-daemon/leader-lock.d.ts +11 -0
  168. package/dist/token-daemon/leader-lock.js +79 -0
  169. package/dist/token-daemon/leader-lock.js.map +1 -0
  170. package/dist/token-daemon/message-bus-integrator.d.ts +98 -0
  171. package/dist/token-daemon/message-bus-integrator.js +144 -0
  172. package/dist/token-daemon/message-bus-integrator.js.map +1 -0
  173. package/dist/token-daemon/provider-registry.d.ts +22 -0
  174. package/dist/token-daemon/provider-registry.js +201 -0
  175. package/dist/token-daemon/provider-registry.js.map +1 -0
  176. package/dist/token-daemon/token-daemon.d.ts +8 -0
  177. package/dist/token-daemon/token-daemon.js +196 -11
  178. package/dist/token-daemon/token-daemon.js.map +1 -1
  179. package/dist/token-portal/local-token-portal.d.ts +1 -0
  180. package/dist/token-portal/local-token-portal.js +18 -0
  181. package/dist/token-portal/local-token-portal.js.map +1 -1
  182. package/dist/token-portal/render.js +1 -0
  183. package/dist/token-portal/render.js.map +1 -1
  184. package/dist/tools/error-log.d.ts +31 -0
  185. package/dist/tools/error-log.js +117 -0
  186. package/dist/tools/error-log.js.map +1 -0
  187. package/dist/tools/stats-request-events.d.ts +2 -0
  188. package/dist/tools/stats-request-events.js +16 -0
  189. package/dist/tools/stats-request-events.js.map +1 -0
  190. package/dist/tools/stats-usage.d.ts +31 -0
  191. package/dist/tools/stats-usage.js +206 -0
  192. package/dist/tools/stats-usage.js.map +1 -0
  193. package/package.json +9 -4
  194. package/scripts/analyze-codex-error-failures.mjs +111 -0
  195. package/scripts/analyze-usage-estimate.mjs +240 -0
  196. package/scripts/camoufox/gen-fingerprint-env.py +171 -0
  197. package/scripts/camoufox/launch-auth.mjs +617 -0
  198. package/scripts/classify-codex-samples.mjs +251 -0
  199. package/scripts/cleanup-codex-error-samples.mjs +88 -0
  200. package/scripts/compare-codex-rccx.mjs +268 -0
  201. package/scripts/copy-compat-assets.mjs +18 -0
  202. package/scripts/install-release.sh +1 -1
  203. package/scripts/local-replay-openai-response.mjs +1 -2
  204. package/scripts/pack-mode.mjs +16 -6
  205. package/scripts/replay-codex-sample.mjs +24 -2
  206. package/scripts/responses-compare-server.mjs +119 -0
  207. package/scripts/tests/apply-patch-loop.mjs +266 -7
  208. package/scripts/tests/exec-command-loop.mjs +165 -0
  209. package/scripts/tool-classification-report.ts +281 -0
  210. package/scripts/verification/samples/openai-chat-list-local-files.json +1 -1
  211. package/scripts/verify-apply-patch.mjs +28 -17
  212. package/scripts/verify-codex-error-samples.mjs +102 -0
  213. package/scripts/verify-e2e-toolcall.mjs +71 -4
  214. package/scripts/virtual-router-shadow-v2-real.mjs +143 -0
  215. 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":"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"}
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":"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"}
@@ -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
- await runInteractiveAuthorizationFlow(providerType, overrides, tokenFilePath, openBrowser, forceReauth || hadExistingTokenFile);
751
- updateThrottle(cacheKey);
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
  }