From 8025c00767e7a92affb5c4f2b718c8e788f3ea27 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 17:16:21 +0000 Subject: [PATCH 1/2] Initial plan From 8043320a19bad7c479db83945f00e4113d062bd2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 17:20:40 +0000 Subject: [PATCH 2/2] fix: restore ready event signaling before server start to prevent timeouts Co-authored-by: observerw <20661574+observerw@users.noreply.github.com> --- src/lsp_cli/manager/client.py | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/lsp_cli/manager/client.py b/src/lsp_cli/manager/client.py index 623e580..3d8ec93 100644 --- a/src/lsp_cli/manager/client.py +++ b/src/lsp_cli/manager/client.py @@ -42,7 +42,6 @@ class ManagedClient: _logger_sink_id: int = field(init=False) _port: int | None = field(init=False, default=None) _ready_event: anyio.Event = field(init=False, factory=anyio.Event) - _startup_error: Exception | None = field(init=False, default=None) def __attrs_post_init__(self) -> None: self._deadline = anyio.current_time() + settings.idle_timeout @@ -68,14 +67,8 @@ def id(self) -> str: return get_client_id(self.target) async def wait_ready(self) -> None: - """Wait until the client is assigned a port/socket and ready to serve. - - Raises: - Exception: If the client failed to start. - """ + """Wait until the client is assigned a port/socket and ready to serve.""" await self._ready_event.wait() - if self._startup_error: - raise self._startup_error @property def conn(self) -> ConnectionInfo: @@ -130,18 +123,12 @@ async def _serve(self) -> None: @asynccontextmanager async def lifespan(app: Litestar) -> AsyncGenerator[None]: - try: - async with self.target.client_cls( - workspace=self.target.project_path - ) as client: - app.state.client = client - app.state.capabilities = Capabilities.build(client) - self._ready_event.set() - yield - except Exception as e: - self._startup_error = e - self._ready_event.set() - raise + async with self.target.client_cls( + workspace=self.target.project_path + ) as client: + app.state.client = client + app.state.capabilities = Capabilities.build(client) + yield def exception_handler(request: Request, exc: Exception) -> Response: self._logger.exception("Unhandled exception in Litestar: {}", exc) @@ -196,6 +183,9 @@ async def run(self) -> None: await uds_path.unlink(missing_ok=True) await uds_path.parent.mkdir(parents=True, exist_ok=True) + # Signal that connection info is available (port/socket path assigned) + self._ready_event.set() + self._logger.info( "Starting managed client for project {} at {}", self.target.project_path,