import { NextResponse } from 'next/server'; import { configManager } from '@/lib/admin/config-manager'; import { logger } from '@/lib/logger'; import { DEFAULT_AI_ENTITLEMENT, type AiPolicy } from '@/lib/ai/types'; /** * GET /api/ai/policy - AI Assistant policy (NOT admin-protected - users read this) * * `enabled` mirrors the admin FeatureGates toggle. `entitlement.classes` * reflects real configuration, not a hardcoded guess: `server` only appears * when AI_SERVER_BASE_URL is actually set (app/api/ai/server/* would 503 * otherwise) - this is enforcement point 1 (docs ยง10), cosmetic-only, the * client hiding what it can't use; the real gate is checkAndAssignSeat() on * every /api/ai/server/chat call, not this list. */ export async function GET() { try { await configManager.ensureLoaded(); const policy = configManager.getPolicy(); const classes = [...DEFAULT_AI_ENTITLEMENT.classes]; if (process.env.AI_SERVER_BASE_URL) classes.push('server'); const aiPolicy: AiPolicy = { enabled: policy.features.aiAssistantEnabled, entitlement: { ...DEFAULT_AI_ENTITLEMENT, classes }, publicConsentVersion: null, }; return NextResponse.json(aiPolicy, { headers: { 'Cache-Control': 'no-store' }, }); } catch (error) { logger.error('AI policy read error', { error: error instanceof Error ? error.message : 'Unknown error' }); return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); } }