TypeScript 97.4%
SQL 1%
JavaScript 0.9%
CSS 0.6%
1import { z } from "zod";2import { desc, eq, sql } from "drizzle-orm";3import { NextResponse } from "next/server";4import { withUser, parseBody, json, ApiError } from "@/lib/api";5import { isAdmin } from "@/lib/session";6import { registryStats, syncAllWithEnvKeys, syncProvider } from "@/lib/ai/registry";7import { getDb, providerConnections, usageRecords, users, models } from "@/db";8import { PROVIDER_IDS, isProviderId } from "@/lib/ai/core/types";9import { ownerKey } from "@/lib/ai/providers/env-keys";1011export const dynamic = "force-dynamic";1213/** Owner-only diagnostics: provider status, model sync, discovered models, latency, errors. */14export const GET = withUser(async ({ user }) => {15 if (!isAdmin(user)) throw new ApiError(403, "Admins only", "FORBIDDEN");16 const db = getDb();17 const stats = await registryStats();18 const [userCount] = await db.select({ n: sql<number>`count(*)::int` }).from(users);19 const connections = await db.select({ provider: providerConnections.provider, status: providerConnections.status, n: sql<number>`count(*)::int` }).from(providerConnections).groupBy(providerConnections.provider, providerConnections.status);20 const errors = await db21 .select({ provider: usageRecords.provider, errorCode: usageRecords.errorCode, n: sql<number>`count(*)::int` })22 .from(usageRecords)23 .where(sql`${usageRecords.status} = 'error' and ${usageRecords.createdAt} > now() - interval '7 days'`)24 .groupBy(usageRecords.provider, usageRecords.errorCode)25 .orderBy(desc(sql`count(*)`))26 .limit(30);27 const latency = await db28 .select({ provider: usageRecords.provider, avgLatencyMs: sql<number>`coalesce(avg(${usageRecords.latencyMs}),0)::float8`, avgTtftMs: sql<number>`coalesce(avg(${usageRecords.ttftMs}),0)::float8`, requests: sql<number>`count(*)::int` })29 .from(usageRecords)30 .where(sql`${usageRecords.createdAt} > now() - interval '7 days'`)31 .groupBy(usageRecords.provider);32 const perProvider = await Promise.all(33 PROVIDER_IDS.map(async (p) => {34 const rows = await db.select({ key: models.key, displayName: models.displayName, status: models.status, hidden: models.hidden, lastSeenAt: models.lastSeenAt, source: models.source }).from(models).where(eq(models.provider, p)).orderBy(desc(models.sortWeight));35 return { provider: p, envKeyConfigured: Boolean(ownerKey(p)), models: rows.map((r) => ({ ...r, lastSeenAt: r.lastSeenAt.toISOString() })) };36 }),37 );38 return json({39 users: userCount.n,40 connections,41 counts: stats.counts,42 syncRuns: stats.lastRuns.map((r) => ({ ...r, startedAt: r.startedAt.toISOString(), finishedAt: r.finishedAt?.toISOString() ?? null })),43 errors,44 latency,45 providers: perProvider,46 });47});4849export const POST = withUser(async ({ req, user }) => {50 if (!isAdmin(user)) throw new ApiError(403, "Admins only", "FORBIDDEN");51 const body = await parseBody(req, z.object({ action: z.literal("sync"), provider: z.string().optional() }));52 if (body.provider) {53 if (!isProviderId(body.provider)) throw new ApiError(400, "Unknown provider");54 const key = ownerKey(body.provider);55 if (!key) return NextResponse.json({ error: { code: "NO_ENV_KEY", message: "No owner key configured for this provider" } }, { status: 400 });56 return json({ results: [await syncProvider(body.provider, key, "admin")] });57 }58 return json({ results: await syncAllWithEnvKeys("admin") });59});60