Skip to content

fix: detect silent SSE connection drops during long tool executions#250

Open
jasonjaclyn2017 wants to merge 1 commit intoop7418:mainfrom
jasonjaclyn2017:fix/silent-session-disconnect
Open

fix: detect silent SSE connection drops during long tool executions#250
jasonjaclyn2017 wants to merge 1 commit intoop7418:mainfrom
jasonjaclyn2017:fix/silent-session-disconnect

Conversation

@jasonjaclyn2017
Copy link
Contributor

When Claude runs a long script, the SSE connection can be silently dropped by transport layers (OS TCP stack, Electron internals, HTTP idle timeouts). Previously this caused the stream to appear "completed" with partial content and no error message.

Two-part fix:

Server-side heartbeat (claude-client.ts):

  • Send keep_alive SSE events every 30s independently of SDK activity
  • Prevents intermediate layers from considering the connection idle
  • Timer properly cleaned up in all exit paths including cancel()

Client-side detection (useSSEStream.ts + stream-session-manager.ts):

  • Track whether the server's 'done' SSE event was received
  • If reader finishes without 'done', treat as connection drop
  • Show "Connection lost" error and clear stale SDK session
  • Flush residual SSE buffer after reader signals done

i18n (en.ts + zh.ts):

  • Add streaming.connectionDrop translation key

When Claude runs a long script, the SSE connection can be silently
dropped by transport layers (OS TCP stack, Electron internals, HTTP
idle timeouts). Previously this caused the stream to appear "completed"
with partial content and no error message.

Two-part fix:

Server-side heartbeat (claude-client.ts):
- Send keep_alive SSE events every 30s independently of SDK activity
- Prevents intermediate layers from considering the connection idle
- Timer properly cleaned up in all exit paths including cancel()

Client-side detection (useSSEStream.ts + stream-session-manager.ts):
- Track whether the server's 'done' SSE event was received
- If reader finishes without 'done', treat as connection drop
- Show "Connection lost" error and clear stale SDK session
- Flush residual SSE buffer after reader signals done

i18n (en.ts + zh.ts):
- Add streaming.connectionDrop translation key

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vercel
Copy link

vercel bot commented Mar 11, 2026

@jasonjaclyn2017 is attempting to deploy a commit to the op7418's projects Team on Vercel.

A member of the Team first needs to authorize it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant