diff --git a/apps/code/src/renderer/features/sessions/components/SessionView.tsx b/apps/code/src/renderer/features/sessions/components/SessionView.tsx
index b95675e7d..bdd446685 100644
--- a/apps/code/src/renderer/features/sessions/components/SessionView.tsx
+++ b/apps/code/src/renderer/features/sessions/components/SessionView.tsx
@@ -63,6 +63,7 @@ interface SessionViewProps {
hasError?: boolean;
errorTitle?: string;
errorMessage?: string;
+ errorRetryable?: boolean;
onRetry?: () => void;
onNewSession?: () => void;
isInitializing?: boolean;
@@ -78,6 +79,48 @@ interface SessionViewProps {
const DEFAULT_ERROR_MESSAGE =
"Failed to resume this session. The working directory may have been deleted. Please start a new session.";
+interface CloudStreamDisconnectedBannerProps {
+ errorTitle?: string;
+ errorMessage?: string;
+ onRetry?: () => void;
+}
+
+function CloudStreamDisconnectedBanner({
+ errorTitle,
+ errorMessage,
+ onRetry,
+}: CloudStreamDisconnectedBannerProps) {
+ return (
+
+
+
+ {errorTitle && (
+
+ {errorTitle}
+
+ )}
+ {errorMessage && (
+
+ {errorMessage}
+
+ )}
+
+ {onRetry && (
+
+ )}
+
+ );
+}
+
/**
* When an allow_always permission is granted outside a mode-switch prompt,
* ratchet the session to the closest "auto-accept edits" preset offered by
@@ -116,6 +159,7 @@ export function SessionView({
hasError = false,
errorTitle,
errorMessage = DEFAULT_ERROR_MESSAGE,
+ errorRetryable = false,
onRetry,
onNewSession,
isInitializing = false,
@@ -137,6 +181,7 @@ export function SessionView({
const currentModeId = modeOption?.currentValue;
const handoffInProgress =
useSessionForTask(taskId)?.handoffInProgress ?? false;
+ const showInlineBanner = hasError && errorRetryable && events.length > 0;
useEffect(() => {
if (allowBypassPermissions) return;
@@ -524,6 +569,13 @@ export function SessionView({
) : (
<>
+ {showInlineBanner && (
+
+ )}
- {hasError ? (
+ {hasError && !showInlineBanner ? (