HKUDS/Vibe-Trading · critical · ConnectionRefusedError

signal-cli daemon check returned status {response.status_cod

Error message

signal-cli daemon check returned status {response.status_code}

What it means

The Signal HTTP-mode connector polls signal-cli's /api/v1/check endpoint at startup; a non-200 status means the daemon answered but is unhealthy.

Source

Thrown at agent/src/channels/signal.py:477

        reconnect_delay_s = 1.0
        max_reconnect_delay_s = 30.0

        while self._running:
            try:
                self.logger.info("Connecting to signal-cli daemon at {}...", base_url)

                # Create HTTP client
                self._http = httpx.AsyncClient(
                    timeout=self._HTTP_TIMEOUT_SECONDS, base_url=base_url
                )

                # Test connection
                try:
                    response = await self._http.get("/api/v1/check")
                    if response.status_code == 200:
                        self.logger.info("Connected to signal-cli daemon")
                    else:
                        raise ConnectionRefusedError(
                            f"signal-cli daemon check returned status {response.status_code}"
                        )
                except Exception as e:
                    raise ConnectionRefusedError(f"signal-cli daemon not responding: {e}")

                # Reset reconnect delay after successful connection check.
                reconnect_delay_s = 1.0

                # Ensure account-level typing indicators are enabled.
                await self._ensure_typing_indicators_enabled()

                # Start SSE receiver and supervise it. If it exits while we're still
                # running, treat it as a disconnect and reconnect.
                self._sse_task = asyncio.create_task(self._sse_receive_loop())
                await self._sse_task
                if self._running:
                    raise ConnectionError("Signal SSE stream ended unexpectedly")

View on GitHub (pinned to 80ffdda44c)

Solutions

  1. Verify signal-cli REST API: curl http://host:8080/api/v1/check
  2. Ensure signal-cli was started with 'signal-cli --config ... rest' and an account is registered
  3. Check signal_endpoint config points to the correct host:port
Defensive patterns

Strategy: retry

Validate before calling

import httpx
async with httpx.AsyncClient() as c:
    r = await c.get(f"{endpoint}/api/v1/check")
    assert r.status_code == 200, f'signal-cli check: {r.status_code}'

Try / catch

try:
    await signal_channel.start()
except ConnectionRefusedError as e:
    # includes both 201 and 202 messages
    log_and_alert(e); await asyncio.sleep(backoff); retry

Prevention

When it happens

Trigger: Calling start() on the Signal channel in HTTP mode when signal-cli's REST API returns 4xx/5xx (e.g. unregistered number, wrong port serving something else).

Common situations: signal-cli running without an account registered, api mode not enabled (signal-cli -o json rest), or the URL pointing at a different service.

Related errors


AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28). Data as JSON: /api/errors/c2d1d9d5f9a5ff47. Report an issue: GitHub.