Files
hermes-agent/agent
Siddharth Balyan f9549f3d9b Free-tier rate limits: renewed token, a prompt card on desktop, streamed status, honest resume model (#129396)
* fix: a rate-limited turn renews an expired free-tier token and stops sleeping for minutes on desktop

A free-tier 429 carries retry_after (1069 s in the lab run). The loop capped
it at 600 s, slept, retried inside the same pause, slept 469 s more, and the
third attempt went out on a guest JWT that had expired during the wait (the
JWT lives 15 minutes). The welcome host answered 403 "invalid jwt", which
welcome_route_refusal read as the dark tier, so the user was told signing-in
was switched off, after 18 minutes of a thinking line.

- interruptible_backoff_sleep adopts a fresh Nous key after every completed
  wait; the per-iteration pre-expiry adoption never ran between retries.
- A welcome-host 403 that says "invalid jwt" is its own route kind,
  session_expired: the existing one-shot route heal re-exchanges the anon
  credential and retries. If the renewal fails the copy says so and the card
  is the retryable outage card, never free_tier_disabled.
- On desktop and TUI a provider cooldown longer than 60 s ends the attempt
  cycle at once (fallback first, else the reset time and the sign-in / model
  doors). Background surfaces keep the long wait.
- Rate-limit waits a user feels (over 60 s, or any on a live surface) emit
  their status line when the wait starts instead of from the end-of-turn
  buffer, and every retry line names the attempt that runs after the wait.

* fix: a not-yet-built free-tier session reports nous/welcome, not the silent default

session.resume (deferred build), session.create and the lazy fallback info reported the configured default model (the silent default z-ai/glm-5.2, no provider) while the agent build pins nous/welcome on the free tier's route. _session_default_route reports the pinned route when the profile routes to the free tier.

* fix: the scripted setup opening's setup_choose calls carry options

#129344 made options required on setup_choose; the backend prelude's name and accent cards omitted it, so the history held calls that do not match the schema. The name card carries the suggested-name row or an empty list, the accent card an empty list.
2026-09-30 21:02:32 +05:30
..
2026-09-11 09:31:13 -07:00