fix(tui_gateway): route setup.runtime_check and setup.status to RPC pool

setup.runtime_check and setup.status are polled by the Desktop frontend on
connect and periodically (use-status-snapshot → evaluateRuntimeReadiness), but
neither was in _LONG_HANDLERS — so dispatch() ran both inline on the WS reader
thread. Under GIL pressure from concurrent agent turns (terminal I/O, large
output, background-process completions) either can block for seconds:

- setup.runtime_check → resolve_runtime_provider() (config read, auth check,
  may probe the provider endpoint)
- setup.status → _has_any_provider_configured() (provider config + credential
  scan)

While either blocks the reader thread the WS read loop can't service later
requests; the frontend RPC timeout fires, the client drops the socket, and the
lost setup.runtime_check response reads as ready=false — a false "needs setup"
/ "Settings failed to load" even though the provider is configured.

Route both to the RPC pool (same precedent as #55545's session.list/pet.info/
process.list). The handlers are read-only and pool writes go through the
lock-guarded write_json, so there's no ordering or safety concern.

Test asserts all 5 frontend-polled RPCs are pool-routed.

Co-authored-by: izumi0uu <izumi0uu@gmail.com>
This commit is contained in:
Yingliang Zhang 2026-07-01 13:41:31 +08:00 committed by brooklyn!
parent 1501a338c3
commit 67472fbaa4
2 changed files with 15 additions and 3 deletions

View file

@ -64,9 +64,11 @@ def capture(server):
# seconds when the GIL is contended by concurrent agent turns.
FRONTEND_POLLED_RPCS = [
"session.list", # loads session list — SQLite query
"pet.info", # petdex poll — file/network read
"process.list", # background process status — process registry scan
"session.list", # loads session list — SQLite query
"pet.info", # petdex poll — file/network read
"process.list", # background process status — process registry scan
"setup.runtime_check", # runtime readiness — resolve_runtime_provider() I/O
"setup.status", # provider configured check — config/credential scan
]

View file

@ -212,6 +212,16 @@ _LONG_HANDLERS = frozenset(
"projects.for_cwd",
"projects.tree",
"projects.project_sessions",
# Setup readiness RPCs are polled by the Desktop frontend on connect
# and periodically (use-status-snapshot → evaluateRuntimeReadiness).
# setup.runtime_check calls resolve_runtime_provider() which reads
# config, checks auth state, and may probe the provider endpoint;
# setup.status calls _has_any_provider_configured() which scans
# provider config + credential files. Under GIL pressure from
# concurrent agent turns, either can take seconds inline, blocking
# the WS read loop and causing false "needs setup" (#50005 family).
"setup.runtime_check",
"setup.status",
"session.branch",
"session.compress",
"session.list",