Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1241 commits
Select commit Hold shift + click to select a range
126cbff
feat(stream-retry): add upstream + timing diagnostics to drop log (#2…
teknium1 May 10, 2026
e5af1dd
fix(review): tell background reviewer not to capture transient env fa…
teknium1 May 10, 2026
dcc8de8
feat(codex): add gpt-5.3-codex-spark model
nederev May 1, 2026
2a6f3de
fix(model-metadata): restore gpt-5.3-codex-spark fallback context
nederev May 1, 2026
c6dc295
fix(model-metadata): set codex-spark fallback context to 128k
nederev May 1, 2026
9457644
fix: surface Codex CLI-only models
askclaw-vesper May 4, 2026
6b5e011
chore: add codex-spark salvage contributors to AUTHOR_MAP
kshitijk4poor May 10, 2026
9ee9a42
docs(codex-spark): document ChatGPT Pro entitlement gating
kshitijk4poor May 10, 2026
826e717
test(codex-spark): add live-API regression and make picker test deter…
kshitijk4poor May 10, 2026
44cdf55
fix(codex-spark): defensive 128k entry in DEFAULT_CONTEXT_LENGTHS + c…
kshitijk4poor May 10, 2026
236cbe1
feat(kanban): add orchestrator board tools
kallidean May 6, 2026
26bf45f
fix(kanban): parse include_archived explicitly
kallidean May 6, 2026
50d2814
fix(kanban): parse triage flag explicitly
kallidean May 6, 2026
2704e7b
fix(kanban): restrict board routing tools to orchestrators
teknium1 May 10, 2026
ce374bc
chore: AUTHOR_MAP entry for kallidean (#20568)
teknium1 May 10, 2026
3d4297a
docs(user-stories): add 4 entries from @emmagine79 thread (#23204)
teknium1 May 10, 2026
9cdcf31
docs(web-search): explain auxiliary-model summarization for web_extra…
teknium1 May 10, 2026
50f9fee
feat(gateway): add LINE Messaging API platform plugin (#23197)
teknium1 May 10, 2026
7312f7f
feat(curator): hint at `hermes curator pin` in the rename block (#23212)
teknium1 May 10, 2026
ec9329e
fix(security): require dashboard auth for plugin API routes
liuhao1024 May 4, 2026
ae4b09c
test(security): broaden plugin API auth coverage + correct stale docs…
teknium1 May 10, 2026
5aa755e
feat(plugins): run any LLM call from inside a plugin via ctx.llm (#23…
teknium1 May 10, 2026
d3db672
fix(kanban): use sys.executable -m hermes for dispatcher spawn
wali-reheman May 10, 2026
62b1c74
fix(kanban): correct dispatcher spawn module name + PATH-first lookup
teknium1 May 10, 2026
c391684
feat(i18n): localize all gateway commands + web dashboard, add 8 new …
teknium1 May 10, 2026
061a183
fix(kanban): guard task_age against corrupt created_at values like '%s'
baocin May 6, 2026
40a4bfa
test(kanban): cover task_age safe-int guards + AUTHOR_MAP entry
teknium1 May 10, 2026
b308dd7
fix(kanban): preserve assignee casing in dashboard
princepal9120 May 7, 2026
08c5b35
test(kanban-dashboard): pin assignee-casing static-asset regressions …
teknium1 May 10, 2026
d4b26df
perf(browser): route browser_console eval through supervisor's persis…
teknium1 May 10, 2026
0e0ddaa
fix(kanban-dashboard): tone down completed-run metadata panel (#19548)
Tranquil-Flow May 10, 2026
a91e5a8
feat(kanban-dashboard): native <details> collapse + skip empty metadata
teknium1 May 10, 2026
673418d
fix(kanban): reject toolset names in task skills
LeonSGP43 May 10, 2026
1f5983c
feat(kanban): aggregate all toolset-name typos in skills before raising
teknium1 May 10, 2026
cede612
feat(gateway): shutdown forensics — non-blocking diag, per-phase timi…
teknium1 May 10, 2026
845be25
fix(kanban): cap dispatch by running workers
guglielmofonda May 7, 2026
3fbbf58
docs(kanban): document max_spawn as live concurrency cap (not per-tic…
teknium1 May 10, 2026
d62808c
chore: AUTHOR_MAP entry for guglielmofonda (#21505)
teknium1 May 10, 2026
5942093
fix(xai): drop models being retired May 15, 2026 from pickers (#23291)
teknium1 May 10, 2026
a282434
feat(gateway): per-platform admin/user split for slash commands (salv…
teknium1 May 10, 2026
6e5c49b
refactor(kanban-orchestrator): drop hardcoded specialist roster, add …
teknium1 May 10, 2026
878611a
feat(session): add /handoff command for cross-platform session transfer
kshitijk4poor May 9, 2026
00ce5f0
feat(session): make /handoff actually transfer the session live
teknium1 May 10, 2026
4d9dcbc
fix(windows): unbreak install + update on Windows (#23394)
teknium1 May 10, 2026
373c4d6
docs(sessions): document /handoff cross-platform session transfer (#2…
teknium1 May 10, 2026
861ce7c
fix: dedupe kanban notifier delivery claims
quocanh261997 May 9, 2026
9c68d12
test(kanban): cover send-exception rewind + drop noisy success log to…
teknium1 May 10, 2026
6062c24
ci: skip lint comment on fork PRs
quocanh261997 May 9, 2026
cdb6e5e
test(conftest): block tests from killing the live hermes-gateway (#23…
teknium1 May 10, 2026
4eb8479
fix(gateway): delete partial message after fallback send on flood con…
HuangYuChuh Apr 29, 2026
ec1fad3
fix(gateway): align fallback delete with sibling style + add regressi…
teknium1 May 10, 2026
04e1816
chore: AUTHOR_MAP entry for HuangYuChuh
teknium1 May 10, 2026
a96dd54
fix: deduplicate kanban notifications for blocked/gave_up states
jelrod27 May 7, 2026
787e3c3
test(kanban): cover redeliver-on-cycle + flip stale unsub-on-abnormal…
teknium1 May 10, 2026
b38b100
chore: AUTHOR_MAP entry for jelrod27 (#21398)
teknium1 May 10, 2026
6636fec
fix(gateway): only mark final response sent when split-overflow chunk…
teknium1 May 10, 2026
ff14666
fix(gateway): stream consumer first message drops thread context
hrygo May 10, 2026
e164a9c
fix(stream-consumer): preserve thread routing on overflow first-send …
hotplex-ai May 9, 2026
f9e0d60
test(thread-routing): handle both lark-SDK-present and absent paths
teknium1 May 10, 2026
cc2a0c6
chore: AUTHOR_MAP entry for hrygo (黄飞虹)
teknium1 May 10, 2026
d6e1fad
fix(xai): omit reasoning.effort for grok models that reject it (#23435)
teknium1 May 10, 2026
3974a13
docs(user-stories): add 116 stories from the Hermes Discord archive (…
teknium1 May 10, 2026
88588b6
fix(kanban): extend stale claim instead of killing live worker
konsisumer May 10, 2026
59d3f24
chore: AUTHOR_MAP entry for konsisumer noreply (#23071)
teknium1 May 10, 2026
a2920b1
fix(tui): right-click copies selection, only pastes when no selection
wesleysimplicio May 9, 2026
2f00559
fix(telegram): pass source.thread_id explicitly on auto-reset notice …
keyuyuan May 10, 2026
62cfe79
fix(tools): clarify kanban_complete phantom-card retry guidance
konsisumer May 10, 2026
c5f1f86
fix(cli): drive _prompt_text_input directly when off main thread (#23…
teknium1 May 10, 2026
c0da5d0
fix: use UTF-16 length for Telegram stream consumer message splitting
freemanconsulting Apr 16, 2026
121bbe0
test(stream-consumer): add UTF-16 overflow regression tests for #11170
teknium1 May 10, 2026
c0bbdec
chore: AUTHOR_MAP entry for Freeman-Consulting
teknium1 May 10, 2026
404640a
feat(goals): /goal checklist + /subgoal user controls (#23456)
teknium1 May 10, 2026
737314f
fix(telegram): normalize dm threads and retry control sends
rahimsais May 10, 2026
666b751
chore: AUTHOR_MAP entry for rahimsais
teknium1 May 10, 2026
ae83a54
docs(kanban): worker lane contract page + review-required convention
teknium1 May 11, 2026
e5bce32
fix(auxiliary): evict cached client on timeout/connection error (#23482)
teknium1 May 11, 2026
771b8c4
test(conftest): plug every gateway-kill leak path (#23486)
teknium1 May 11, 2026
da2ed47
fix(achievements): inject Authorization header in plugin API calls
May 10, 2026
80bb5f2
fix(achievements): use canonical X-Hermes-Session-Token header
teknium1 May 11, 2026
4ed293b
feat(telegram): native draft streaming via sendMessageDraft (Bot API …
NivOO5 May 11, 2026
7f90141
test(telegram): native-draft transport coverage + docs
teknium1 May 11, 2026
9e005d6
chore: AUTHOR_MAP entry for NivOO5
teknium1 May 11, 2026
ba5640f
fix(gateway): route kanban notifications to creator profile
quocanh261997 May 11, 2026
68d081f
fix(kanban): keep '--created-by' default as 'user'
teknium1 May 11, 2026
4a080b1
fix(goals): forward standing /goal state on auto-compression session …
teknium1 May 11, 2026
a63a2b7
fix(goals): force judge to use tool calls instead of JSON-text replie…
teknium1 May 11, 2026
518d37f
feat(kanban): add reclaim_first support to bulk reassign endpoint
May 10, 2026
0ea234e
feat(kanban): dashboard batch QOL upgrade
May 10, 2026
98c499b
kanban dashboard: fix batch QOL oracle blockers
May 10, 2026
a88f201
kanban dashboard: multi-card drag visual feedback
May 10, 2026
6905383
kanban dashboard: remove redundant t.summary from search haystack
May 10, 2026
3df7e30
kanban dashboard: fix shift-click range selection, column select-all …
May 10, 2026
b60462a
test(kanban): remove stale t.summary assertion from search test
eloklam May 10, 2026
b8bf2f8
fix(kanban): merge dashboard batch QOL with i18n + collapse + assigne…
teknium1 May 11, 2026
bf5b8a7
chore(release): map @eloklam tailnet email
teknium1 May 11, 2026
3b122cc
feat(kanban): stranded_in_ready diagnostic for unclaimed tasks (#23578)
teknium1 May 11, 2026
bf1f409
fix(telegram): split-and-deliver oversized edits instead of silent tr…
May 11, 2026
82352e5
test(telegram): regression coverage for edit overflow split-and-deliver
teknium1 May 11, 2026
6c1af45
chore: AUTHOR_MAP entry for kjames2001 (James Huang)
teknium1 May 11, 2026
4c57a5b
feat(skills): add api-testing optional skill (#1800)
eren-karakus0 May 11, 2026
f6736ce
fix(security): sanitize env and redact output in quick commands + rem…
0xbyt4 Mar 17, 2026
28b4fe6
test: stabilize quick-command redaction test against xdist ordering
teknium1 May 11, 2026
f2e8ed2
Add unit tests for hyperliquid skill functionality
Hugo-SEQUIER Mar 18, 2026
1f89939
chore(skills/hyperliquid): tighten SKILL.md to modern format
teknium1 May 11, 2026
5f76787
chore(release): AUTHOR_MAP entry for Hugo-SEQUIER
teknium1 May 11, 2026
e3b88a8
rename(skills): api-testing -> rest-graphql-debug (#23589)
teknium1 May 11, 2026
ac95b8c
perf(gateway): tune Telegram cadence + adaptive fast-path for short r…
wilsen0 May 11, 2026
edb4a2b
test(telegram): cover env-clamped helper + adaptive text-batch tiers
teknium1 May 11, 2026
482d49c
chore: AUTHOR_MAP entry for wilsen0
teknium1 May 11, 2026
3af3c4e
fix(misc): three small defensive fixes from PR #1974
Gutslabs May 11, 2026
228a4d1
fix(config): warn loudly on YAML parse failure instead of silent defa…
teknium1 May 11, 2026
bf2cc8b
Merge pull request #20317 from NousResearch/meta/security-policy
jquesnelle May 11, 2026
896a7ce
feat: add stocks & finance skill (Yahoo Finance, no API key)
Mar 19, 2026
2ea957f
chore(skills/stocks): relocate to optional-skills/finance/stocks/
teknium1 May 11, 2026
9526040
chore(skills/stocks): tighten SKILL.md to modern format
teknium1 May 11, 2026
0458d99
chore(release): AUTHOR_MAP entry for Mibayy clawhub email
teknium1 May 11, 2026
ace1c4e
fix(discord): typing indicator task not cleaned up after API error
0xbyt4 Mar 22, 2026
228b7d2
fix(auxiliary): cache 402'd providers as unhealthy with TTL to stop p…
teknium1 May 11, 2026
ebf2ea5
feat(terminal,cli): docker_extra_args + display.timestamps
Mibayy May 11, 2026
d992fd9
feat(deps): add hindsight-client as optional dependency (#21818)
alt-glitch May 11, 2026
5606258
feat(nix): add extraDependencyGroups for sealed venv extras (#21817)
alt-glitch May 11, 2026
64145a1
fix(nix): replace chown -R with targeted find in container entrypoint…
alt-glitch May 11, 2026
f6d4f3c
fix(kanban): route gateway create auto-subscribe to explicit board
Frowtek May 10, 2026
2b3bf17
fix(kanban): call kanban_block on iteration-budget exhaustion to prev…
liuhao1024 May 10, 2026
641e40c
fix(kanban): restore HERMES_KANBAN_BOARD after scoped slash override
Sylw3ster May 10, 2026
5af315c
fix(kanban): inject HERMES_HOME into worker subprocess env
TurgutKural May 10, 2026
8ac998c
fix(send_message): allow kanban workers to call send_message
dmnkhorvath May 10, 2026
379e7dd
test(send_message): cover _check_send_message gating paths
dmnkhorvath May 10, 2026
27cfe72
fix(kanban): use localized column label in select-all aria label
smwbev May 11, 2026
a1854ac
fix(kanban): treat archived parent tasks as terminal for dependency r…
Ninso112 May 10, 2026
7087702
chore: add salvage contributors to AUTHOR_MAP
kshitijk4poor May 11, 2026
5712483
fix: guard resolve_profile_env against missing profile dirs
kshitijk4poor May 11, 2026
494824f
chore: remove unused sentinel in test_send_message_tool
kshitijk4poor May 11, 2026
9520a1c
fix(terminal): block sudo -S password guessing when SUDO_PASSWORD is …
May 9, 2026
976d8e2
fix(approval): catch sudo with stdin/askpass/shell privilege flags
fr33d3m0n May 7, 2026
1d4a499
chore: AUTHOR_MAP entries for sudo-hardening salvage contributors
kshitijk4poor May 11, 2026
3e7145e
revert: roll back /goal checklist + /subgoal feature stack (#23813)
teknium1 May 11, 2026
7026af4
fix(agent): catch ChatGPT-account Codex data-URL rejection so images …
teknium1 May 11, 2026
a479ec0
fix: make web UI build output decoding robust on Windows
VinceZcrikl May 11, 2026
88a2ce4
chore: AUTHOR_MAP entry for VinceZcrikl noreply (#23647)
teknium1 May 11, 2026
7085f4e
fix(dashboard): fallback to stale dist, retry build, add --skip-build…
ygd58 May 11, 2026
283381b
fix(dashboard): validate dist exists when --skip-build is set
teknium1 May 11, 2026
e155f2a
rebuild model catalog
rob-maron May 11, 2026
054f568
fix: use TUI modal for slash confirmations
zhengyn0001 May 11, 2026
cc9e788
fix(cli): defensive _slash_confirm_state access + AUTHOR_MAP
teknium1 May 11, 2026
8e2eb4b
fix(/model): surface Nous Portal models from remote catalog manifest …
teknium1 May 11, 2026
6578744
chore: ruff auto-fixes — collapsible-else-if, if-stmt-min-max, dict.f…
kshitijk4poor May 11, 2026
1d00716
fix(cli,tui): align CJK / wide-char markdown tables (#23863)
teknium1 May 11, 2026
111b859
fix(auxiliary): evict async wrappers on poisoned client (follow-up to…
wuli666 May 11, 2026
8c11710
chore(release): add AUTHOR_MAP entry for wuli666
teknium1 May 11, 2026
2ec8d2b
chore: ruff auto-fix PLR6201 — tuple → set in membership tests (#23937)
kshitijk4poor May 11, 2026
7b76366
feat(prompt-cache): cross-session 1h prefix cache for Claude on Anthr…
teknium1 May 11, 2026
ce0f529
chore: ruff auto-fix C401, C416, C408, PLR1722 (#23940)
kshitijk4poor May 11, 2026
2718834
feat: expose HERMES_SESSION_ID to agent tools via ContextVar + env (#…
alt-glitch May 11, 2026
3197b4d
Merge remote-tracking branch 'origin/main' into fix/bundle-size
ethernet8023 May 11, 2026
91eef62
fix: correct context-length resolution for kimi-k2.6 on Ollama Cloud …
kshitijk4poor May 11, 2026
e2b713c
fix(model-metadata): skip OpenRouter for known providers, add kimi/mo…
nicoechaniz May 11, 2026
9a63b5f
chore: add nicoechaniz to AUTHOR_MAP
kshitijk4poor May 11, 2026
c6ca116
refactor(tui): simplify TUI build logic, remove stale staleness checks
ethernet8023 May 11, 2026
75b428c
feat(ui-tui): resolve markdown links to readable page titles (#24013)
OutThisLife May 11, 2026
825bd50
Merge pull request #18036 from NousResearch/fix/bundle-size
ethernet8023 May 11, 2026
ea1d046
fix(cli): vertical fallback for markdown tables wider than terminal (…
teknium1 May 11, 2026
05bad7b
fix(dashboard): MiniMax 'Login' button launched Claude OAuth (#22832)
ahmedbadr3 May 9, 2026
97a0e69
chore(release): add AUTHOR_MAP entry for ahmedbadr3
teknium1 May 11, 2026
ced1990
feat(computer-use): refresh cua-driver on `hermes update` + add `inst…
teknium1 May 12, 2026
e855925
fix(nous): surface Portal-flagged free models in picker even when cur…
teknium1 May 12, 2026
3c23b15
fix(tui-clipboard): skip native safety net on OSC52-capable terminals…
benbarclay May 12, 2026
7993e03
fix(cache): route Nous Portal Qwen through Portal-Claude cache pathwa…
teknium1 May 12, 2026
528bba6
fix kimi
rob-maron May 12, 2026
057fc7b
fix guard
rob-maron May 12, 2026
f0c2964
remove comments
rob-maron May 12, 2026
32abe74
fix comment
rob-maron May 12, 2026
58e2109
fix(minimax): harden OAuth dashboard and runtime
austinpickett May 12, 2026
94d9db7
add client marker tag on aux inference requests
rewbs May 12, 2026
407683b
fix(docs): repair Voice & TTS provider table
May 12, 2026
99ad2d1
fix(deps): unbreak [all] install — drop mistralai while PyPI quaranti…
teknium1 May 12, 2026
c1eb2dc
feat(security): supply-chain advisory checker + lazy-install framewor…
teknium1 May 12, 2026
dd0923b
docs: remove public advisory page (handle community comms separately)…
teknium1 May 12, 2026
fc3fd6b
fix(dashboard): UI polish — modals, layout, consistency, test fixes
austinpickett May 12, 2026
c594a23
feat(agent): per-turn file-mutation verifier footer (#24498)
teknium1 May 12, 2026
2863e94
Use nous portal as model metadata authority (#24502)
rob-maron May 12, 2026
d186186
fix(install): surface uv install + uv.lock sync errors instead of sil…
teknium1 May 12, 2026
c23a87b
union paid recs from nous portal with static list (#24509)
rob-maron May 12, 2026
a34998e
fix(cli): parse positional insights days
helix4u May 12, 2026
642768c
Merge pull request #24161 from NousResearch/austin/fix/dashboard
austinpickett May 12, 2026
653d304
fix(gateway): detect stale scoped locks via cmdline when start_time i…
pkyanam May 11, 2026
629c33c
test(gateway): patch _pid_exists instead of os.kill for scoped-lock t…
teknium1 May 12, 2026
954e854
chore(release): map kyanam.preetham@gmail.com → pkyanam
teknium1 May 12, 2026
71198b9
📝 docs(kanban): clarify dependent task gating
BlackishGreen33 May 12, 2026
1189ed7
fix(docs): correct broken internal links to webhooks and mlops skill …
luarss May 12, 2026
4fa5f7b
chore(release): add AUTHOR_MAP entry for luarss
teknium1 May 12, 2026
4bb0a82
fix(gateway): enqueue SSE EOS sentinel on task completion
May 12, 2026
3955aef
fix(install): use `--extra all` not `--all-extras`; drop lazy-covered…
teknium1 May 12, 2026
62fd905
feat(browser): support externally managed Camofox sessions
db-aeon May 11, 2026
f63d520
chore(camofox): document new env vars + AUTHOR_MAP entry
teknium1 May 12, 2026
38441a7
docs(camofox): expand externally-managed sessions section (#24584)
teknium1 May 12, 2026
d89553c
fix(daytona): migrate legacy-sandbox lookup to cursor-based list() (#…
teknium1 May 12, 2026
83b9389
feat(lsp): semantic diagnostics from real language servers in write_f…
teknium1 May 12, 2026
88ede80
fix(pricing): add deepseek-v4-pro to official docs pricing table
zccyman May 12, 2026
24e2151
chore(release): add AUTHOR_MAP entries for zccyman and Osraka
teknium1 May 12, 2026
f9559c3
fix(gateway): consult lock record argv when cmdline unreadable in sco…
AhmetArif0 May 12, 2026
76bbb94
chore: AUTHOR_MAP entry for AhmetArif0 (PR #24600)
teknium1 May 12, 2026
29d7c24
feat(gateway): wire clarify tool with inline keyboard buttons on Tele…
teknium1 May 12, 2026
9b2488a
fix: include arg-taking commands in Telegram menu
ryptotalent May 12, 2026
389c707
chore(release): add AUTHOR_MAP entry for ryptotalent
teknium1 May 12, 2026
d68a0ec
fix(auxiliary): pass cfg_base_url and cfg_api_key when resolving task…
hookinglau May 12, 2026
b3ca636
chore(release): add AUTHOR_MAP entry for hookinglau
teknium1 May 12, 2026
e385877
fix(dashboard): skip browser-open on headless Linux to prevent proces…
AllynSheep May 12, 2026
782e3f5
chore(release): add AUTHOR_MAP entries for AllynSheep
teknium1 May 12, 2026
80375cb
fix(dashboard): display real config path on Config page
aqilaziz May 12, 2026
6ec89d8
chore(release): add AUTHOR_MAP entries for aqilaziz
teknium1 May 12, 2026
2a3140a
fix(dashboard): rescan plugins when cached directory is removed
liuhao1024 May 12, 2026
d33deb7
fix(tui): clear scrollback buffer on startup to prevent tmux scrollba…
laoli-no1 May 12, 2026
b7bd0f7
chore(release): add AUTHOR_MAP entries for laoli-no1
teknium1 May 12, 2026
7a4ad5c
fix(cli): use display-width for response box header label to support CJK
NorethSea May 12, 2026
c7cfad5
chore(release): add AUTHOR_MAP entries for NorethSea
teknium1 May 12, 2026
a33ec10
fix(cli): @-file completion crash on Windows when paths aren't cp1252…
JamesX88 May 12, 2026
413990c
chore(release): add AUTHOR_MAP entries for JamesX88
teknium1 May 12, 2026
6f285ef
fix(telegram): clear in-progress reaction on cancelled processing (#2…
teknium1 May 13, 2026
29c9ff9
fix(lsp): typescript SDK install + tsc-missing skip + shellcheck warn…
teknium1 May 13, 2026
a694a26
docs(gateway): mention Weixin in gateway help and docstrings
wuwuzhijing May 13, 2026
1beb578
fix(ci): install ripgrep in e2e job
wesleysimplicio May 13, 2026
8d55305
fix(ci): bump e2e job timeout to 15 minutes
wesleysimplicio May 13, 2026
0bc5f7b
fix(gateway): reduce systemd restart delay
silv-mt-holdings May 13, 2026
a54d4b0
fix(send_message): recognize XMPP JIDs as explicit targets
Quarkex May 13, 2026
0c233e7
fix(doctor): skip /models health check for providers that don't suppo…
jak983464779 May 13, 2026
6f92a21
fix(web): add Bearer auth header for Tavily /crawl endpoint
McClean May 13, 2026
d8c4460
fix(cron): include whatsapp in _HOME_TARGET_ENV_VARS
dhruv-saxena May 13, 2026
2a18b62
fix(cache): drop ttl=1h on Portal Qwen — Alibaba upstream is 5m-only …
teknium1 May 13, 2026
4c82555
fix(retry): use float() for Retry-After header to handle sub-second v…
ryptotalent May 13, 2026
e713932
fix(signal): handle group messages from linked devices in syncMessage…
ms-alan May 13, 2026
081f936
fix(voice_mode): detect audio in WSL when sd.query_devices() returns …
RhombusMaximus May 13, 2026
557deec
fix(tui): use TERMINAL_CWD in _session_info for accurate status line …
Dangooy May 13, 2026
80c4b27
docs(lsp): document follow-up fixes from #24630 (#24709)
teknium1 May 13, 2026
dd1d4e9
fix(gateway): add chat_id to hook_ctx for message source tracking
diablozzc May 13, 2026
327b8ce
fix(install): use stash@{0} instead of git rev-parse refs/stash for a…
Jwd-gity May 13, 2026
e474130
fix(telegram): use thread fallback helper in slash-confirm result send
AhmetArif0 May 13, 2026
afa5b81
fix(prompt_builder): inject tool-use enforcement for GLM models
ALIYILD May 13, 2026
7c67097
fix(line): use build_source instead of nonexistent create_source
mizgyo May 13, 2026
e77fd75
fix(wecom): update connection status after WebSocket reconnection
02356abc May 13, 2026
420762f
fix(tools): forward thread_id via metadata in _send_via_adapter live …
AhmetArif0 May 13, 2026
1a4e8f7
fix(gateway): make WhatsApp npm install timeout configurable
liuhao1024 May 13, 2026
a4289d7
fix(test): use i18n t() for restart drain assertion
alblez May 13, 2026
8ac3514
fix(agent): clear stale config context_length on model switch
AgentArcLab May 13, 2026
80374d4
fix: approval DELETE pattern DOTALL flag allows newline bypass
amathxbt May 13, 2026
b06e999
fix(cache): kill long-lived prefix layout — system prompt is now byte…
teknium1 May 13, 2026
486b692
feat(nous): unified client=hermes-client-v<version> tag on every Port…
teknium1 May 13, 2026
1e01b25
feat(providers): rename Alibaba Cloud to Qwen Cloud, reorder picker (…
teknium1 May 13, 2026
942adf6
fix(docker): chown .venv to hermes so lazy_deps can install platform …
alt-glitch May 13, 2026
7598f76
chore: sync with upstream main (2026-05-13)
May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,20 @@ BROWSER_SESSION_TIMEOUT=300
# Browser sessions are automatically closed after this period of no activity
BROWSER_INACTIVITY_TIMEOUT=120

# Camofox local anti-detection browser (Camoufox-based Firefox).
# Set CAMOFOX_URL to route the browser tools through a local Camofox server
# instead of agent-browser/Browserbase. See docs/user-guide/features/browser.md.
# CAMOFOX_URL=http://localhost:9377

# Externally managed Camofox sessions — when another app owns the visible
# Camofox browser, set these so Hermes shares the same userId/profile instead
# of creating its own isolated session.
# CAMOFOX_USER_ID=
# CAMOFOX_SESSION_KEY=
# Set to true to reuse an already-open Camofox tab for this identity before
# creating a new one (useful for gateway restarts).
# CAMOFOX_ADOPT_EXISTING_TAB=false

# =============================================================================
# SESSION LOGGING
# =============================================================================
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,14 @@ jobs:

e2e:
runs-on: ubuntu-latest
timeout-minutes: 10
timeout-minutes: 15
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y ripgrep

- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5

Expand Down
6 changes: 5 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,13 @@ RUN cd web && npm run build && \
# hermes_cli/main.py succeeds (see #18800). /opt/hermes/web is build-time
# only (HERMES_WEB_DIST points at hermes_cli/web_dist) and is intentionally
# not chowned here.
# The .venv MUST be hermes-writable so lazy_deps.py can install platform
# packages (discord.py, telegram, slack, etc.) at first gateway boot.
# Without this, `uv pip install` fails with EACCES and all messaging
# adapters silently fail to load. See tools/lazy_deps.py.
USER root
RUN chmod -R a+rX /opt/hermes && \
chown -R hermes:hermes /opt/hermes/ui-tui /opt/hermes/node_modules
chown -R hermes:hermes /opt/hermes/.venv /opt/hermes/ui-tui /opt/hermes/node_modules
# Start as root so the entrypoint can usermod/groupmod + gosu.
# If HERMES_UID is unset, the entrypoint drops to the default hermes user (10000).

Expand Down
5 changes: 2 additions & 3 deletions agent/anthropic_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1305,9 +1305,8 @@ def convert_tools_to_anthropic(tools: List[Dict]) -> List[Dict]:
),
}
# Forward cache_control marker when present on the OpenAI-format
# tool dict (set by ``mark_tools_for_long_lived_cache``). Anthropic's
# tools array supports cache_control on the last tool to cache the
# entire schema cross-session.
# tool dict. Anthropic's tools array supports cache_control on the
# last tool to cache the entire schema cross-session.
cache_control = t.get("cache_control")
if isinstance(cache_control, dict):
anthropic_tool["cache_control"] = dict(cache_control)
Expand Down
29 changes: 25 additions & 4 deletions agent/auxiliary_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,28 @@ def build_or_headers(or_config: dict | None = None) -> dict:
# Nous Portal extra_body for product attribution.
# Callers should pass this as extra_body in chat.completions.create()
# when the auxiliary client is backed by Nous Portal.
NOUS_EXTRA_BODY = {"tags": ["product=hermes-agent", "client=aux"]}
#
# The tags are computed from agent.portal_tags so the client= marker stays
# in lockstep with hermes_cli.__version__ across every Portal call site
# (main loop, aux, compression, web_extract). Do not inline a literal here;
# see agent/portal_tags.py for the rationale.
from agent.portal_tags import nous_portal_tags as _nous_portal_tags


def _nous_extra_body() -> dict:
"""Return a fresh Nous Portal ``extra_body`` dict.

Computed at call time so a hot-reloaded ``hermes_cli.__version__`` is
reflected without restarting long-running processes.
"""
return {"tags": _nous_portal_tags()}


# Backwards-compatible module attribute. Some callers (tests, third-party
# plugins) read ``NOUS_EXTRA_BODY`` directly; keep it as a snapshot of the
# current tags. Callers that need the freshest value should call
# ``_nous_extra_body()`` or import ``nous_portal_tags`` directly.
NOUS_EXTRA_BODY = _nous_extra_body()

# Set at resolve time — True if the auxiliary client points to Nous Portal
auxiliary_is_nous: bool = False
Expand Down Expand Up @@ -3437,7 +3458,7 @@ def get_auxiliary_extra_body() -> dict:
Includes Nous Portal product tags when the auxiliary client is backed
by Nous Portal. Returns empty dict otherwise.
"""
return dict(NOUS_EXTRA_BODY) if auxiliary_is_nous else {}
return _nous_extra_body() if auxiliary_is_nous else {}


def auxiliary_max_tokens_param(value: int) -> dict:
Expand Down Expand Up @@ -3828,7 +3849,7 @@ def _resolve_task_provider_model(
# (e.g. OPENROUTER_API_KEY) instead of locking into "custom".
return cfg_provider, resolved_model, cfg_base_url, None, resolved_api_mode
if cfg_provider and cfg_provider != "auto":
return cfg_provider, resolved_model, None, None, resolved_api_mode
return cfg_provider, resolved_model, cfg_base_url, cfg_api_key, resolved_api_mode

return "auto", resolved_model, None, None, resolved_api_mode

Expand Down Expand Up @@ -4026,7 +4047,7 @@ def _build_call_kwargs(
# Provider-specific extra_body
merged_extra = dict(extra_body or {})
if provider == "nous" or auxiliary_is_nous:
merged_extra.setdefault("tags", []).extend(NOUS_EXTRA_BODY["tags"])
merged_extra.setdefault("tags", []).extend(_nous_portal_tags())
if merged_extra:
kwargs["extra_body"] = merged_extra

Expand Down
106 changes: 106 additions & 0 deletions agent/lsp/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
"""Language Server Protocol (LSP) integration for Hermes Agent.

Hermes runs full language servers (pyright, gopls, rust-analyzer,
typescript-language-server, etc.) as subprocesses and pipes their
``textDocument/publishDiagnostics`` output into the post-write lint
delta filter used by ``write_file`` and ``patch``.

LSP is **gated on git workspace detection** — if the agent's cwd is
inside a git repository, LSP runs against that workspace; otherwise the
file_operations layer falls back to its existing in-process syntax
checks. This keeps users on user-home cwd's (e.g. Telegram gateway
chats) from spawning daemons they don't need.

Public API:

from agent.lsp import get_service

svc = get_service()
if svc and svc.enabled_for(path):
await svc.touch_file(path)
diags = svc.diagnostics_for(path)

The bulk of the wiring is internal — most callers only need the layer
in :func:`tools.file_operations.FileOperations._check_lint_delta`,
which is already wired (see that module).

Architecture is documented in ``website/docs/user-guide/features/lsp.md``.
"""
from __future__ import annotations

import atexit
import logging
import threading
from typing import Optional

from agent.lsp.manager import LSPService

logger = logging.getLogger("agent.lsp")

_service: Optional[LSPService] = None
_atexit_registered = False
_service_lock = threading.Lock()


def get_service() -> Optional[LSPService]:
"""Return the process-wide LSP service singleton, or None when disabled.

The service is created lazily on first call. ``None`` is returned
when LSP is disabled in config, when no workspace can be detected,
or when the platform doesn't support subprocess-based LSP servers.

On first creation, registers an :mod:`atexit` handler that tears
down spawned language servers on Python exit so a long-running
CLI or gateway session doesn't leak pyright/gopls/etc. processes
when it terminates.
"""
global _service, _atexit_registered
if _service is not None:
return _service if _service.is_active() else None
with _service_lock:
if _service is not None:
return _service if _service.is_active() else None
_service = LSPService.create_from_config()
if not _atexit_registered:
# ``atexit`` handlers run in LIFO order on normal Python
# exit and on SystemExit, but NOT on os._exit() or
# uncaught signals. Language servers are stateless
# subprocesses — losing them on SIGKILL is fine; they'll
# be reaped by the kernel along with their parent. We
# care about clean exits where Python flushes stdio
# before terminating; without this hook every
# ``hermes chat`` exit would leak pyright processes that
# outlive the parent for a few seconds while their
# stdout buffers drain.
atexit.register(_atexit_shutdown)
_atexit_registered = True
return _service if (_service is not None and _service.is_active()) else None


def shutdown_service() -> None:
"""Tear down the LSP service if one was started.

Safe to call multiple times; safe to call when no service was created.
"""
global _service
with _service_lock:
svc = _service
_service = None
if svc is not None:
try:
svc.shutdown()
except Exception as e: # noqa: BLE001
logger.debug("LSP shutdown error: %s", e)


def _atexit_shutdown() -> None:
"""atexit-registered wrapper. Logs at debug because by the time
atexit fires the user has already seen the agent's final output —
a noisy shutdown line on top of that is just clutter."""
try:
shutdown_service()
except Exception as e: # noqa: BLE001
logger.debug("atexit LSP shutdown failed: %s", e)


__all__ = ["get_service", "shutdown_service", "LSPService"]
Loading
Loading