Skip to content

fix(desktop): read HERMES_HOME from the Windows registry when env is stale (salvage #45628) - #46772

Merged
austinpickett merged 1 commit into
mainfrom
salvage/windows-hermes-home-registry-45628
Jun 15, 2026
Merged

fix(desktop): read HERMES_HOME from the Windows registry when env is stale (salvage #45628)#46772
austinpickett merged 1 commit into
mainfrom
salvage/windows-hermes-home-registry-45628

Conversation

@austinpickett

Copy link
Copy Markdown
Collaborator

Summary

Salvage of #45628 (@jeffrobodie-glitch) onto current main. Fixes #45471.

On Windows, a GUI app launched from Explorer inherits the environment block captured at login. If a user sets HERMES_HOME via setx after logging in, it's invisible in process.env for the desktop app — even though the CLI (a fresh shell) picks it up immediately. The desktop then silently falls back to %LOCALAPPDATA%\hermes and reports "No inference provider configured" despite a valid configured home.

Confirmed still present on main: resolveHermesHome() in apps/desktop/electron/main.cjs consults only process.env.HERMES_HOME then jumps straight to the %LOCALAPPDATA% default — no registry read.

What changed

  • New windows-user-env.cjs — reads a User-scoped var from HKCU\Environment via reg query, parses the output, expands %VAR% refs, and fails safe (returns null off-Windows without spawning, on spawn error, when reg exits non-zero, or on empty value)
  • resolveHermesHome() consults the live registry value on Windows before the %LOCALAPPDATA% default
  • New test file (windows-user-env.test.cjs, 10 cases) wired into test:desktop:platforms

Deviations from the original PR

  1. Conflict resolution: main now imports/uses normalizeHermesHomeRoot in resolveHermesHome (the env-var path goes through it). Kept that.
  2. Consistency improvement: the original returned path.resolve(fromRegistry); I route the registry value through the same normalizeHermesHomeRoot() the env var uses, so a registry value pointing at a .../profiles/<name> dir collapses to the home root identically.

Test plan

  • node --test windows-user-env.test.cjs → 10/10 pass
  • node --check on both windows-user-env.cjs and main.cjs → OK
  • Live E2E on real Windows: readWindowsUserEnvVar('HERMES_HOME') returned the actual registry value (C:\Users\…\AppData\Local\hermes); Path read correctly; a non-existent var returned null.

Credit

…stale

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
@austinpickett
austinpickett requested a review from a team June 15, 2026 17:16
@github-actions

Copy link
Copy Markdown
Contributor

🔎 Lint report: salvage/windows-hermes-home-registry-45628 vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 10933 on HEAD, 10931 on base (🆕 +2)

🆕 New issues (2):

Rule Count
unresolved-attribute 2
First entries
tests/run_agent/test_credits_notices_toggle.py:76: [unresolved-attribute] unresolved-attribute: Unresolved attribute `_credits_session_start_micros` on type `AIAgent`
run_agent.py:2920: [unresolved-attribute] unresolved-attribute: Object of type `Self@get_credits_spent_micros` has no attribute `_credits_session_start_micros`

✅ Fixed issues (1):

Rule Count
invalid-assignment 1
First entries
tests/run_agent/test_credits_notices_toggle.py:76: [invalid-assignment] invalid-assignment: Object of type `None` is not assignable to attribute `_credits_session_start_micros` of type `int`

Unchanged: 5758 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@alt-glitch alt-glitch added type/bug Something isn't working comp/tui Terminal UI (ui-tui/ + tui_gateway/) comp/gateway Gateway runner, session dispatch, delivery area/config Config system, migrations, profiles P2 Medium — degraded but workaround exists labels Jun 15, 2026
@alt-glitch

Copy link
Copy Markdown
Collaborator

Related: #45628 (original by @jeffrobodie-glitch, salvaged here) and #45471 (the bug this fixes). This salvage is the active rebased-onto-main version of the Windows registry HERMES_HOME read.

@austinpickett
austinpickett merged commit 368fcf1 into main Jun 15, 2026
26 checks passed
@austinpickett
austinpickett deleted the salvage/windows-hermes-home-registry-45628 branch June 15, 2026 20:16
rdnot added a commit to rdnot/hermes-agent-medical-research that referenced this pull request Jun 15, 2026
…kfile-fix.yml)

Upstream advanced from 5bfed0f (Jun 15) to 3e7e9b2 (Jun 16). Major upstream
changes since last merge:

- feat(skills): add optional payments skills (Stripe Link, MPP, Projects) NousResearch#31343
- feat(delegation): async background subagents via delegate_task(background=true) NousResearch#40946
- fix(desktop): read HERMES_HOME from Windows registry when env is stale NousResearch#46772
- fix(desktop): let explicit model switches escape broken config providers NousResearch#46796
- fix(dump): report effective terminal backend in hermes debug
- fix(inventory): deduplicate models between user-defined and aggregator providers
- fix(doctor): recognize nvidia as vendor-slug-accepting provider
- fix(discord): cap slash commands at Discord's 100-command limit
- fix(teams): package Microsoft Teams SDK as an installable extra NousResearch#46764
- fix(dashboard): scope chat sidebar model card to selected profile NousResearch#46665
- fix(deps): declare websockets as core dep + relax dev setuptools pin NousResearch#46744
- fix(desktop): pin @assistant-ui/store so the cluster shares one tap
- fix(install): make npm install -g packages reachable on PATH
- feat(honcho-setup): replace deployment-shape prompt with gateway-gated identity tree
- refactor(honcho): canonicalize identity-mapping on pinUserPeer, migrate legacy key
- mattermost: preserve thread-local delivery hygiene
- ci: rip out nix ci for now
- ...plus desktop Electron changes, web UI updates, website docs, honcho docs

Fork customizations preserved (all 22 verified intact):
- run_agent.py: max_iterations: int = 200
- agent/conversation_loop.py: _force_final_threshold, _build_tools_summary,
  _current_turn_tool_calls, _pending_tool_summary, tool_summary flow
- agent/turn_finalizer.py: 'tool_summary' key in result dict
- tools/web_tools.py: tiered fetcher (curl_cffi→scrapling→httpx),
  MAX_OUTPUT_SIZE=10000, _get_extract_backend, max_result_size_chars=500_000,
  LLM-summarization disabled, NCBI/PubMed/PMC hardening
- tools/budget_config.py: 400_000 / 500_000
- gateway/run.py: HERMES_MAX_ITERATIONS, "200"
- hermes_cli/config.py: max_turns: 200
- cli.py: result.get('tool_summary') display
- gateway/config.py: Platform.LINE = "line"
- gateway/authz_mixin.py: Platform.LINE: "LINE_ALLOWED_GROUPS"
- plugins/platforms/line/adapter.py: reply_only_mention, build_source

Conflict resolution:
- .github/workflows/nix-lockfile-fix.yml: removed by upstream.
  Was fork-only (disabled with if:false, requires APP_ID/APP_PRIVATE_KEY
  secrets the fork does not have). Upstream deletion is correct.

Backup branch: backup-main-pre-merge-20260616-063126
alanbratu pushed a commit to alanbratu/hermes-agent that referenced this pull request Jun 17, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
zmlgit pushed a commit to zmlgit/hermes-agent that referenced this pull request Jun 17, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
al3xar pushed a commit to al3xar/hermes-agent that referenced this pull request Jun 17, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
T02200059 pushed a commit to T02200059/hermes-agent that referenced this pull request Jun 18, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
waefrebeorn pushed a commit to waefrebeorn/slermes that referenced this pull request Jul 2, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
Methodician added a commit to Methodician/hermes-agent that referenced this pull request Jul 4, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
habarmc1223-sudo pushed a commit to habarmc1223-sudo/hermes-agent-fluxmem that referenced this pull request Jul 8, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
santhreal pushed a commit to santhreal/hermes-agent that referenced this pull request Jul 13, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
leewenjie pushed a commit to leewenjie/hermes-agent that referenced this pull request Aug 7, 2026
…stale (NousResearch#46772)

A GUI app launched from Explorer inherits the environment block captured at
login, so a HERMES_HOME set via 'setx' AFTER login is invisible in process.env
even though the CLI (a fresh shell) sees it. The desktop then silently fell
back to %LOCALAPPDATA%\hermes and reported 'No inference provider configured'
despite a valid configured home (NousResearch#45471).

resolveHermesHome() now consults the live HKCU\Environment registry value on
Windows before the LOCALAPPDATA default. New windows-user-env.cjs helper parses
'reg query' output, expands %VAR% refs, and fails safe (returns null off-Windows,
on spawn error, or empty value). The registry value is normalized through the
same normalizeHermesHomeRoot() path as the env var for consistency.

Co-authored-by: jeffrobodie-glitch <jeffrobodie@gmail.com>
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 comp/gateway Gateway runner, session dispatch, delivery comp/tui Terminal UI (ui-tui/ + tui_gateway/) P2 Medium — degraded but workaround exists type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Windows fails to read OPENROUTER_API_KEY / HERMES_HOME

4 participants