Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
441 commits
Select commit Hold shift + click to select a range
bb79bcd
fix: detect pyproject.toml / __init__.py version drift in hermes doct…
teknium1 May 30, 2026
9d2571c
fix: surface /agents nudge while delegate_task is in-flight (TUI + CLI)
kshitijk4poor May 30, 2026
e481b15
Merge pull request #35216 from kshitijk4poor/fix/agents-nudge-single-…
kshitijk4poor May 30, 2026
b4cf114
fix(vision): fail fast on non-retryable image download errors (#35221)
teknium1 May 30, 2026
64998fa
fix(tui): use base64 encoding for PowerShell clipboard writes to pres…
annguyenNous May 30, 2026
16882cf
refactor(tui): simplify base64 clipboard write to a stdin flag
teknium1 May 30, 2026
c70dca3
fix(kanban): rebuild legacy TEXT-PK tables to INTEGER AUTOINCREMENT o…
teknium1 May 30, 2026
6ab71d3
fix(kanban): prevent infinite retry loop when worker exhausts iterati…
liuhao1024 May 30, 2026
8e5a685
fix(kanban): align recompute_ready guard with breaker's configured fa…
teknium1 May 30, 2026
14517ac
fix(update): export launcher virtualenv to uv
LeonSGP43 May 30, 2026
93e6a05
feat(model-picker): group multi-endpoint providers under one row (#35…
teknium1 May 30, 2026
a57cc00
fix(packaging): include mcp_serve in py-modules so hermes mcp serve w…
liuhao1024 May 29, 2026
83a7d0b
fix(skills): fix transaction ordering in reset_bundled_skill and hand…
annguyenNous May 30, 2026
8ae0802
fix(skills): make _rmtree_writable handle read-only directories, not …
teknium1 May 30, 2026
6a08fd3
test(skills): assert restore via synced[copied], not manifest re-read
teknium1 May 30, 2026
39f6b6e
fix(file-tools): make write_file/patch atomic (temp-file + rename) (#…
teknium1 May 30, 2026
1bdb29d
fix(cli): use `uv tool upgrade` when Hermes is a uv tool install (#29…
briandevans May 21, 2026
bebd4f8
fix(cli): restrict uv-tool-install detection to running interpreter
briandevans May 27, 2026
2334228
fix(update): handle pipx installs + --system fallback in _cmd_update_pip
teknium1 May 30, 2026
4d7ea3f
chore(release): map inchargeautomation-lab author email
teknium1 May 30, 2026
a29d64e
fix(mcp): reap stdio MCP grandchildren via process-group signal
konsisumer May 11, 2026
41decf2
test(mcp): import os and pytest in test_mcp_stability
teknium1 May 30, 2026
460771b
fix(lsp): detect Windows wrapper binaries in installer probes
Sylw3ster May 20, 2026
296fcdf
fix(lsp): handle Windows .cmd shims in LSP process spawn
tuancookiez-hub May 29, 2026
c9e31a8
chore(release): map tuancookiez-hub for #34865 salvage
teknium1 May 30, 2026
794519c
fix(state): persist mid-session model switch to database
LengR May 30, 2026
e1945ff
test(state): cover update_session_model overwrite + getattr-guard tex…
teknium1 May 30, 2026
6baf001
fix(run_agent): gate concurrent checkpoint preflight on block_result …
beardthelion May 29, 2026
8bd0060
fix(google-workspace): handle Gmail header casing case-insensitively
donovan-yohan May 30, 2026
2475244
fix(update/windows): robustly exclude launcher-shim ancestors from co…
teknium1 May 30, 2026
40fcb96
fix(auxiliary): pass base_url/api_key/api_mode through set_runtime_ma…
liuhao1024 May 29, 2026
622e534
test(auxiliary): e2e routing assertions for custom-provider aux resol…
teknium1 May 30, 2026
d3724c0
fix(tools): recognize email addresses as explicit targets in send_mes…
liuhao1024 May 29, 2026
bfc4a26
fix(tools): point email home-channel error at EMAIL_HOME_ADDRESS
teknium1 May 30, 2026
cbf851a
perf(tui): stop slow/dead MCP servers from freezing TUI startup
kshitijk4poor May 30, 2026
61268ff
feat(cli): add hermes prompt-size diagnostic (#35276)
teknium1 May 30, 2026
0bfe19b
fix(gateway): merge nested gateway.platforms configuration block
Que0x May 29, 2026
6d2727e
fix(discord): bridge explicit allow_from configuration to env var map…
Que0x May 29, 2026
44f3e51
fix(gateway): run adapter config hooks for nested-only platform blocks
teknium1 May 30, 2026
5a1aa9e
fix(nous_account): add threading lock to prevent TOCTOU race on cache
sprmn24 May 28, 2026
5f84c91
fix(file-tools): handle UTF-8 BOM in read_file / write_file / patch (…
teknium1 May 30, 2026
ea6eaab
perf(read_file): compact line-number gutter — ~14% fewer tokens per r…
teknium1 May 30, 2026
10dec7c
fix(kanban): respect mobile safe areas in task detail drawer (#35378)
teknium1 May 30, 2026
2b16b75
fix(gateway): recover model on post-interrupt turn; gate fallback sta…
teknium1 May 30, 2026
bede3cf
fix(tools): wrap _run_tool cleanup in finally to prevent interrupt st…
liuhao1024 May 30, 2026
182739f
test(interrupt): assert no leaked tid instead of no-op block
teknium1 May 30, 2026
020601d
fix(compression): drop conflicting 'resume Active Task' directive in …
May 15, 2026
56b8dcc
fix(compressor): treat unanswered user questions as Active Task, not …
mathijsvandenhurk May 26, 2026
42bbd22
fix(compressor): strip stale handoff prefix on resume; reconcile #262…
teknium1 May 30, 2026
92ad7cc
fix(browser): recover from CDP DOM-node serialization crash in browse…
teknium1 May 30, 2026
9fbde54
fix(cli): fail closed on empty oneshot responses
briancl2 May 30, 2026
433bfff
fix(cli): surface oneshot agent exceptions to stderr with rc=1
teknium1 May 30, 2026
234ac00
fix(dashboard): allow insecure WS peers on explicit non-loopback bind…
teknium1 May 30, 2026
b0ce47d
feat: add text debounce batching for WhatsApp and WeChat platforms
redpiggy-cyber May 30, 2026
cddb728
fix(gateway): config.yaml path for WhatsApp/Weixin text-batch delays
teknium1 May 30, 2026
45465b0
fix(gateway): never auto-pause platforms on transient network/DNS fai…
teknium1 May 30, 2026
51d165a
fix(gateway): support Windows absolute paths in MEDIA tag regex and e…
Tranquil-Flow May 30, 2026
1b95545
test: use raw docstring in test_run_tool_media_re to silence escape w…
teknium1 May 30, 2026
20d073f
test: update extract_local_files Windows-path test for new matching b…
teknium1 May 30, 2026
b47cb1b
feat(kanban): file attachments on tasks (#35395)
teknium1 May 30, 2026
0c6e133
perf(cli): stop eager MCP discovery from blocking agent-capable startup
Sylw3ster May 30, 2026
96643b4
fix(file-tools): anchor relative-path resolution to absolute base; re…
teknium1 May 30, 2026
6a72af0
fix(managed-gateway): keep tool availability scans off the Nous token…
Sylw3ster May 30, 2026
5921d66
fix(cli): stop OSC 11 bg probe from trapping users in a stray editor …
OutThisLife May 30, 2026
b1a2540
perf(read_file): make compact gutter the only format; drop HERMES_REA…
teknium1 May 30, 2026
bdfba45
fix(gateway): stop system tips from auto-uploading local files
helix4u May 30, 2026
4ec0ade
fix(gateway): denylist config.yaml for media delivery (belt-and-suspe…
teknium1 May 30, 2026
ec67def
fix(install): refresh stale uv so installs actually get FTS5 Python (…
teknium1 May 31, 2026
355af2c
fix(session): survive missing FTS5 runtimes
helix4u May 30, 2026
cd067ab
fix(tui): swallow degraded mouse-burst noise so a stalled loop can't …
OutThisLife May 31, 2026
b1d34cf
fix(tui): clamp bogus terminal dimensions (WSL 131072x1) (#35657)
teknium1 May 31, 2026
9ed9af2
fix(update): name new config options in migration prompt; skip prompt…
teknium1 May 31, 2026
c2cbe2c
fix: remove Discord mention redaction from secret scrubber
JezzaHehn May 25, 2026
fe62424
test(redact): assert Discord mentions pass through unchanged
teknium1 May 31, 2026
50db2d9
feat(models): add deepseek-v4-flash, trim variants, group curated lis…
teknium1 May 31, 2026
02d1da4
Block Hermes root config in media delivery
LeonSGP43 May 31, 2026
dc4de14
fix(telegram): retry on httpx pool timeout instead of dropping the se…
teknium1 May 31, 2026
9b78f41
fix(security): neutralize file paths in mutation-verifier footer (#35…
teknium1 May 31, 2026
5cd6c17
fix(gateway,cron): prevent agent restart loops via self-targeting gat…
SimoKiihamaki May 23, 2026
bd72d33
fix(gateway,cron): reuse existing _HERMES_GATEWAY marker; tighten cro…
teknium1 May 31, 2026
d276018
docs(toolsets): clarify all/* wildcard does not enable kanban (#35729)
teknium1 May 31, 2026
d4e7b2f
fix(voice): allow /voice over SSH when a sound server is reachable (#…
teknium1 May 31, 2026
0ffbcbb
fix(vision): cap embedded image size before it wedges a session (#35732)
teknium1 May 31, 2026
ca03486
fix(streaming): stop duplicating tool-call args from cumulative-resen…
teknium1 May 31, 2026
e1293bd
feat(models): refresh model catalog hourly instead of daily (#35756)
teknium1 May 31, 2026
e8cacb5
fix(feishu): cap _message_text_cache with LRU eviction to prevent unb…
AhmetArif0 May 11, 2026
3c21fed
fix(bluebubbles): cap _guid_cache with LRU eviction to prevent unboun…
dskwe May 22, 2026
91a98d1
fix: tool_output_limits re-reads config on every call (no caching)
amathxbt May 9, 2026
eb9bfd3
fix(T5): replace time.sleep(0.25) with asyncio.sleep in MCP auth reco…
ErnestHysa May 26, 2026
0036c72
fix(gateway): upgrade plugin/bundle error logging and fix O(n^2) watc…
ErnestHysa May 26, 2026
3289927
fix(gateway): detach pending_watchers batch + normalize LRU caches + …
kshitijk4poor May 31, 2026
0cd7d54
feat(kanban): goal_mode cards run workers in a /goal loop (#35710)
teknium1 May 31, 2026
3463c97
fix(cli): decode raw arrow-key escape sequences in curses menus
kshitijk4poor May 31, 2026
4ccd141
Merge pull request #35776 from kshitijk4poor/fix/curses-arrow-key-decode
kshitijk4poor May 31, 2026
087be00
fix(cli): migrate setup model/provider pickers off simple_term_menu t…
kshitijk4poor May 31, 2026
8f4c8e7
refactor(cli): extract shared curses menu event-loop driver
kshitijk4poor May 31, 2026
1fc7bdc
feat(tools): always show Nous Tool Gateway backends, login on select …
teknium1 May 31, 2026
f2d4cf4
fix(cli): clamp post-compression token sentinel in status bar (#35858)
teknium1 May 31, 2026
2b5268f
revert: drop cumulative-resend tool-arg heuristic from shared streami…
teknium1 May 31, 2026
64628ea
fix(anthropic): demote dead thinking signature when orphan-strip muta…
fesalfayed May 31, 2026
04bb74c
chore: map fesalfayed author email for release notes
teknium1 May 31, 2026
a726e8a
fix(tui): auto-recover session on unexpected gateway death (+ persist…
OutThisLife May 31, 2026
de4f40e
feat(setup): thin out setup — Quick Setup via Nous Portal + Full Setu…
teknium1 May 31, 2026
1044d9f
fix(gateway): /stop can interrupt a sibling participant's run in a pe…
teknium1 May 31, 2026
7a315bd
fix(tools): preserve live session cwd in terminal_tool, and keep ACP …
kshitijk4poor May 31, 2026
6f8975d
fix(tools): don't compound-rewrite spawn_via_env background wrappers
kshitijk4poor May 31, 2026
01dda3f
Merge pull request #36010 from kshitijk4poor/fix/terminal-cwd-acp-aware
kshitijk4poor May 31, 2026
59cc7c3
Merge pull request #36023 from kshitijk4poor/fix/spawn-via-env-bg-wra…
kshitijk4poor May 31, 2026
4259bab
fix(gateway): preserve Telegram DM topic routing metadata in syntheti…
Dusk1e May 28, 2026
eb3cf97
fix(gateway): resolve _get_dm_topic_info on adapter class, not instance
kshitijk4poor May 31, 2026
47d2d05
chore(model-picker): refresh provider picker descriptions
kshitijk4poor May 31, 2026
84d8245
feat(model-picker): show short description on grouped provider rows
kshitijk4poor May 31, 2026
c9a28df
feat(model-picker): description on group layer, plain labels on members
kshitijk4poor May 31, 2026
cf32872
docs: drop early-beta framing for native Windows support (#36093)
teknium1 May 31, 2026
51c68d4
Add Hermes desktop app (#20059)
OutThisLife May 31, 2026
cd8aa38
Revert "fix(tui): clamp bogus terminal dimensions (WSL 131072x1) (#35…
teknium1 May 31, 2026
3ef97a6
fix(desktop): track main for self-update now that GUI merged (#36104)
OutThisLife May 31, 2026
77bb648
fix(desktop): report desktop_contract in lazy session.create info (#3…
OutThisLife May 31, 2026
fa4ebaa
fix(install): build desktop in 'desktop' stage on macOS/Linux instead…
OutThisLife Jun 1, 2026
e1c7a9a
feat(tools): surface the free tool pool in entitlement + setup (#36153)
alt-glitch Jun 1, 2026
dcbf62e
fix(docker): seed s6 gateway state for legacy run cmd (#34829)
donovan-yohan Jun 1, 2026
758454d
fix(docker): validate HERMES_UID/GID to prevent privilege escalation …
teknium1 Jun 1, 2026
1031031
fix(docker): skip unnecessary boot chown when volume ownership alread…
Foldblade Jun 1, 2026
4e530f1
add a github action to build& sign a windows installer
ethernet8023 Jun 1, 2026
9a82cd3
Merge pull request #36190 from NousResearch/ethie/sign-win
ethernet8023 Jun 1, 2026
e2ee917
chore(attribution): map SiTaggart for PR #35583 (#36189)
benbarclay Jun 1, 2026
a75a454
fix(tools): fall back to .hermes/.env when forwarded secret is empty …
SiTaggart Jun 1, 2026
a8526a4
chore(models): bump minimax to minimax-m3 in openrouter + nous lists …
teknium1 Jun 1, 2026
79f7e7a
fix(desktop): make locally-built macOS app relaunchable after in-plac…
OutThisLife Jun 1, 2026
e3b3d4d
feat(models): add MiniMax-M3 to native minimax providers + 1M context…
teknium1 Jun 1, 2026
740fb28
fix(config): chown ensure_hermes_home dirs to HERMES_UID/GID in Docke…
Bartok9 Jun 1, 2026
a60bff2
fix(docker): add /usr/bin/tini compatibility shim for legacy wrappers…
Bartok9 Jun 1, 2026
064875a
fix(docker): support s6 /init images in terminal sandbox (#34628) (#3…
Bartok9 Jun 1, 2026
380ce47
Remove prviliges drop when you never ran as root (#34837)
IAvecilla Jun 1, 2026
b14e15c
fix(gateway): clean service restart notifications
helix4u Jun 1, 2026
0bc616e
fix(desktop): darken light-mode code comment color for legibility (#3…
OutThisLife Jun 1, 2026
bdceedf
fix(docker): chown hermes-owned top-level state files on boot (#35098…
benbarclay Jun 1, 2026
7fbe9b7
fix(desktop): add missing PATCH /api/sessions/{id} so rename works (#…
OutThisLife Jun 1, 2026
e1eba6f
fix(dashboard-auth): drop /api/* paths from OAuth next= round trip (#…
benbarclay Jun 1, 2026
359f2be
feat(desktop): drop files anywhere in the chat area (#36262)
OutThisLife Jun 1, 2026
c1a531d
fix(dashboard): guard update endpoint in Docker with structured guida…
benbarclay Jun 1, 2026
f106e58
fix(docker): create s6 envdir before browser path export (#34601)
aminvakil Jun 1, 2026
e3998d4
chore(attribution): map polnikale for PR #35717 (#36273)
benbarclay Jun 1, 2026
b3aaf26
fix(docker): discover Playwright headless_shell browser (#35717)
polnikale Jun 1, 2026
e8827ef
fix(gateway): skip MEDIA: inside serialized JSON string values
liuhao1024 Jun 1, 2026
fb1b681
fix(gateway): keep JSON-embedded MEDIA: text verbatim in cleaned output
kshitijk4poor Jun 1, 2026
521d069
fix(gateway): restrict auto-appended media to producer tools
VinciZhu Apr 28, 2026
3ccf4fd
fix(gateway): skip MEDIA: tags inside code blocks and blockquotes
liuhao1024 May 31, 2026
ec6261a
chore(release): add VinciZhu to AUTHOR_MAP for #16721 salvage
kshitijk4poor Jun 1, 2026
6c73e8f
fix(gateway): keep code blocks verbatim in cleaned text when media pr…
kshitijk4poor Jun 1, 2026
3e59be0
feat(state): add messages.active flag + rewind primitives (#21910)
SaguaroDev May 10, 2026
31cfa08
feat(memory): add rewound kwarg to on_session_switch hook
SaguaroDev May 10, 2026
243e836
feat(tui): wire /rewind through command.dispatch + prefill payload (#…
SaguaroDev May 10, 2026
3f7d1c8
feat(undo): /undo [N] backs up N user turns with prefill + soft-delete
teknium1 Jun 1, 2026
e1951ce
fix(memory): only forward rewound kwarg when set
teknium1 Jun 1, 2026
92a567d
fix(ci): regen model catalog + stop gui tests consuming macos-fixup s…
teknium1 Jun 1, 2026
9074a15
feat: explain Quick Setup vs Full setup inline in the first-time setu…
teknium1 Jun 1, 2026
ba6ffd4
fix(skills-guard): stop flagging benign skill content + honor skill i…
teknium1 Jun 1, 2026
0622a70
feat(gateway): bring /undo [N] to messaging platforms (parity with CL…
teknium1 Jun 1, 2026
70e1571
feat(curator): prune built-in skills after inactivity + track usage f…
teknium1 Jun 1, 2026
2ed9637
feat(skills): blank-slate skills — install --no-skills + opt-out/opt-…
teknium1 Jun 1, 2026
b571ec2
feat(dashboard): full administration panel — MCP, pairing, webhooks, …
teknium1 Jun 1, 2026
023149f
fix(agent): stop reporting broken streams as output-length truncation…
teknium1 Jun 1, 2026
8f2931e
fix(file_tools): block agent writes to ~/.hermes/config.yaml to preve…
Subway2023 Apr 23, 2026
4e9d886
fix(approval): pair terminal-side gate for ~/.hermes/config.yaml writes
teknium1 Jun 1, 2026
ef3a650
chore(release): map Subway2023 for PR #14639 salvage
teknium1 Jun 1, 2026
a5371b3
chore: add benfrank241 to AUTHOR_MAP (#36898)
kshitijk4poor Jun 1, 2026
b964627
fix(utils): guard os.fchmod for Windows in atomic_json_write
benfrank241 Jun 1, 2026
1ffa22e
fix(minimax): drop stale ≤204,800 cache entries for MiniMax-M3 (#36726)
teknium1 Jun 1, 2026
e946f49
fix(models): add gemini-3.5-flash to Gemini OAuth + API-key pickers (…
teknium1 Jun 1, 2026
32032e1
fix(simplex): avoid reconnecting healthy idle websocket
maxcz79 May 16, 2026
f1237aa
chore(release): map maxcz79 author email for AUTHOR_MAP
teknium1 Jun 1, 2026
4bc7296
feat(agent): add runtime_cwd resolver (single source of truth for wor…
banditburai May 29, 2026
2564760
test(agent): pin context_cwd isdir-skip asymmetry and tilde expansion
banditburai May 29, 2026
1604765
fix(prompt): show configured working directory in system prompt (clos…
banditburai May 29, 2026
c79b80a
test(prompt): place cwd regression tests in TestEnvironmentHints (dro…
banditburai May 29, 2026
f90777a
refactor(prompt): route context-file cwd through runtime_cwd resolver
banditburai May 29, 2026
eadfeef
docs(agent): correct resolve_context_cwd comment (None → caller getcw…
banditburai May 29, 2026
75f4787
docs(test): correct None-semantics comment in test_runtime_cwd (disco…
banditburai May 29, 2026
ac0cce5
test(agent): pin whitespace-strip and OSError-propagation in runtime_cwd
banditburai May 29, 2026
128da68
test(tools): characterize tool-surface TERMINAL_CWD contract (#29265)
banditburai May 29, 2026
c45593c
docs: expand quickstart Skills section (#37047)
teknium1 Jun 1, 2026
7527e7a
feat: fuzzy search for the model picker (WebUI + TUI)
kshitijk4poor Jun 1, 2026
53f598e
feat(cli): add fuzzy search helpers for curses pickers
counterposition Jun 1, 2026
0fdab53
feat(cli): ranked fuzzy search in the curses model picker
kshitijk4poor Jun 1, 2026
92273e4
docs: add 25 new community user stories to the collage (#37048)
teknium1 Jun 2, 2026
8bf498c
fix(gateway): scope final-delivery flags to turn-final segment (#29346)
banditburai May 29, 2026
a1f76ba
fix(gateway): recover extract-stripped tool responses on all platform…
banditburai May 29, 2026
5666690
fix(weixin): replace aiohttp ClientTimeout with asyncio.wait_for in _…
caojiguang May 25, 2026
765790a
test(weixin): regression suite for _api_post/_api_get timeout migration
banditburai May 30, 2026
3a8d643
chore(release): map caojiguang@gmail.com in AUTHOR_MAP
banditburai May 30, 2026
4f7fe9b
fix(dashboard): surface Docker update guidance instead of generic fai…
benbarclay Jun 2, 2026
e59b815
fix(tui): prioritize status/model over cwd in the status bar on narro…
OutThisLife Jun 2, 2026
1d7a1c0
fix(tui): make busy status-bar reservation /indicator-style aware
OutThisLife Jun 2, 2026
162c785
fix(file-safety): add sandbox-mirror soft guard for writes to per-tas…
briandevans Jun 2, 2026
2f17174
fix(tui): pin status/model, whole-segment tail disclosure, smaller cwd
OutThisLife Jun 2, 2026
1d9aacb
feat(installer): make commit pinning opt-in, default to branch-follow
jquesnelle Jun 2, 2026
ddc2286
chore(release): add whyhkzk to AUTHOR_MAP for PR #32407 (#37121)
benbarclay Jun 2, 2026
85b65e2
feat(desktop): session hygiene, archive, media streaming + connecting…
OutThisLife Jun 2, 2026
9cb7d40
fix(tui): derive busy/duration reservation width from fmtDuration
OutThisLife Jun 2, 2026
e25b2a6
fix(tui): address Copilot review on status-bar tail disclosure
OutThisLife Jun 2, 2026
0502206
feat(bluebubbles): support group mention gating
tmchow May 31, 2026
d967e74
chore: add contributor attribution mapping
tmchow May 31, 2026
abe0e19
refactor(bluebubbles): simplify mention-gating helpers
teknium1 Jun 2, 2026
899e8b9
fix(tui): keep fmtCwdBranch default, cap cwd at the status-bar call site
OutThisLife Jun 2, 2026
eee32cd
fix(gateway): fall back to in-process heartbeat when s6 sleep is miss…
benbarclay Jun 2, 2026
8104b20
fix(xai): route video models by modality
Julientalbot May 31, 2026
f600352
Merge pull request #37123 from NousResearch/installer-optional-commit…
jquesnelle Jun 2, 2026
13a2350
fix(tui): pass indicatorStyle into FaceTicker so render matches reser…
OutThisLife Jun 2, 2026
7d51cd7
Merge pull request #37115 from NousResearch/bb/tui-statusbar-responsive
OutThisLife Jun 2, 2026
f7a3509
fix(gateway): honor WECOM_ALLOWED_USERS in env-only WeCom DM allowlist
Zyrixtrex Jun 1, 2026
fabca0b
feat(tui): single /model command + unified Sessions overlay (#37112)
OutThisLife Jun 2, 2026
c914e4a
fix(mcp): fail fast on HTML content-type instead of waiting full conn…
liuhao1024 May 31, 2026
64f7f36
fix(mcp): make non-MCP HTTP endpoint fast-fail robust and non-retryable
teknium1 Jun 2, 2026
d4b533d
fix: batch of small robustness/correctness fixes from @kyssta-exe
kyssta-exe Jun 2, 2026
0cd5867
fix(whatsapp): honor dm_policy and group_policy open at the gateway
Zyrixtrex Jun 1, 2026
59510d7
feat(skills): fix browse cap, add source links + copy buttons + categ…
teknium1 Jun 2, 2026
f24b7ed
fix: make Honcho startup fail open
stephenschoettler May 12, 2026
fc99563
feat(dashboard): add terminalBackground field to DashboardTheme
davidgut1982 Jun 2, 2026
34468ed
fix: normalize terminalBackground default and drop unrelated lockfile…
teknium1 Jun 2, 2026
f768e75
fix(telegram): cache observed group media
Glucksberg Jun 1, 2026
fa3b06b
refactor(telegram): generalize observed-media caching into a reusable…
teknium1 Jun 2, 2026
72e82f8
fix(kanban): decompose children inherit root workspace instead of for…
teknium1 Jun 2, 2026
21f55af
fix(model-picker): stop routing OpenAI selection to OpenRouter (#37175)
teknium1 Jun 2, 2026
043350d
fix(cli): prepend queued notes safely to multimodal messages
xxxigm Jun 2, 2026
a26a12a
test(cli): cover _prepend_note_to_message str/list handling
xxxigm Jun 2, 2026
c35ede7
refactor(cli): normalize note and avoid blank lines in prepend helper
xxxigm Jun 2, 2026
a5aecf2
feat(kanban): gate notifier watcher on dispatch_in_gateway
steveonjava Jun 2, 2026
1495f0c
fix(file-safety): extend sandbox-mirror guard to cover inner-containe…
whyhkzk Jun 2, 2026
40ae170
ci(docker): use registry-backed build cache for arm64 (#37129)
benbarclay Jun 2, 2026
bd8e2ec
feat(dashboard): complete admin panel — MCP catalog, enable/disable t…
teknium1 Jun 2, 2026
272c2f3
fix(kanban): kanban_create inherits the spawning worker's task worksp…
teknium1 Jun 2, 2026
81dd43a
fix(docker): preserve Docker -w workdir in main-wrapper (#35472) (#36…
Tranquil-Flow Jun 2, 2026
0269eca
test(minimax): assert M3 stale-cache guard contract, not a brittle 1M…
teknium1 Jun 2, 2026
15cb4e2
fix(docker): install python3-venv so ensurepip fallback works (closes…
alaamohanad169-ship-it Jun 2, 2026
3c1d066
feat(dashboard): Channels page — set up every gateway messaging chann…
teknium1 Jun 2, 2026
134643a
fix(desktop): reflect active toolset provider in config panel
jquesnelle Jun 2, 2026
2c0d648
fix(cron): sanitize invisible unicode in vetted skill content instead…
teknium1 Jun 2, 2026
787936d
feat(gateway): structured stream-event protocol + Telegram draft form…
teknium1 Jun 2, 2026
89db6c8
Merge pull request #37283 from NousResearch/fix-toolset-provider-sele…
jquesnelle Jun 2, 2026
d78d77e
feat(config): surface gateway streaming block in DEFAULT_CONFIG (#37285)
teknium1 Jun 2, 2026
a2b8e43
refactor(desktop): consolidate skills + tools management into one pane
jquesnelle Jun 2, 2026
c6501c0
Merge pull request #37310 from NousResearch/desktop/consolidate-skill…
jquesnelle Jun 2, 2026
5e55b35
refactor(desktop): move model management from Command Center into Set…
jquesnelle Jun 2, 2026
c10ccaa
feat(dashboard-auth): rotate dashboard sessions via refresh token (#3…
benbarclay Jun 2, 2026
195c4d2
feat(streaming): per-platform streaming defaults (Telegram on, Discor…
teknium1 Jun 2, 2026
afea650
fix(model-picker): OpenAI shows curated models; OpenRouter no longer …
teknium1 Jun 2, 2026
927fa7a
Merge pull request #37330 from NousResearch/desktop/consolidate-model…
jquesnelle Jun 2, 2026
e4c1b1f
feat: restore telegram command browser workflow on v0.15
nextsaver-source May 29, 2026
95d0a8a
feat: claude -p subprocess bypass for Anthropic subscription billing
nextsaver-source 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
  •  
  •  
  •  
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
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
51 changes: 40 additions & 11 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 @@ -196,11 +200,34 @@ jobs:
- 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 +238,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 +254,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 +282,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
8 changes: 4 additions & 4 deletions .github/workflows/nix-lockfile-fix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ on:
paths:
- 'ui-tui/package-lock.json'
- 'ui-tui/package.json'
- 'web/package-lock.json'
- 'web/package.json'
- 'apps/dashboard/package-lock.json'
- 'apps/dashboard/package.json'
workflow_dispatch:
inputs:
pr_number:
Expand All @@ -28,7 +28,7 @@ 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
# in ui-tui/ or apps/dashboard/. Runs fix-lockfiles and pushes the hash
# update commit directly to main so Nix builds never stay broken.
#
# Safety invariants:
Expand Down Expand Up @@ -110,7 +110,7 @@ jobs:
# 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)"
'apps/dashboard/package-lock.json' 'apps/dashboard/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
77 changes: 67 additions & 10 deletions .github/workflows/supply-chain-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,9 @@ name: Supply Chain Audit
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- '**/*.py'
- '**/*.pth'
- '**/setup.py'
- '**/setup.cfg'
- '**/sitecustomize.py'
- '**/usercustomize.py'
- '**/__init__.pth'
- 'pyproject.toml'
# No paths filter — the jobs must always run so required checks
# report a status (path-gated workflows leave checks "pending" forever
# when no matching files change, which blocks merge).

permissions:
pull-requests: write
Expand All @@ -27,8 +21,44 @@ permissions:
# advisory-only workflow instead.

jobs:
# ── Path filter (shared by both scan and dep-bounds) ───────────────
changes:
runs-on: ubuntu-latest
outputs:
# True when any file the scanner cares about changed in this PR
scan: ${{ steps.filter.outputs.scan }}
# True when pyproject.toml changed in this PR
deps: ${{ steps.filter.outputs.deps }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Check for relevant file changes
id: filter
run: |
BASE="${{ github.event.pull_request.base.sha }}"
HEAD="${{ github.event.pull_request.head.sha }}"
SCAN_FILES=$(git diff --name-only "$BASE"..."$HEAD" -- \
'*.py' '**/*.py' '*.pth' '**/*.pth' \
'setup.py' 'setup.cfg' \
'sitecustomize.py' 'usercustomize.py' '__init__.pth' \
'pyproject.toml' || true)
if [ -n "$SCAN_FILES" ]; then
echo "scan=true" >> "$GITHUB_OUTPUT"
else
echo "scan=false" >> "$GITHUB_OUTPUT"
fi
DEPS_FILES=$(git diff --name-only "$BASE"..."$HEAD" -- 'pyproject.toml' || true)
if [ -n "$DEPS_FILES" ]; then
echo "deps=true" >> "$GITHUB_OUTPUT"
else
echo "deps=false" >> "$GITHUB_OUTPUT"
fi

scan:
name: Scan PR for critical supply chain risks
needs: changes
if: needs.changes.outputs.scan == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout
Expand Down Expand Up @@ -147,10 +177,24 @@ jobs:
echo "::error::CRITICAL supply chain risk patterns detected in this PR. See the PR comment for details."
exit 1

# Gate: reports success when scan was skipped (no relevant files changed).
# This ensures the required check always gets a status.
scan-gate:
name: Scan PR for critical supply chain risks
needs: changes
# always() so the gate still reports SUCCESS even if `changes` fails/is
# skipped — without it, a failed dependency would leave the required
# check unreported (i.e. "pending"), the exact failure mode this fixes.
if: always() && needs.changes.outputs.scan != 'true'
runs-on: ubuntu-latest
steps:
- run: echo "No supply-chain-relevant files changed, skipping scan."

dep-bounds:
name: Check PyPI dependency upper bounds
needs: changes
if: needs.changes.outputs.deps == 'true'
runs-on: ubuntu-latest
if: contains(github.event.pull_request.changed_files_url, 'pyproject.toml') || true
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand Down Expand Up @@ -211,3 +255,16 @@ jobs:
run: |
echo "::error::PyPI dependencies without upper bounds detected. Add <next_major ceiling per CONTRIBUTING.md policy."
exit 1

# Gate: reports success when dep-bounds was skipped (no pyproject.toml changed).
# This ensures the required check always gets a status.
dep-bounds-gate:
name: Check PyPI dependency upper bounds
needs: changes
# always() so the gate still reports SUCCESS even if `changes` fails/is
# skipped — without it, a failed dependency would leave the required
# check unreported (i.e. "pending"), the exact failure mode this fixes.
if: always() && needs.changes.outputs.deps != 'true'
runs-on: ubuntu-latest
steps:
- run: echo "No pyproject.toml changes, skipping dependency bounds check."
Loading