Bundles the prior autonomous-session output that was sitting unstaged: - Em-dash sweep across src/ + tests/ (en-dash/em-dash to hyphen, ~2280 instances) - country-flag-icons rollout (CountryFlag component, replaces emoji glyphs that never rendered on Windows; lazy-loads the 3x2 SVG index as a single chunk after the per-subpath dynamic-import approach silently failed in webpack) - Admin IA Phase 1+2: 7-domain regroup, 41 to 38 pages, /admin/berths index, redirects (ocr to ai, reports to dashboard, invitations to users), docs/admin-ia-proposal.md - Per-template email tester (registry + endpoint + UI on Email admin page) - Cancel-document mode picker (delete-from-Documenso vs keep-for-audit) - Dashboard PDF report: 25 widgets, SVG charts, date-range picker, 11 resolvers - Customize-widgets per-region sortables at xl+ (charts/rails/feed); single flat sortable below xl when the layout stacks; per-viewport saved orders - Audit doc updates capturing each shipped item - Lint fixes: react-compiler immutability in DonutChart (reduce instead of let-reassign), set-state-in-effect disables in CountryFlag and UploadForSigning preview-bytes effect, unused 'confirm' destructures in interest contract + reservation tabs, unescaped apostrophe in test-template card copy
86 lines
3.5 KiB
TypeScript
86 lines
3.5 KiB
TypeScript
import { Bot, FileScan, Lightbulb } from 'lucide-react';
|
|
|
|
import { RegistryDrivenForm } from '@/components/admin/shared/registry-driven-form';
|
|
import { PageHeader } from '@/components/shared/page-header';
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
|
|
import { OcrSettingsForm } from '@/components/admin/ocr-settings-form';
|
|
|
|
export default function AiAdminPage() {
|
|
return (
|
|
<div className="space-y-6">
|
|
<PageHeader
|
|
title="AI configuration"
|
|
description="One place to manage every AI-using feature. Provider credentials and the master AI switch live here; per-feature thresholds are embedded below."
|
|
eyebrow="ADMIN"
|
|
/>
|
|
|
|
<RegistryDrivenForm
|
|
title="Master controls"
|
|
description="Hard kill switch + budget guardrails covering every AI surface in this port."
|
|
sections={['ai.master']}
|
|
/>
|
|
|
|
<RegistryDrivenForm
|
|
title="Provider credentials"
|
|
description="Shared API keys used by AI-enabled features. AES-encrypted at rest. Per-feature pages can override the model on a feature-by-feature basis."
|
|
sections={['ai.providers']}
|
|
/>
|
|
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base flex items-center gap-2">
|
|
<Bot className="h-4 w-4" /> Receipt OCR
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Provider, model, and confidence thresholds for the receipt scanner. AI fallback only
|
|
runs when the on-device parser is uncertain.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<OcrSettingsForm embedded />
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/*
|
|
Berth-PDF parser AI fallback - currently configured via the
|
|
BERTH_PDF_PARSER_* env vars. No per-port override surface today;
|
|
when one is added, it lands here so admins don't have to hunt.
|
|
*/}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base flex items-center gap-2">
|
|
<FileScan className="h-4 w-4" /> Berth PDF parser
|
|
</CardTitle>
|
|
<CardDescription>
|
|
3-tier extraction (AcroForm → on-device OCR → AI fallback on low confidence) for
|
|
per-berth PDFs and brochures. Provider + confidence threshold are env-controlled today
|
|
(BERTH_PDF_PARSER_PROVIDER, BERTH_PDF_PARSER_CONFIDENCE_FLOOR); a per-port override UI
|
|
lands in a follow-up. The master switch above gates the AI tier across every port.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
</Card>
|
|
|
|
{/*
|
|
Future AI surfaces. Each gets a section here once it ships:
|
|
- Recommender embeddings (currently rule-based, not LLM-based)
|
|
- Contact-log action extraction (deferred - needs user demand)
|
|
- Inquiry-form auto-classification (deferred)
|
|
Listing them inert here closes the "where do I configure AI?"
|
|
loop - admins land on /admin/ai and see the full landscape.
|
|
*/}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base flex items-center gap-2 text-muted-foreground">
|
|
<Lightbulb className="h-4 w-4" /> Planned AI surfaces
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Recommender embeddings, contact-log action extraction, and inquiry-form auto-
|
|
classification are queued. They will surface as additional sections on this page when
|
|
shipped, with no scattered admin entries to hunt down.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
</Card>
|
|
</div>
|
|
);
|
|
}
|