fix(desktop): honest browser-backend readiness, explicit backend activation, full OpenAI TTS voice/model options - #73932
Merged
Merged
Conversation
…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).
Contributor
૮ >ﻌ< ა ci reviewran on 79c73ac all good! |
This was referenced Jul 29, 2026
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.
This was referenced Jul 29, 2026
13 tasks
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
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 probednode_modules/.bin/agent-browseras the extensionless POSIX shim — which fails exec on Windows (WinError 193). It now resolves both rungs via PATHEXT-awareshutil.which, mirroring_find_agent_browser().post_setup: agent_browser, whose readiness gate requires a local Chromium the cloud never uses — they now use the cloud-scopedbrowserbasehook (agent-browser CLI only)._agent_browser_installed()could readbrowser_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.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".
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 (addsballad,verse,marin,cedar).Changes
hermes_cli/nous_subscription.py:_has_agent_browser()gains the managed-Node rung and PATHEXT-aware.binresolution (Windows.cmdshim).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._has_agent_browserrung tests, per-model voice tests, panel interaction tests updated to the explicit-activation UX; browser-plugin schema tests updated to the cloud hook;fake_whichstubs acceptpath=.Validation
.cmdrungs, E2E-verified with a fake binary under$HERMES_HOME/node/binand stripped PATH)alloy)Python: 199 targeted tests green (
test_tools_config,test_nous_subscription,test_browser_provider_plugins) + 528 intest_web_server. Desktop: 78 vitest green across the touched suites;tsc --noEmitand eslint clean.Infographic