38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
const CODEX_AUTH_ERROR_PATTERNS = [
|
|
/access token could not be refreshed/i,
|
|
/authentication session could not be refreshed/i,
|
|
/refresh token (?:has expired|was already used|was revoked)/i,
|
|
/you have since logged out or signed in to another account/i,
|
|
/please (?:log out and )?sign in again/i,
|
|
/please reauthenticate/i,
|
|
/not logged in/i,
|
|
/token data is not available/i,
|
|
/auth (?:is missing|tokens are missing|does not expose)/i
|
|
]
|
|
const ANSI_ESCAPE_RE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*[a-zA-Z]`, 'g')
|
|
|
|
export function isCodexAuthError(error: string | null | undefined): boolean {
|
|
const message = error?.trim()
|
|
if (!message) {
|
|
return false
|
|
}
|
|
return CODEX_AUTH_ERROR_PATTERNS.some((pattern) => pattern.test(message))
|
|
}
|
|
|
|
export function extractCodexAuthError(output: string | null | undefined): string | null {
|
|
const cleanOutput = output?.replace(ANSI_ESCAPE_RE, '').trim()
|
|
if (!cleanOutput) {
|
|
return null
|
|
}
|
|
|
|
const matchingLine = cleanOutput
|
|
.split(/\r?\n/)
|
|
.map((line) => line.trim())
|
|
.find(isCodexAuthError)
|
|
if (matchingLine) {
|
|
return matchingLine
|
|
}
|
|
|
|
return isCodexAuthError(cleanOutput) ? cleanOutput.slice(0, 4_000) : null
|
|
}
|