import * as admin from 'firebase-admin' // Initialize the Admin SDK once for every function in this codebase. // Handlers call admin.firestore()/messaging() lazily at invocation time, so a // single idempotent init here is sufficient and avoids "already exists" errors. if (admin.apps.length === 0) { admin.initializeApp() } export { revenueCatWebhook } from './billing/revenueCatWebhook' export { syncEntitlement } from './billing/syncEntitlement' export { sendDailyQuestionReminder, sendPartnerAnsweredNotification, } from './notifications/reminders' export { sendGentleReminderCallable } from './notifications/sendGentleReminderCallable' export { sendChallengeDayReminders, unlockDueMemoryCapsules, } from './notifications/gameRetention' export { sendDailyQuestionProactiveReminder } from './notifications/dailyQuestionReminder' export { sendReengagementReminder } from './notifications/reengagement' export { checkDeviceIntegrity } from './security/checkDeviceIntegrity' export { notifyOnDateMatch } from './dates/createDateMatch' export { assignDailyQuestion, assignDailyQuestionCallable, } from './questions/assignDailyQuestion' export { onAnswerWritten } from './questions/onAnswerWritten' export { onMessageWritten } from './questions/onMessageWritten' export { onCoupleLeave } from './couples/onCoupleLeave' export { leaveCoupleCallable } from './couples/leaveCoupleCallable' export { acceptInviteCallable } from './couples/acceptInviteCallable' export { createInviteCallable } from './couples/createInviteCallable' export { submitOutcomeCallable } from './couples/submitOutcomeCallable' export { scheduledOutcomesReminder } from './couples/scheduledOutcomesReminder' export { onUserDelete } from './users/onUserDelete' export { onGameSessionUpdate } from './games/onGameSessionUpdate' // NOTE (security review Batch 2): the unauthenticated public `health` HTTP endpoint // was removed to shrink attack surface. Deployment can be verified via // `firebase functions:list`. If an uptime probe is ever needed, re-add it behind // auth / a shared secret rather than as an open endpoint.