Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
776 commits
Select commit Hold shift + click to select a range
0399d4b
perf(tui): shave ~190ms off `hermes --tui` cold start
OutThisLife Apr 29, 2026
9f004b6
perf(tools): memoize get_tool_definitions + TTL-cache check_fn result…
teknium1 Apr 29, 2026
cb039ac
fix: account for latex
austinpickett Apr 29, 2026
fd94346
fix(doctor): accept catalog provider aliases
scotttrinh Apr 28, 2026
fe295f9
docs(hooks): tutorial — build a BOOT.md startup checklist (#17202)
teknium1 Apr 29, 2026
adef1f3
chore(release): map scott@scotttrinh.com -> scotttrinh (#17203)
teknium1 Apr 29, 2026
3379f88
docs: clarify wrapForFrac and streaming math-fence rationale
austinpickett Apr 29, 2026
cd7150a
perf(approval): precompile DANGEROUS_PATTERNS and HARDLINE_PATTERNS (…
teknium1 Apr 29, 2026
e4120d1
Merge remote-tracking branch 'origin/main' into fix/markdown
austinpickett Apr 29, 2026
afb20a1
fix(tui): recover from stuck paste mode
OutThisLife Apr 29, 2026
ce2cc73
fix(tui): stabilize sticky prompt tracking
OutThisLife Apr 29, 2026
d7ae8df
style(tui): remove steer queued emoji
OutThisLife Apr 29, 2026
f542d17
style(tui): apply npm run fix
OutThisLife Apr 29, 2026
10ad700
fix(tui): use paste timeout when rearming paste watchdog
OutThisLife Apr 29, 2026
6e9691f
Merge pull request #17237 from NousResearch/bb/tui-paste-watchdog
OutThisLife Apr 29, 2026
9e398e1
perf(tui): avoid importing classic CLI during tool discovery
OutThisLife Apr 29, 2026
8c892c1
refactor(redact): canonical mask_secret helper; fix status.py DIM dri…
teknium1 Apr 29, 2026
c4db1ce
skills: add pretext creative-demos skill
OutThisLife Apr 29, 2026
1d4218b
feat(review): active-update bias, loaded-skill-first, support-file va…
teknium1 Apr 29, 2026
b66cbb7
perf(tui): defer agent construction until first prompt
OutThisLife Apr 29, 2026
0a6ecea
fix(tui): hydrate lazy startup panel and use animated loaders
OutThisLife Apr 29, 2026
a2819e1
fix(tui): address lazy startup review races
OutThisLife Apr 29, 2026
72a3af6
fix(tui): keep prompt submit off the RPC pool
OutThisLife Apr 29, 2026
88a9efd
fix(tui): tighten cold-start edge cases after review
OutThisLife Apr 29, 2026
f10a3df
fix(tui): align /browser connect local CDP handling
OutThisLife Apr 29, 2026
69ff114
fix(browser): avoid bogus Chrome launch fallback
OutThisLife Apr 29, 2026
7d39a45
fix(tui): show /browser connect progress like CLI
OutThisLife Apr 29, 2026
e750829
fix(tui): stream /browser connect progress as gateway events
OutThisLife Apr 29, 2026
26816d1
refactor(tui): tighten /browser connect plumbing
OutThisLife Apr 29, 2026
d1ee491
fix(browser): address Copilot review on /browser connect
OutThisLife Apr 29, 2026
679a274
fix(browser): address Copilot round-3 on /browser connect
OutThisLife Apr 29, 2026
f95c34f
fix(browser): address Copilot round-4 on /browser connect
OutThisLife Apr 29, 2026
ac855bb
fix(cli): respect terminal.cwd config in local terminal backend
Tranquil-Flow Apr 23, 2026
dcd7b71
fix(gateway): linearize tool-progress bubbles with content messages (…
teknium1 Apr 29, 2026
4858e26
feat(tui): port classic CLI /reload (.env hot-reload) to TUI
OutThisLife Apr 28, 2026
6b4ef00
review(copilot): keep /reload cli_only since gateway has no handler
OutThisLife Apr 28, 2026
97a2474
review(copilot): point reload.env docstring at hermes_cli.config.relo…
OutThisLife Apr 28, 2026
cc5efb6
fix(tui): keep non-agent session RPCs lazy
OutThisLife Apr 29, 2026
88e07c4
fix(cli): prevent .env sanitizer from splitting GLM_API_KEY by LM_API…
jackjin1997 Apr 28, 2026
d341af2
fix(tui): preserve busy and init error signaling
OutThisLife Apr 29, 2026
80e474f
fix(gateway,terminal): expand shell tilde in terminal.cwd before subp…
mcndjxlefnd Apr 23, 2026
ded12f0
chore(release): map LyleLengyel@gmail.com -> mcndjxlefnd
Teknium Apr 29, 2026
8860237
fix: resolve external_dirs relative to HERMES_HOME instead of cwd (#9…
Apr 15, 2026
bc79e22
feat(curator): background skill maintenance (issue #7816)
teknium1 Apr 26, 2026
c8b7e72
refactor(curator): point review prompt at existing tools
teknium1 Apr 26, 2026
0d31864
fix(curator): defense-in-depth gates against bundled/hub skills
teknium1 Apr 26, 2026
a12f7aa
fix(curator): default cycle is every 7 days, not 24 hours
teknium1 Apr 26, 2026
019d4c1
feat(curator): hook into the gateway's cron-ticker thread
teknium1 Apr 26, 2026
fa9383d
feat(curator): umbrella-first prompt, inherit parent config, unbounde…
Teknium Apr 29, 2026
c2fd0fa
fix(tui): preserve memory monitor in-flight guard
OutThisLife Apr 29, 2026
22cc749
Potential fix for pull request finding
OutThisLife Apr 29, 2026
5e68503
Merge pull request #17190 from NousResearch/bb/tui-cold-start-profiling
OutThisLife Apr 29, 2026
5531c0d
feat(docker): run container as host user to avoid root-owned bind mounts
benbarclay Apr 29, 2026
2d13707
refactor(config): add cfg_get() helper; migrate 20 nested-get call si…
teknium1 Apr 29, 2026
bc0d8a9
feat(curator): per-run reports — run.json + REPORT.md under logs/cura…
teknium1 Apr 29, 2026
58a6171
Merge pull request #17305 from NousResearch/feat/docker-run-as-host-user
benbarclay Apr 29, 2026
21676e8
Revert "fix(anthropic): remove Claude Code fingerprinting from OAuth …
teknium1 Apr 29, 2026
0599807
refactor(config): migrate remaining 33 cfg_get call sites (#17311)
teknium1 Apr 29, 2026
be57af7
docs(anthropic): clarify OAuth uses Claude Pro/Max subscription usage…
teknium1 Apr 29, 2026
ed170f4
docs(anthropic): correct OAuth scope to Max plan + extra usage credit…
teknium1 Apr 29, 2026
23f5fc6
feat(gateway/signal): native formatting, reply quotes, and reactions
exiao Apr 17, 2026
4a62ba9
fix(signal): correct SPOILER docstring + AUTHOR_MAP for exiao
teknium1 Apr 29, 2026
ecaf800
feat(yuanbao): wire native text + media delivery into send_message
Apr 29, 2026
860ff44
fix(usage_pricing): add MiniMax-M2.7 pricing for minimax and minimax-…
Feranmi10 Apr 29, 2026
df0e97a
fix(minimax): enable Anthropic prompt caching for MiniMax's own model…
teknium1 Apr 29, 2026
37d107e
[verified] fix(gateway): accept user systemd private socket during pr…
rylena Apr 29, 2026
d244596
chore: add rylena to AUTHOR_MAP for PR #17363
teknium1 Apr 29, 2026
13683c0
feat(memory): notify providers on mid-process session_id rotation (#1…
teknium1 Apr 29, 2026
20b759c
fix(process): reconcile session.exited against real child exit in pol…
teknium1 Apr 29, 2026
3606414
fix(gateway): isolate platform connect failures with per-platform tim…
tmimmanuel Apr 29, 2026
4643796
chore(release): map tmimmanuel email to GitHub login
teknium1 Apr 29, 2026
b0435cc
fix(model_tools): cancel coroutine on timeout so worker thread exits …
teknium1 Apr 29, 2026
e9b96fd
fix: recognize ret=-2 as stale-session signal in Weixin adapter
vominh1919 Apr 29, 2026
258755a
test(weixin): cover _is_stale_session_ret helper (#17228)
teknium1 Apr 29, 2026
fe6c866
fix: close file descriptor in LocalEnvironment._update_cwd
vominh1919 Apr 29, 2026
aea72c0
skills: adapt spike/sketch + 2 references from gsd-build/get-shit-don…
teknium1 Apr 29, 2026
ff687c0
fix(aux): skip kimi-coding in vision auto-detect (closes #17076) (#17…
teknium1 Apr 29, 2026
40d25e1
fix(tts): resolve API keys from ~/.hermes/.env via get_env_value (#17…
briandevans Apr 28, 2026
33967b4
fix(tts): tolerate missing hermes_cli.config in tts_tool import
briandevans Apr 28, 2026
9e63062
fix(stt): resolve API keys from ~/.hermes/.env via get_env_value (#17…
teknium1 Apr 29, 2026
f317325
docs(weixin): clarify iLink bot identity limits and warn on group pol…
teknium1 Apr 29, 2026
b85fff9
fix(update): protect dashboard wmic scan against UnicodeDecodeError o…
briandevans Apr 28, 2026
835f9ad
fix(update,test): clarify wmic comment; switch tests to monkeypatch s…
briandevans Apr 28, 2026
cf83982
fix(gateway): handle wmic encoding errors on Windows non-English locales
Kailigithub Apr 29, 2026
5662ac2
chore(release): map Kailigithub email to GitHub login
teknium1 Apr 29, 2026
0565497
fix(hindsight): drain retain queue cleanly on shutdown
nicoloboschi Apr 28, 2026
7141cda
fix: narrow Anthropic adapter dot-mangling to Claude models only
vominh1919 Apr 29, 2026
398945e
fix(cron): accept list-form deliver values so deliver=['telegram'] wo…
teknium1 Apr 29, 2026
83c288d
fix(anthropic): broaden Kimi thinking-suppression to custom endpoints…
teknium1 Apr 29, 2026
810d98e
feat(api_server): expose run status for external UIs (#17085)
Magaav Apr 29, 2026
5a1d4f6
feat: add Vercel Sandbox backend
scotttrinh Apr 29, 2026
13c2383
fix: address self-review findings for Vercel Sandbox salvage
kshitijk4poor Apr 29, 2026
e0a03f3
fix(api-server): collapse tool start/lifecycle into a single SSE event
briandevans Apr 27, 2026
1bedc83
docs(onboarding): lead OpenClaw residue banner with migrate, warn tha…
teknium1 Apr 29, 2026
c38dac7
fix(hindsight): flush buffered turns and drop stale prefetch on sessi…
nicoloboschi Apr 29, 2026
0a5ee01
fix(hindsight): route flush-on-switch through writer queue, not raw t…
teknium1 Apr 29, 2026
60c6b07
fix(cron): keep SOUL.md identity when workdir is unset
liuhao1024 Apr 28, 2026
fd7188a
chore(release): map liuhao03@bilibili.com to @liuhao1024
teknium1 Apr 29, 2026
fd5479a
fix: preserve DeepSeek thinking blocks on Anthropic replay (#16748)
vominh1919 Apr 28, 2026
fa3338c
test(anthropic): regression guard for DeepSeek /anthropic thinking re…
teknium1 Apr 29, 2026
e120cd5
fix(model_switch): dedup /model picker rows when custom provider endp…
teknium1 Apr 29, 2026
8c8fc6c
fix(skills): let skill_manage patch/edit/delete skills in external_di…
teknium1 Apr 29, 2026
ec27f0a
fix(cron): fall back gracefully when HERMES_CRON_TIMEOUT is invalid
yeyitech Apr 17, 2026
6d84237
chore: add yeyitech to AUTHOR_MAP
teknium1 Apr 29, 2026
e0c0167
fix(cron): use last_run_at as croniter base for cron jobs
beenherebefore Apr 29, 2026
b2820cd
chore: add beenherebefore to AUTHOR_MAP
teknium1 Apr 29, 2026
9eb1602
feat(cli): add minimax-oauth provider with PKCE browser flow
amanning3390 Apr 24, 2026
0b2f1bb
feat(agent): wire MiniMax-M2.7 for minimax-oauth provider
amanning3390 Apr 24, 2026
f3aa989
test(cli): cover minimax-oauth resolution, refresh, menu wiring
amanning3390 Apr 24, 2026
eafa637
docs: document MiniMax OAuth login flow
amanning3390 Apr 24, 2026
40a98fb
feat(minimax-oauth): full integration with peer OAuth providers
teknium1 Apr 29, 2026
430302c
Merge pull request #17175 from NousResearch/fix/markdown
austinpickett Apr 29, 2026
b01656d
docs: exclude per-skill pages from search, add curator feature page (…
teknium1 Apr 29, 2026
c61b2e0
feat(skills): refuse skill_manage writes on pinned skills (#17562)
teknium1 Apr 29, 2026
0e577fb
docs(curator): document that pinning also blocks skill_manage writes …
teknium1 Apr 29, 2026
9ee540a
fix(install): promote croniter to a core dependency
txbxxx Apr 29, 2026
69d4800
chore: add txbxxx to AUTHOR_MAP
teknium1 Apr 29, 2026
5a61c11
fix(nix): auto-refresh npm lockfile hashes
github-actions[bot] Apr 29, 2026
c5a5e58
fix(gemini): nest OpenAI-compat thinking config under google
Nanako0129 Apr 29, 2026
2e99177
fix(gemini): pass base_url into chat transport
Nanako0129 Apr 29, 2026
258449c
chore(release): add Nanako0129 to AUTHOR_MAP
teknium1 Apr 29, 2026
165d766
skills: refine pretext creative demo guidance
OutThisLife Apr 29, 2026
b81638d
feat(comfyui): rewrite skill — official CLI + REST API, no third-part…
alt-glitch Apr 29, 2026
d7d1503
docs(comfyui): add comprehensive onboarding — all install paths, doc …
alt-glitch Apr 29, 2026
9835f57
Potential fix for pull request finding 'CodeQL / Incomplete URL subst…
alt-glitch Apr 29, 2026
528a13b
Potential fix for pull request finding 'CodeQL / Incomplete URL subst…
alt-glitch Apr 29, 2026
9d7ece3
feat(comfyui): add hardware check + auto-gate local install on verdict
teknium1 Apr 29, 2026
ffe1d66
docs(comfyui): ask local vs cloud FIRST before hardware check (#17612)
teknium1 Apr 29, 2026
9be3ab1
fix(plugins): stop firing pre_tool_call hook twice per tool execution…
teknium1 Apr 29, 2026
456955c
Merge pull request #17259 from NousResearch/bb/pretext-skill
OutThisLife Apr 29, 2026
d8afafd
fix(tui): hide reasoning panels immediately
OutThisLife Apr 29, 2026
10fcd62
fix(tui): render explicit prompt gap
OutThisLife Apr 29, 2026
f7abcb4
fix(tui): ignore hidden reasoning stream segments
OutThisLife Apr 29, 2026
d3ab2b2
fix(tui): share composer prompt gap metric
OutThisLife Apr 29, 2026
7d96a5a
fix(tui): refine reasoning visibility updates
OutThisLife Apr 29, 2026
8652d47
fix(tui): remove unused prompt import
OutThisLife Apr 29, 2026
4899bd9
feat(skills): move comfyui from optional to built-in (#17631)
teknium1 Apr 29, 2026
528e7dc
fix(cli): exclude profiles/ from profile create --clone-all
hejuntt1014 Apr 20, 2026
b52b633
chore: map hejuntt1014 in AUTHOR_MAP
teknium1 Apr 29, 2026
c2cb6d1
fix(tui): persist global details mode sections
OutThisLife Apr 29, 2026
2a9a5ff
Merge pull request #17625 from NousResearch/bb/tui-reasoning-hide
OutThisLife Apr 29, 2026
f45434d
Merge pull request #17626 from NousResearch/bb/tui-prompt-gap
OutThisLife Apr 29, 2026
faa467c
fix(tui): share detail section constants
OutThisLife Apr 29, 2026
d9bf093
Merge pull request #17638 from NousResearch/bb/tui-details-persist
OutThisLife Apr 29, 2026
5e6e8b6
fix(tui): honor launch toolsets (#17623)
OutThisLife Apr 29, 2026
98f5be1
fix(tui): word-wrap composer input (#17651)
OutThisLife Apr 29, 2026
fc7f55f
fix(tui): responsive /compress with live progress + CLI-parity feedba…
OutThisLife Apr 30, 2026
9fc9c15
fix(banner): show correct update status on nix-built hermes (#17550)
ethernet8023 Apr 30, 2026
b978fd8
feat(tui): preserve modifiers on mouse wheel events
OutThisLife Apr 30, 2026
7a4da31
fix(docker): add curl to apt dependencies
benbarclay Apr 30, 2026
fc0f358
fix(tui): add modifier-held precision wheel scrolling
OutThisLife Apr 30, 2026
8cce85b
Merge pull request #17669 from NousResearch/bb/tui-scroll-precision-mod
OutThisLife Apr 30, 2026
31f70d1
fix(ci): recover 38 failing tests on main (#17642)
teknium1 Apr 30, 2026
4cc6da8
fix(tui): normalize legacy Terminal.app colors (#17695)
OutThisLife Apr 30, 2026
0ba451d
fix(vision): use HERMES_HOME-based cache dir instead of cwd (#17719)
teknium1 Apr 30, 2026
24b5279
feat(tui): delete sessions from /resume picker with `d`
OutThisLife Apr 30, 2026
49fcad8
fix(tui): require double-tap `d` to confirm session delete
OutThisLife Apr 30, 2026
8dcab19
fix(gateway): fail closed when session.delete can't enumerate active …
OutThisLife Apr 30, 2026
22ff6ca
docs: two-week gap sweep — platforms, CLI, config, TUI, hooks, provid…
teknium1 Apr 30, 2026
95f2802
feat(cli): preserve --tui and other flags across internal relaunches
ethernet8023 Apr 29, 2026
3c67346
refactor(cli): derive relaunch flag table from argparse introspection
ethernet8023 Apr 30, 2026
7d48a16
remove relaunch_chat
ethernet8023 Apr 29, 2026
a7780fe
fix(skills/comfyui): bug fixes, cloud parity, expanded coverage, exam…
SHL0MS Apr 30, 2026
51b44b6
fix(skills/comfyui): correct hallucinated node names and registry slugs
SHL0MS Apr 30, 2026
289cc47
docs: resync reference, user-guide, developer-guide, and messaging pa…
teknium1 Apr 30, 2026
e6b05ea
feat: add Models dashboard tab with rich per-model analytics
yatesjalex Apr 30, 2026
113239f
fix(dashboard/models): filter empty-string model rows + simplify vend…
teknium1 Apr 30, 2026
7966560
feat(skills): /reload-skills slash command + skills_reload agent tool
shannonsands Apr 29, 2026
dd2d1ba
refactor(reload-skills): queue note for next turn, drop cache invalid…
teknium1 Apr 30, 2026
1f71217
fix(telegram): support group user allowlist
xandersbell Apr 30, 2026
763aadd
fix(telegram): preserve pre-#17686 chat-ID-in-_USERS configs + doc split
teknium1 Apr 30, 2026
d69a0b2
fix(security): apply ACL checks to QQBot guild messages and guild DMs…
memosr Apr 29, 2026
1623371
chore(release): map memosr commit email for release notes
teknium1 Apr 30, 2026
ffa6529
fix(cron): clear auto-delivery thread context between jobs
simbam99 Apr 29, 2026
502debe
chore: map vlad19@gmail.com -> dandaka for CI author check
teknium1 Apr 30, 2026
a7fb79e
fix(agent): spawn OpenRouter pre-warm thread only once per process
dandaka Apr 29, 2026
7fae87b
fix(gateway): refresh cached agents after MCP tool changes
helix4u Apr 30, 2026
4d7fc0f
feat(gateway,cli): confirm /reload-mcp to warn about prompt cache inv…
teknium1 Apr 30, 2026
8f144fe
feat: pluggable platform adapter registry + IRC reference implementation
teknium1 Apr 11, 2026
2e20f6a
feat: complete plugin platform parity — all 12 integration points
teknium1 Apr 11, 2026
457128d
fix: wire PII redaction + token empty warnings for plugin platforms
teknium1 Apr 11, 2026
e464cde
feat: final platform plugin parity — webhook delivery, platform hints…
teknium1 Apr 12, 2026
52d9e57
feat: dynamic toolset generation for plugin platforms
teknium1 Apr 12, 2026
1f16080
feat(gateway): unify setup flows, load platforms dynamically from reg…
ethernet8023 Apr 20, 2026
6e42daf
fix(nix): bundle plugins/ and expose it via HERMES_BUNDLED_PLUGINS
ethernet8023 Apr 20, 2026
868bc1c
feat(irc): add interactive setup
ethernet8023 Apr 20, 2026
71c8ca1
chore(salvage): strip duplicated/merge-corrupted blocks from PR #17664
teknium1 Apr 30, 2026
4d36349
feat(plugins): bundled platform plugins auto-load by default
teknium1 Apr 30, 2026
828d3a3
fix(anthropic): reactive recovery for OAuth 1M-context beta rejection…
teknium1 Apr 30, 2026
b06a06e
fix(docker): restore trailing newline on Dockerfile
benbarclay Apr 30, 2026
e7beaaf
Merge pull request #17694 from NousResearch/fix/docker-add-curl
benbarclay Apr 30, 2026
f73364b
fix(ci): stabilize main test suite regressions (#17660)
stephenschoettler Apr 30, 2026
ce0c3ae
fix(aux): remove hardcoded Codex fallback model, drop Codex from auto…
teknium1 Apr 30, 2026
62a5d72
feat(plugins): bundle hermes-achievements + scan full session history…
teknium1 Apr 30, 2026
718e4e2
fix(plugins): register dynamically-loaded modules in sys.modules befo…
jquesnelle Apr 28, 2026
3c27efb
feat(dashboard): configure main + auxiliary models from Models page (…
teknium1 Apr 30, 2026
21e695f
fix: clean up defensive shims and finish CI stabilization from #17660…
teknium1 Apr 30, 2026
b3137d7
feat(teams): add Microsoft Teams platform adapter as a plugin
Apr 30, 2026
a696bce
fix(tools_config): handle plugin platforms in platform_tool_universe
Apr 30, 2026
ca5bebe
fix(teams): send images as attachments instead of markdown links
Apr 30, 2026
39b0bc3
fix(teams): override send_image_file for local image attachments
Apr 30, 2026
45780ed
feat(teams): keep card body visible after approval button click
Apr 30, 2026
e23bb18
fix(teams): rewrite interactive_setup to use teams CLI flow
Apr 30, 2026
26787ce
test(gateway): isolate plugin adapter imports and guard the anti-pattern
teknium1 Apr 30, 2026
aa7bf32
feat(gateway): centralize audio routing + FLAC support + Telegram doc…
teknium1 Apr 30, 2026
fd07969
fix: stabilize CI — TS widen, sys.modules restore, WS subscriber race…
teknium1 Apr 30, 2026
5b85a7d
fix(update): kill stale dashboard processes instead of warning (#17832)
teknium1 Apr 30, 2026
2facea7
feat(tts): add command-type provider registry under tts.providers.<na…
teknium1 Apr 30, 2026
0ad4f55
feat(dashboard): add --stop and --status flags (#17840)
teknium1 Apr 30, 2026
25caaa4
feat(tips): add cost-saving tips from April 30 tip-of-the-day (#17841)
teknium1 Apr 30, 2026
97a851b
fix(openviking): normalize summary pseudo-URIs to prevent v0.3.3 500s
htsh Apr 7, 2026
bff8ab0
test(openviking): add helper regression coverage
htsh Apr 9, 2026
10e43ed
fix(openviking): fallback summary reads to content/read for file URIs
htsh Apr 15, 2026
5d253e6
fix(openviking): pre-check fs/stat to route file URIs before hitting …
teknium1 Apr 30, 2026
d2536a7
fix(acp): replay session history on load
HenkDz Apr 29, 2026
6589474
fix(acp): drop dead message_id kwarg from replay chunks
teknium1 Apr 30, 2026
0da968e
fix(curator): unify under auxiliary.curator (hermes model, dashboard)…
teknium1 Apr 30, 2026
2662bfb
fix(tests): make test_update_stale_dashboard immune to hermes_cli.mai…
teknium1 Apr 30, 2026
8d302e3
feat(tts): add Piper as a native local TTS provider (closes #8508) (#…
teknium1 Apr 30, 2026
cb130bf
fix(ssh): prevent tar from overwriting remote home dir permissions
vominh1919 Apr 30, 2026
663ba9a
fix(gateway): drain pending messages via fresh task, not recursion (#…
briandevans Apr 30, 2026
f44f1f9
fix(gateway): preserve session guard across in-band drain handoff
briandevans Apr 30, 2026
f549357
fix(cron): surface agent run_conversation failure flags as job failure
briandevans Apr 30, 2026
362996e
fix(runtime_provider): _get_named_custom_provider must honour transpo…
zicochaos Apr 30, 2026
01d7c87
chore(release): map zicochaos to GitHub login
teknium1 Apr 30, 2026
3858f94
fix: handle gateway Ctrl+C shutdown cleanly
rylena Apr 30, 2026
19f9be1
fix(tools): serialize concurrent hermes_tools RPC calls from execute_…
Heltman Apr 30, 2026
5af8fa5
chore(release): map Heltman email to username for AUTHOR_MAP
teknium1 Apr 30, 2026
ca87c82
fix(gateway): guard yaml.safe_load and float() env var casts against …
vominh1919 Apr 30, 2026
411f586
refactor(gateway): extract _float_env helper for env-var float casts
teknium1 Apr 30, 2026
04ea895
feat(gateway/signal): add support for multiple images sending
MaxyMoos Apr 30, 2026
3de8e21
feat(gateway): native send_multiple_images for Telegram, Discord, Sla…
teknium1 Apr 30, 2026
cc5b9fb
fix(transport): omit thinking_config for Gemma on the gemini provider…
briandevans Apr 29, 2026
fbb3775
fix(gateway): enforce auth check in busy-session path to prevent unau…
Bartok9 Apr 30, 2026
0dd373e
fix(context): honor model.context_length for Ollama num_ctx and all d…
Apr 30, 2026
70ae678
chore(release): map rob@atlas.lan to @rmoen
teknium1 Apr 30, 2026
e0fa2cf
fix(tools): isolate get_tool_definitions quiet_mode cache + dedup LCM…
Sanjays2402 Apr 29, 2026
201f7ca
fix: prevent bare 'custom' slug in model.provider (#17478)
Apr 29, 2026
61fec76
chore(release): map Andy283 gitee email in AUTHOR_MAP
teknium1 Apr 30, 2026
3fc4c63
test(model_switch): update regression to reflect bare-custom guard
teknium1 Apr 30, 2026
b50bc13
fix(config): preserve YAML lists in hermes config set (#17876)
teknium1 Apr 30, 2026
87f5e1a
test(ssh): update tar pipe assertion for --no-overwrite-dir
teknium1 Apr 30, 2026
d1d0ef6
fix(gateway): persist user message on transient agent failures (#7100)
konsisumer Apr 17, 2026
e8e5985
fix(curator): seed defaults on update, create logs/curator dir, defer…
teknium1 Apr 30, 2026
eda1d51
fix(skills): exclude .archive from skill index walk
leoneparise Apr 29, 2026
a845177
fix(skills): also exclude .archive in skills_tool + add author map entry
teknium1 Apr 30, 2026
4c79286
test(gateway): pin cleanup invariants for #17758 in-band drain hand-off
teknium1 Apr 30, 2026
4178ab3
fix(skills): wire bump_use() into skill invocation and preload paths …
Bartok9 Apr 30, 2026
ae8930a
fix(skills): also bump_use on skill_view tool invocation
teknium1 Apr 30, 2026
9a14540
fix(nix): replace magic-nix-cache with Cachix (#17928)
alt-glitch Apr 30, 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
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@

# Dependencies
node_modules
**/node_modules
.venv
**/.venv

# CI/CD
.github
Expand Down
16 changes: 16 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -398,3 +398,19 @@ IMAGE_TOOLS_DEBUG=false
# 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

# =============================================================================
# MICROSOFT TEAMS INTEGRATION
# =============================================================================
# Register a Bot in Azure: https://dev.botframework.com/ → "Register a bot"
# Or use Azure Portal: Azure Active Directory → App registrations → New registration
# Then add the bot to Teams via the Bot Framework or App Studio.
#
# TEAMS_CLIENT_ID= # Azure AD App (client) ID
# TEAMS_CLIENT_SECRET= # Azure AD client secret value
# TEAMS_TENANT_ID= # Azure AD tenant ID (or "common" for multi-tenant)
# TEAMS_ALLOWED_USERS= # Comma-separated AAD object IDs or UPNs
# TEAMS_ALLOW_ALL_USERS=false # Set true to skip the allowlist
# TEAMS_HOME_CHANNEL= # Default channel/chat ID for cron delivery
# TEAMS_HOME_CHANNEL_NAME= # Display name for the home channel
# TEAMS_PORT=3978 # Webhook listen port (Bot Framework default)
14 changes: 12 additions & 2 deletions .github/actions/nix-setup/action.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
name: 'Setup Nix'
description: 'Install Nix with DeterminateSystems and enable magic-nix-cache'
description: 'Install Nix and configure Cachix binary cache'

inputs:
cachix-auth-token:
description: 'Cachix auth token (enables push). Omit for read-only.'
required: false
default: ''

runs:
using: composite
steps:
- uses: DeterminateSystems/nix-installer-action@ef8a148080ab6020fd15196c2084a2eea5ff2d25 # v22
- uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
with:
name: hermes-agent
authToken: ${{ inputs.cachix-auth-token }}
continue-on-error: true
10 changes: 9 additions & 1 deletion .github/workflows/nix-lockfile-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ concurrency:
cancel-in-progress: true

jobs:
check:
nix-lockfile-check:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- uses: ./.github/actions/nix-setup
with:
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}

- name: Resolve head SHA
id: sha
Expand All @@ -36,6 +38,12 @@ jobs:
LINK_SHA: ${{ steps.sha.outputs.full }}
run: nix run .#fix-lockfiles -- --check

- name: Fail if check crashed without reporting
if: steps.check.outputs.stale != 'true' && steps.check.outputs.stale != 'false'
run: |
echo "::error::fix-lockfiles exited without reporting stale status — likely an infrastructure or script failure"
exit 1

- name: Post sticky PR comment (stale)
if: steps.check.outputs.stale == 'true' && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2.9.1
Expand Down
109 changes: 107 additions & 2 deletions .github/workflows/nix-lockfile-fix.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
name: Nix Lockfile Fix

on:
push:
branches: [main]
paths:
- 'ui-tui/package-lock.json'
- 'ui-tui/package.json'
- 'web/package-lock.json'
- 'web/package.json'
workflow_dispatch:
inputs:
pr_number:
Expand All @@ -19,9 +26,105 @@ concurrency:
cancel-in-progress: false

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 --apply 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
# the paths filter above, so this cannot re-trigger itself.
# 2. An explicit file-whitelist check before commit aborts if
# fix-lockfiles ever modifies unexpected files.
# 3. Job-level concurrency with cancel-in-progress: true ensures
# back-to-back pushes collapse to the newest; ref: main checkout
# always operates on the latest branch state.
# 4. Uses a GitHub App token (not GITHUB_TOKEN) so the fix commit
# triggers downstream nix.yml verification.
auto-fix-main:
if: github.event_name == 'push'
runs-on: ubuntu-latest
timeout-minutes: 25
concurrency:
group: auto-fix-main
cancel-in-progress: true
steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@7bfa3a4717ef143a604ee0a99d859b8886a96d00 # v1.9.3
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}

- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
ref: main
token: ${{ steps.app-token.outputs.token }}

- uses: ./.github/actions/nix-setup
with:
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}

- name: Apply lockfile hashes
id: apply
run: nix run .#fix-lockfiles -- --apply

- name: Commit & push
if: steps.apply.outputs.changed == 'true'
shell: bash
run: |
set -euo pipefail

# Ensure only nix files were modified — prevents accidental
# self-triggering if fix-lockfiles ever touches package files.
unexpected="$(git diff --name-only | grep -Ev '^nix/(tui|web)\.nix$' || true)"
if [ -n "$unexpected" ]; then
echo "::error::Unexpected modified files: $unexpected"
exit 1
fi

# Record the base SHA before committing — used to detect package
# file changes if we need to rebase after a non-fast-forward push.
BASE_SHA="$(git rev-parse HEAD)"

git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add nix/tui.nix nix/web.nix
git commit -m "fix(nix): auto-refresh npm lockfile hashes" \
-m "Source: $GITHUB_SHA" \
-m "Run: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"

# Retry push with rebase in case main advanced with an unrelated
# commit during the nix build. Without this, a non-fast-forward
# rejection silently loses the fix. If package files changed during
# the rebase, abort — a fresh auto-fix run will handle the new state.
for attempt in 1 2 3; do
if git push origin HEAD:main; then
exit 0
fi
echo "::warning::Push attempt $attempt failed (non-fast-forward?), rebasing…"
git fetch origin main

# If package files changed between our base and the new main,
# 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)"
if [ -n "$pkg_changed" ]; then
echo "::warning::Package files changed since hash computation — aborting; a fresh run will recompute"
exit 0
fi

git rebase origin/main
done
echo "::error::Failed to push after 3 rebase attempts"
exit 1

# ── PR fix (manual / checkbox) ─────────────────────────────────────
# Existing behavior: run on manual dispatch OR when a task-list
# checkbox in the sticky lockfile-check comment flips from [ ] to [x].
fix:
# Run on manual dispatch OR when a task-list checkbox in the sticky
# lockfile-check comment flips from `[ ]` to `[x]`.
if: |
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'issue_comment'
Expand Down Expand Up @@ -99,6 +202,8 @@ jobs:
fetch-depth: 0

- uses: ./.github/actions/nix-setup
with:
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}

- name: Apply lockfile hashes
id: apply
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/nix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ jobs:
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: ./.github/actions/nix-setup
with:
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}
- name: Check flake
if: runner.os == 'Linux'
run: nix flake check --print-build-logs
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,4 @@ mini-swe-agent/
.nix-stamps/
result
website/static/api/skills-index.json
models-dev-upstream/
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ hermes-agent/
│ │ # homeassistant, signal, matrix, mattermost, email, sms,
│ │ # dingtalk, wecom, weixin, feishu, qqbot, bluebubbles,
│ │ # webhook, api_server, ...). See ADDING_A_PLATFORM.md.
│ └── builtin_hooks/ # Always-registered gateway hooks (boot-md, ...)
│ └── builtin_hooks/ # Extension point for always-registered gateway hooks (none shipped)
├── plugins/ # Plugin system (see "Plugins" section below)
│ ├── memory/ # Memory-provider plugins (honcho, mem0, supermemory, ...)
│ ├── context_engine/ # Context-engine plugins
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ branding:
agent_name: "My Agent"
welcome: "Welcome message"
response_label: " ⚔ Agent "
prompt_symbol: "⚔"
prompt_symbol: "⚔"
tool_prefix: "╎" # Tool output line prefix
```
Expand Down
16 changes: 13 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright
# that would otherwise accumulate when hermes runs as PID 1. See #15012.
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential nodejs npm python3 ripgrep ffmpeg gcc python3-dev libffi-dev procps git openssh-client docker-cli tini && \
build-essential curl nodejs npm python3 ripgrep ffmpeg gcc python3-dev libffi-dev procps git openssh-client docker-cli tini && \
rm -rf /var/lib/apt/lists/*

# Non-root user for runtime; UID can be overridden via HERMES_UID at runtime
Expand All @@ -30,18 +30,28 @@ WORKDIR /opt/hermes
# unless the lockfiles themselves change.
COPY package.json package-lock.json ./
COPY web/package.json web/package-lock.json web/
COPY ui-tui/package.json ui-tui/package-lock.json ui-tui/
COPY ui-tui/packages/hermes-ink/package.json ui-tui/packages/hermes-ink/package-lock.json ui-tui/packages/hermes-ink/

RUN npm install --prefer-offline --no-audit && \
npx playwright install --with-deps chromium --only-shell && \
(cd web && npm install --prefer-offline --no-audit) && \
(cd ui-tui && npm install --prefer-offline --no-audit) && \
npm cache clean --force

# ---------- Source code ----------
# .dockerignore excludes node_modules, so the installs above survive.
COPY --chown=hermes:hermes . .

# Build web dashboard (Vite outputs to hermes_cli/web_dist/)
RUN cd web && npm run build
# Build browser dashboard and terminal UI assets.
RUN cd web && npm run build && \
cd ../ui-tui && npm run build && \
rm -rf node_modules/@hermes/ink && \
rm -rf packages/hermes-ink/node_modules && \
cp -R packages/hermes-ink node_modules/@hermes/ink && \
npm install --omit=dev --prefer-offline --no-audit --prefix node_modules/@hermes/ink && \
rm -rf node_modules/@hermes/ink/node_modules/react && \
node --input-type=module -e "await import('@hermes/ink')"

# ---------- Permissions ----------
# Make install dir world-readable so any HERMES_UID can read it at runtime.
Expand Down
11 changes: 11 additions & 0 deletions acp_adapter/entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,17 @@ def main() -> None:
import acp
from .server import HermesACPAgent

# MCP tool discovery from config.yaml — run before asyncio.run() so
# it's safe to use blocking waits. (ACP also registers per-session
# MCP servers dynamically via asyncio.to_thread inside the event
# loop; that path is unaffected.) Moved from model_tools.py module
# scope to avoid freezing the gateway's loop on lazy import (#16856).
try:
from tools.mcp_tool import discover_mcp_tools
discover_mcp_tools()
except Exception:
logger.debug("MCP tool discovery failed at ACP startup", exc_info=True)

agent = HermesACPAgent()
try:
asyncio.run(acp.run_agent(agent, use_unstable_protocol=True))
Expand Down
Loading