import { listSeries, searchPapers } from "@autoscholar/core"; import { PublicSearchQuery } from "@autoscholar/schemas"; import type { Metadata } from "next"; import { Disclosure } from "@/components/Disclosure"; import { EmptyResearchState, EmptyState } from "@/components/EmptyState"; import { FilterSidebar, LibraryFilters } from "@/components/LibraryFilters"; import { Pagination } from "@/components/Pagination"; import { PaperCard } from "@/components/PaperCard"; import { t } from "@/lib/i18n"; import { db } from "@/lib/server/db"; export const dynamic = "force-dynamic"; export const metadata: Metadata = { title: "Research library", description: "Searchable library of AutoScholar working papers.", alternates: { canonical: "/research" }, }; export default async function ResearchPage({ searchParams, }: { searchParams: Promise>; }) { const sp = await searchParams; const raw: Record = {}; for (const [k, v] of Object.entries(sp)) raw[k] = Array.isArray(v) ? v[0] : v; for (const k of Object.keys(raw)) if (raw[k] === "") delete raw[k]; const parsed = PublicSearchQuery.safeParse(raw); const q = parsed.success ? parsed.data : PublicSearchQuery.parse({}); const d = db(); const res = await searchPapers(d, q); const series = await listSeries(d); const hrefFor = (p: number) => { const u = new URLSearchParams(); for (const [k, v] of Object.entries(raw)) if (v && k !== "page") u.set(k, v); u.set("page", String(p)); return `/research?${u.toString()}`; }; const anyFilter = Object.keys(raw).some((k) => !["page", "sort", "pageSize"].includes(k)); return (

Library

Working papers

Search titles, abstracts, keywords and verified metadata. Every entry is an AI-generated working paper with its evidence attached.

{!parsed.success && (

Some filters were invalid and have been ignored.

)}
{res.items.length === 0 ? ( anyFilter ? ( Clear all filters ) : ( ) ) : (
    {res.items.map((p, i) => (
  • ))}
)}
); }