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' }