mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-01 12:52:11 +03:00
- Replace all `as any` casts in MCP advancedTools with typed helpers (toRecord, toString, toNumber) - Harden open-sse services: rateLimitManager, sessionManager, usage, roleNormalizer, signatureCache, comboMetrics - Improve responseSanitizer and responseTranslator type safety - Remove deprecated openai-responses request translator - Add dashboard pages: /a2a, /mcp, /auto-combo with live data - Improve error/loading/not-found pages with consistent design - Add root loading.tsx and typecheck tsconfig variants - Add check-t11-any-budget.mjs audit script
72 lines
2.8 KiB
TypeScript
72 lines
2.8 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 motion-reduce:transition-none 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 motion-reduce:transition-none 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>
|
|
<a
|
|
href="/status"
|
|
className="px-6 py-2.5 rounded-lg text-[var(--color-text-main)] text-sm font-semibold cursor-pointer transition-all duration-200 motion-reduce:transition-none 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="Open system status"
|
|
>
|
|
System Status
|
|
</a>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|