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 */}
-
+
{/* 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 (
-
-
+
*/}
{event.content}
@@ -248,7 +250,7 @@ export function ActivityCard({ activity }: { activity: AgentActivity }) {
const info = getActivityInfo()
return (
-