import type { AiEvidence } from "@dci/core"; import type { Metadata } from "next"; import Link from "next/link"; import { Breadcrumbs } from "@/components/entity/breadcrumbs"; import { SectionNav } from "@/components/entity/section-nav"; import { SourcesFooter } from "@/components/entity/sources-footer"; import { EventList } from "@/components/event-list"; import { AiFacilitiesTable } from "@/components/intelligence/ai/ai-facilities-table"; import { ApiNote, CoverageBar, HonestEmpty, MwFigure, PillLink, PublishedOnlyNote, ShareList } from "@/components/intelligence/shared"; import { ProjectList } from "@/components/project-list"; import { AiMark } from "@/components/ui/badge"; import { Page, PageHeader, Section } from "@/components/ui/card"; import { Metric, MetricCell, MetricRow } from "@/components/ui/metric"; import { ErrorState, OfflineNotice } from "@/components/ui/states"; import { api } from "@/lib/api"; import { fmtInt, fmtMw, fmtPct } from "@/lib/format"; import { AI_EVIDENCE_LABEL, STATUS_LABEL, statusVar } from "@/lib/labels"; import { routes } from "@/lib/routes"; import { pageMetadata } from "@/lib/seo"; export const revalidate = 120; export const metadata: Metadata = pageMetadata({ title: "AI infrastructure", description: "AI / HPC data centers and projects with their evidence level (confirmed, likely, associated), the project pipeline by stage, top operators, markets and countries — published figures only.", path: routes.ai(), }); const LEVELS: Array<{ level: AiEvidence; rule: string; counted: boolean }> = [ { level: "confirmed", rule: "A source explicitly describes the site as AI / HPC / GPU / accelerated-computing infrastructure.", counted: true }, { level: "likely", rule: "AI-ready, high-density, liquid- or direct-to-chip cooling or GPU signals in the source.", counted: true }, { level: "associated", rule: "Only an AI tenant, customer or company mention — reported separately, NOT counted as AI infrastructure.", counted: false }, { level: "unknown", rule: "No signal in any indexed source. A single keyword never confirms a site.", counted: false }, ]; export default async function AiInfrastructurePage() { const r = await api.aiIndex(); if (!r.ok) { return ( ); } const d = r.data; const s = d.stats; const stages = [...d.pipelineByStage].sort((a, b) => b.count - a.count); const stageMax = Math.max(1, ...stages.map((x) => x.count)); const sections = [ { id: "evidence", label: "Evidence levels" }, { id: "pipeline", label: "Project pipeline", count: stages.length }, { id: "top", label: "Top operators & places" }, { id: "announcements", label: "Announcements", count: d.recentAnnouncements.length }, { id: "projects", label: "Recent projects", count: d.recentProjects.length }, { id: "facilities", label: "Facilities", count: d.facilities.length }, ]; return ( Open the AI layer on the map →} /> } label="Planned MW" note={s.plannedMw === null ? "no published figure" : "projects, published ≈ figures"} /> } label="Construction MW" note={s.constructionMw === null ? "no published figure" : "under construction"} />
    {LEVELS.map((l) => (
  • {l.level === "unknown" ? Unknown : }

    {AI_EVIDENCE_LABEL[l.level].replace("AI · ", "").replace(/^./, (c) => c.toUpperCase())}. {l.rule}

    {l.counted ? "counted" : "not counted"}
  • ))}
{stages.length === 0 ? ( ) : (
    {stages.map((st) => (
  1. {STATUS_LABEL[st.status]}
    {fmtInt(st.count)} {st.count === 1 ? "project" : "projects"} {st.mw === null ? MW — : <>≈ {fmtMw(st.mw)}}
  2. ))}
)}
({ key: o.id, label: o.name, href: routes.operator(o.slug), facilities: o.facilities, projects: o.projects, plannedMw: o.plannedMw }))} /> ({ key: m.id, label: m.name, href: routes.market(m.slug), facilities: m.facilities, projects: m.projects, plannedMw: m.plannedMw, iso2: m.countryIso2 }))} /> ({ key: c.iso2, label: c.name, href: routes.country(c.slug), facilities: c.facilities, projects: c.projects, plannedMw: c.plannedMw, iso2: c.iso2 }))} />
Live feed (AI) →}>
All AI projects →}>
MW coverage}>
); } function TopColumn({ title, rows }: { title: string; rows: Array<{ key: string; label: string; href: string; facilities: number; projects: number; plannedMw: number | null; iso2?: string | null }> }) { const total = rows.reduce((a, x) => a + x.facilities + x.projects, 0); return (
{title}
{rows.length === 0 ? ( ) : ( ({ key: x.key, label: x.label, href: x.href, count: x.facilities + x.projects, share: total ? (x.facilities + x.projects) / total : 0, mw: x.plannedMw, iso2: x.iso2 ?? null }))} /> )}

records = facilities + projects · MW = planned, published

); }