Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1697 commits
Select commit Hold shift + click to select a range
9fb40e6
fix(tui): restrict fast-echo bypass to ASCII so Vietnamese/CJK/IME in…
OutThisLife May 15, 2026
b62c997
feat(xai-oauth): add xAI Grok OAuth (SuperGrok Subscription) provider
Jaaneek May 15, 2026
e4d7a5d
fix(tools): video_gen picker reflects active xAI selection and runs x…
Jaaneek May 15, 2026
9eef53b
chore(release): map Jaaneek@users.noreply.github.com to Jaaneek
Jaaneek May 15, 2026
e13c1b8
fix(xai-http): preserve ~/.hermes/.env fallback and XAI_STT_BASE_URL …
Jaaneek May 15, 2026
7fdc16d
refactor(transports/codex): trim duplicated cache-key comments
Jaaneek May 15, 2026
1e4801b
docs(xai-oauth): correct logout command (was hermes auth remove)
Jaaneek May 15, 2026
7d7cdd4
test(xai-oauth): use grok-4.3 instead of retiring grok-code-fast-1
Jaaneek May 15, 2026
aac6d97
chore(xai-oauth): trim CORS allowlist to xAI auth origins
teknium1 May 15, 2026
4ad5fa7
docs(xai-oauth): add xai-oauth to provider enumeration pages (#26542)
teknium1 May 15, 2026
734aa0f
fix(cronjob): require explicit truthy session env values
aydnOktay Mar 24, 2026
931caf2
fix(env-flags): widen truthy-only session env checks to sibling sites
teknium1 May 15, 2026
4e89c53
fix(async): close unscheduled coroutines in all threadsafe bridges (#…
teknium1 May 15, 2026
13c3d4b
feat(nvidia): add NIM billing origin header
nv-kasikritc May 13, 2026
6fc0fa6
chore(release): add AUTHOR_MAP entry for kchantharuan@nvidia.com
teknium1 May 15, 2026
4444d5f
fix(acp): emit native plan updates for todo
HenkDz May 15, 2026
bd3a587
fix(acp): replay native todo plans
HenkDz May 15, 2026
622c27e
fix(install.ps1): restore EAP=Continue around uv python install, skip…
teknium1 May 15, 2026
9e67c8e
Merge pull request #26048 from stephenschoettler/fix/discord-e2e-hist…
ethernet8023 May 15, 2026
3b9368a
fix(auth): point SSH OAuth users at the tunnel they actually need (#2…
teknium1 May 15, 2026
518f395
fix(gateway): keep running when platforms fail; add per-platform circ…
teknium1 May 15, 2026
032fb84
docs(hermes_tools_mcp_server): align scope docstring with EXPOSED_TOO…
teknium1 May 15, 2026
3215ef1
ci(pypi): build web dashboard + TUI bundle before creating wheel
alt-glitch May 15, 2026
384ec96
feat(banner): check PyPI for updates when not a git install
alt-glitch May 15, 2026
cc07e30
feat(install): add --ensure and --postinstall modes for targeted dep …
alt-glitch May 15, 2026
c4bda3f
fix(doctor): generate config from defaults when template file is missing
alt-glitch May 15, 2026
d69eab1
fix(gateway): build service PATH from existing dirs only, include ~/.…
alt-glitch May 15, 2026
b2bf658
feat(tui): find bundled entry.js from wheel before falling back to np…
alt-glitch May 15, 2026
624ce11
feat(config): detect pip install method and recommend correct update …
alt-glitch May 15, 2026
79afa50
feat(update): support pip install --upgrade for PyPI installs
alt-glitch May 15, 2026
bea96e5
chore(config): expand ensure_hermes_home to create full directory sca…
alt-glitch May 15, 2026
259ae84
feat: add ensure_dependency() wrapper + ship install.sh in wheel
alt-glitch May 15, 2026
96917fb
refactor: fix review findings — remove duplicate imports and deduplic…
alt-glitch May 15, 2026
55a7c45
fix(update): handle --check for pip installs (missed code path)
alt-glitch May 15, 2026
e38a478
chore(ci): pin actions/setup-node to SHA for supply-chain consistency
alt-glitch May 15, 2026
c57709a
feat: wire ensure_dependency into TUI and browser tool call sites
alt-glitch May 15, 2026
b1edf3d
chore: gitignore hermes_cli/scripts/ (bundled at wheel build time)
alt-glitch May 15, 2026
99b81cd
feat: add `hermes postinstall` command for pip users
alt-glitch May 15, 2026
164a77d
docs: add pip install path to installation, quickstart, updating, and…
alt-glitch May 15, 2026
47c0efe
refactor: DRY cleanup from code review
alt-glitch May 15, 2026
a480d34
docs: add hermes postinstall to installation + quickstart, fix update…
alt-glitch May 15, 2026
233d417
docs(xai): link OAuth-over-SSH guide from xAI provider surfaces (#26610)
teknium1 May 15, 2026
887ba1f
ci: reject PRs with no common ancestor on main (#26611)
teknium1 May 15, 2026
42070ec
feat(skills/notion): overhaul for Notion Developer Platform (May 2026…
teknium1 May 15, 2026
2d7182f
fix(delegate): move heartbeat thread start inside try block to preven…
sprmn24 May 15, 2026
6068363
fix(delegate): guard heartbeat join against unstarted thread
teknium1 May 15, 2026
7fee1f6
fix(memory): eliminate TOCTOU race in Windows file lock creation
sprmn24 May 15, 2026
4aec25b
fix(windows): stop spamming cwd-missing + tirith-spawn warnings on ev…
teknium1 May 15, 2026
31ba2b0
fix(xai-oauth): recover from prelude SSE errors, gate reasoning repla…
teknium1 May 15, 2026
068c24f
feat(deepseek): add thinking.type + reasoning_effort mapping for Deep…
twebefy28 Apr 24, 2026
cd9470f
fix(deepseek): wire thinking-mode via DeepSeekProfile, not legacy fal…
teknium1 May 15, 2026
dc4cde2
feat(docs): show per-skill pages in the left sidebar (#26646)
teknium1 May 16, 2026
ce0e189
fix(xai-oauth): break entitlement-403 credential-refresh loop, bump g…
teknium1 May 16, 2026
9818b9a
fix(xai-oauth): rewrite entitlement-403 hint to not accuse subscriber…
teknium1 May 16, 2026
6784c80
fix(xai-oauth): lead entitlement-403 hint with X Premium+ gotcha (#26…
teknium1 May 16, 2026
566d8f0
fix(tui): keep DECSTBM scroll region off bottom row (#26683)
OutThisLife May 16, 2026
006937f
fix(tui): handle timeout/error subagent statuses in /agents (#26687)
OutThisLife May 16, 2026
55c9f32
fix(tui): width-aware markdown table rendering with vertical fallback…
alt-glitch May 16, 2026
86a368d
remove pip installation method from docs
jquesnelle May 16, 2026
c7db6a5
Merge pull request #26702 from NousResearch/remove-pip-docs
jquesnelle May 16, 2026
63503eb
fix(dashboard): clarify Kanban Ready vs assignment
austinpickett May 16, 2026
97a32af
fix(auxiliary): resolve xai oauth compression from pool
helix4u May 16, 2026
44b63fc
fix(tui): allow transcript scroll + Esc during approval/clarify/confi…
OutThisLife May 16, 2026
a31191c
fix(docs): unique sidebar keys for duplicate skill categories (#26726)
teknium1 May 16, 2026
c5dc970
fix(windows): silence tirith-unavailable banner + skip install/spawn …
teknium1 May 16, 2026
ca413c6
fix(dashboard): align Ukrainian Kanban Ready column help
austinpickett May 16, 2026
965610f
fix(cli): tolerate unreadable dirs when building systemd PATH
austinpickett May 16, 2026
16ff946
Revert "fix(cli): tolerate unreadable dirs when building systemd PATH"
austinpickett May 16, 2026
e377833
Merge pull request #26711 from NousResearch/austin/fix/dashboard-kanban
austinpickett May 16, 2026
c9b32a6
feat(skill): darwinian-evolver optional skill
teknium1 May 16, 2026
53637fb
chore(skills/darwinian-evolver): AUTHOR_MAP + docs regen
teknium1 May 16, 2026
9c304a7
fix(agent): retry malformed anthropic stream parser errors
helix4u May 16, 2026
016c772
feat(plugins): tool override flag for replacing built-in tools (close…
teknium1 May 16, 2026
afb97db
docs: add Programmatic Integration overview (closes #360)
teknium1 May 16, 2026
559c6ad
feat(skills): add optional pinggy-tunnel skill
teknium1 May 16, 2026
70b6635
fix(tui): keep Ink displayCursor in sync with fast-echo writes so cur…
OutThisLife May 16, 2026
627f8a5
security: sanitize tool error strings before injecting into model con…
teknium1 May 16, 2026
74d0b39
feat(x_search): gated X (Twitter) search tool with OAuth-or-API-key a…
teknium1 May 16, 2026
c445f48
fix(delegation): honor api_mode + auto-detect anthropic_messages URLs…
teknium1 May 16, 2026
395e9dd
feat: add supports_parallel_tool_calls for MCP servers (#26825)
teknium1 May 16, 2026
6ba35ec
Inspired by Claude Code: tighten dangerous-command detection (#26829)
teknium1 May 16, 2026
d725407
security(deps): bump aiohttp, anthropic, cryptography to CVE-fixed ve…
teknium1 May 16, 2026
5f91b1a
feat(skills): add osint-investigation optional skill (closes #355) (#…
teknium1 May 16, 2026
d0a183c
fix(doctor): suppress stale direct-key issues when oauth is healthy
worlldz May 16, 2026
7bb97b9
chore: add worlldz to AUTHOR_MAP for #26704 salvage
kshitijk4poor May 16, 2026
4ded3ed
fix: detect gh-copilot deprecation and improve GitHub Models 413 erro…
konsisumer Apr 16, 2026
b85b938
test: add tests for copilot ACP deprecation detection and Azure URL m…
konsisumer Apr 16, 2026
374dc81
fix(copilot-acp): tighten deprecation detection + sharpen GitHub Mode…
teknium1 May 16, 2026
585d6b6
fix(gateway): merge rapid TEXT follow-ups during active sessions (#44…
teknium1 May 16, 2026
fcd9011
fix(security): separate OAuth PKCE state from code_verifier
shaun0927 Apr 16, 2026
345821b
style: move secrets import alongside other function-level imports
shaun0927 Apr 16, 2026
72f94f4
test(security): regression guard for OAuth PKCE state/verifier separa…
teknium1 May 16, 2026
a91a57f
chore: release v0.14.0 (2026.5.16) (#26862)
teknium1 May 16, 2026
f3a4af9
fix(acp): replay assistant reasoning as agent_thought_chunk on sessio…
kshitijk4poor May 16, 2026
3034eee
fix(acp): replay session history before responding to session/load (#…
kshitijk4poor May 16, 2026
6836987
docs(release): rewrite v0.14.0 highlights for excitement framing (#27…
teknium1 May 16, 2026
35f2552
docs(tools): add video_generate / video_gen toolset to user-facing to…
teknium1 May 16, 2026
6c2406c
fix(signal): read groupV2.id in envelope, fall back to legacy groupIn…
teknium1 May 16, 2026
8a2b2b9
docs(release): expand v0.14.0 highlights with newcomer-friendly conte…
teknium1 May 16, 2026
05af78c
fix(update): make Camofox lazy-installed instead of eager (#27055)
teknium1 May 16, 2026
c844d15
fix(update): stream npm install output so postinstall progress is vis…
briandevans May 2, 2026
fc03c95
feat(cli): add /exit --delete flag to remove session on quit (#27101)
teknium1 May 16, 2026
dc3d0fe
Port from cline/cline#10343: periodic gateway memory logging (#27102)
teknium1 May 16, 2026
93e109a
fix(moonshot): strip $ref siblings and collapse tuple items in tool s…
teknium1 May 16, 2026
fb05f5d
fix(mcp): validate remote URLs up-front with a clear error (#27105)
teknium1 May 16, 2026
dffb602
fix(xai): drop stale X Premium+ hint from entitlement 403 surfacing (…
teknium1 May 16, 2026
e51d74a
fix(codex): rotate pool on usage limit 429
Qwinty May 15, 2026
6f817e1
fix(telegram): restore DM topic typing indicator
helix4u May 16, 2026
226cee4
feat(cli): show ▶ N indicator in status bar when /background tasks ar…
teknium1 May 16, 2026
e21cb8d
feat(status): append session recap to /status output (#27176)
teknium1 May 16, 2026
2b19390
fix(xai): surface provider 'error' SSE frame in Codex fallback stream…
teknium1 May 17, 2026
33528b4
fix(agent): reset _fallback_index at turn start even when no fallback…
konsisumer May 6, 2026
29b1bd0
feat(cli): add `hermes send` to pipe script output to any messaging p…
teknium1 May 17, 2026
9b82586
fix(plugins): surface category-namespaced plugins in hermes plugins list
guillaumemeyer May 16, 2026
8ab8bc2
fix(plugins): remove unreachable hermes tools → Langfuse path
guillaumemeyer May 16, 2026
21be702
refactor(plugins): drop dead bundled-source guard in _discover_all_pl…
guillaumemeyer May 16, 2026
5cbe0b1
test(plugins): cover _discover_all_plugins recursion + cross-link loader
guillaumemeyer May 16, 2026
3b39096
Port from Kilo-Org/kilocode#9434: strip historical media after compre…
teknium1 May 17, 2026
885d124
refactor(run_agent): extract message sanitization to agent/message_sa…
teknium1 May 17, 2026
59f1c0f
refactor(run_agent): extract tool-dispatch helpers to agent/tool_disp…
teknium1 May 17, 2026
5f309ae
refactor(run_agent): extract OpenAI proxy, safe stdio, IterationBudget
teknium1 May 17, 2026
1f6eb17
refactor(run_agent): extract background memory/skill review to agent/…
teknium1 May 17, 2026
5311d99
refactor(run_agent): extract context compression to agent/conversatio…
teknium1 May 17, 2026
2d2cd5e
refactor(run_agent): extract system-prompt builder to agent/system_pr…
teknium1 May 17, 2026
7955921
refactor(run_agent): extract tool execution to agent/tool_executor.py
teknium1 May 17, 2026
57f6762
refactor(run_agent): extract stream diagnostics to agent/stream_diag.py
teknium1 May 17, 2026
4b25619
refactor(run_agent): extract chat-completion helpers to agent/chat_co…
teknium1 May 17, 2026
0430e71
refactor(run_agent): extract streaming API caller (893 LOC) to agent/…
teknium1 May 17, 2026
c42fa94
refactor(run_agent): extract Codex runtime + assorted helpers to dedi…
teknium1 May 17, 2026
d35ee7b
refactor(run_agent): move review prompts to agent/background_review.py
teknium1 May 17, 2026
0530252
refactor(run_agent): extract run_conversation to agent/conversation_l…
teknium1 May 17, 2026
9f40898
refactor(run_agent): extract __init__ (1,381 LOC) to agent/agent_init.py
teknium1 May 17, 2026
407a11b
feat(discord): allow_any_attachment config to accept arbitrary file t…
teknium1 May 17, 2026
a1e3d79
docs: add hermes-eval to Community section
Saurav0989 May 16, 2026
df80bda
docs: add Hermes MemPalace to Community plugins section
kjames2001 May 16, 2026
d5ce85c
docs: add computer-use-linux community MCP
avifenesh May 14, 2026
31a8058
docs(delegation): show api_mode override in custom-endpoint example
r266-tech May 16, 2026
86f3776
docs(delegation): document api_mode wire-protocol override from #26824
r266-tech May 16, 2026
6f7292a
docs(cron): document name-based job lookup from #26231
r266-tech May 15, 2026
49bd95c
docs(security): document YOLO mode visual indicators added in #26238
r266-tech May 15, 2026
c741eac
docs(spotify): document Home Assistant speaker routing
BROCCOLO1D May 17, 2026
903ac23
docs(dashboard): clarify chat tab tui flag
aqilaziz May 15, 2026
21078eb
fix(fallback): forward custom_providers to fallback model context-len…
PaTTeeL May 17, 2026
7244116
feat(agent): Added gemma 4 to reasoning allowlist
matthewlai May 13, 2026
96b7f3d
chore(release): AUTHOR_MAP entries for batch salvage contributors
teknium1 May 17, 2026
973f27e
fix(run_agent): isolate background review fork from external memory p…
teknium1 May 17, 2026
94c3e0a
refactor(run_agent): extract 10 more helpers to agent/agent_runtime_h…
teknium1 May 17, 2026
290bf93
fix(tui): harden Terminal.app render behavior
OutThisLife May 17, 2026
9b2d581
fix(cli): satisfy ruff encoding requirement in send_cmd
OutThisLife May 17, 2026
7e1788d
fix(tui): harden ansi sanitizers for dangling CSI
OutThisLife May 17, 2026
a65f723
fix(review): address Copilot follow-up on sanitizer and file decode e…
OutThisLife May 17, 2026
9f182bd
Merge pull request #27251 from NousResearch/bb/skin-render-magenta-bleed
OutThisLife May 17, 2026
32c3f06
docs(readme): remove hermes-eval and Hermes MemPalace from Community …
teknium1 May 17, 2026
4e9cedc
fix(gateway): add missing logger definition to prevent NameError in _…
0xchainer May 16, 2026
57feef3
test(gateway): add smoke test for logger init (regression guard for #…
0xchainer May 16, 2026
a81cfd0
chore(release): map 0xchainer and kronexoi emails for upcoming salvages
teknium1 May 17, 2026
6053188
fix: remove unused import and hoist module-level constant
0xchainer May 16, 2026
4b17c24
fix(skills): return None instead of truthy stub when skill load fails
0xchainer May 16, 2026
782d743
test(skills): add regression test for skill load failure returning None
0xchainer May 16, 2026
1eadb06
fix(kanban): --severity filter uses >= comparison per documented beha…
shellybotmoyer May 17, 2026
8d756a4
fix(run_agent): guard memory provider init against empty/whitespace s…
ether-btc May 15, 2026
7282ef1
fix: add paste collapse logging to aid debugging
LifeJiggy May 15, 2026
4279da4
fix(windows): make PowerShell installer parse in 5.1
nekwo May 15, 2026
7d09bb1
fix(delegate): tool_trace false-positive error detection for short ou…
flooryyyy May 15, 2026
508b022
feat(gateway): add .ts/.py/.sh to SUPPORTED_DOCUMENT_TYPES
dgians May 17, 2026
1a4e64b
fix(credential_pool): parse ISO-string last_status_at during from_dic…
shellybotmoyer May 17, 2026
5f72dd8
fix(install): use resolved python variable in setup_open_webui.sh
flanny7 May 16, 2026
9a9f8a6
fix(run_agent): detect kimi models via model name for reasoning pad
hermesagent26 May 17, 2026
773a0fa
fix(deepseek): set default_aux_model on profile so aux warning stops …
teknium1 May 17, 2026
e90a52d
chore(release): AUTHOR_MAP entries for batch salvage group 2 contribu…
teknium1 May 17, 2026
ea2ee51
fix(teams): fall back to default port on invalid port config
kronexoi May 16, 2026
e5f19af
feat(install.ps1): stage protocol + Windows clean-VM hardening pass
jquesnelle May 17, 2026
c0b64f0
fix(install.ps1): address Copilot review on #27224
jquesnelle May 17, 2026
3925be2
fix(install.ps1): trim completion banner + strip em-dash in test
teknium1 May 17, 2026
fb138d9
fix(install.ps1): Stage-Node honest reporting + reject empty -Stage
teknium1 May 17, 2026
4782379
refactor(run_agent): review fixes — keyword-forward __init__, drop de…
teknium1 May 17, 2026
8d4766a
fix(api_server): coerce stringified booleans in request payloads
Sylw3ster May 15, 2026
bde3c79
fix: preserve discover_models in _normalize_custom_provider_entry
darvsum May 16, 2026
75e5d0f
fix: strip image parts for non-vision models with provider profiles
hueilau May 17, 2026
5338250
fix(gateway): add direct_messages_topic_id for synthetic Telegram DM …
Timur00Kh May 16, 2026
8bf0945
fix(windows): suppress console window flash on subprocess spawns
Grogger May 16, 2026
6f50c26
fix(model-switch): probe /models for custom providers without api_key
lemassykoi May 17, 2026
6158964
feat: inject current time into goal judge prompt
draplater May 17, 2026
7a7e78a
fix(cron): prevent parallel job result loss on exception
pr7426 May 16, 2026
a52f014
fix(tests): mock keychain in TestReadClaudeCodeCredentials to prevent…
therahul-yo May 15, 2026
8973b00
fix(scripts): fix UnicodeEncodeError in footgun checker on Windows
flamiinngo May 17, 2026
04bb307
chore(release): AUTHOR_MAP entries for batch salvage group 3 contribu…
teknium1 May 17, 2026
c1ae18e
fix(gateway): add trust_env=True to aiohttp sessions in SMS, Slack, T…
EloquentBrush0x May 15, 2026
fdd455b
fix(gateway): avoid zsh status variable in update wrapper
subtract0 May 17, 2026
364a1dd
Local: doctor uses x-goog-api-key for Google generativelanguage endpoint
zwolniony May 17, 2026
a301750
fix(gateway): preserve underscores in plain-text identifiers
that-ambuj May 15, 2026
0afab4a
feat(gateway): extract auto-TTS markdown strip into prepare_tts_text(…
francip May 15, 2026
b389796
fix(auxiliary): resolve api_key_env alias in named custom provider pa…
zccyman May 13, 2026
5631345
[agent] fix: harden api server response headers
lidge-jun May 16, 2026
52c8971
fix: respect user-configured vision model for OpenRouter
phoenixshen May 17, 2026
35b7bef
fix(line): add trust_env=True to all _LineClient aiohttp sessions
AhmetArif0 May 15, 2026
7322816
chore(release): AUTHOR_MAP entries for batch salvage group 4 contribu…
teknium1 May 17, 2026
152d42d
Merge origin/main into pr-27248 (resolving run_agent.py = ours)
teknium1 May 17, 2026
8f3bc17
feat(agent): Added gemma 4 to reasoning allowlist
matthewlai May 13, 2026
94b3131
fix(run_agent): detect kimi models via model name for reasoning pad
hermesagent26 May 17, 2026
a77ca92
perf(run_agent): accumulate length-continuation prefix via list+join
teknium1 May 17, 2026
7d221aa
fix(langfuse): complete observability fix — port to extracted convers…
teknium1 May 17, 2026
b07524e
feat(xai-oauth): add xAI Grok OAuth (SuperGrok Subscription) provider…
teknium1 May 17, 2026
27df249
feat(nvidia): add NIM billing origin header — port to extracted modules
teknium1 May 17, 2026
6362e71
fix(xai-oauth): recover from prelude SSE errors, gate reasoning repla…
teknium1 May 17, 2026
408aa4f
port(refactor): deepseek thinking-mode (068c24f8a + cd9470f41) — no n…
teknium1 May 17, 2026
6975a2d
fix(xai-oauth): entitlement-403 chain — final state (ce0e189d3 + 9818…
teknium1 May 17, 2026
f885be0
fix(auxiliary): resolve xai oauth compression from pool — port to con…
teknium1 May 17, 2026
fe4c87e
fix(agent): retry malformed anthropic stream parser errors — port to …
teknium1 May 17, 2026
3fbedd7
feat: add supports_parallel_tool_calls for MCP servers (#26825) — por…
teknium1 May 17, 2026
df22d29
fix(copilot): GitHub Models 413 hint — port to extracted conversation…
teknium1 May 17, 2026
80fa92a
fix(codex): rotate pool on usage limit 429 — port to extracted modules
teknium1 May 17, 2026
aa05ffb
fix(xai): surface provider 'error' SSE frame in Codex fallback stream…
teknium1 May 17, 2026
4ab9a06
fix(agent): reset _fallback_index at turn start even when no fallback…
teknium1 May 17, 2026
b5bcffe
fix(fallback): forward custom_providers to fallback model context-len…
teknium1 May 17, 2026
4ece521
fix(run_agent): isolate background review fork from external memory p…
teknium1 May 17, 2026
36ad833
fix(run_agent): guard memory provider init against empty/whitespace s…
teknium1 May 17, 2026
563b4d9
fix: strip image parts for non-vision models with provider profiles +…
teknium1 May 17, 2026
56ad30d
Merge pull request #27248 from NousResearch/hermes/hermes-27dc9cc2
teknium1 May 17, 2026
519657a
fix(matrix): warn on clock-skew silent message drops (#12614) (#27330)
kshitijk4poor May 17, 2026
ad1aa1a
feat(x_search): auto-enable toolset when xAI OAuth or XAI_API_KEY is …
teknium1 May 17, 2026
a9ba636
fix(tools): run post_setup in _reconfigure_provider() for env-var pro…
EloquentBrush0x May 15, 2026
cc59880
chore(release): map EloquentBrush0x email for #26642 salvage
teknium1 May 17, 2026
ad00777
fix(mcp-oauth): print SSH tunnel hint in _redirect_handler
EloquentBrush0x May 16, 2026
5fba236
chore: ruff auto-fix PLR6201 resweep — tuple → set in membership test…
kshitijk4poor May 17, 2026
d87b27c
fix(gateway): add codex runtime telegram alias
YanzhongSu May 14, 2026
5a2a858
test(restart_drain): assert i18n catalog resolved (#22266)
haran2001 May 17, 2026
d9abbe7
fix(metadata): qwen3.6-plus has a 1M context window (#27008)
haran2001 May 17, 2026
3c51da1
fix(cli): sync _skill_commands after /reload-skills so Tab completion…
ms-alan May 17, 2026
6622277
fix ACP start events for polished tools
godlin-gh May 15, 2026
8e3cfdf
fix(webui): allow native text selection in chat via xterm.js bypass (…
wesleysimplicio May 17, 2026
aeda146
fix(security): honor shell hook blocks even when message/reason is ab…
flamiinngo May 17, 2026
6380596
fix(security): restore type safety and extract constant in shell hook…
flamiinngo May 17, 2026
dbeaaa4
refactor(security): extract _block_message helper to unify block logi…
flamiinngo May 17, 2026
c9298bb
fix(doctor): SSH check ignores TERMINAL_SSH_USER, TERMINAL_SSH_PORT, …
Carry00 May 16, 2026
1856bd9
fix(telegram): re-trigger typing indicator after sending messages
alaamohanad169-ship-it May 15, 2026
c02606a
chore(deps): lazy-install boto3/botocore for bedrock adapter
hawknewton May 17, 2026
150b577
chore(release): AUTHOR_MAP entries for batch salvage group 5 contribu…
teknium1 May 17, 2026
c6e6909
feat(browser): add BrowserProvider ABC mirroring web_search_provider …
kshitijk4poor May 14, 2026
b8138ac
feat(browser): browserbase plugin (spike — first migration)
kshitijk4poor May 14, 2026
a15cdfb
feat(browser): browser-use + firecrawl plugins; drop single-eligible …
kshitijk4poor May 14, 2026
40fde85
refactor(browser): dispatch _get_cloud_provider through agent.browser…
kshitijk4poor May 14, 2026
1b9c539
feat(tools): mirror image_gen plugin-injection in Browser Automation …
kshitijk4poor May 14, 2026
250caeb
refactor(browser): delete tools/browser_providers/ directory; migrate…
kshitijk4poor May 14, 2026
fec0a0d
test(plugins/browser): coverage for the 3-plugin migration
kshitijk4poor May 14, 2026
1bb6f03
fix(browser): ensure plugin discovery before registry lookup; parity …
kshitijk4poor May 14, 2026
c74ff2c
fix(browser): self-review pass — dead-import, log levels, future-proo…
kshitijk4poor May 14, 2026
f36c89c
fix(plugins/browser): carry forward requests.RequestException wrapping
teknium1 May 17, 2026
b38554a
chore: sync with upstream main (2026-05-17)
May 17, 2026
af727a1
fix: regenerate uv.lock after upstream sync
May 17, 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
  •  
  •  
  •  
58 changes: 58 additions & 0 deletions .github/workflows/history-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: History Check

# Rejects PRs whose branch has no common ancestor with main.
#
# In May 2026 PR #25045 was merged from a branch that had been disconnected
# from main's history (likely an accidental `git checkout --orphan` or
# `.git/` re-init). GitHub's merge UI does not refuse merges of unrelated
# histories, so the PR landed cleanly with the intended one-file change —
# but its parent-less root commit (413990c94) got grafted into main as a
# second root, and ~1500 files' worth of `git blame` history collapsed
# onto that single commit.
#
# This check catches the failure mode by requiring `git merge-base` between
# the PR head and main to be non-empty.

on:
pull_request:
branches: [main]

permissions:
contents: read

jobs:
check-common-ancestor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0 # full history both sides for merge-base

- name: Reject PRs with no common ancestor on main
run: |
# `git merge-base` exits non-zero AND prints nothing when the two
# commits share no ancestor. We check both conditions explicitly
# so the failure message is clear regardless of which signal fires
# first.
if ! BASE=$(git merge-base origin/main HEAD 2>/dev/null) || [ -z "$BASE" ]; then
echo ""
echo "::error::This PR has no common ancestor with main."
echo ""
echo "Your branch's history is disconnected from main. Common causes:"
echo " - the branch was created with 'git checkout --orphan'"
echo " - '.git/' was re-initialized at some point during the work"
echo " - the branch was force-pushed from an unrelated repository"
echo ""
echo "Merging an unrelated-history PR grafts a parent-less root commit"
echo "into main and collapses git blame for every file in that snapshot."
echo "Reference: PR #25045 caused this and re-rooted blame on ~1500"
echo "files to a single orphan commit."
echo ""
echo "To fix, rebase your changes onto current main:"
echo " git fetch origin main"
echo " git checkout -b fix-branch origin/main"
echo " # re-apply your changes (cherry-pick, copy files, etc.)"
echo " git push -f origin fix-branch"
exit 1
fi
echo "::notice::Common ancestor with main: $BASE"
26 changes: 26 additions & 0 deletions .github/workflows/upload_to_pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,32 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6

- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: '22'

- name: Build web dashboard
run: cd web && npm ci && npm run build

- name: Build TUI bundle
run: cd ui-tui && npm ci && npm run build

- name: Bundle TUI into hermes_cli
run: |
mkdir -p hermes_cli/tui_dist
cp ui-tui/dist/entry.js hermes_cli/tui_dist/entry.js

- name: Verify frontend assets exist
run: |
test -f hermes_cli/web_dist/index.html || { echo "ERROR: web_dist not built"; exit 1; }
test -f hermes_cli/tui_dist/entry.js || { echo "ERROR: tui_dist not built"; exit 1; }

- name: Bundle install.sh into wheel
run: |
mkdir -p hermes_cli/scripts
cp scripts/install.sh hermes_cli/scripts/install.sh

- name: Build wheel and sdist
run: uv build --sdist --wheel

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,6 @@ mini-swe-agent/
result
website/static/api/skills-index.json
models-dev-upstream/
hermes_cli/tui_dist/*
hermes_cli/scripts/
docs/superpowers/*
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ scripts/run_tests.sh
- 💬 [Discord](https://discord.gg/NousResearch)
- 📚 [Skills Hub](https://agentskills.io)
- 🐛 [Issues](https://github.com/NousResearch/hermes-agent/issues)
- 🔌 [computer-use-linux](https://github.com/avifenesh/computer-use-linux) — Linux desktop-control MCP server for Hermes and other MCP hosts, with AT-SPI accessibility trees, Wayland/X11 input, screenshots, and compositor window targeting.
- 🔌 [HermesClaw](https://github.com/AaronWong1999/hermesclaw) — Community WeChat bridge: Run Hermes Agent and OpenClaw on the same WeChat account.

---
Expand Down
479 changes: 479 additions & 0 deletions RELEASE_v0.14.0.md

Large diffs are not rendered by default.

77 changes: 74 additions & 3 deletions acp_adapter/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from typing import Any, Callable, Deque, Dict

import acp
from acp.schema import AgentPlanUpdate, PlanEntry

from .tools import (
build_tool_complete,
Expand All @@ -24,17 +25,83 @@
logger = logging.getLogger(__name__)


def _json_loads_maybe_prefix(value: str) -> Any:
"""Parse a JSON object even when Hermes appended a human hint after it."""
text = value.strip()
try:
return json.loads(text)
except Exception:
decoder = json.JSONDecoder()
data, _ = decoder.raw_decode(text)
return data


def _build_plan_update_from_todo_result(result: Any) -> AgentPlanUpdate | None:
"""Translate Hermes' todo tool result into ACP's native plan update.

Zed renders ``sessionUpdate: plan`` as its first-class task/todo panel. The
Hermes agent already maintains task state through the ``todo`` tool, so the
ACP adapter should expose that state natively instead of only as a generic
tool-call transcript block.
"""
if not isinstance(result, str) or not result.strip():
return None

try:
data = _json_loads_maybe_prefix(result)
except Exception:
return None

if not isinstance(data, dict) or not isinstance(data.get("todos"), list):
return None

todos = data["todos"]
if not todos:
return AgentPlanUpdate(session_update="plan", entries=[])

status_map = {
"pending": "pending",
"in_progress": "in_progress",
"completed": "completed",
# ACP plans only support pending/in_progress/completed. Preserve
# cancelled tasks as terminal entries instead of dropping them and
# making the client's full-list replacement lose visible context.
"cancelled": "completed",
}
entries: list[PlanEntry] = []
for item in todos:
if not isinstance(item, dict):
continue
content = str(item.get("content") or item.get("id") or "").strip()
if not content:
continue
raw_status = str(item.get("status") or "pending").strip()
status = status_map.get(raw_status, "pending")
if raw_status == "cancelled":
content = f"[cancelled] {content}"
entries.append(PlanEntry(content=content, priority="medium", status=status))

return AgentPlanUpdate(session_update="plan", entries=entries)


def _send_update(
conn: acp.Client,
session_id: str,
loop: asyncio.AbstractEventLoop,
update: Any,
) -> None:
"""Fire-and-forget an ACP session update from a worker thread."""
from agent.async_utils import safe_schedule_threadsafe

future = safe_schedule_threadsafe(
conn.session_update(session_id, update),
loop,
logger=logger,
log_message="Failed to send ACP update",
)
if future is None:
return
try:
future = asyncio.run_coroutine_threadsafe(
conn.session_update(session_id, update), loop
)
future.result(timeout=5)
except Exception:
logger.debug("Failed to send ACP update", exc_info=True)
Expand Down Expand Up @@ -168,6 +235,10 @@ def _step(api_call_count: int, prev_tools: Any = None) -> None:
snapshot=meta.get("snapshot"),
)
_send_update(conn, session_id, loop, update)
if tool_name == "todo":
plan_update = _build_plan_update_from_todo_result(result)
if plan_update is not None:
_send_update(conn, session_id, loop, plan_update)
if not queue:
tool_call_ids.pop(tool_name, None)

Expand Down
27 changes: 17 additions & 10 deletions acp_adapter/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,21 +111,28 @@ def _callback(
allow_permanent: bool = True,
**_: object,
) -> str:
from agent.async_utils import safe_schedule_threadsafe

options = _build_permission_options(allow_permanent=allow_permanent)

future = None
tool_call = _build_permission_tool_call(command, description)
coro = request_permission_fn(
session_id=session_id,
tool_call=tool_call,
options=options,
)
future = safe_schedule_threadsafe(
coro, loop,
logger=logger,
log_message="Permission request: failed to schedule on loop",
)
if future is None:
return "deny"

try:
tool_call = _build_permission_tool_call(command, description)
coro = request_permission_fn(
session_id=session_id,
tool_call=tool_call,
options=options,
)
future = asyncio.run_coroutine_threadsafe(coro, loop)
response = future.result(timeout=timeout)
except (FutureTimeout, Exception) as exc:
if future is not None:
future.cancel()
future.cancel()
logger.warning("Permission request timed out or failed: %s", exc)
return "deny"

Expand Down
Loading
Loading