{"record":{"id":"b10279033a5489aa","repo":"HKUDS/Vibe-Trading","slug":"signal-sse-stream-ended-unexpectedly","errorCode":null,"errorMessage":"Signal SSE stream ended unexpectedly","messagePattern":"Signal SSE stream ended unexpectedly","errorType":"error_code","errorClass":"ConnectionError","httpStatus":null,"severity":"error","filePath":"agent/src/channels/signal.py","lineNumber":494,"sourceCode":"                    else:\n                        raise ConnectionRefusedError(\n                            f\"signal-cli daemon check returned status {response.status_code}\"\n                        )\n                except Exception as e:\n                    raise ConnectionRefusedError(f\"signal-cli daemon not responding: {e}\")\n\n                # Reset reconnect delay after successful connection check.\n                reconnect_delay_s = 1.0\n\n                # Ensure account-level typing indicators are enabled.\n                await self._ensure_typing_indicators_enabled()\n\n                # Start SSE receiver and supervise it. If it exits while we're still\n                # running, treat it as a disconnect and reconnect.\n                self._sse_task = asyncio.create_task(self._sse_receive_loop())\n                await self._sse_task\n                if self._running:\n                    raise ConnectionError(\"Signal SSE stream ended unexpectedly\")\n\n            except asyncio.CancelledError:\n                break\n            except ConnectionRefusedError as e:\n                self.logger.error(\n                    \"{}. Make sure signal-cli daemon is running: \"\n                    \"signal-cli -a {} daemon --http {}:{}\",\n                    e,\n                    self.config.phone_number,\n                    self.config.daemon_host,\n                    self.config.daemon_port,\n                )\n            except Exception as e:\n                self.logger.error(\"Signal channel error: {}\", e)\n            finally:\n                if self._sse_task:\n                    if not self._sse_task.done():\n                        self._sse_task.cancel()","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/channels/signal.py#L476-L512","documentation":"Raised when the supervised SSE task (/api/v1/events stream) exits while the channel is still supposed to be running; the connector treats it as an unexpected disconnect.","triggerScenarios":"signal-cli closes the SSE event stream (restart, idle timeout, proxy cutting the stream) while _running is true.","commonSituations":"Reverse proxy (nginx) timing out long-lived SSE connections, signal-cli restarting, or network interruption.","solutions":["Ensure any proxy in front of signal-cli disables buffering and extends read timeouts for /api/v1/events","Restart/reconnect logic: the loop retries; confirm signal-cli stays up","Check signal-cli logs for why the stream ended"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"except ConnectionError as e:\n    if 'SSE stream ended' in str(e):\n        log.warning('SSE ended; channel loop will reconnect')","preventionTips":["Keep the channel's supervised loop running so it reconnects","Tune proxy read timeouts for /api/v1/events"],"tags":["signal","sse","network","streaming"],"backgroundTag":"sse-stream-disconnected","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}