Skip to content

fix(desktop): honest browser-backend readiness, explicit backend activation, full OpenAI TTS voice/model options - #73932

Merged
teknium1 merged 2 commits into
mainfrom
hermes/hermes-0c4d6a98
Jul 29, 2026
Merged

fix(desktop): honest browser-backend readiness, explicit backend activation, full OpenAI TTS voice/model options#73932
teknium1 merged 2 commits into
mainfrom
hermes/hermes-0c4d6a98

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

The desktop Capabilities → Tools tab now tells the truth about browser-backend readiness, makes backend activation an explicit visible action, and exposes the full OpenAI TTS model/voice catalogs.

Fixes three defects reported from Windows testing:

  1. Browser rows stuck on "Setup required" after a successful setup run. The installer worked; the readiness probe didn't:

    • _has_agent_browser() never searched the Hermes-managed Node dir (%LOCALAPPDATA%\hermes\node / $HERMES_HOME/node/bin) where the Windows install lands, and probed node_modules/.bin/agent-browser as the extensionless POSIX shim — which fails exec on Windows (WinError 193). It now resolves both rungs via PATHEXT-aware shutil.which, mirroring _find_agent_browser().
    • Cloud rows (Nous Subscription Browser Use, Browserbase, Browser Use, Firecrawl) declared post_setup: agent_browser, whose readiness gate requires a local Chromium the cloud never uses — they now use the cloud-scoped browserbase hook (agent-browser CLI only).
    • _agent_browser_installed() could read browser_tool's stale cached "Chromium missing" result from before the install ran in the spawned post-setup process; the cache is dropped before probing so the pill flips to Ready right after a successful run.
  2. No signal for which backend is active; row click silently rewrote config. Row click now only expands/collapses. Activation is an explicit "Use this backend" button; the active row carries an Active pill and its expanded panel says "This is your active backend".

  3. OpenAI TTS showed one model and one voice. The options existed but rendered through a native <datalist>, which filters by the field's current value — a field already set to a valid option suggested only itself. Replaced with a real combobox listing every option; voice suggestions now track the selected model per the OpenAI TTS docs: tts-1/tts-1-hd → 9 voices, gpt-4o-mini-tts → 13 (adds ballad, verse, marin, cedar).

Changes

  • hermes_cli/nous_subscription.py: _has_agent_browser() gains the managed-Node rung and PATHEXT-aware .bin resolution (Windows .cmd shim).
  • hermes_cli/tools_config.py: Nous Subscription browser row → post_setup: browserbase; _agent_browser_installed() invalidates the stale Chromium cache before probing.
  • plugins/browser/{browserbase,browser_use,firecrawl}/provider.py: cloud rows → post_setup: browserbase.
  • apps/desktop/.../toolset-config-panel.tsx: expand vs. activate split, Active pill, "Use this backend" CTA; "Needs setup" copy → "Setup required".
  • apps/desktop/.../combobox-input.tsx (new) + config-field.tsx: real free-input combobox replaces <datalist>.
  • apps/desktop/.../helpers.ts: per-model OpenAI voice narrowing.
  • i18n: new keys in en/zh/zh-hant/ja (+types).
  • Tests: new _has_agent_browser rung tests, per-model voice tests, panel interaction tests updated to the explicit-activation UX; browser-plugin schema tests updated to the cloud hook; fake_which stubs accept path=.

Validation

Before After
Windows install → readiness pill "Setup required" forever Ready/Active (managed-Node + .cmd rungs, E2E-verified with a fake binary under $HERMES_HOME/node/bin and stripped PATH)
Nous Subscription (Browser Use cloud) w/o local Chromium needs_setup ready once CLI present
Backend activation implicit row click, no feedback "Use this backend" button + Active pill
OpenAI TTS voice list (field set to alloy) 1 suggestion 13 (gpt-4o-mini-tts) / 9 (tts-1, tts-1-hd)

Python: 199 targeted tests green (test_tools_config, test_nous_subscription, test_browser_provider_plugins) + 528 in test_web_server. Desktop: 78 vitest green across the touched suites; tsc --noEmit and eslint clean.

Infographic

Desktop Capabilities readiness + TTS options fix

teknium1 added 2 commits July 28, 2026 23:24
…ivation + full OpenAI TTS voice/model options

Three GUI Capabilities-tab defects reported on Windows:

1. Browser rows stuck on 'Setup required' after a successful setup run.
   Root causes, all in the readiness probe (not the installer):
   - _has_agent_browser() never searched the Hermes-managed Node dir
     (%LOCALAPPDATA%/hermes/node / $HERMES_HOME/node/bin) where the
     Windows install lands, and probed node_modules/.bin/agent-browser
     as the extensionless POSIX shim, which fails exec on Windows
     (WinError 193) — now resolved via PATHEXT-aware shutil.which
     against both rungs, mirroring _find_agent_browser().
   - Cloud rows (Nous Subscription Browser Use, Browserbase, Browser
     Use, Firecrawl) declared post_setup: agent_browser, whose
     readiness gate requires a LOCAL Chromium build the cloud never
     uses — switched to the cloud-scoped 'browserbase' hook (CLI-only).
   - _agent_browser_installed() could read browser_tool's stale cached
     'Chromium missing' result from before the install ran in the
     spawned post-setup process — cache now dropped before probing so
     the pill flips to Ready right after a successful run.

