+
+ this.setState({ hasError: false, error: null })}
+ />
+
+
+ );
+ }
+ return this.props.children;
+ }
+}
diff --git a/packages/frontend/src/components/ErrorDisplay.tsx b/packages/frontend/src/components/ErrorDisplay.tsx
new file mode 100644
index 0000000..1b3ac2b
--- /dev/null
+++ b/packages/frontend/src/components/ErrorDisplay.tsx
@@ -0,0 +1,85 @@
+import { useState } from "react";
+
+interface ErrorDisplayProps {
+ title?: string;
+ message: string;
+ fullLog?: string;
+ onRetry?: () => void;
+}
+
+export function ErrorDisplay({
+ title = "Something went wrong",
+ message,
+ fullLog,
+ onRetry,
+}: ErrorDisplayProps) {
+ const [expanded, setExpanded] = useState(false);
+
+ const copyError = () => {
+ const text = fullLog ? `${title}\n${message}\n\n${fullLog}` : `${title}\n${message}`;
+ navigator.clipboard.writeText(text).catch(() => {});
+ };
+
+ return (
+