Fixes issue #547 by having the shared GitHub LSP installer in aft-bridge preserve full distribution runtimes for LuaLS and clangd, and by smoke-testing cached and newly installed servers before exposing their paths.
Bug Fixes
Cached servers that fail runtime startup are automatically repaired and revalidated with a bounded smoke command; required runtime resources are verified before a cached smoke verdict is trusted.
Cached paths blocked by an in-flight install lock are retried in the background, so a second session picks up servers installed by the first. These waits abort on shutdown instead of blocking for the lock's full timeout, and skipped servers are tracked the same way.
OpenCode publishes each ready server's path to the live transport pool as it settles, so one held install lock no longer delays unrelated servers until every install completes.
Upgrade candidates are validated and smoke-tested in staging before the swap, so a failed download or extraction leaves the working distribution intact.
Arbitrary files no longer count as healthy cache entries; only runnable executables passing the smoke check qualify. Passed and timeout verdicts are cached by executable digest so healthy caches stay zero-hash.
Refactors
The GitHub installer, release probe, and server spec table move from pi-plugin and opencode-plugin into aft-bridge with host adapters; both plugins now share the same implementation.
Server specs gain layout (distribution | standalone), smokeArgs, and required runtime paths so distribution-style servers keep resources next to the executable.
Confidence Score: 5/5
The latest changes appear safe to merge; no new blocking issue was found.
Summary
Both plugins now share a GitHub language-server installer that preserves LuaLS and clangd runtime files.
LuaLS and clangd keep their runtime files beside their executables.
Pi and OpenCode use the same GitHub LSP installer.
Pi and OpenCode add each ready server path to live bridges.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Check cached server] --> B{Install lock busy?}
B -->|Yes| C[Wait for lock or cancellation]
C -->|Cancelled| D[Stop waiting]
C -->|Released| E[Check server]
B -->|No| E
E -->|Ready| F[Publish server path]
F --> G{OpenCode pool attached?}
G -->|No| H[Save paths and replay at attach]
G -->|Yes| I[Update future and live bridges]