Builds on top of W3.9 to turn the homepage Bureau from a read-only
dashboard into a working command center.
UI improvements (web/components/bureau-snapshot.tsx):
- Detective tiles are now <Link>s — each navigates to its primary
artefact section in /bureau (Holmes→#hypotheses, Locard→#evidence,
Dupin→#contradictions, Schneier→#hypotheses, Poirot→#witnesses,
Taleb→#outliers, Tetlock→#hypotheses, Case-Writer→#reports). Hover
bg matches the detective's tone color.
- <QuickLaunch /> form inserted right under the tiles.
New <QuickLaunch /> client component:
- Detective dropdown (7 active kinds; evidence_chain not yet exposed
here since it needs a doc_id better picked from the doc page).
- Single input swaps placeholder + aria-label by kind: question for
Holmes, topic for Dupin/Taleb/Case-Writer, hypothesis_id for
Schneier/Tetlock, person_id for Poirot.
- Submits to POST /api/bureau/launch and redirects to /jobs/[id]
via the next.js router.
- Loading state ("queueing…") + error display inline.
POST /api/bureau/launch (web/app/api/bureau/launch/route.ts):
- Same 8-kind validator as the chat tool's request_investigation.
- Auth required when Supabase is configured (triggered_by = user:email).
- Returns { job_id, kind, detective, status_url, eta_seconds }.
DocBureauPanel on /d/[docId] (web/components/doc-bureau-panel.tsx):
- Server component inserted between the doc header and
AnomalyHighlights.
- Surfaces every bureau artefact that touches the doc:
· Evidence whose source_page_id starts with docId/p
· Hypotheses citing any of those evidence_ids
· Contradictions whose chunks[] has any item with this doc_id
· Gaps/outliers with scope.doc_id == docId
· Case reports whose markdown body references docId (filesystem scan)
- Empty state shows "Investigation Bureau — untouched" with a CTA
linking back to the homepage to launch the first investigation.
- When non-empty, header counts total artefacts + links to /bureau
for the full view.
Metadata (web/app/layout.tsx):
- description rewritten from "Investigative wiki of the US Department
of War UAP/UFO archive (war.gov/ufo)" to one that names the bureau
+ the 8 detectives. Affects SERP previews + social-card defaults.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
31 lines
1.2 KiB
TypeScript
31 lines
1.2 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { JetBrains_Mono, Inter } from "next/font/google";
|
|
import "./globals.css";
|
|
import { CommandPalette } from "@/components/command-palette";
|
|
import { LocaleToggle, getLocale } from "@/components/locale-toggle";
|
|
|
|
const inter = Inter({ subsets: ["latin"], variable: "--font-sans" });
|
|
const mono = JetBrains_Mono({ subsets: ["latin"], variable: "--font-mono" });
|
|
|
|
export const metadata: Metadata = {
|
|
title: "The Disclosure Bureau",
|
|
description:
|
|
"Investigative case folder of declassified UAP/UFO documents, " +
|
|
"worked by 8 AI detectives (Holmes · Locard · Dupin · Schneier · " +
|
|
"Poirot · Taleb · Tetlock · Case-Writer).",
|
|
};
|
|
|
|
export default async function RootLayout({ children }: { children: React.ReactNode }) {
|
|
const locale = await getLocale();
|
|
return (
|
|
<html lang={locale === "en" ? "en" : "pt-BR"} className="dark" data-locale={locale}>
|
|
<body className={`${inter.variable} ${mono.variable}`}>
|
|
{children}
|
|
<CommandPalette />
|
|
<div className="fixed bottom-3 left-3 z-40 opacity-70 hover:opacity-100 transition">
|
|
<LocaleToggle current={locale} />
|
|
</div>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|