2. No way to tell which backend is active, and clicking a row to read
   its details silently rewrote config. Row click now only
   expands/collapses; activation is an explicit 'Use this backend'
   button, the active row carries an 'Active' pill, and the expanded
   active row says 'This is your active backend'.

3. OpenAI TTS showed one model and one voice. The options were always
   defined but rendered through a native <datalist>, which filters by
   the field's current value — a field already set to a valid option
   suggested only itself. Replaced with a real combobox (Input +
   dropdown) that lists every option, and voice suggestions now track
   the selected model per the OpenAI TTS docs: tts-1/tts-1-hd = 9
   voices, gpt-4o-mini-tts = 13 (adds ballad, verse, marin, cedar).
_has_agent_browser()'s new managed-Node rung calls
shutil.which('agent-browser', path=...); tests that monkeypatch
shutil.which globally with 1-arg lambdas raised TypeError when their
code path reached the browser readiness probe (test_post_setup_gating,
test_setup_model_provider).
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

૮ >ﻌ< ა ci review

ran on 79c73ac

all good!

@alt-glitch alt-glitch added type/bug Something isn't working comp/desktop Electron desktop app (apps/desktop/*) comp/cli CLI entry point, hermes_cli/, setup wizard comp/plugins Plugin system and bundled plugins tool/browser Browser automation (CDP, Playwright) tool/tts Text-to-speech and transcription provider/openai OpenAI / Codex Responses API area/config Config system, migrations, profiles area/i18n Localization, locales, translations platform/windows Native Windows-specific behavior or breakage sweeper:risk-platform-windows Sweeper risk: may break or behave differently on native Windows P3 Low — cosmetic, nice to have labels Jul 29, 2026
@teknium1
teknium1 merged commit f98b223 into main Jul 29, 2026
54 checks passed
@teknium1
teknium1 deleted the hermes/hermes-0c4d6a98 branch July 29, 2026 06:52
teknium1 added a commit that referenced this pull request Jul 29, 2026
Follow-up on the #53205 salvage: replace bare is_file() probes of the
managed (~/.hermes/node[/bin]) and legacy (node_modules/.bin) locations
with shutil.which(..., path=dir) so Windows resolves the executable
.cmd shim instead of the extensionless POSIX script — the same miss
class fixed for _has_agent_browser() in #73932. Also covers the
Windows managed layout where the binary sits in node/ directly.
randlee pushed a commit to randlee/hermes-agent that referenced this pull request Aug 11, 2026
Follow-up on the NousResearch#53205 salvage: replace bare is_file() probes of the
managed (~/.hermes/node[/bin]) and legacy (node_modules/.bin) locations
with shutil.which(..., path=dir) so Windows resolves the executable
.cmd shim instead of the extensionless POSIX script — the same miss
class fixed for _has_agent_browser() in NousResearch#73932. Also covers the
Windows managed layout where the binary sits in node/ directly.
33hodl pushed a commit to 33hodl/hermes-agent that referenced this pull request Aug 12, 2026
Follow-up on the NousResearch#53205 salvage: replace bare is_file() probes of the
managed (~/.hermes/node[/bin]) and legacy (node_modules/.bin) locations
with shutil.which(..., path=dir) so Windows resolves the executable
.cmd shim instead of the extensionless POSIX script — the same miss
class fixed for _has_agent_browser() in NousResearch#73932. Also covers the
Windows managed layout where the binary sits in node/ directly.
prmartinow pushed a commit to prmartinow/hermes-agent that referenced this pull request Aug 26, 2026
Follow-up on the NousResearch#53205 salvage: replace bare is_file() probes of the
managed (~/.hermes/node[/bin]) and legacy (node_modules/.bin) locations
with shutil.which(..., path=dir) so Windows resolves the executable
.cmd shim instead of the extensionless POSIX script — the same miss
class fixed for _has_agent_browser() in NousResearch#73932. Also covers the
Windows managed layout where the binary sits in node/ directly.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Config system, migrations, profiles area/i18n Localization, locales, translations comp/cli CLI entry point, hermes_cli/, setup wizard comp/desktop Electron desktop app (apps/desktop/*) comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have platform/windows Native Windows-specific behavior or breakage provider/openai OpenAI / Codex Responses API sweeper:risk-platform-windows Sweeper risk: may break or behave differently on native Windows tool/browser Browser automation (CDP, Playwright) tool/tts Text-to-speech and transcription type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants