Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1514 commits
Select commit Hold shift + click to select a range
75adf7d
style(desktop): flatten appearance settings — drop card-in-card sections
OutThisLife Jun 4, 2026
2b762c5
style(desktop): de-box appearance options into flat rows + bare theme…
OutThisLife Jun 4, 2026
f15d2cb
style(desktop): primitive-level pointer cursor + borderless settings …
OutThisLife Jun 4, 2026
41ede96
style(desktop): Color Mode + Tool Call Display as one-row segmented c…
OutThisLife Jun 4, 2026
947f305
style(desktop): drop redundant On/Off label next to boolean config sw…
OutThisLife Jun 4, 2026
75e29f9
style(desktop): add Switch xs size; move appearance controls inline-r…
OutThisLife Jun 4, 2026
e2ea648
test(docker): make tty-passthrough probe robust to container boot-log…
benbarclay Jun 4, 2026
e45dd2b
refactor(web): unify main-slot model assignment base_url/context hand…
teknium1 Jun 4, 2026
e68fc4d
feat(desktop): titlebar toggle to flip sidebar sides
OutThisLife Jun 4, 2026
03ba06e
fix(docker): chown gateway install tree on UID remap (salvage #37928)…
benbarclay Jun 4, 2026
30c7b78
fix(memory): fall back to pip when uv is unavailable (salvage #5954) …
benbarclay Jun 4, 2026
2e628ae
fix(docker): add libolm-dev so matrix lazy-install can build python-o…
benbarclay Jun 4, 2026
40420a6
fix(desktop): attachments on Enter, IME composition, scroll, fetchJso…
teknium1 Jun 4, 2026
ac9de2e
feat(desktop): global Cmd+K palette + UI consistency overhaul
OutThisLife Jun 4, 2026
311e808
style(desktop): tidy root error-boundary actions
OutThisLife Jun 4, 2026
ded620b
style(desktop): fix profiles sidebar — header + add-icon, drop text-link
OutThisLife Jun 4, 2026
88bdb6b
style(desktop): kill focus rings globally
OutThisLife Jun 4, 2026
fd88d52
style(desktop): shared Badge component; tidy profile metadata
OutThisLife Jun 4, 2026
e026fd8
style(desktop): migrate bespoke pills to shared Badge; tidy cron/titl…
OutThisLife Jun 4, 2026
fd68ae6
style(desktop): drop active background on titlebar actions
OutThisLife Jun 4, 2026
9e02b18
style(desktop): tighten error-boundary action gap
OutThisLife Jun 4, 2026
aecdc75
style(desktop): hide search when there's nothing to search
OutThisLife Jun 4, 2026
3a5e36c
fix(desktop): composer wraps long text & expands at the real wrap point
OutThisLife Jun 4, 2026
5bb7156
feat(desktop): composer/intro polish + shared ErrorState
OutThisLife Jun 4, 2026
38acced
style(desktop): satisfy lint across PR-touched files
OutThisLife Jun 4, 2026
bc9e33d
refactor(desktop): DRY/elegance pass over PR-touched files
OutThisLife Jun 4, 2026
86643d8
feat(desktop): Cmd+K jumps to sessions; drop API-key entries
OutThisLife Jun 4, 2026
3c163cb
feat(desktop): background needs-input indicator, clarify redesign, Cm…
OutThisLife Jun 4, 2026
ffb5376
fix(config): align prefill messages key handling
helix4u Jun 4, 2026
f31c950
refactor(supermemory): session-level ingest + kebab aliases (salvaged…
alt-glitch Jun 4, 2026
0401176
Merge pull request #38760 from helix4u/fix/prefill-config-compat
kshitijk4poor Jun 4, 2026
bb291b6
feat(dashboard): `hermes dashboard register` for self-hosted OAuth cl…
benbarclay Jun 4, 2026
c2ca3f0
fix(dashboard): honor --portal-url / HERMES_DASHBOARD_PORTAL_URL over…
benbarclay Jun 4, 2026
6717914
fix(dashboard): explain WHY a chat WS connection was refused (#38743)
teknium1 Jun 4, 2026
fe74a1a
fix(dashboard_auth): allow any http:// host in redirect_uri fast-fail…
benbarclay Jun 4, 2026
ed9e8ba
feat(dashboard-auth): add pluggable password (non-redirect) login
benbarclay Jun 4, 2026
acb0e2b
feat(dashboard-auth): add BasicAuthProvider username/password plugin
benbarclay Jun 4, 2026
3a25912
test(dashboard-auth): cover password login route, provider, and plugin
benbarclay Jun 4, 2026
b36a30d
docs(dashboard-auth): document the username/password provider
benbarclay Jun 4, 2026
9cbc37e
feat(desktop): dedicated Providers settings + polished Accounts/API-k…
austinpickett Jun 4, 2026
9d07927
desktop: OAuth-aware remote gateway connection
benbarclay Jun 3, 2026
bf590c8
fix(desktop): hide gateway auth control until probe resolves the scheme
benbarclay Jun 3, 2026
385a508
fix(desktop): don't fall back to a dead WS ticket on OAuth re-mint fa…
benbarclay Jun 4, 2026
fe709a4
fix(test): expect 4404 close code for disabled embedded chat (#38841)
teknium1 Jun 4, 2026
bd12b3c
feat(desktop): username/password login for remote gateways (#38851)
teknium1 Jun 4, 2026
4ed6317
fix(update): don't fail desktop rebuild / skills sync on mid-rebuild …
teknium1 Jun 4, 2026
928f1ac
fix(desktop): re-mint OAuth WS ticket on gateway reconnect (#38886)
teknium1 Jun 4, 2026
0175be3
chore(desktop): silence Vite chunk-size warning for intentional singl…
teknium1 Jun 4, 2026
b1b0f4b
fix(desktop): surface command approval even when its tool is in a col…
teknium1 Jun 4, 2026
aeec88c
fix(installer): symlink bundled node/npm into command bin dir for FHS…
alt-glitch Jun 4, 2026
bf82a7f
fix(cli): erase live chrome on exit so it isn't stranded above the se…
teknium1 Jun 4, 2026
cae6b54
feat(dashboard): always enable embedded chat; remove dashboard --tui …
benbarclay Jun 4, 2026
f57ce34
feat(dashboard-auth): add generic self-hosted OIDC provider
benbarclay Jun 4, 2026
616c0a3
fix(dashboard-auth): don't abort verify chain on one provider's Provi…
benbarclay Jun 4, 2026
df9fb8e
fix(tools): stop hermes tools reporting kanban as removed (#38918)
teknium1 Jun 4, 2026
c0435f4
docs: remote desktop connect uses username/password, not --insecure +…
teknium1 Jun 4, 2026
d3fab54
fix(cli): clear screen on exit so live chrome isn't stranded in scrol…
teknium1 Jun 4, 2026
4ae3c98
fix(gateway): bridge shared-key loop to nested platform config blocks
AhmetArif0 May 31, 2026
de60bf4
fix(memory): register parent packages for user-installed provider imp…
solaitken Jun 2, 2026
5f199e6
chore(release): add AUTHOR_MAP entry for solaitken
teknium1 Jun 4, 2026
a6a4e6f
fix(approval): gate perl/ruby -i in-place edits of Hermes config/env
AhmetArif0 Jun 1, 2026
b04c6e9
fix(approval): catch perl/ruby -i as a separate flag token
teknium1 Jun 4, 2026
9756dff
fix(model_metadata): drop stale ≤256,000 cache entries for Grok-4.3
AhmetArif0 Jun 1, 2026
0b46c41
fix(vision): convert video_url blocks to Anthropic input_video format…
kyssta-exe Jun 2, 2026
153fe28
fix(vision): use MiniMax type="video" block (not input_video) + tests
teknium1 Jun 4, 2026
c9b6206
fix(cli): launchd KeepAlive unconditional restart (#37388)
ashishpatel26 Jun 4, 2026
c14e6b4
chore(release): map ashishpatel26 author email for salvage
teknium1 Jun 4, 2026
eb9cde7
fix(cron): decouple job dispatch from completion in tick()
vynxevainglory-ai Jun 2, 2026
9fbfeb3
fix(cron): make sequential jobs non-blocking too + sweep MCP after jo…
teknium1 Jun 4, 2026
34a2903
fix(auth): set active_provider after hermes auth add google-gemini-cli
AhmetArif0 Jun 2, 2026
b620602
fix(desktop): remove session search aux model
scubamount Jun 2, 2026
643181b
chore: add scubamount to AUTHOR_MAP for salvaged PR #37616
teknium1 Jun 4, 2026
5f62ba8
fix(auth): use _save_xai_oauth_tokens in auth_commands to set active_…
AhmetArif0 Jun 2, 2026
3d1d0a4
fix(minimax): align default_aux_model with M3 frontier on minimax + m…
Fearvox Jun 2, 2026
b531b5d
fix(minimax): update AUTHOR_MAP entry + test_minimax_oauth_aux_model_…
Fearvox Jun 2, 2026
fa8e2f9
polish(minimax): address Copilot review comments on M3 default-aux fix
Fearvox Jun 2, 2026
71a9f44
fix(gateway): retry startup auto-resume when a failed platform reconn…
Frowtek Jun 2, 2026
d12c233
docs(wecom): stop implying live streaming and typing support (#38990)
teknium1 Jun 4, 2026
cd68b8f
fix(auth): set active_provider after hermes auth add qwen-oauth
AhmetArif0 Jun 2, 2026
cbfe1d2
docs(guides): Run Nemotron 3 Ultra free in Hermes Agent (launch guide…
OutThisLife Jun 4, 2026
28ca446
fix(gateway): guard kanban dispatcher against malformed config and em…
annguyenNous Jun 3, 2026
c136eb4
fix(update): harden venv rebuild + verify core deps after install
Jun 4, 2026
38d3c49
refactor(skills): clean up bundled skill set + add environments: rele…
teknium1 Jun 4, 2026
86c64cf
fix(gateway): visually expire Discord interactive views on timeout
kyssta-exe Jun 3, 2026
f3bbfda
feat(gateway): handle Feishu meeting invitations
zhaoleibd Jun 2, 2026
7314757
refactor(feishu): slim meeting-invite parser; add AUTHOR_MAP entry
teknium1 Jun 4, 2026
f7dabd3
fix(api-server): guard json.loads against corrupted SQLite data in re…
annguyenNous Jun 3, 2026
6bdbe30
fix(vision): guard image pixel dimensions, not just bytes (#37677)
kyssta-exe Jun 2, 2026
dd4ba4c
fix(vision): cap pixel dimensions proactively at embed time + declare…
teknium1 Jun 4, 2026
4cca7f5
fix(tools): add raise_for_status for MiniMax t2a_v2 TTS path
annguyenNous Jun 3, 2026
07f5382
fix(gateway): don't treat dm_policy: pairing as open access on own-po…
Frowtek Jun 3, 2026
fff0561
fix(gateway): anchor Google Chat OAuth client secret to default Herme…
Frowtek Jun 3, 2026
a6a0a5b
fix(desktop): detect linux arm64 binary
ethernet8023 Jun 4, 2026
b7169f9
fix(gateway): keep pending /update completion notifications until the…
Frowtek Jun 3, 2026
3858cf4
fix(cli): honor global-root active_provider fallback for named profiles
Frowtek Jun 3, 2026
e003c53
chore(desktop): zero eslint/typecheck debt + prettier pass (#39100)
OutThisLife Jun 4, 2026
f583c6e
fix(desktop): recover from corrupt cached Electron download on build
0xharryriddle Jun 2, 2026
fef04a1
fix(desktop): purge electron cache unconditionally, not via stdlib zi…
teknium1 Jun 4, 2026
6feb40e
fix(desktop): wait for backend exit before reloading on connection-co…
AhmetArif0 Jun 3, 2026
c2d11cc
fix(dashboard): surface model-write failure when creating a profile
AhmetArif0 Jun 3, 2026
de370fd
fix(dashboard): prevent stale desc-save indicator when requests overlap
AhmetArif0 Jun 3, 2026
081694c
fix(kanban): isolate board override per concurrent call
worlldz Jun 3, 2026
62f0cfd
fix(kanban-dashboard): use context-local board pin in specify/decompo…
teknium1 Jun 4, 2026
9ecc331
feat(desktop): search sessions by id
0xharryriddle Jun 3, 2026
580d924
perf(desktop): make session-id search SQL-bounded, not O(n)
teknium1 Jun 4, 2026
2982122
fix(gateway): deliver $HOME deliverables on root-run gateways
teknium1 Jun 4, 2026
693f4c7
fix(gateway): clear zombie agent slot when session_reset races in-fli…
CryptoByz Jun 4, 2026
30412a9
fix(cron): re-validate stale cron-output entries before deletion (#37…
kyssta-exe Jun 3, 2026
98903d0
fix(tui): reuse live session on resume
rexdotsh Jun 3, 2026
bd6d098
fix(tui): keep resumed live history current
rexdotsh Jun 3, 2026
8077e7d
fix(tui): narrow resume lock to avoid blocking session.close
kshitijk4poor Jun 4, 2026
ee7948e
fix(deps): exclude dev tooling from all extra
rexdotsh Jun 3, 2026
1f347ee
fix(uv): move venv aside instead of gutting it in place on Windows re…
jeffrobodie-glitch Jun 4, 2026
d136735
chore(release): map jeffrobodie@gmail.com -> jeffrobodie-glitch for s…
teknium1 Jun 4, 2026
a3fb48b
fix(state): keep /branch sessions visible after parent reopen
liuhao1024 Jun 4, 2026
acce1a2
feat(desktop): polish credentials settings and messaging env routing …
austinpickett Jun 4, 2026
1eeb7da
fix(desktop): slash commands bypass queue when busy and chip id suffi…
ethernet8023 Jun 4, 2026
b94b362
feat(desktop): per-session profile switching + cross-profile sessions
OutThisLife Jun 4, 2026
5df732a
feat(desktop): quick-create profile from rail + pin rail on empty sid…
OutThisLife Jun 4, 2026
d29caf3
fix(desktop): satisfy slash metadata typecheck
helix4u Jun 4, 2026
e0121c5
feat(desktop): drag-sort profiles in the rail
OutThisLife Jun 4, 2026
cfbc47d
feat(desktop): open command palette with Cmd/Ctrl+P too
OutThisLife Jun 4, 2026
3e4fa8c
fix(desktop): lock profile-rail drag to the x-axis
OutThisLife Jun 4, 2026
9915665
fix(desktop): step profile-rail drags cell-by-cell, clamp to strip
OutThisLife Jun 4, 2026
fb18bde
feat(desktop): fluid, haptic profile-rail reordering
OutThisLife Jun 4, 2026
76b98f4
fix(desktop): gate ALL-profiles grouping on multiProfile
OutThisLife Jun 4, 2026
0c7def3
feat(desktop): show "+" in the rail for single-profile users
OutThisLife Jun 4, 2026
48d8d80
feat(desktop): single-profile rail shows default icon + create
OutThisLife Jun 4, 2026
dfd6bcf
fix(desktop): restore accordion expand for credential settings rows (…
austinpickett Jun 4, 2026
cf9dc36
refactor(desktop): drop per-session icons, read-only cross-profile reads
OutThisLife Jun 4, 2026
a40e20e
feat(desktop): profile rail rename/delete + context-switch polish
OutThisLife Jun 4, 2026
8256294
fix(tui): persist timed-out/cancelled clarify prompts in transcript
benbarclay Jun 4, 2026
495c373
fix(config): bridge docker_volumes and docker_forward_env in config s…
Dusk1e Jun 4, 2026
b434f8c
fix(deps): promote markdown to a core dependency so rich delivery wor…
benbarclay Jun 4, 2026
eb43a5b
chore: improve .dockerignore with Python and common patterns (#6092)
archerthegoat Jun 4, 2026
6ad0152
chore: enforce LF line endings for container entrypoints (#12181)
bluefishs Jun 4, 2026
5300727
revert: keep Google Chat OAuth secret + active_provider profile-scope…
teknium1 Jun 4, 2026
2f0c8e9
Add Telegram QR onboarding to dashboard
shannonsands Jun 3, 2026
e7a7872
fix(tui_gateway): dedup re-queued process notifications flooding TUI
flooryyyy May 27, 2026
454d6cb
fix(telegram): finalize sealed overflow chunk so split streamed repli…
AliZakaee Jun 4, 2026
751b914
fix(mcp): ensure server.shutdown() on probe iteration failure
annguyenNous Jun 4, 2026
4690bbc
fix(local): recognize unqualified hostnames as local endpoints (#9248)
Tranquil-Flow Jun 5, 2026
82c157b
fix(docker): clean up orphaned container when docker run fails (salva…
benbarclay Jun 5, 2026
2c98dc0
fix(desktop): offer remote sign-in on a gated-gateway boot failure (#…
teknium1 Jun 5, 2026
54cae7d
switch model order
rob-maron Jun 4, 2026
fd87c61
feat(models): add qwen/qwen3.7-plus to nous + openrouter catalogs (#3…
teknium1 Jun 5, 2026
c54b935
fix(desktop): rename session via session.title RPC so /title works (#…
benbarclay Jun 5, 2026
8a88844
fix(docker): recover from out-of-band container removal in persistent…
benbarclay Jun 5, 2026
b20fcff
docs: make dashboard/gateway prerequisites explicit for remote-backen…
teknium1 Jun 5, 2026
c14c37d
fix(openviking): add missing /agent/{agent}/ segment to memory URI — …
Kewe63 Jun 2, 2026
fe4e327
chore: add Kewe63 to release AUTHOR_MAP
teknium1 Jun 4, 2026
9dbd3c5
feat(desktop): drag sessions into chat as @session links + spawn loader
OutThisLife Jun 5, 2026
74e845c
fix(slack): pass thread_ts in standalone send_message tool path
dirtyren Jun 3, 2026
0538c5e
chore: add dirtyren to AUTHOR_MAP for PR #38177 salvage
teknium1 Jun 5, 2026
f764b04
fix(desktop): deleting the active profile reliably falls back to default
OutThisLife Jun 5, 2026
36f1cd7
feat(installer): do shallow clones
ethernet8023 Jun 5, 2026
99cee12
docs(install): warn that VPS browser consoles mangle special chars (#…
bedirhancode Jun 5, 2026
4a4b9bd
fix(test): add platform guard for grp import
Kewe63 May 12, 2026
f736d2b
fix(vision): detect vision-capable custom providers via ProviderProfi…
Kewe63 May 15, 2026
d33d23c
fix(vision): drop models.dev catalog fallback, keep explicit profile …
teknium1 Jun 5, 2026
19db9cd
fix(acp): replace direct db._lock/_conn access with public update_ses…
Kewe63 Apr 13, 2026
76c7512
chore: add Kewe63 gmail to release AUTHOR_MAP
teknium1 Jun 5, 2026
46b2afc
fix(state): use TRUNCATE WAL checkpoint to prevent unbounded WAL growth
Kewe63 May 13, 2026
c60952b
fix(web): run URL SSRF checks off the event loop in async paths
Kewe63 Jun 4, 2026
93b5df3
fix(test): patch async_is_safe_url in web-provider SSRF mocks
teknium1 Jun 4, 2026
ea44011
fix(desktop): prevent thinking block from closing mid-streaming
stremtec Jun 4, 2026
46abf04
fix(ssh): handle WinError 1314 symlink failure with shutil.copy2 fall…
Kewe63 Apr 13, 2026
dfe6fbb
fix(ssh): narrow symlink fallback to WinError 1314 only
Kewe63 Apr 13, 2026
8067275
fix(docs): update all install instructions everywhere
ethernet8023 Jun 4, 2026
86371e6
style(desktop): drop border + radius from the profile-swap overlay
OutThisLife Jun 5, 2026
1b01fa3
feat(desktop): long-press a rail profile to pick its color
OutThisLife Jun 5, 2026
89baf02
Merge origin/main into bb/desktop-profile-support
OutThisLife Jun 5, 2026
4891f9a
feat(desktop): concurrent multi-profile gateway sockets
OutThisLife Jun 5, 2026
7b4acad
feat(desktop): per-profile "+" to start a session in the all-profiles…
OutThisLife Jun 5, 2026
ff5652d
Merge pull request #39330 from NousResearch/bb/desktop-profile-support
OutThisLife Jun 5, 2026
391b594
fix(cli): use Rich [dim] tag instead of ANSI escape in _restore_sessi…
liuhao1024 Jun 5, 2026
338f0b2
fix(desktop): recover from corrupt Electron cache in bootstrap instal…
youngstar-eth Jun 4, 2026
facd011
chore(release): map youngstar-eth in AUTHOR_MAP for salvage PR #39134
teknium1 Jun 5, 2026
2574237
fix(approval): check is_approved in execute_code guard (#39275)
kyssta-exe Jun 5, 2026
e952957
fix(mcp): widen shutdown_mcp_servers exception guard to BaseException
HeLLGURD Jun 5, 2026
1bcfe9c
fix(cli): widen _run_cleanup MCP shutdown guard to BaseException
HeLLGURD Jun 5, 2026
2069e78
chore: add HeLLGURD to release AUTHOR_MAP for PR #39453 salvage
teknium1 Jun 5, 2026
5bcb63e
fix(tui): add thread-safety locks for _sessions and prompt dicts
stremtec Jun 3, 2026
9cc47b2
feat(desktop): add 'choose provider later' skip to first-run onboardi…
teknium1 Jun 5, 2026
10c78bf
test(desktop): add injectable gateway WebSocket probe + unit tests
xxxigm Jun 4, 2026
500cf53
fix(desktop): validate live WebSocket in remote gateway connection test
xxxigm Jun 4, 2026
bcb024a
fix(desktop): fail remote test when OAuth ws-ticket mint fails
teknium1 Jun 5, 2026
96cd37e
fix(dashboard): reap orphaned embedded-chat sessions to stop slash_wo…
benbarclay Jun 4, 2026
fb853a1
fix(install): scrap rebuild venv
ethernet8023 Jun 5, 2026
7c00ffd
fix(google-workspace): fall back to uv when venv has no pip (#39516)
benbarclay Jun 5, 2026
4eca569
fix: temp for update
ethernet8023 Jun 5, 2026
ab706a3
Clear stale desktop onboarding errors (#38844)
shannonsands Jun 5, 2026
7f016f5
change(desktop): show up to 50 models in list per provider by default
ethernet8023 Jun 5, 2026
46c16b9
fix(deps): bump react-router-dom to 7.17.0 (GHSA-8x6r-g9mw-2r78)
benbarclay Jun 4, 2026
6b77fd2
fix(nix): bump npmDepsHash for react-router 7.17.0 lockfile
teknium1 Jun 5, 2026
736dc0f
fix(nix): use fetchNpmDeps hash for npmDepsHash, not prefetch-npm-deps
benbarclay Jun 5, 2026
7309f3b
fix(line): map inbound message types to the correct MessageType
teknium1 Jun 5, 2026
899ee8c
fix(gateway): tolerate non-UTF-8 status/pid files in gateway status r…
brian-doherty Jun 5, 2026
439f53c
fix(desktop): gate OAuth remote connect on AT-or-RT, not access token…
benbarclay Jun 5, 2026
b1e399d
fix(update-check): stop reporting phantom "N commits behind" inside D…
benbarclay Jun 5, 2026
ad69d3e
fix(terminal): guard os.getcwd() against a deleted CWD
isair Jun 5, 2026
c8e80cd
fix(update): require managed marker before destructive clean
helix4u Jun 5, 2026
b0d234f
fix(cron): don't crash on `cron list` when a job's repeat is null
liuboacean Jun 5, 2026
9ab9c92
docs(dashboard): clarify auth provider suitability + registration acr…
benbarclay Jun 5, 2026
3278b42
fix(dashboard): strip session token from subprocess env
coygeek Jun 3, 2026
b459bac
fix(cli): gitignore Desktop bootstrap marker so hermes update stops a…
harjothkhara Jun 5, 2026
397d492
chore(release): map harjoth.khara@gmail.com → harjothkhara for #38550…
teknium1 Jun 5, 2026
2a82519
fix(models): don't silently default Nous to the most expensive flagship
xxxigm Jun 5, 2026
ef5e48f
test(models): guard Nous silent default against expensive-flagship es…
xxxigm Jun 5, 2026
3da44db
fix(models): use deepseek-v4-flash as Nous silent default
teknium1 Jun 5, 2026
8a9ded5
feat(discord): voice-channel mixer — ambient idle bed + verbal acks t…
teknium1 Jun 5, 2026
6bf55a4
Add CLI Telegram QR onboarding
shannonsands Jun 5, 2026
ec46f59
fix(gemini): default native maxOutputTokens + strip OpenAI extra_body…
teknium1 Jun 5, 2026
3cd1bd9
fix(cli): require Chromium for local browser readiness in setup/statu…
Frowtek Jun 5, 2026
06268f1
feat(gateway): explain /voice usage when toggled bare (#39766)
teknium1 Jun 5, 2026
d414275
feat(delegation): uncap max_spawn_depth (floor 1, no ceiling) (#39772)
teknium1 Jun 5, 2026
947e21b
fix(gateway): log silent file-delivery drops (#39767)
teknium1 Jun 5, 2026
72eb42d
feat(update): stash/restore by default + settable discard for non-int…
teknium1 Jun 5, 2026
db204ae
fix(update): make ensure_uv() survive the update boundary (no first-r…
OutThisLife Jun 5, 2026
1a3e608
feat(desktop): per-profile remote gateway hosts (#39778)
OutThisLife Jun 5, 2026
ca8c78e
fix(desktop): heal stale runtime-id cache + model on profile switch (…
OutThisLife Jun 5, 2026
d880b5b
fix(update/windows): don't return _UvResult on Windows (subprocess ar…
OutThisLife Jun 5, 2026
98528c7
fix(desktop/windows): stop racing our own backend during in-app updat…
OutThisLife Jun 5, 2026
14fee4f
fix(update/windows): retry handoff `hermes update` once on first-run …
OutThisLife Jun 5, 2026
7583aed
fix(completion): remove /model <arg> autocomplete from CLI/TUI (#39727)
teknium1 Jun 5, 2026
ca1fb32
docs: remove --include-desktop install instructions (#39762)
teknium1 Jun 5, 2026
9ca11b3
perf(/model): prewarm picker provider-models cache in background (#39…
teknium1 Jun 5, 2026
af8b917
fix(termux): scope frontend npm installs
adybag14-cyber Jun 5, 2026
83c1386
fix(desktop): route remote-profile session reads to the owning remote…
OutThisLife Jun 5, 2026
3045d54
fix(desktop): route remote-profile session mutations + fix unified-li…
OutThisLife Jun 5, 2026
9af54b2
fix(desktop): make remote-profile sessions first-class (resume, read,…
OutThisLife Jun 5, 2026
cf78659
fix(gateway): propagate max_tokens from config.yaml to AIAgent
ViewWay May 6, 2026
1c909e7
fix(cli,gateway): complete max_tokens propagation — CLI path + env va…
ViewWay May 6, 2026
14275d7
fix(gateway): honor per-provider max_output_tokens in max_tokens chain
teknium1 Jun 5, 2026
2dda393
test(gateway): regression tests for max_tokens propagation chain (#20…
teknium1 Jun 5, 2026
e837856
chore(release): map ViewWay author email for AUTHOR_MAP
teknium1 Jun 5, 2026
02d6bf1
fix(desktop+gateway): full multi-profile support over one global-remo…
OutThisLife Jun 5, 2026
4a1907b
feat(desktop): add i18n with Simplified Chinese (zh-Hans) support
JimLiu Jun 3, 2026
1d9c3eb
feat(desktop): persist i18n language in config
JimLiu Jun 4, 2026
6f6eb87
fix(gateway): new chats honor their profile in global-remote mode (#3…
OutThisLife Jun 5, 2026
4b2d00f
feat(model_switch): honor discover_models in custom_providers section 4
ohMyJason Jun 5, 2026
53bba70
chore: add ohMyJason to AUTHOR_MAP
kshitijk4poor Jun 5, 2026
7ae8aac
feat(model): honor discover_models in terminal hermes model named-cus…
kshitijk4poor Jun 5, 2026
b5d42da
Merge pull request #40080 from kshitijk4poor/salvage/discover-models-…
kshitijk4poor Jun 5, 2026
e6f7e21
Merge pull request #40093 from kshitijk4poor/feat/named-custom-discov…
kshitijk4poor Jun 5, 2026
66a6b9c
Merge pull request #39482 from liuhao1024/fix/rich-markup-error-on-se…
kshitijk4poor Jun 5, 2026
ea266f4
fix(file-ops): make rg/grep search error guard reachable and preserve…
teknium1 Jun 6, 2026
3c231eb
chore: release v0.16.0 (2026.6.5) (#40206)
teknium1 Jun 6, 2026
9e66724
graft: record upstream v2026.5.29 as already-applied (squashed via PR…
Jun 8, 2026
356c4cb
Merge upstream v2026.6.5 into main
Jun 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 28 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@
.gitignore
.gitmodules

# Python
__pycache__
*.py[cod]
*$py.class
*.so
.Python
*.egg-info/
dist/
build/

# Virtual environments
venv/
env/
ENV/

# Dependencies
node_modules
**/node_modules
Expand All @@ -24,7 +39,20 @@ ui-tui/packages/hermes-ink/dist/

# Environment files
.env
.env.*

# IDE
.vscode/
.idea/
*.swp
*.swo

# Testing
.pytest_cache/
.coverage
htmlcov/

# Documentation
*.md

# Runtime data (bind-mounted at /opt/data; must not leak into build context)
Expand Down
8 changes: 5 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -417,20 +417,22 @@ IMAGE_TOOLS_DEBUG=false
# Default STT provider is "local" (faster-whisper) — runs on your machine, no API key needed.
# Install with: pip install faster-whisper
# Model downloads automatically on first use (~150 MB for "base").
# To use cloud providers instead, set GROQ_API_KEY or VOICE_TOOLS_OPENAI_KEY above.
# Provider priority: local > groq > openai
# Configure in config.yaml: stt.provider: local | groq | openai
# To use cloud providers instead, set GROQ_API_KEY, VOICE_TOOLS_OPENAI_KEY, or ELEVENLABS_API_KEY above.
# Provider priority: local > groq > openai > mistral > xai > elevenlabs
# Configure in config.yaml: stt.provider: local | groq | openai | mistral | xai | elevenlabs

# =============================================================================
# STT ADVANCED OVERRIDES (optional)
# =============================================================================
# Override default STT models per provider (normally set via stt.model in config.yaml)
# STT_GROQ_MODEL=whisper-large-v3-turbo
# STT_OPENAI_MODEL=whisper-1
# STT_ELEVENLABS_MODEL=scribe_v2

# Override STT provider endpoints (for proxies or self-hosted instances)
# GROQ_BASE_URL=https://api.groq.com/openai/v1
# STT_OPENAI_BASE_URL=https://api.openai.com/v1
# ELEVENLABS_STT_BASE_URL=https://api.elevenlabs.io/v1

# =============================================================================
# MICROSOFT TEAMS INTEGRATION
Expand Down
2 changes: 1 addition & 1 deletion .envrc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
watch_file pyproject.toml uv.lock
watch_file ui-tui/package-lock.json ui-tui/package.json
watch_file package-lock.json package.json web/package.json ui-tui/package.json website/package.json apps/shared/package.json apps/desktop/package.json ui-tui/packages/hermes-ink/package.json
watch_file flake.nix flake.lock nix/devShell.nix nix/tui.nix nix/package.nix nix/python.nix

use flake
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
# Auto-generated files — collapse diffs and exclude from language stats
web/package-lock.json linguist-generated=true

# Enforce LF for scripts that run inside Linux containers.
# Without this, Windows checkout converts to CRLF and breaks `exec` in the
# container entrypoint with "no such file or directory".
*.sh text eol=lf
Dockerfile text eol=lf
*.dockerfile text eol=lf
docker/entrypoint.sh text eol=lf
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/pr-screenshots/39327/tools-collapsed.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/pr-screenshots/39327/tools-expanded.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
100 changes: 100 additions & 0 deletions .github/workflows/build-windows-installer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
name: Build Windows Installer

on:
workflow_dispatch:

permissions:
contents: read

jobs:
# Gate: workflow_dispatch is already restricted to users with write access,
# but we want ADMIN-only. Explicitly check the triggering actor's repo
# permission via the API and fail fast for anyone below admin.
authorize:
name: Authorize (admins only)
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Check actor is a repo admin
env:
GH_TOKEN: ${{ github.token }}
ACTOR: ${{ github.actor }}
run: |
set -euo pipefail
perm=$(gh api \
"repos/${{ github.repository }}/collaborators/${ACTOR}/permission" \
--jq '.permission')
echo "Actor '${ACTOR}' has permission: ${perm}"
if [ "${perm}" != "admin" ]; then
echo "::error::'${ACTOR}' is not a repo admin (permission=${perm}). Refusing to build/sign."
exit 1
fi
echo "Authorized: '${ACTOR}' is an admin."

build:
name: Hermes-Setup.exe
needs: authorize
runs-on: windows-latest
timeout-minutes: 30
permissions:
contents: read
# Required for OIDC auth to Azure (azure/login federated credentials).
id-token: write

steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
cache: npm

- name: Install npm dependencies
run: npm ci

- name: Setup Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable

- name: Cache Rust targets
uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
workspaces: apps/bootstrap-installer/src-tauri

- name: Build installer
run: npm run tauri:build
working-directory: apps/bootstrap-installer

- name: Azure login (OIDC)
uses: azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

- name: Sign Hermes-Setup.exe with Azure Artifact Signing
uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2
with:
endpoint: ${{ vars.AZURE_SIGNING_ENDPOINT }}
signing-account-name: ${{ vars.AZURE_SIGNING_ACCOUNT_NAME }}
certificate-profile-name: ${{ vars.AZURE_SIGNING_CERTIFICATE_PROFILE }}
# Sign both the raw exe and the bundled NSIS installer.
files-folder: ${{ github.workspace }}\apps\bootstrap-installer\src-tauri\target\release
files-folder-filter: exe
files-folder-recurse: true
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256

- name: Upload NSIS installer
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: Hermes-Setup-installer
path: apps/bootstrap-installer/src-tauri/target/release/bundle/nsis/*.exe

- name: Upload raw exe
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: Hermes-Setup-exe
path: apps/bootstrap-installer/src-tauri/target/release/Hermes-Setup.exe
22 changes: 17 additions & 5 deletions .github/workflows/contributor-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ name: Contributor Attribution Check
on:
pull_request:
branches: [main]
paths:
# Only run when code files change (not docs-only PRs)
- '*.py'
- '**/*.py'
- '.github/workflows/contributor-check.yml'
# No paths filter — the job must always run so the required check
# reports a status (path-gated workflows leave checks "pending" forever
# when no matching files change, which blocks merge).

permissions:
contents: read
Expand All @@ -20,7 +18,21 @@ jobs:
with:
fetch-depth: 0 # Full history needed for git log

- name: Check if relevant files changed
id: filter
run: |
BASE="${{ github.event.pull_request.base.sha }}"
HEAD="${{ github.event.pull_request.head.sha }}"
CHANGED=$(git diff --name-only "$BASE"..."$HEAD" -- '*.py' '**/*.py' '.github/workflows/contributor-check.yml' || true)
if [ -n "$CHANGED" ]; then
echo "run=true" >> "$GITHUB_OUTPUT"
else
echo "run=false" >> "$GITHUB_OUTPUT"
echo "No Python files changed, skipping attribution check."
fi

- name: Check for unmapped contributor emails
if: steps.filter.outputs.run == 'true'
run: |
# Get the merge base between this PR and main
MERGE_BASE=$(git merge-base origin/main HEAD)
Expand Down
55 changes: 40 additions & 15 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ on:

permissions:
contents: read
# Needed so the arm64 job can push/pull its registry-backed build cache
# to ghcr.io (cache-to/cache-from type=registry). See the build-arm64
# job for why registry cache replaced the gha cache on that arch.
packages: write

# Concurrency: push/release runs are NEVER cancelled so every merge gets
# its own image. PR runs reuse a PR-scoped group with
Expand Down Expand Up @@ -54,8 +58,6 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: recursive

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
Expand Down Expand Up @@ -190,17 +192,38 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: recursive

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3

# Build once, load into the local daemon for smoke testing. PR arm64
# builds deliberately avoid the gha cache: cold-cache arm64 builds can
# outlive GitHub's short-lived Azure cache SAS token, then fail while
# reading or writing cache blobs before the smoke test can run.
- name: Build image (arm64, smoke test, uncached PR)
# Log in to ghcr.io so the registry-backed build cache below can be
# read (cache-from) on every event and written (cache-to) on
# push/release. Uses the workflow's GITHUB_TOKEN, which is valid for
# the whole job — unlike the gha cache backend's short-lived Azure SAS
# token, which expired mid-build on slow cold-cache arm64 runs and
# crashed the build before the smoke test (the reason the gha cache
# was removed from arm64 PRs in the first place).
- name: Log in to ghcr.io (build cache)
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

# Build once, load into the local daemon for smoke testing.
#
# PR builds use the registry-backed cache READ-ONLY (cache-from only):
# they pull warm layers pushed by the most recent main build but never
# write, so rapid PR pushes don't race on cache writes or pollute the
# cache ref. This restores warm-cache speed to arm64 PR builds (which
# were running fully uncached and were ~45% slower than amd64, making
# them the job most often cancelled on supersede).
#
# Registry cache (type=registry on ghcr.io) is used instead of the gha
# cache that previously broke here: its credential is the job-lifetime
# GITHUB_TOKEN, not a short-lived SAS token, so the cold-build-outlives-
# token failure mode cannot recur.
- name: Build image (arm64, smoke test, cache read-only PR)
if: github.event_name == 'pull_request'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
Expand All @@ -211,9 +234,11 @@ jobs:
tags: ${{ env.IMAGE_NAME }}:test
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
cache-from: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64

# Main/release builds still use the per-arch gha cache so the digest
# push below can reuse layers from this smoke-test build.
# Main/release builds read AND write the registry cache so the digest
# push below reuses layers from this smoke-test build, and so the next
# PR/main build starts warm.
- name: Build image (arm64, smoke test, cached publish)
if: github.event_name != 'pull_request'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
Expand All @@ -225,8 +250,8 @@ jobs:
tags: ${{ env.IMAGE_NAME }}:test
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
cache-from: type=gha,scope=docker-arm64
cache-to: type=gha,mode=max,scope=docker-arm64
cache-from: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64
cache-to: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64,mode=max

- name: Smoke test image
uses: ./.github/actions/hermes-smoke-test
Expand All @@ -253,8 +278,8 @@ jobs:
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=gha,scope=docker-arm64
cache-to: type=gha,mode=max,scope=docker-arm64
cache-from: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64
cache-to: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64,mode=max

- name: Export digest
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/nix-lockfile-fix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ on:
push:
branches: [main]
paths:
- 'ui-tui/package-lock.json'
- 'package-lock.json'
- 'package.json'
- 'ui-tui/package.json'
- 'web/package-lock.json'
- 'web/package.json'
- 'apps/desktop/package.json'
workflow_dispatch:
inputs:
pr_number:
Expand All @@ -27,9 +27,9 @@ concurrency:

jobs:
# ── Auto-fix on main ───────────────────────────────────────────────
# Fires when a push to main touches package.json or package-lock.json
# in ui-tui/ or web/. Runs fix-lockfiles and pushes the hash
# update commit directly to main so Nix builds never stay broken.
# Fires when a push to main touches package.json or package-lock.json.
# Runs fix-lockfiles and pushes the hash update commit directly to main
# so Nix builds never stay broken.
#
# Safety invariants:
# 1. The fix commit only touches nix/*.nix files, which are NOT in
Expand Down Expand Up @@ -109,8 +109,8 @@ jobs:
# our computed hashes are stale. Abort and let the next triggered
# run recompute from the correct package-lock state.
pkg_changed="$(git diff --name-only "$BASE_SHA"..origin/main -- \
'ui-tui/package-lock.json' 'ui-tui/package.json' \
'web/package-lock.json' 'web/package.json' || true)"
'package-lock.json' 'package.json' \
'ui-tui/package.json' 'apps/desktop/package.json' || true)"
if [ -n "$pkg_changed" ]; then
echo "::warning::Package files changed since hash computation — aborting; a fresh run will recompute"
exit 0
Expand Down
Loading
Loading