/** * Resolução de privacidade de IA em cascata (agente.md secao 122): * Campaign > Queue > Tenant (o nível mais específico configurado vence). * Tenant é o único nível obrigatório (nunca null no banco, default * AI_OFF) — os outros dois só existem como *override* opcional. * * Simplificação conhecida: `Campaign` guarda a intenção como dois * booleanos independentes (`aiTranscriptionEnabled`/`aiAnalysisEnabled`, * já existiam desde a fase Campaigns, secao 63) em vez do enum de 3 * níveis usado em `Tenant`/`Queue` — não há como uma campanha forçar * AI_OFF explicitamente quando o tenant/fila já tem um nível mais * permissivo (só pode fazer *opt-in*, nunca *opt-out* explícito). Dado * que "opt-in" é a direção mais segura por padrão, aceitável por agora; * documentado em docs/AI_PIPELINE.md. */ export type AIPrivacyLevelName = "AI_OFF" | "TRANSCRIPTION_ONLY" | "TRANSCRIPTION_AND_ANALYSIS"; export interface ResolvePrivacyParams { tenantLevel: AIPrivacyLevelName; queueLevel?: AIPrivacyLevelName | null; campaignTranscriptionEnabled?: boolean; campaignAnalysisEnabled?: boolean; } export function resolvePrivacyLevel(params: ResolvePrivacyParams): AIPrivacyLevelName { if (params.campaignAnalysisEnabled) return "TRANSCRIPTION_AND_ANALYSIS"; if (params.campaignTranscriptionEnabled) return "TRANSCRIPTION_ONLY"; if (params.queueLevel) return params.queueLevel; return params.tenantLevel; } export function allowsTranscription(level: AIPrivacyLevelName): boolean { return level === "TRANSCRIPTION_ONLY" || level === "TRANSCRIPTION_AND_ANALYSIS"; } export function allowsAnalysis(level: AIPrivacyLevelName): boolean { return level === "TRANSCRIPTION_AND_ANALYSIS"; }