From 9531fcff5a20940e1548cee55ca185ca3ff7e227 Mon Sep 17 00:00:00 2001 From: Simon <10131203+gaomeng1900@users.noreply.github.com> Date: Wed, 21 Jan 2026 16:50:55 +0800 Subject: [PATCH] feat(ext): enhance error handling and improve UI structure --- .../extension/src/entrypoints/background.ts | 4 ++ .../src/entrypoints/sidepanel/App.tsx | 12 ++--- .../sidepanel/components/ErrorBoundary.tsx | 49 +++++++++++++++++++ .../sidepanel/components/cards/index.tsx | 30 ++++++------ .../src/entrypoints/sidepanel/main.tsx | 5 +- 5 files changed, 79 insertions(+), 21 deletions(-) create mode 100644 packages/extension/src/entrypoints/sidepanel/components/ErrorBoundary.tsx diff --git a/packages/extension/src/entrypoints/background.ts b/packages/extension/src/entrypoints/background.ts index bec0541..7f4de33 100644 --- a/packages/extension/src/entrypoints/background.ts +++ b/packages/extension/src/entrypoints/background.ts @@ -145,6 +145,10 @@ function registerCommandHandlers(): void { // Execute task (don't await - runs in background) agent.execute(task).catch((error) => { console.error('[PageAgentExt] Task execution error:', error) + const message = error instanceof Error ? error.message : String(error) + // Broadcast error as a history event so it persists in UI + const errorEvent: HistoricalEvent = { type: 'error', message } + eventBroadcaster.history([errorEvent]) eventBroadcaster.status('error') }) }) diff --git a/packages/extension/src/entrypoints/sidepanel/App.tsx b/packages/extension/src/entrypoints/sidepanel/App.tsx index 77b8680..b85f6ba 100644 --- a/packages/extension/src/entrypoints/sidepanel/App.tsx +++ b/packages/extension/src/entrypoints/sidepanel/App.tsx @@ -109,7 +109,7 @@ export default function App() { return (
{/* Header */} -
+
Page Agent Ext @@ -120,10 +120,10 @@ export default function App() {
-
+ {/* Content */} -
+
{/* Current task */} {currentTask && (
@@ -145,10 +145,10 @@ export default function App() { {/* Activity indicator at bottom */} {activity && }
-
+ {/* Input */} -
+
+
) } diff --git a/packages/extension/src/entrypoints/sidepanel/components/ErrorBoundary.tsx b/packages/extension/src/entrypoints/sidepanel/components/ErrorBoundary.tsx new file mode 100644 index 0000000..f04a1a0 --- /dev/null +++ b/packages/extension/src/entrypoints/sidepanel/components/ErrorBoundary.tsx @@ -0,0 +1,49 @@ +import { AlertTriangle, RotateCcw } from 'lucide-react' +import { Component, type ErrorInfo, type ReactNode } from 'react' + +import { Button } from '@/components/ui/button' + +interface Props { + children: ReactNode +} + +interface State { + hasError: boolean + error: Error | null +} + +export class ErrorBoundary extends Component { + state: State = { hasError: false, error: null } + + static getDerivedStateFromError(error: Error): State { + return { hasError: true, error } + } + + componentDidCatch(error: Error, errorInfo: ErrorInfo) { + console.error('[ErrorBoundary]', error, errorInfo.componentStack) + } + + handleReload = () => { + window.location.reload() + } + + render() { + if (!this.state.hasError) { + return this.props.children + } + + return ( +
+ +

Something went wrong

+

+ {this.state.error?.message || 'An unexpected error occurred'} +

+ +
+ ) + } +} diff --git a/packages/extension/src/entrypoints/sidepanel/components/cards/index.tsx b/packages/extension/src/entrypoints/sidepanel/components/cards/index.tsx index abff419..6ae94d0 100644 --- a/packages/extension/src/entrypoints/sidepanel/components/cards/index.tsx +++ b/packages/extension/src/entrypoints/sidepanel/components/cards/index.tsx @@ -60,11 +60,11 @@ function ReflectionItem({ icon, value }: { icon: string; value: string }) { return ( - {icon} + {icon} setExpanded(!expanded)} > @@ -93,11 +93,11 @@ function ReflectionSection({ if (items.length === 0) return null return ( -
-
+
+ {/*
Reflection -
-
+
*/} +
{items.map((item) => ( ))} @@ -162,15 +162,17 @@ export function EventCard({ event }: { event: HistoricalEvent }) { if (event.type === 'step') { return ( -
+
+
Step
+ {/* Reflection */} {event.reflection && } {/* Action */} {event.action && (
-
- Action +
+ Actions

- {event.action.name} + {event.action.name} {JSON.stringify(event.action.input)} @@ -198,10 +200,10 @@ export function EventCard({ event }: { event: HistoricalEvent }) { if (event.type === 'observation') { return ( -

-
+
+ {/*
Observation -
+
*/}
{event.content} @@ -248,7 +250,7 @@ export function ActivityCard({ activity }: { activity: AgentActivity }) { const info = getActivityInfo() return ( -
+
- + + + )