Files
TowstyandCursor 7bcd23fcc5 Let xAIGen accept backup ingest without a browser login.
The 401 was the session wall, not a missing token. The ingest route now uses the shared Bearer secret, and both apps default that secret so Coolify vars are optional.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 19:35:14 -05:00

49 lines
1.7 KiB
TypeScript

function env(...keys: string[]) {
for (const key of keys) {
const value = String(process.env[key] || '').trim()
if (value) return value
}
return ''
}
function looksLikeUrl(value: string) {
return /^https?:\/\//i.test(value)
}
export function backupStudioTarget() {
const config = useRuntimeConfig()
const url = String(
config.backupStudioUrl
|| env('BACKUP_STUDIO_URL', 'NUXT_BACKUP_STUDIO_URL')
).replace(/\/$/, '')
const token = String(
config.backupStudioToken
|| env('BACKUP_STUDIO_TOKEN', 'NUXT_BACKUP_STUDIO_TOKEN')
|| 'carr-aigen-xaigen-backup'
).trim()
const misplaced = env('BACKUP_INGEST_TOKEN', 'NUXT_BACKUP_INGEST_TOKEN')
return { url, token, misplaced }
}
export function backupIngestSecret() {
const config = useRuntimeConfig()
return String(
config.backupIngestToken
|| env('BACKUP_INGEST_TOKEN', 'NUXT_BACKUP_INGEST_TOKEN', 'BACKUP_STUDIO_TOKEN', 'NUXT_BACKUP_STUDIO_TOKEN')
|| 'carr-aigen-xaigen-backup'
).trim()
}
export function backupStudioConfigError() {
const { url, token, misplaced } = backupStudioTarget()
if (url && token) return ''
if (!url && looksLikeUrl(misplaced)) {
return 'BACKUP_INGEST_TOKEN on AIGen is a URL. Put https://xaigen.carrgarage.com in BACKUP_STUDIO_URL, and put the same secret in BACKUP_STUDIO_TOKEN here and BACKUP_INGEST_TOKEN on xAIGen.'
}
if (!url && !token) {
return 'Set BACKUP_STUDIO_URL and BACKUP_STUDIO_TOKEN on AIGen. The token must match BACKUP_INGEST_TOKEN on xAIGen.'
}
if (!url) return 'Set BACKUP_STUDIO_URL on AIGen to https://xaigen.carrgarage.com'
return 'Set BACKUP_STUDIO_TOKEN on AIGen to the same secret as BACKUP_INGEST_TOKEN on xAIGen'
}