Skip to content

feat: YOLO mode toggle — skip all approvals per session (#467)#1152

Closed
bergeouss wants to merge 6 commits intonesquena:masterfrom
bergeouss:feat/issue-467-yolo-mode-toggle
Closed

feat: YOLO mode toggle — skip all approvals per session (#467)#1152
bergeouss wants to merge 6 commits intonesquena:masterfrom
bergeouss:feat/issue-467-yolo-mode-toggle

Conversation

@bergeouss
Copy link
Copy Markdown
Contributor

@bergeouss bergeouss commented Apr 27, 2026

Thinking Path

Issue #467 requests a YOLO mode that lets users skip all approval prompts for the current session. The backend already had the plumbing (enable_session_yolo, disable_session_yolo, is_session_yolo_enabled in tools/approval.py) — this PR wires it up on the frontend with three entry points:

  1. /yolo slash command — typed in the composer, toggles YOLO on/off for the active session
  2. "⚡ Skip all this session" button — appears on every approval card, enables YOLO AND approves the current pending action
  3. YOLO pill indicator — shows in the composer footer when YOLO is active, click to toggle off

YOLO State Lifecycle

The state is session-scoped and stored server-side in memory (not in localStorage or sessionStorage):

Scenario Behavior
Page reload ✅ State persists — the frontend re-fetches via _fetchYoloState() on session load
Cross-tab ⚠️ State is shared — enabling YOLO in Tab A affects Tab B for the same session (both poll the same server-side flag)
Server restart 🔄 State is lost — in-memory only, not persisted to disk
Session switch ✅ State resets — loadSession() clears _yoloEnabled and fetches the new session state
Cross-session ✅ Isolated — each session has its own YOLO flag

This is intentional: the server-side approach avoids localStorage sync issues and ensures consistency across page reloads. The cross-tab sharing is an acceptable trade-off since YOLO is a per-session power-user feature that the user explicitly enables.

What Changed

  • api/routes.py: Added POST /api/session/yolo endpoint (toggle enable/disable with pending approval resolution) + yolo_enabled field in GET /api/session/status
  • static/commands.js: Added /yolo command entry + cmdYolo() function
  • static/index.html: Added skip-all button on approval card + YOLO pill in composer footer
  • static/messages.js: Added YOLO state management (_yoloEnabled, _fetchYoloState(), _updateYoloPill(), toggleYoloFromApproval()) + state fetch after startApprovalPolling in sendMessage
  • static/sessions.js: Added _fetchYoloState() calls at all startApprovalPolling call sites + reset on loadSession()
  • static/style.css: Added .yolo-pill (amber pill) and .approval-skip-all (link-style) CSS
  • static/i18n.js: Added 8 YOLO-related keys for all 6 locales (en, ru, es, de, zh-Hant, ko)
  • tests/test_issue467_yolo_mode_toggle.py: 24 tests — endpoint GET/POST, slash command registration, HTML elements, CSS classes, i18n coverage

i18n Duplicate Key Verification

All 8 YOLO-specific keys (cmd_yolo, yolo_no_session, yolo_enabled, yolo_disabled, yolo_pill_label, yolo_pill_title_active, approval_skip_all, approval_skip_all_title) are present exactly once in each of the 6 locales (en, ru, es, de, zh-Hant, ko). Verified via automated grep — no YOLO key duplicates exist.

Note: there are pre-existing duplicate keys in ru and zh-Hant locale blocks (e.g., failed, http, https, settings_label_model, etc.) that are unrelated to this PR. These pre-date this change and should be addressed in a separate cleanup PR.

Closes #467

@bergeouss
Copy link
Copy Markdown
Contributor Author

Fix: i18n locale structure restored

The initial YOLO key insertions had several issues:

  1. Duplicate keys in ru and zh-Hant blocks — the insertion script placed keys at the wrong position (mid-block after a function value) instead of at the end
  2. Missing zh (Simplified Chinese) locale — keys were inserted into zh-Hant only
  3. Double commas (},,) in en and de blocks from the replacement pattern
  4. Missing zh-Hant (Traditional Chinese) — the repo added this locale after our initial analysis

Fix: restored the original i18n.js from master, then cleanly inserted YOLO keys at the correct position (before the closing brace) for all 8 locale blocks: en, ru, es, de, zh, zh-Hant, ko.

All 32 tests pass locally (24 YOLO + 4 Chinese locale + 4 language precedence).

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

Thanks for the detailed write-up and the follow-up i18n fix, @bergeouss! The YOLO mode implementation looks comprehensive.

Backend — the POST /api/session/yolo toggle endpoint with yolo_enabled in the status response is clean, and building on the existing tools/approval.py plumbing rather than re-implementing it is the right approach.

Frontend — three entry points (slash command, skip-all button on approval card, pill indicator) cover the natural discovery paths a user would take. The amber pill is a good visible indicator that the mode is active.

State management_fetchYoloState() called at every session load point and resetting on loadSession() is the right scope (session-scoped, not persistent).

i18n fix — good that the duplicate-key and missing-locale issues were caught and fixed. The clean re-insertion approach (restore from master, then insert at correct positions) avoids accumulating diff noise.

The 24 tests for the YOLO feature look solid. Closes #467.

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

Hold — Needs Review and Clarification Before Merge

YOLO mode is a substantial new feature that touches multiple sensitive areas of the codebase. Placing a hold until the following are addressed.


1. UX/Design Review Required — @aronprins

This PR introduces two new persistent UI elements that need a design review against our progressive disclosure principle:

  • The YOLO pill in the composer footer — this is a persistent, always-visible indicator. We should confirm this is the right level of prominence for a power-user escape hatch. Should it be less discoverable (e.g., tucked behind a settings icon) or is the current placement intentional?
  • The "Skip all this session" button inside the approval card — this is a high-impact action presented inline with a routine approval flow. We need to verify that surfacing a session-wide bypass directly in the approval card aligns with progressive disclosure — users may enable YOLO mode without fully understanding the scope of what they are skipping.

@aronprins — can you review the placement of both elements and confirm they meet our UX bar before this merges?


2. Author Clarification Needed — Session State Behavior

The PR introduces session-scoped YOLO state, but the following questions are not answered in the PR description or code comments:

  • Page reload behavior: Is the YOLO state cleared on a full page reload, or only on an explicit session switch? If state persists across reloads (e.g., via sessionStorage), users may be surprised to find approvals are still being skipped after they close and reopen a tab.
  • Cross-tab isolation: Does enabling YOLO in one browser tab affect other open tabs running the same session? If state is stored in a shared location (e.g., a shared store or localStorage), enabling YOLO in Tab A could silently bypass approvals in Tab B without the user's awareness — a meaningful security concern.

Please update the PR description (or add inline code comments) to explicitly document the answers to both questions.


3. i18n Duplicate Key Fix — Verification Required

The author mentioned that duplicate translation keys in the ru and zh-Hant locale files were fixed as part of this PR. Before merging, please confirm:

  • The duplicate keys are fully resolved in the current branch tip (not just described in the PR body).
  • A quick grep or automated lint of the locale files confirms no remaining duplicates.

If the i18n fix is confirmed clean, note that explicitly in a follow-up comment.


Summary of Blockers

# Blocker Owner
1 UX review — YOLO pill placement and "Skip all this session" button (progressive disclosure) @aronprins
2 Clarify YOLO state lifecycle: page reload behavior and cross-tab isolation PR Author
3 Verify i18n duplicate key fix is fully resolved in current branch PR Author

Removing the hold once all three are addressed. Thanks for the thoughtful feature work — the core idea is solid, just want to make sure the edges are tight before this lands.

@nesquena-hermes nesquena-hermes added hold ux User experience / visual polish labels Apr 27, 2026
bergeouss added a commit to bergeouss/hermes-webui that referenced this pull request Apr 27, 2026
Address reviewer feedback on nesquena#1152 (blocker nesquena#2):
- Document page reload behavior: state PERSISTS (server-side in-memory)
- Document cross-tab isolation: state is SHARED per session
- Document server restart: state is LOST (in-memory only)
- Correct misleading 'resets on page reload' comment in messages.js
- Update backend route comment in routes.py
@bergeouss
Copy link
Copy Markdown
Contributor Author

Review Feedback Addressed

Blocker #2 — Session State Behavior Clarification ✅

  • Issue: Reviewer asked to clarify page reload behavior and cross-tab isolation for YOLO state.
  • Fix:
    • Corrected misleading comment in static/messages.js that incorrectly stated "resets on page reload"
    • Added comprehensive lifecycle documentation in both static/messages.js (frontend) and api/routes.py (backend)
    • Updated PR description with a detailed lifecycle table:
      • Page reload: State persists — frontend re-fetches from server-side in-memory store
      • Cross-tab: State is shared — same server-side flag per session
      • Server restart: State is lost — in-memory only, not persisted to disk
      • Session switch: State resets — loadSession() clears and re-fetches
  • Files: static/messages.js, api/routes.py, PR description

Blocker #3 — i18n Duplicate Key Verification ✅

  • Issue: Reviewer asked to confirm YOLO-related duplicate keys are fully resolved.
  • Verification: All 8 YOLO-specific keys (cmd_yolo, yolo_no_session, yolo_enabled, yolo_disabled, yolo_pill_label, yolo_pill_title_active, approval_skip_all, approval_skip_all_title) are present exactly once in each of the 6 locales (en, ru, es, de, zh-Hant, ko).
  • Note: Pre-existing duplicate keys exist in ru and zh-Hant locale blocks (e.g., failed, http, https, settings_label_model) that are unrelated to this PR. These pre-date this change and should be addressed in a separate cleanup PR. Added this clarification to the PR description.

Blocker #1 — UX/Design Review

Not addressed (awaiting @aronprins review — assigned to them).

🤖 AI-assisted via Hermes Agent

@aronprins
Copy link
Copy Markdown
Contributor

Got any screenshots?

…na#467)

- Add POST /api/session/yolo endpoint (toggle enable/disable)
- Add yolo_enabled field to GET /api/session/status
- Add /yolo slash command with cmdYolo() function
- Add YOLO pill indicator in composer footer (hidden by default)
- Add 'Skip all this session' button on approval cards
- Sync YOLO state across session load/switch via _fetchYoloState()
- Add CSS for .yolo-pill (amber) and .approval-skip-all styles
- Add i18n keys for all 6 locales (en, ru, es, de, zh, ko)
- Add 24 tests covering endpoints, command, HTML, CSS, and i18n
…locales (nesquena#467)

- Restore original i18n.js and re-insert YOLO keys cleanly
- Add YOLO keys to zh (Simplified Chinese) locale
- Add YOLO keys to zh-Hant (Traditional Chinese) locale
- Fix duplicate key insertions in ru and zh-Hant blocks
- Fix syntax errors (double commas) from previous insertions
- All 7 locales + zh-Hant now have 8 YOLO-related keys
- JS syntax validates clean
Address reviewer feedback on nesquena#1152 (blocker nesquena#2):
- Document page reload behavior: state PERSISTS (server-side in-memory)
- Document cross-tab isolation: state is SHARED per session
- Document server restart: state is LOST (in-memory only)
- Correct misleading 'resets on page reload' comment in messages.js
- Update backend route comment in routes.py
…na#1152)

The i18n.js locale blocks must be separated by double newlines (\n\n)
for locale test regex patterns to match. Previous YOLO key insertions
broke this spacing. All transitions (en->ru->es->de->zh->ko) restored.
@bergeouss bergeouss force-pushed the feat/issue-467-yolo-mode-toggle branch from 24d58b0 to 8635365 Compare April 27, 2026 19:57
bergeouss added a commit to bergeouss/hermes-webui that referenced this pull request Apr 27, 2026
@bergeouss
Copy link
Copy Markdown
Contributor Author

Screenshots

1. Approval Card — "Skip all this session" button

The new "⚡ Skip all this session" button is added at the bottom of the approval card, allowing users to toggle YOLO mode directly from the approval prompt:

Approval Card

2. /yolo slash command autocomplete

Typing /yolo in the composer shows the command with its description:

YOLO Autocomplete

3. YOLO pill indicator (active)

When YOLO mode is active, a "YOLO" pill badge appears in the composer toolbar:

YOLO Pill

@nesquena
Copy link
Copy Markdown
Owner

@aronprins looks pretty good to me, Aron can I get your blessing to move this forward to review?

@aronprins
Copy link
Copy Markdown
Contributor

The slash command is fine.

The text below the buttons isnt. Can it be added as another button?

Regarding the item in the composer footer: not a fan... but with the knowledge ill be moving it in the near future: approved.

@bergeouss @nesquena

@nesquena
Copy link
Copy Markdown
Owner

The slash command is fine.

The text below the buttons isnt. Can it be added as another button?

Regarding the item in the composer footer: not a fan... but with the knowledge ill be moving it in the near future: approved.

@bergeouss @nesquena

+1 Agree, can we move the text below the buttons to be another button and then I'll move this forward for review, thanks!

…na#1152)

- Move skip-all button inside .approval-btns container alongside
  Approve/Deny buttons per reviewer feedback
- Restyle from plain text link (.approval-skip-all) to styled button
  (.approval-btn.yolo) with amber accent matching YOLO pill
- Update test to check for new .approval-btn.yolo CSS class
- Add ⚡ icon to button for visual consistency
@bergeouss
Copy link
Copy Markdown
Contributor Author

Review Feedback Addressed

  • Issue: Le texte "Skip all this session" sous les boutons Approve/Deny ressemblait à un lien texte plutôt qu'''à un bouton — demande du mainteneur de le convertir en bouton
  • Fix: Déplacé le bouton "Skip all" à l'''intérieur du conteneur .approval-btns avec les autres boutons d'''approbation. Re-stylisé de .approval-skip-all (lien texte) vers .approval-btn.yolo (bouton avec accent ambre cohérent avec le YOLO pill). Ajouté une icône ⚡ pour la cohérence visuelle.
  • Files:
    • static/index.html — déplacement du bouton dans .approval-btns, nouvelle structure avec icône + label
    • static/style.css — remplacement de .approval-skip-all par .approval-btn.yolo avec style ambre
    • tests/test_issue467_yolo_mode_toggle.py — mise à jour du test CSS pour vérifier la nouvelle classe

🤖 AI-assisted via Hermes Agent

@nesquena nesquena removed the hold label Apr 28, 2026
…lse-fail

The /api/session/yolo endpoint relies on tools.approval.{enable,disable,
is_session}_yolo from hermes-agent. routes.py falls back to no-op lambdas
when the import fails — so without the agent:
  * POST returns the input value echoed back ({"yolo_enabled": True}),
    making POST-only tests false-pass.
  * GET always returns False, breaking POST→GET round-trip tests like
    test_yolo_post_persists_within_session, which is exactly the test
    that's been failing on every CI run for over a day.

This is the same pattern used by other agent-dependent endpoints
(cron, skills) — mark the endpoint test classes with
@requires_agent_modules so they auto-skip when tools.approval is not
importable, and run normally in environments that have hermes-agent.

The 17 static-analysis tests (slash command registration, HTML elements,
CSS classes, i18n coverage) keep running everywhere — they don't need
the agent.

Local suite: 2564 passed, 7 skipped (the YOLO endpoint cluster) on
agent-less environments. Will run all 24 in CI if hermes-agent is wired,
or cleanly skip the 7 endpoint tests when not.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Copy link
Copy Markdown
Owner

@nesquena nesquena left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — end-to-end ✅ (approved after agent-skip marker pushed)

What this ships

@bergeouss's implementation of #467 — a YOLO mode toggle for the Web UI. Three entry points: /yolo slash command, "⚡ Skip all this session" button on every approval card, and a YOLO pill in the composer footer. State is server-side per-session, fetched on session load.

Traced against upstream hermes-agent

Pulled fresh nousresearch/hermes-agent tarball.

The agent already has the full plumbing at tools/approval.py:434-466:

  • enable_session_yolo(session_key) / disable_session_yolo(session_key) — module-level _session_yolo: set[str] lock-protected
  • is_session_yolo_enabled(session_key) — read path
  • is_current_session_yolo_enabled() — checked at run_agent.py:780, 905 before the dangerous-pattern check

Critically, the YOLO bypass does NOT defeat the hard floor: at tools/approval.py:131-167 there's a BLOCKED_DESTRUCTIVE set (rm -rf /, dd of=/dev/sda, mkfs.*, etc.) that's checked BEFORE the YOLO bypass. Even with /yolo enabled, those patterns still hit a hard rejection. ✅ Acceptable security model — YOLO skips the per-pattern allow-once / always prompt loop, not the destructive-floor block.

The PR's routes.py correctly imports the three functions from tools.approval (with a graceful no-op fallback when the agent isn't installed) and the POST handler also calls resolve_gateway_approval(sid, "once", resolve_all=True) to clear any pending approval card — so the user isn't stuck if they enable YOLO while a card is up.

What I caught — endpoint tests fail without the agent

CI has been red on every push for over a day with one specific failure:

test_yolo_post_persists_within_session FAILED — assert False is True

Root cause: when tools.approval is not importable (CI environments without hermes-agent), routes.py falls back to no-op lambdas (the existing pattern in this file):

except ImportError:
    enable_session_yolo = lambda *a, **k: None
    is_session_yolo_enabled = lambda *a, **k: False

POST returns {"yolo_enabled": <input>} echoed from the request body — so naive POST-only tests false-pass. But test_yolo_post_persists_within_session does POST→GET, and GET hits the False-returning lambda, so the round-trip catches the agent-less environment.

This is the same pattern other agent-dependent endpoints (cron, skills) handle via the existing @requires_agent_modules marker. The YOLO endpoint cluster needed it too.

What I pushed — 415d7f5

(Pushed to @bergeouss's fork via maintainer-edit.)

Marked TestYoloEndpointGet and TestYoloEndpointPost with @requires_agent_modules. Both class docstrings now explain the agent-dependence and the lambda-fallback false-pass mode that the round-trip test catches. Static-analysis tests (slash-command registration, HTML, CSS, i18n) keep running everywhere — they don't need the agent.

Local results:

  • Without agent: 17 passed, 7 skipped (the YOLO endpoint cluster) — clean.
  • With agent (production / nesquena-hermes integration): all 24 should run.

GitHub Actions hasn't auto-run CI on my fork push yet (likely needs maintainer approval after the previous string of failures). The fix is verified locally. CI will pick up on the next agent push or maintainer rerun.

End-to-end trace

/yolo slash command flow

commands.js:801-820cmdYolo():

  1. GET current state via /api/session/yolo?session_id=<sid>
  2. Toggle: POST with {enabled: !current}
  3. Update local _yoloEnabled, refresh pill, toast message
  4. If enabling, also call hideApprovalCard(true) to dismiss any pending card

POST endpoint atomicity

routes.py:1417-1444:

if enabled:
    enable_session_yolo(sid)
    # Also resolve any pending approvals for this session so the
    # agent doesn't stay stuck waiting on an already-dismissed card.
    try:
        from tools.approval import _pending as _p, _lock as _l
        with _l:
            _p.pop(sid, None)
    except Exception:
        pass
    resolve_gateway_approval(sid, "once", resolve_all=True)
else:
    disable_session_yolo(sid)

When enabling: sets the YOLO flag, clears the pending-approval queue (so the agent proceeds), and resolves the visible approval card with "once" (immediately approves the current pending action). All three steps acquire the agent's _lock correctly. ✅

Lifecycle (PR docstring)

Scenario Behavior Verified
Page reload _fetchYoloState() re-syncs from backend sessions.js:178, 256 ✅
Cross-tab Both tabs poll same server flag acceptable trade-off ✅
Server restart In-memory only — flag cleared safe-by-default ✅
Session switch loadSession resets _yoloEnabled sessions.js:103 ✅
Cross-session Per-session flag in agent's _session_yolo set tools/approval.py ✅

_fetchYoloState integration points

Three call sites:

Covers all three scenarios where a session becomes "active" on the client side. ✅

Edge-case trace

Scenario Expected Actual
Click "Skip all" on approval card Enable YOLO + approve current card "once" ✅ POST handler
Press /yolo with no active session "No active session" toast ✅ commands.js:806
Toggle YOLO on, then send dangerous command Skipped per is_current_session_yolo_enabled() ✅ agent path
Toggle YOLO on, then send rm -rf / Hard-blocked by BLOCKED_DESTRUCTIVE ✅ agent floor
Reload tab while YOLO active Pill stays visible after _fetchYoloState()
Two tabs, enable YOLO in tab A Tab B's pill shows on next _fetchYoloState() (next session activity) ✅ shared state
Server restart All YOLO flags cleared ✅ in-memory only
Session switch to a session without YOLO _yoloEnabled=false then refetch true state ✅ sessions.js:103

Tests

  • PR's 24 new tests: 17 pass everywhere; 7 endpoint tests skip when agent unavailable (after my push).
  • Local full suite: 2564 passed, 7 skipped + the existing agent-dependent skips, 1 PR-unrelated pre-existing failure (test_sprint3.py::test_workspace_add_rejects_system_paths — the macOS quirk that v0.50.231 fixes; this PR is on top of master from before that landed).
  • CI: previously failing due to the missing skip marker; my push should turn it green when CI re-runs.

Other audit — confirmed correct

  • JS syntax: node --check passes on commands.js, messages.js, i18n.js, sessions.js.
  • i18n coverage: PR adds 8 keys to 6 locales (en, ru, es, de, zh, ko) — wait, missing zh-Hant. Let me check... actually verified at i18n.js:3485-3492 — zh-Hant block IS included with full coverage. Total locales: 7 with the YOLO additions. ✅
  • No XSS surface: pill and card label use textContent and data-i18n attribute (translated server-side via applyLocaleToDOM). No raw HTML interpolation of user input.
  • auth_error not introduced here: this is the YOLO PR; auth_error is from a different flow (#1208). No overlap.
  • The PR's earlier review-cycle fixes (per the commit history) — moved skip-all button into .approval-btns, restyled as button not link, double-newline locale fix — all already absorbed into the current shape.

Minor observations (non-blocking)

  • The cross-tab "shared state" trade-off is correctly documented but worth highlighting in user-visible docs (or a tooltip): a power user might enable YOLO in a private tab and not realise their other open tabs of the same session also get the bypass. The current pill UI gives them visibility ("⚡ YOLO") so they should notice.
  • The _pending.pop(sid, None) direct-import workaround at routes.py:1432 reaches into the agent's private state. Cleaner would be a public clear_pending(sid) helper in tools/approval.py — but that requires an agent-side change. The current approach handles the gateway-resolve case correctly.
  • The _updateYoloPill calls applyLocaleToDOM() on every state change — slightly wasteful since only the pill's title attr changes, but the function is fast and runs only on toggle. Acceptable.

Recommendation

Approved (with agent-skip marker pushed). Clean implementation that wires up #467's pre-existing backend plumbing across three discoverable UI affordances. The lifecycle docstring is accurate and the cross-tab shared-state trade-off is the right call. Hard-floor BLOCKED_DESTRUCTIVE patterns remain enforced, which is the right safety stance — YOLO bypasses the prompt loop, not the destructive block. My pushed @requires_agent_modules markers fix the long-standing CI failure that was blocking this PR. Parked at approval — ready for the release agent's merge/tag pipeline.

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

This PR has been rebased onto master and opened as #1210. The i18n.js conflicts were resolved (both master's new status keys and the PR's yolo keys kept). All 2811 tests pass. @bergeouss — thank you for the contribution, full credit preserved. Will merge #1210 in the next batch release.

nesquena-hermes added a commit that referenced this pull request Apr 28, 2026
…OLO mode (#1211)

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

Merges PRs #1208, #1209, #1210 (#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 #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 #467)
  Original author: @bergeouss (PR #1152)

Tests: 2837 passed (+50 new tests vs previous release)
QA harness: 20/20 passed + all browser API checks passed
@nesquena-hermes
Copy link
Copy Markdown
Collaborator

This PR has been merged via integration branch #1210 in v0.50.236. Thank you @bergeouss for the contribution — full credit preserved in the commit and CHANGELOG.

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

ux User experience / visual polish

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: YOLO mode toggle for Web UI sessions (skip approval prompts)

4 participants