mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-12 10:12:11 +03:00
Phase 2 — Architecture & Quality: - A-5: DI container (src/lib/container.ts) - L-6: Prompt versioning (src/lib/db/prompts.ts) - L-7: Eval scheduler (src/lib/evals/scheduler.ts) - L-8: Plugin architecture (src/lib/plugins/index.ts) - T-3: Integration tests (42 tests, 9 suites) Phase 3 — UX & Polish: - P-1: 500 error page (src/app/error.tsx) - P-2: Audit log viewer (dashboard/audit-log/page.tsx) - U-2: ARIA attributes on error pages - U-5: Typed global-error.tsx params - U-6: CSS variables for accent/semantic/traffic colors - L-3: Output PII sanitization (src/lib/piiSanitizer.ts) - L-4: Tool-calling allowlist/denylist (src/lib/toolPolicy.ts) - L-9: Semantic cache invalidation API + auto-cleanup - D-5: SECURITY.md updated to v1.0.x - F-2: Deleted .env copy
65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
"use client";
|
|
|
|
/**
|
|
* Server Error Page — P-1
|
|
*
|
|
* Per-page error boundary for unrecoverable errors within the
|
|
* dashboard layout. Falls back to global-error.tsx if this fails.
|
|
*/
|
|
|
|
interface ErrorProps {
|
|
error: Error & { digest?: string };
|
|
reset: () => void;
|
|
}
|
|
|
|
export default function Error({ error, reset }: ErrorProps) {
|
|
return (
|
|
<div
|
|
className="flex flex-col items-center justify-center min-h-[60vh] p-6 text-center"
|
|
role="alert"
|
|
aria-live="assertive"
|
|
>
|
|
<div className="text-[64px] mb-4" aria-hidden="true">
|
|
🔧
|
|
</div>
|
|
<h1 className="text-[28px] font-bold mb-2 text-[var(--color-text-main)]">
|
|
Internal Server Error
|
|
</h1>
|
|
<p className="text-[15px] text-[var(--color-text-muted)] max-w-[400px] leading-relaxed mb-2">
|
|
Something went wrong while processing your request. Our team has been
|
|
notified and is working on a fix.
|
|
</p>
|
|
{error?.digest && (
|
|
<p className="text-xs text-[var(--color-text-muted)] mb-6 font-mono">
|
|
Error ID: {error.digest}
|
|
</p>
|
|
)}
|
|
{process.env.NODE_ENV === "development" && error?.message && (
|
|
<pre
|
|
className="p-4 rounded-lg bg-red-500/10 border border-red-500/30 text-red-500 text-xs max-w-[600px] overflow-auto text-left mb-6"
|
|
aria-label="Error details"
|
|
>
|
|
{error.message}
|
|
{error.stack && `\n\n${error.stack}`}
|
|
</pre>
|
|
)}
|
|
<div className="flex gap-3">
|
|
<button
|
|
onClick={reset}
|
|
aria-label="Retry loading the page"
|
|
className="px-6 py-2.5 rounded-lg text-white text-sm font-semibold cursor-pointer transition-all duration-200 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] focus:outline-2 focus:outline-offset-2 focus:outline-[var(--color-accent)]"
|
|
>
|
|
Try Again
|
|
</button>
|
|
<a
|
|
href="/dashboard"
|
|
className="px-6 py-2.5 rounded-lg text-[var(--color-text-main)] text-sm font-semibold cursor-pointer transition-all duration-200 border border-[var(--color-border)] hover:bg-[var(--color-bg-alt)] no-underline focus:outline-2 focus:outline-offset-2 focus:outline-[var(--color-accent)]"
|
|
aria-label="Return to dashboard"
|
|
>
|
|
Go to Dashboard
|
|
</a>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|