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 ? (