fix: preserve provider auth metadata

This commit is contained in:
elky
2026-06-20 22:11:42 +08:00
parent 1123095bb7
commit f1c30439ff
51 changed files with 2098 additions and 420 deletions
@@ -1352,6 +1352,7 @@ function parseImportText(text: string): {
browser_profile?: string
user_id?: string
account_name?: string
headers?: Record<string, string>
} | null {
const trimmed = text.trim()
if (!trimmed) return null
@@ -1422,7 +1423,14 @@ function parseImportText(text: string): {
const normalizedSessionToken = typeof sessionToken === 'string' && sessionToken.trim()
? sessionToken.trim()
: (typeof sessionTokenCamel === 'string' && sessionTokenCamel.trim() ? sessionTokenCamel.trim() : undefined)
const importedAccessToken = normalizedAccessToken ?? grokSsoToken ?? normalizedSessionToken
const normalizedHeaders = normalizeHeadersField(obj.headers)
?? normalizeHeadersField(obj.request_headers)
?? normalizeHeadersField(obj.requestHeaders)
?? normalizeHeadersField(obj.header_overrides)
?? normalizeHeadersField(obj.headerOverrides)
?? normalizeHeadersField(obj.extra_headers)
?? normalizeHeadersField(obj.extraHeaders)
const importedAccessToken = normalizedAccessToken ?? grokSsoToken ?? normalizedSessionToken ?? bearerTokenFromHeaders(normalizedHeaders)
if (normalizedRefreshToken || importedAccessToken) {
return {
refresh_token: normalizedRefreshToken,
@@ -1441,6 +1449,7 @@ function parseImportText(text: string): {
browser_profile: isGrokProvider.value ? normalizeStringField(obj.browser_profile) ?? normalizeStringField(obj.browserProfile) ?? normalizeStringField(obj.browser) ?? normalizeStringField(obj.impersonate) ?? grokCookieImport?.browser_profile : undefined,
user_id: normalizeStringField(obj.user_id) ?? normalizeStringField(obj.userId) ?? normalizeStringField(obj.chatgpt_user_id) ?? normalizeStringField(obj.chatgptUserId),
account_name: normalizeStringField(obj.account_name) ?? normalizeStringField(obj.accountName),
headers: normalizedHeaders,
}
}
return null
@@ -1526,6 +1535,34 @@ function normalizeStringField(value: unknown): string | undefined {
return typeof value === 'string' && value.trim() ? value.trim() : undefined
}
function normalizeHeadersField(value: unknown): Record<string, string> | undefined {
if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined
const headers: Record<string, string> = {}
for (const [rawKey, rawValue] of Object.entries(value as Record<string, unknown>)) {
const key = rawKey.trim().toLowerCase()
if (!key || ['host', 'content-length', 'connection', 'transfer-encoding', 'proxy-authorization'].includes(key)) {
continue
}
let headerValue: string | undefined
if (typeof rawValue === 'string') {
headerValue = rawValue.trim()
} else if (typeof rawValue === 'number' || typeof rawValue === 'boolean') {
headerValue = String(rawValue)
}
if (headerValue) {
headers[key] = headerValue
}
}
return Object.keys(headers).length > 0 ? headers : undefined
}
function bearerTokenFromHeaders(headers: Record<string, string> | undefined): string | undefined {
const authorization = headers?.authorization?.trim()
if (!authorization) return undefined
const match = authorization.match(/^bearer\s+(.+)$/i)
return match?.[1]?.trim() || undefined
}
function normalizeNumberField(value: unknown): number | undefined {
if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
return Math.floor(value)