diff --git a/hermes_cli/inventory.py b/hermes_cli/inventory.py index 03964dbc20..83abb891d4 100644 --- a/hermes_cli/inventory.py +++ b/hermes_cli/inventory.py @@ -1017,6 +1017,14 @@ def _apply_pricing( # paid models on its first picker open. row["free_tier_pending"] = True row["unavailable_models"] = list(models) + # Every model renders locked until the prewarm lands; say why + # on the existing per-provider warning surface instead of + # leaving the user staring at a greyed-out list. + if not row.get("warning"): + row["warning"] = ( + "Checking Nous plan entitlement… models unlock on the " + "next picker open (or refresh)." + ) continue if not raw_pricing: if slug == "nous": diff --git a/tests/hermes_cli/test_inventory_pricing.py b/tests/hermes_cli/test_inventory_pricing.py index 0309ff8285..d626593f34 100644 --- a/tests/hermes_cli/test_inventory_pricing.py +++ b/tests/hermes_cli/test_inventory_pricing.py @@ -170,6 +170,13 @@ def test_cold_nous_entitlement_keeps_models_unselectable(monkeypatch): assert rows[0]["free_tier_pending"] is True assert rows[0]["unavailable_models"] == ["free/model", "paid/model"] + # The whole list renders locked — the picker's per-provider warning + # surface must say why, without clobbering an existing auth warning. + assert "entitlement" in rows[0]["warning"] + + rows = [{"slug": "nous", "models": ["m"], "warning": "paste NOUS_API_KEY to activate"}] + inv._apply_pricing(rows, cached_only=True) + assert rows[0]["warning"] == "paste NOUS_API_KEY to activate" def test_prewarm_preserves_context_and_runs_once_per_profile(tmp_path, monkeypatch):