hermes-agent/hermes_cli
MaxFreedomPollard 31032b4f51 fix(auth): a transient read failure is not corruption
_load_auth_store() treated every exception from reading auth.json as
corruption and returned an empty store. EMFILE under fd exhaustion,
EACCES, EIO and a stalled network mount all reached that branch. This
module does read-modify-write in roughly fifteen places, so the empty
store was one _save_auth_store() away from erasing every stored
credential.

Separate OSError from parse failure: a file that exists but cannot be
read now raises, naming the real cause and leaving the file on disk
untouched. Only a genuine parse failure takes the preserve-and-start-
empty branch, which is unchanged.

The backup was also unreliable in exactly the conditions that triggered
it: shutil.copy2 opens a file, so under EMFILE it failed too, its bare
except swallowed that, and the log still said "Corrupt file preserved
at ..." when nothing had been written. Track whether the copy landed
and say so accurately.
2026-07-31 22:34:52 -07:00
..
dashboard_auth chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
observability perf(config): stop deepcopying config on per-turn read-only paths 2026-07-29 11:33:41 -07:00
proxy
…
subcommands fix(pairing): keep GUI approvals off the code brute-force lockout 2026-07-29 17:51:40 -05:00
web_routers refactor(web): extract sessions/mcp/skills/tools routes to APIRouter modules (wave 2; route-table equality verified) 2026-07-29 16:21:54 -07:00
__init__.py chore: release v0.19.1 (2026.7.30) 2026-07-30 16:45:08 -07:00
_early_recovery.py fix(update): test runs never mutate the live checkout — pytest-guard the marker and repair paths 2026-07-29 21:30:53 -07:00
_parser.py
…
_scan_venv_blockers.py fix(desktop): use the canonical gateway matcher for the preflight exemption 2026-07-31 22:34:28 -07:00
_subprocess_compat.py fix(git): never block internal git calls on credential prompts 2026-07-28 17:34:21 -07:00
active_sessions.py fix(sessions): claim the cap slot on first turn, not on open 2026-07-28 12:11:52 -05:00
agent_import.py refactor: extract atomic_write_text to utils.py; fix write-failure error handling 2026-07-29 16:49:07 +05:30
approval_mode.py
…
approvals_suggest.py
…
auth.py fix(auth): a transient read failure is not corruption 2026-07-31 22:34:52 -07:00
auth_commands.py
…
azure_detect.py
…
backup.py
…
bang_shell.py feat(cli): ! shell mode — run a command without spending a model turn 2026-07-31 21:21:20 -07:00
banner.py fix(windows): native Windows correctness for CLI, gateway status, banner, and WSL browser paths 2026-07-29 23:16:18 -07:00
blueprint_cmd.py
…
browser_connect.py fix(windows): native Windows correctness for CLI, gateway status, banner, and WSL browser paths 2026-07-29 23:16:18 -07:00
build_info.py
…
bundles.py
…
callbacks.py
…
checkpoints.py
…
claw.py
…
cli_agent_setup_mixin.py fix(tui,cli): render a resumed interrupted turn as an event 2026-07-28 03:54:25 -05:00
cli_billing_mixin.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
cli_commands_mixin.py fix(cli): dispatch /indicator to set the busy-indicator style (#50618) 2026-07-31 22:33:16 -07:00
cli_output.py
…
clipboard.py fix(cli): stop hard-wrapping streamed paragraphs; prefer OSC 52 over SSH 2026-07-29 08:42:16 -07:00
codex_models.py
…
codex_runtime_plugin_migration.py
…
codex_runtime_switch.py
…
colors.py
…
commands.py fix(cli): dispatch /indicator to set the busy-indicator style (#50618) 2026-07-31 22:33:16 -07:00
completion.py
…
config.py docs(config): document --force destructive-replace semantics 2026-07-31 22:33:08 -07:00
config_defaults.py feat(terminal): raise Docker sandbox /dev/shm to 1g by default (configurable) 2026-07-31 21:31:51 -07:00
config_migrations.py refactor: config auto-migration support floor at v12 + deprecated shim retirement 2026-07-29 16:44:31 -07:00
console_engine.py fix(sessions): keep kanban worker runs out of the session lists 2026-07-31 13:53:04 -05:00
container_boot.py fix(gateway): detect and report unclean shutdowns via lifecycle ledger (NS-608) 2026-07-28 22:41:09 -07:00
context_switch_guard.py
…
copilot_auth.py fix(copilot): add explicit UTF-8 encoding to JWT store read/write 2026-07-31 22:31:09 -07:00
credential_lifecycle.py
…
cron.py feat(cron): user-owned model pins + cron.model fleet default 2026-07-28 11:52:47 -07:00
curator.py
…
curses_ui.py
…
dashboard_procs.py refactor: extract dashboard process-hygiene helpers to dashboard_procs.py 2026-07-29 10:59:54 -07:00
dashboard_register.py
…
debug.py
…
default_soul.py
…
dep_ensure.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
diagnostics_upload.py
…
dingtalk_auth.py
…
doctor.py fix(cli): stabilize custom provider identities 2026-07-31 17:26:42 +05:30
dump.py Revert "remove Vercel AI Gateway and Vercel Sandbox (#33067)" 2026-07-29 19:48:37 -07:00
env_loader.py perf(config): one raw config.yaml parse per process instead of 3-4 2026-07-29 10:32:25 -07:00
fallback_cmd.py
…
fallback_config.py
…
focus_view.py
…
gateway.py fix(windows): native Windows correctness for CLI, gateway status, banner, and WSL browser paths 2026-07-29 23:16:18 -07:00
gateway_enroll.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
gateway_windows.py
…
goals.py
…
gui_uninstall.py
…
hooks.py Reapply "feat(observability): integrate NeMo Relay runtime and shared metrics" 2026-07-27 21:10:51 -07:00
init_command.py
…
input_sanitize.py
…
inventory.py feat(picker): derive a newest-per-lab featured shortlist from models.dev 2026-07-28 03:52:33 -05:00
journey.py
…
kanban.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
kanban_db.py fix(kanban): deliver notifications from non-dispatch gateways 2026-07-31 21:52:11 -07:00
kanban_decompose.py
…
kanban_diagnostics.py
…
kanban_specify.py
…
kanban_swarm.py
…
lifecycle.py Reapply "feat(observability): integrate NeMo Relay runtime and shared metrics" 2026-07-27 21:10:51 -07:00
logs.py
…
main.py fix(update): stop gateway holders the guard finds after the pause 2026-07-31 22:34:28 -07:00
managed_scope.py
…
managed_uv.py fix(cli): sweep aged venv.stale.runtime-* backups on hermes update 2026-07-29 18:15:54 -07:00
mcp_catalog.py fix(git): never block internal git calls on credential prompts 2026-07-28 17:34:21 -07:00
mcp_config.py fix(mcp): make Figma remote OAuth work via DCR allowlist defaults 2026-07-28 00:53:16 -05:00
mcp_picker.py
…
mcp_security.py
…
mcp_startup.py
…
memory_oauth.py
…
memory_setup.py fix: route memory-provider dep installs through lazy_deps durable target 2026-07-28 22:40:33 -07:00
middleware.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
migrate.py
…
moa_cmd.py
…
moa_config.py
…
model_catalog.py
…
model_cost_guard.py
…
model_normalize.py Revert "remove Vercel AI Gateway and Vercel Sandbox (#33067)" 2026-07-29 19:48:37 -07:00
model_search.py
…
model_setup_flows.py fix(cli): stabilize custom provider identities 2026-07-31 17:26:42 +05:30
model_switch.py fix(cli): stabilize custom provider identities 2026-07-31 17:26:42 +05:30
models.py fix(models): honor model.base_url in OpenAI discovery, cache identity, and listing authority 2026-07-31 21:31:56 -07:00
nous_account.py
…
nous_auth_keepalive.py
…
nous_billing.py refactor: single shared Retry-After parser 2026-07-29 10:13:50 -07:00
nous_subscription.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
npm_engine.py fix(npm): self-upgrade a managed npm when engines.npm rejects it 2026-07-31 13:42:04 -04:00
onepassword_secrets_cli.py refactor: single build_subprocess_env() factory for all child-process spawns (profile + secret-scrub single owner) 2026-07-29 10:14:11 -07:00
oneshot.py
…
pairing.py fix(pairing): keep GUI approvals off the code brute-force lockout 2026-07-29 17:51:40 -05:00
partial_compress.py
…
pets.py
…
platforms.py
…
plugins.py Reapply "feat(observability): integrate NeMo Relay runtime and shared metrics" 2026-07-27 21:10:51 -07:00
plugins_cmd.py fix(git): never block internal git calls on credential prompts 2026-07-28 17:34:21 -07:00
portal_cli.py fix(auth): use refresh-free Nous status snapshot on read-only display paths 2026-07-28 22:42:19 -07:00
profile_describer.py
…
profile_distribution.py fix(git): never block internal git calls on credential prompts 2026-07-28 17:34:21 -07:00
profiles.py refactor: canonical config loaders for behavioral reads + guarded raw-read primitive (kills the managed-scope/env-expansion drift class) 2026-07-29 10:53:29 -07:00
projects_cmd.py
…
projects_db.py
…
prompt_size.py
…
prompt_stash.py feat(cli): complete the Ctrl+S prompt stash — keybinding, state machine, tests 2026-07-31 21:21:16 -07:00
provider_catalog.py
…
providers.py refactor(providers): delegate is_official_openai_host to base_url_host_matches 2026-07-31 21:31:56 -07:00
proxy_cli.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
psutil_android.py
…
pt_input_extras.py fix(cli): route Cmd+Backspace and Cmd+ForwardDelete to the kill bindings 2026-07-30 03:39:26 -05:00
pty_bridge.py refactor: single build_subprocess_env() factory for all child-process spawns (profile + secret-scrub single owner) 2026-07-29 10:14:11 -07:00
pty_session.py
…
relaunch.py
…
route_identity.py refactor: fold simplify-code review findings 2026-07-29 17:13:48 +05:30
runtime_provider.py fix(runtime): fall back to the provider's declared transport, not chat_completions 2026-07-31 21:31:56 -07:00
secret_prompt.py
…
secrets_cli.py refactor: single build_subprocess_env() factory for all child-process spawns (profile + secret-scrub single owner) 2026-07-29 10:14:11 -07:00
security_advisories.py
…
security_audit.py
…
security_audit_startup.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
send_cmd.py refactor: canonical config loaders for behavioral reads + guarded raw-read primitive (kills the managed-scope/env-expansion drift class) 2026-07-29 10:53:29 -07:00
service_manager.py
…
session_export.py
…
session_export_html.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
session_export_md.py
…
session_filters.py
…
session_listing.py
…
session_recap.py
…
session_recovery.py
…
sessions_cmd.py refactor: hoist cmd_sessions out of main() into sessions_cmd.py 2026-07-29 10:59:54 -07:00
setup.py modernize re-added Vercel integrations: SDK 0.7.2, telemetry off, sibling-site wiring 2026-07-29 19:48:37 -07:00
setup_hidden_env.py
…
setup_whatsapp_cloud.py
…
skills_config.py
…
skills_hub.py refactor: remove the claude-marketplace skill source (redundant Marketplace hub tab) 2026-07-28 23:16:27 -07:00
skin_cmd.py
…
skin_engine.py
…
slack_cli.py fix: route stray HERMES_HOME hardcodes through get_hermes_home() (profile + native-Windows safety) 2026-07-29 09:33:48 -07:00
slash_exec.py refactor: registry-owned execute() on CommandDef — informational commands unified (thin slice) 2026-07-29 12:11:24 -07:00
sqlite_runtime.py
…
sqlite_safe_read.py
…
sqlite_util.py
…
status.py modernize re-added Vercel integrations: SDK 0.7.2, telemetry off, sibling-site wiring 2026-07-29 19:48:37 -07:00
stdio.py
…
suggestions_cmd.py
…
telegram_managed_bot.py
…
timeouts.py
…
tips.py
…
tools_config.py Portal free user vision fix + flux3 polling improvements (#75448) 2026-07-31 10:17:55 -04:00
toolset_validation.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
uninstall.py fix(install): install a hermes-acp launcher onto PATH 2026-07-28 11:53:12 -07:00
update_cmd.py fix(update): snapshot venv launchers before the gateway drain 2026-07-31 22:34:28 -07:00
update_lock.py fix(update): make the ancestor-PID lock handoff cross-platform via psutil 2026-07-31 22:28:46 -07:00
urllib_security.py
…
vercel_auth.py Revert "remove Vercel AI Gateway and Vercel Sandbox (#33067)" 2026-07-29 19:48:37 -07:00
voice.py fix(voice): spoken barge-in works on every TTS playback path (CLI + gateway/desktop backends) 2026-07-29 08:24:00 -07:00
web_deps.py refactor(web): extract sessions/mcp/skills/tools routes to APIRouter modules (wave 2; route-table equality verified) 2026-07-29 16:21:54 -07:00
web_git.py fix(git): never block internal git calls on credential prompts 2026-07-28 17:34:21 -07:00
web_models.py fix(pairing): scope the approve/revoke endpoints to a profile 2026-07-29 18:43:50 -05:00
web_server.py Revert "remove Vercel AI Gateway and Vercel Sandbox (#33067)" 2026-07-29 19:48:37 -07:00
webhook.py
…
win_pty_bridge.py refactor: single build_subprocess_env() factory for all child-process spawns (profile + secret-scrub single owner) 2026-07-29 10:14:11 -07:00
windows_ssh_runtime.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
write_approval_commands.py
…
xai_retirement.py
…