Skip to content

fix+feat: batch v0.50.236 — OAuth providers fix, profile switch UX, YOLO mode#1211

Merged
nesquena-hermes merged 5 commits intomasterfrom
stage/v0.50.236
Apr 28, 2026
Merged

fix+feat: batch v0.50.236 — OAuth providers fix, profile switch UX, YOLO mode#1211
nesquena-hermes merged 5 commits intomasterfrom
stage/v0.50.236

Conversation

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

Batch release v0.50.236

Three PRs: an OAuth provider fix, a profile-switching UX improvement, and the long-awaited YOLO mode feature.

Constituent PRs

PR Author What
#1208 @nesquena-hermes fix(providers): OAuth cards show correct "Configured" status
#1209 @nesquena-hermes ux(profiles): spinner + parallelized fetches during profile switch
#1210 @bergeouss (rebased) feat: YOLO mode toggle — skip all approvals per session

All three were independently reviewed and approved by @nesquena before this batch was assembled. Per the batch release bypass policy, no additional review round is needed.

What's in this release

fix(providers) — #1208
OAuth providers (openai-codex, nous, copilot) always showed "Not configured" in Settings → Providers even when working. Three root causes: (1) has_key=True from config.yaml was overwritten by get_auth_status() returning logged_in=False; (2) the provider list filter filter(p=>p.configurable) excluded all OAuth providers entirely; (3) auth error strings were discarded. All fixed. 15 new tests.

ux(profiles) — #1209
Profile chip now shows the new profile name immediately on click (optimistic update), displays a small spinner, and disables the button to prevent double-clicks. finally block guarantees cleanup. populateModelDropdown() and loadWorkspaceList() now run in parallel via Promise.all, cutting switch time ~50%. 11 new tests.

feat: YOLO mode — #1210 (original: #1152 by @bergeouss)
/yolo slash command and "Skip all this session" button on approval cards. Session-scoped, in-memory only (not persisted across restarts). ⚡ amber pill in composer footer shows active state. Full i18n across 8 locales. 24 new tests.

Test results

2837 passed, 0 failed, 2 skipped (macOS-only skips, intentional)

Previous: 2773 tests. This batch adds 50 new tests.

Files changed (13 files, 950 insertions, 17 deletions)

api/providers.py, api/routes.py, static/commands.js, static/i18n.js, static/index.html, static/messages.js, static/panels.js, static/sessions.js, static/style.css, tests/test_issue1202_oauth_provider_status.py, tests/test_issue467_yolo_mode_toggle.py, tests/test_profile_switch_ux.py, CHANGELOG.md

nesquena and others added 5 commits April 28, 2026 05:45
…her locales

The PR added providers_oauth_config_yaml_hint and providers_oauth_not_configured_hint
to en/ru/es/de/zh/ko but omitted zh-Hant — the existing related key
providers_oauth_hint has full 7-locale coverage including zh-Hant. Without
this entry, zh-Hant users fall back to the English string for these specific
two messages while the rest of the providers panel renders in zh-Hant.

Match the project's standard 7-locale coverage so the OAuth provider card body
text is consistent for Traditional Chinese users.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
…1202)

OAuth providers (openai-codex, nous, copilot) always showed "Not configured" in
Settings → Providers even when fully working. Three separate issues:

1. api/providers.py — has_key from _provider_has_key() was unconditionally discarded:
   The `else: has_key = False` branch and `except Exception: has_key = False` both
   forced False, hiding a valid token in config.yaml → providers.<id>.api_key.
   Fix: `elif has_key: key_source = "config_yaml"` preserves config.yaml tokens;
   except clause now logs debug and keeps the existing has_key value.

2. api/providers.py — OAuth providers not visible in Settings panel at all:
   configurable=False for all OAuth providers (by design — WebUI can't set OAuth tokens).
   But the JS filter `filter(p=>p.configurable)` excluded them entirely.
   Fix: added is_oauth field to the provider dict; JS filter changed to
   `filter(p=>p.configurable||p.is_oauth)` so OAuth providers appear in Settings.

3. api/providers.py + static/panels.js — auth_error not surfaced to user:
   get_auth_status() returns a descriptive error string (e.g. "Codex refresh token
   consumed by Codex CLI. Run hermes auth.") but it was discarded.
   Fix: auth_error field added to provider dict and rendered in OAuth card body.

static/panels.js:
   - isOauth now uses p.is_oauth from backend (eliminates hardcoded ID list)
   - OAuth card body shows different hints: config_yaml, auth_error, not-configured
   - Configured badge shows for OAuth providers with has_key=True

static/i18n.js:
   - providers_oauth_config_yaml_hint (6 locales)
   - providers_oauth_not_configured_hint (6 locales)

15 new tests in tests/test_issue1202_oauth_provider_status.py, including
regression guards for all three root causes.

2802 tests pass, 0 fail.
…itching

Visual feedback:
- Profile chip immediately shows the new name (optimistic update) when clicked
- Small CSS spinner appears on the chip icon during the switch
- Button is disabled to prevent double-clicks stacking
- finally block always cleans up — chip can never get stuck in loading state
- On error: chip label reverts to the previous profile name

Performance:
- populateModelDropdown() and loadWorkspaceList() now run via Promise.all
  instead of sequential awaits — model dropdown fetch and workspace list
  fetch are independent, so they run simultaneously (~50% faster switches)
- Apply steps (S._pendingProfileModel, workspace update) happen after
  Promise.all resolves — correctness unchanged

11 new tests in tests/test_profile_switch_ux.py covering:
- spinner CSS class present during switch, removed in finally
- optimistic name set before API call
- chip disabled during switch, re-enabled after
- error path reverts chip label
- Promise.all pattern verified
- no old sequential await pattern present
- CSS switching class has correct properties

2798 tests pass, 0 fail.
…1152)

Co-authored-by: bergeouss <[email protected]>
Closes #467

Rebased onto master with i18n.js conflict resolved (kept both master's
status_* keys and PR's yolo_* keys in each locale block). All other
files applied cleanly.
@nesquena-hermes nesquena-hermes merged commit 24b1e6f into master Apr 28, 2026
3 checks passed
@nesquena-hermes nesquena-hermes deleted the stage/v0.50.236 branch April 28, 2026 05:56
JKJameson pushed a commit to JKJameson/hermes-webui that referenced this pull request Apr 29, 2026
…OLO mode (nesquena#1211)

fix+feat: batch v0.50.236 — OAuth providers fix, profile switch UX, YOLO mode (nesquena#1211)

Merges PRs nesquena#1208, nesquena#1209, nesquena#1210 (nesquena#1152 rebased):

- fix(providers): OAuth provider cards show correct Configured status in Settings.
  get_providers() was discarding has_key=True from _provider_has_key() for OAuth
  providers, hiding config.yaml tokens. Also fixed filter excluding all OAuth providers
  from the Settings panel. Surfaces auth_error string. (closes nesquena#1202)

- ux(profiles): profile chip shows spinner and new name immediately on switch.
  Optimistic name update + .switching CSS class + chip disabled + finally cleanup.
  populateModelDropdown() and loadWorkspaceList() now parallelized via Promise.all.

- feat: YOLO mode toggle — skip all approvals per session.
  /yolo slash command, "Skip all this session" button on approval cards,
  amber ⚡ pill indicator in composer footer. Session-scoped, in-memory.
  Full i18n: en, ru, es, de, zh, ko, zh-Hant. (closes nesquena#467)
  Original author: @bergeouss (PR nesquena#1152)

Tests: 2837 passed (+50 new tests vs previous release)
QA harness: 20/20 passed + all browser API checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants