From 5ed27c0f743c42d1f086f5e972f04c78eb930e00 Mon Sep 17 00:00:00 2001 From: sprmn24 Date: Wed, 29 Apr 2026 01:44:48 +0300 Subject: [PATCH] fix(tui_gateway): guard env var parsing against invalid values at import _SLASH_WORKER_TIMEOUT_S and _pool used raw float()/int() on env vars at module level. A non-numeric value (e.g. HERMES_TUI_SLASH_TIMEOUT_S=abc) raises ValueError during import, preventing TUI gateway from starting with no useful error message. Wrap both parses in try/except with safe fallbacks: - HERMES_TUI_SLASH_TIMEOUT_S: fallback to 45.0s - HERMES_TUI_RPC_POOL_WORKERS: fallback to 4 workers --- tui_gateway/server.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tui_gateway/server.py b/tui_gateway/server.py index 84b89a43..61aa683b 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -125,9 +125,11 @@ _cfg_lock = threading.Lock() _cfg_cache: dict | None = None _cfg_mtime: float | None = None _cfg_path = None -_SLASH_WORKER_TIMEOUT_S = max( - 5.0, float(os.environ.get("HERMES_TUI_SLASH_TIMEOUT_S", "45") or 45) -) +try: + _slash_timeout = float(os.environ.get("HERMES_TUI_SLASH_TIMEOUT_S") or "45") +except (ValueError, TypeError): + _slash_timeout = 45.0 +_SLASH_WORKER_TIMEOUT_S = max(5.0, _slash_timeout) _DETAIL_SECTION_NAMES = ("thinking", "tools", "subagents", "activity") _DETAIL_MODES = frozenset({"hidden", "collapsed", "expanded"}) @@ -153,8 +155,12 @@ _LONG_HANDLERS = frozenset( } ) +try: + _rpc_pool_workers = max(2, int(os.environ.get("HERMES_TUI_RPC_POOL_WORKERS") or "4")) +except (ValueError, TypeError): + _rpc_pool_workers = 4 _pool = concurrent.futures.ThreadPoolExecutor( - max_workers=max(2, int(os.environ.get("HERMES_TUI_RPC_POOL_WORKERS", "4") or 4)), + max_workers=_rpc_pool_workers, thread_name_prefix="tui-rpc", ) atexit.register(lambda: _pool.shutdown(wait=False, cancel_futures=True))