Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
774 commits
Select commit Hold shift + click to select a range
f456f30
fix(gateway): refuse to write service definitions with a temp-dir HER…
teknium1 Jun 11, 2026
a09343c
feat(dashboard): SKILL.md editor on Skills page + attach-skill select…
teknium1 Jun 11, 2026
d0e017b
fix(gateway): gate oversized Telegram voice/audio before download (#4…
austinpickett Jun 11, 2026
e372803
fix(desktop): refresh session model metadata on switch (#43977)
OmarB97 Jun 11, 2026
b1af653
fix(desktop): Harden local file tree paths (#43618)
yucode-kk Jun 11, 2026
e24c935
fix(bedrock): fall back to non-streaming InvokeModel when IAM denies …
teknium1 Jun 11, 2026
9c051f5
fix(dashboard): Anthropic API Key entry checks ANTHROPIC_API_KEY, not…
teknium1 Jun 11, 2026
2ecb4e6
Merge remote-tracking branch 'origin/main' into hermes/hermes-6b48295e
teknium1 Jun 11, 2026
52c7976
fix(whatsapp-cloud): review follow-ups for #43921
teknium1 Jun 11, 2026
ee1a744
fix(agent): demote non-coding skill categories to names-only — never …
OutThisLife Jun 11, 2026
dca11b6
fix(mcp): preserve stdio argv passthrough
helix4u Jun 10, 2026
b2043cf
fix(tui): decode startup subprocess output as utf-8
helix4u Jun 10, 2026
5508f4b
fix(cli): utf-8 decode for whatsapp-bridge npm install capture (sibli…
teknium1 Jun 11, 2026
e71d746
fix(mcp): avoid false failed startup status
helix4u Jun 10, 2026
51f47f9
feat(desktop): add read-only remote filesystem API
yoniebans Jun 9, 2026
db79e90
feat(desktop): add filesystem routing facade
yoniebans Jun 9, 2026
8878484
feat(desktop): wire remote filesystem browsing
yoniebans Jun 9, 2026
56a0f48
fix(desktop): tighten remote filesystem wiring
yoniebans Jun 9, 2026
9121834
fix(desktop): scope remote workspace defaults
yoniebans Jun 10, 2026
c7bfc93
fix(dashboard): Config page header shows the switched profile's confi…
teknium1 Jun 11, 2026
4d6a133
fix(agent): gate skill-index demotion behind the opt-in focus mode (#…
teknium1 Jun 11, 2026
9a09ea6
feat(cron): Suggested Cron Jobs — one surface for proposed automations
teknium1 Jun 7, 2026
1593ca5
feat(cron): Cron Recipes — parameterized automation templates across …
teknium1 Jun 8, 2026
e976faa
feat(cron-recipes): /cron-recipe <name> seeds a conversational fill
teknium1 Jun 8, 2026
e8b7578
fix(cron-recipes): pre-release hardening — honest cadences, strict sl…
teknium1 Jun 10, 2026
3c489fd
fix(commands): unpin /reset from Slack priority aliases — registry hi…
teknium1 Jun 10, 2026
cb29e8a
refactor(cron): rebrand Cron Recipes -> Automation Blueprints
teknium1 Jun 11, 2026
a4f179c
fix(agent): steer GPT/Codex family to V4A for single-file edits too (…
OutThisLife Jun 11, 2026
8505e9d
fix(desktop): disable spellcheck on composer inputs (#44415)
OutThisLife Jun 11, 2026
93a2f68
fix(desktop): preserve explicit hide-all choice in model visibility d…
liuhao1024 Jun 11, 2026
743c55e
fix(desktop): stop file tree throwing "Cannot have two HTML5 backends…
xxxigm Jun 11, 2026
ce99a81
fix(dashboard): suppress unicode-animations postinstall during npm ci
austinpickett Jun 11, 2026
e7ae145
fix(gateway): guide the agent to read attached PDF/DOCX instead of pu…
xxxigm Jun 11, 2026
4e9be3e
test(gateway): cover document context note for PDF/DOCX vs text
xxxigm Jun 11, 2026
13650ab
fix(gateway): audio attachment note no longer steers the agent into p…
teknium1 Jun 11, 2026
020ef76
fix(discord): cancel _bot_task on connect() timeout to prevent zombie…
deaneeth Jun 11, 2026
08b1c44
fix(discord): extend bot-task cancellation to connect()'s generic exc…
teknium1 Jun 11, 2026
5e5308d
fix(node): fix @types/node version
ethernet8023 Jun 11, 2026
e080365
fix(tui): new weird typeerror
ethernet8023 Jun 11, 2026
c3464ec
fix(discord): recover from runtime gateway task exits (#44383)
austinpickett Jun 11, 2026
93764b9
fix(web): guarantee the keyless web default registers even if discove…
xxxigm Jun 11, 2026
32a7301
test(web): cover keyless default surviving a failed plugin sweep
xxxigm Jun 11, 2026
114e265
fix(plugins): don't cache a failed discovery sweep as discovered
teknium1 Jun 11, 2026
484f484
fix(desktop): carve sidebar nav rows out of the titlebar drag region …
OutThisLife Jun 11, 2026
d5e2fbf
fix(agent): frame compaction handoff sections as historical context
konsisumer Jun 11, 2026
8f8cad7
fix(agent): strengthen compression preamble against stale task execut…
kyssta-exe Jun 8, 2026
acb2954
fix(agent): freeze carveout-era SUMMARY_PREFIX for renormalization
teknium1 Jun 11, 2026
6c752ca
refactor(agent): tighten SUMMARY_PREFIX wording and fix stale doc ref…
teknium1 Jun 11, 2026
021ed69
docs: finish Automation Blueprints terminology rebrand (#44470)
austinpickett Jun 11, 2026
2ee69d0
fix(skills): let ClawHub index build walk past the 12s browse budget …
austinpickett Jun 11, 2026
7396977
fix(desktop): discover MCP tools for dashboard /api/ws backends (#44512)
OutThisLife Jun 11, 2026
b1fe210
fix(desktop): keep named-profile desktop backends per-profile (#44510)
OutThisLife Jun 11, 2026
d221e36
fix(desktop): recover from transient assistant-ui index-lookup crash …
mollusk Jun 11, 2026
9102d4a
fix(dashboard): show Windows 11 in host panel (#44511)
helix4u Jun 11, 2026
e96fe06
fix(desktop): use served dashboard token for websocket auth
jeffrobodie-glitch Jun 10, 2026
7a2d498
fix(desktop): route profile session reads
Evisolpxe Jun 11, 2026
e3ed772
fix(desktop): refuse a foreign backend's session token after readiness
OutThisLife Jun 11, 2026
9ff0ba0
fix(desktop): prevent backend port-squat boot loop and pickPort self-…
bionicbutterfly13 Jun 9, 2026
81436e1
fix(approval): carry allow_permanent to TUI + desktop approval prompts
OutThisLife Jun 11, 2026
cc726aa
refactor(desktop): fold served-token adoption + foreign-backend refus…
OutThisLife Jun 11, 2026
b097d7b
refactor(desktop): use native fetch in dashboard-token
OutThisLife Jun 11, 2026
55a18e6
chore(approval): tighten allow_permanent comments + DRY the no-always…
OutThisLife Jun 11, 2026
e2145a5
fix(ui-tui): stabilize embedded dashboard chat gateway (#44528)
austinpickett Jun 11, 2026
c6007e5
Merge pull request #44534 from NousResearch/bb/approval-allow-permanent
OutThisLife Jun 11, 2026
4ddb033
fix(desktop): collect + persist API key for custom OpenAI endpoints (…
OutThisLife Jun 12, 2026
880107a
Merge pull request #44529 from NousResearch/bb/desktop-profile-fallout
OutThisLife Jun 12, 2026
96cc7ee
fix(coding): don't provide worktree root in context
ethernet8023 Jun 12, 2026
5affecb
fix(mcp): capability-gate tools/list so prompt-only MCP servers can c…
teknium1 Jun 12, 2026
afe5370
Merge pull request #44545 from NousResearch/hermes-worktree-code
OutThisLife Jun 12, 2026
ab06ef8
fix(coding): teach agents terminal env state persists
OutThisLife Jun 12, 2026
9e484f0
Merge pull request #44559 from NousResearch/bb/persistent-terminal-env
OutThisLife Jun 12, 2026
6c00077
feat(desktop): auto-detect RTL/bidi text direction in chat
OutThisLife Jun 12, 2026
4d67ac6
Merge pull request #44596 from NousResearch/bb/desktop-rtl-bidi
OutThisLife Jun 12, 2026
09bcf5a
fix(desktop): move tool-row copy control into expanded body
OutThisLife Jun 12, 2026
6db65e6
Merge pull request #44627 from NousResearch/bb/desktop-tool-row-copy-…
OutThisLife Jun 12, 2026
6e41ca9
fix(desktop): bundle JetBrains Mono for the terminal pane (#44642)
OutThisLife Jun 12, 2026
24f74eb
fix(desktop): make file-preview source + markdown selectable (#44648)
OutThisLife Jun 12, 2026
62e937b
feat(plugins): expose register_slack_action_handler API
bcsmith528 May 6, 2026
08e8bed
fix(gateway): keep plugin action wrapper signature to (ack, body, act…
bcsmith528 May 6, 2026
e4c168b
chore: map bcsmith528 contributor email for attribution
kshitijk4poor Jun 12, 2026
c574170
Merge pull request #44664 from kshitijk4poor/salvage/slack-plugin-act…
kshitijk4poor Jun 12, 2026
82d5701
fix(slack): ack reaction lifecycle events
Veritas-7 Jun 9, 2026
889a136
fix(plugins): clear _plugin_platform_names on force-rediscover
kshitijk4poor Jun 12, 2026
44bd478
fix(plugins): credit shared hook/middleware/tool names to every plugin
kshitijk4poor Jun 12, 2026
b2d151a
fix(tools): strip default from $ref nodes in tool schemas
OutThisLife Jun 12, 2026
a35b370
Merge pull request #44674 from kshitijk4poor/fix/slack-reactions-plug…
kshitijk4poor Jun 12, 2026
a942bfd
fix(gateway): reset _last_flushed_db_idx when reusing cached agent (#…
kyssta-exe Jun 12, 2026
343803b
fix(cli): use subprocess on Windows for dashboard profile re-exec (#4…
kyssta-exe Jun 12, 2026
db7714d
Merge pull request #44331 from NousResearch/hermes/hermes-6b48295e
teknium1 Jun 12, 2026
434c684
fix(agent): focus automatic compression on recent user turns
konsisumer Jun 3, 2026
c7bee8f
refactor(agent): drop unused tail_start param from _derive_auto_focus…
teknium1 Jun 12, 2026
d6df38b
🐛 fix(cli): wrap long approval commands in prompt
BlackishGreen33 May 1, 2026
81cdbbd
🐛 fix(cli): wrap approval preview hints
BlackishGreen33 May 2, 2026
b3f5e17
fix(tui): wrap long approval commands in the Ink overlay
teknium1 Jun 12, 2026
d810f2b
Merge pull request #44676 from NousResearch/bb/fix-schema-ref-default
OutThisLife Jun 12, 2026
87893fe
fix(memory): flatten multimodal content before provider sync
erosika Jun 11, 2026
15439be
refactor(memory): reuse _summarize_user_message_for_log instead of fo…
kshitijk4poor Jun 12, 2026
046f444
Merge pull request #44738 from kshitijk4poor/salvage/memory-sync-mult…
kshitijk4poor Jun 12, 2026
906bee9
fix(nix): natively compile and correctly stage node-pty for desktop app
ethernet8023 Jun 11, 2026
c196269
fix(credits): suppress usage gauge when top-up funds exist + add disp…
teknium1 Jun 12, 2026
0a963d8
feat(photon): add telemetry toggle via `hermes photon telemetry`
underthestars-zhy Jun 11, 2026
573c4e6
feat(photon): upgrade to spectrum-ts 3.0.0 (pinned) with markdown + r…
underthestars-zhy Jun 11, 2026
a652131
fix(photon): stop gateway restarts from orphaning the sidecar on its …
underthestars-zhy Jun 11, 2026
9bfff6e
chore(photon): bump spectrum-ts to 3.1.0
underthestars-zhy Jun 11, 2026
a23c0b3
fix(photon): use per-call httpx client in _sidecar_call
underthestars-zhy Jun 11, 2026
156f4fb
feat(photon): add agent-facing emoji reaction support
underthestars-zhy Jun 11, 2026
23305cf
fix(photon): normalize DM chat keys in last-inbound reaction tracker
underthestars-zhy Jun 11, 2026
b4e95a2
fix(photon): add clarifying comments for Windows-safe os.kill usage
underthestars-zhy Jun 11, 2026
05470aa
feat(messaging): expose action='unreact' in send_message + react disp…
teknium1 Jun 12, 2026
8207ae8
fix(gateway): add Signal message type classification for documents
kdunn926 Apr 20, 2026
ffef9da
test(gateway): verify Signal inbound PDF attachment sets MessageType.…
kdunn926 Apr 20, 2026
8e821cd
test(gateway): verify Signal inbound text attachment sets MessageType…
kdunn926 Apr 20, 2026
1e29ab3
fix(gateway): classify Signal video attachments + catch-all DOCUMENT …
teknium1 Jun 12, 2026
f03f161
fix(gateway): classify email document attachments as DOCUMENT
teknium1 Jun 12, 2026
74180eb
fix(gateway): classify SimpleX non-image/non-audio files as DOCUMENT
teknium1 Jun 12, 2026
8b2a3c9
chore: add kdunn926 to AUTHOR_MAP
teknium1 Jun 12, 2026
286ecd2
fix(agent): strip MEDIA directives from compressor summarizer input (…
Tranquil-Flow Apr 24, 2026
8e5b759
refactor(agent): hoist MEDIA-directive regex to module level
teknium1 Jun 12, 2026
4474873
feat(cli): persist resolved approval/clarify prompts in scrollback (#…
teknium1 Jun 12, 2026
7ba5df0
feat(billing): /credits command — balance + portal top-up handoff (#4…
alt-glitch Jun 12, 2026
0fd34e8
fix(teams): cache document/video/audio attachments and classify as DO…
teknium1 Jun 12, 2026
e20e0bd
feat(Yuanbao): support wechat forward msg (#43508)
loongfay Jun 12, 2026
88dbf95
fix(dashboard): profile-scope Channels endpoints and seed per-profile…
teknium1 Jun 12, 2026
9c50521
fix(desktop): complete backend PATH for Homebrew Codex
y0shua1ee Jun 12, 2026
d62979a
feat(desktop): composer status stack, live subagent windows, editable…
OutThisLife Jun 12, 2026
79c3ed3
fix(desktop): new chat honours the active profile instead of rubberba…
OutThisLife Jun 12, 2026
7d4e60e
docs(website): redirect old automation-templates URL to automation-bl…
SHL0MS Jun 12, 2026
46d758b
feat(desktop): window translucency slider in Appearance settings (#45…
OutThisLife Jun 12, 2026
2f9d187
fix(ci): remove pytest-timeout, use per-file timeout only
ethernet8023 Jun 10, 2026
c41a653
fix(tests): mock subprocess.Popen in all _handle_update_command tests
ethernet8023 Jun 12, 2026
6ff39c3
fix(tests): guard against real 'hermes update' subprocess spawns in c…
ethernet8023 Jun 12, 2026
4d68984
fix(tests): remove no-longer-needed forensics
ethernet8023 Jun 12, 2026
8044bf0
fix(ci): only save test durations when tests pass
ethernet8023 Jun 10, 2026
1e25358
refactor(desktop): use port 0 for ephemeral port discovery instead of…
ethernet8023 Jun 12, 2026
c618152
Update model correctly when updating from dashboard
IAvecilla Jun 11, 2026
8c3c08c
Update implementation to make it cleaner
IAvecilla Jun 11, 2026
bc3f4ed
Skip redundant model switch
IAvecilla Jun 12, 2026
6b40736
fix(tui): config.yaml wins over env model seed in per-turn sync
teknium1 Jun 12, 2026
05b9c84
Add Telegram Bot API 10.1 rich message support
AliZakaee Jun 12, 2026
652dd9c
fix: rich messages follow-ups — reply_parameters, send latch, opt-in …
teknium1 Jun 12, 2026
fa5e98f
fix(send): helpful error when --file gets a binary; document MEDIA: a…
teknium1 Jun 12, 2026
331cb38
fix: stop Discord typing after replies
itsflownium Jun 12, 2026
c2326bc
chore: add itsflownium to AUTHOR_MAP
teknium1 Jun 12, 2026
dc46748
test: assert typing-stop-before-callback as an invariant, not a call …
teknium1 Jun 12, 2026
2714fc8
fix(agent): re-enter retry loop on genuine Nous 429 so fallback guard…
Jun 12, 2026
fca84fe
test: regression guard for Nous 429 fallback re-entry; AUTHOR_MAP entry
teknium1 Jun 12, 2026
9b01c4d
fix(update): never spawn an interactive polkit prompt when restarting…
teknium1 Jun 12, 2026
bba9b51
fix(delegation): remove the default subagent wall-clock timeout (#45149)
teknium1 Jun 12, 2026
a118b94
fix(dashboard): skill installs from the dashboard silently auto-cance…
teknium1 Jun 12, 2026
749b721
fix(compression): always append END OF CONTEXT SUMMARY marker to stan…
Tranquil-Flow May 27, 2026
0db5cb8
refactor(agent): hoist summary end marker to _SUMMARY_END_MARKER; str…
teknium1 Jun 12, 2026
2e874ef
fix(desktop): allow dismissing settled tool rows
helix4u Jun 12, 2026
b16e22b
fix(desktop): persist tool-row dismissal across virtualization; keep …
OutThisLife Jun 12, 2026
7a318aa
fix(profiles): exclude session history, backups, and snapshots from -…
teknium1 Jun 12, 2026
691ff7c
fix(compressor): keep last visible assistant reply out of compaction …
xxxigm May 21, 2026
2fef3e2
fix(webui): split merge-into-tail compaction so reply renders as its …
xxxigm May 21, 2026
68536d4
test(compressor): regression coverage for assistant-tail anchor + com…
xxxigm May 21, 2026
135fe90
fix(profiles): backfill .env for pre-existing profiles on hermes upda…
teknium1 Jun 12, 2026
bbf020e
feat(desktop): follow streaming output at bottom + jump-to-bottom but…
OutThisLife Jun 12, 2026
e906726
feat(desktop): worktree-aware sidebar grouping + composer/sidebar UX …
OutThisLife Jun 12, 2026
0595af0
feat(desktop): move workspace/worktree drag handle into the leading icon
OutThisLife Jun 12, 2026
aec3885
fix(agent): preserve recent turns during compression
konsisumer Jun 12, 2026
5d0408d
fix(agent): clamp flush cursor after repair_message_sequence compacti…
kyssta-exe Jun 12, 2026
8905ee6
fix(agent): rewind flush cursor exactly when repair compacts before t…
teknium1 Jun 12, 2026
dd12a54
refactor(desktop): extract shared WorkspaceHeader for repo + worktree…
OutThisLife Jun 12, 2026
1899c8f
fix(skills): run youtube transcript helper through uv
helix4u Jun 12, 2026
956af7f
fix(agent): add metadata flag to context compression summary messages…
kyssta-exe Jun 12, 2026
7e46533
test: compressed-summary metadata flag set in-process, stripped on wire
teknium1 Jun 12, 2026
9688c1a
chore: add Kimi K2.7 code catalog slug (#45283)
teknium1 Jun 12, 2026
1a3cd3d
refactor(desktop): collapse sidebar drag-reorder into one generic Reo…
OutThisLife Jun 12, 2026
78ce917
fix(desktop): crisp terminal text via opaque xterm canvas
OutThisLife Jun 13, 2026
a1c6349
Merge branch 'main' of github.com:NousResearch/hermes-agent into bb/s…
OutThisLife Jun 13, 2026
d14f6c9
fix(desktop): stop streaming autoscroll bounce; move attachments belo…
OutThisLife Jun 13, 2026
a86b7b3
Merge pull request #45273 from NousResearch/bb/sidebar-workspace-dedup
OutThisLife Jun 13, 2026
7c226cc
perf(desktop): isolate streaming re-renders & cut layout thrash
OutThisLife Jun 13, 2026
edc36f3
perf(desktop): incremental markdown rendering during streams
OutThisLife Jun 13, 2026
3cf7d43
perf(desktop): faster session resume & warm AudioContext at idle
OutThisLife Jun 13, 2026
d62e9b7
build(nix): refresh npmDepsHash for the remend dependency
OutThisLife Jun 13, 2026
492c402
perf(desktop): cut GUI streaming & interaction lag (#45343)
OutThisLife Jun 13, 2026
7d183f6
fix(desktop): theme the image-gen placeholder instead of a white squa…
OutThisLife Jun 13, 2026
bf090de
fix(desktop): stop stranding queued prompts across backend bounces
OutThisLife Jun 13, 2026
f23a4b7
fix(desktop): keep queued drains quiet on transient "session busy"
OutThisLife Jun 13, 2026
1891637
fix(desktop): never surface "session busy" — retry every submit past it
OutThisLife Jun 13, 2026
7f302c9
chore: uptick
OutThisLife Jun 13, 2026
1e755ff
fix(desktop): keep recents sorted unless manually reordered (#45404)
helix4u Jun 13, 2026
a856276
Merge pull request #45414 from NousResearch/bb/fix-desktop-queue-drai…
OutThisLife Jun 13, 2026
76b9386
fix(desktop): rebuild thread autoscroll on use-stick-to-bottom
OutThisLife Jun 13, 2026
0a7a818
Merge pull request #45255 from NousResearch/bb/desktop-stuck-tool-rows
OutThisLife Jun 13, 2026
45ceee8
Merge branch 'main' of github.com:NousResearch/hermes-agent into bb/d…
OutThisLife Jun 13, 2026
7768715
fix(desktop): tighten multiline user prompt spacing
OutThisLife Jun 13, 2026
be6713c
fix(nix): refresh npm deps hash
OutThisLife Jun 13, 2026
acd4278
fix(nix): use fetchNpmDeps hash from flake check
OutThisLife Jun 13, 2026
b15dc58
fix(desktop): keep generated images in the tool slot, not inline
OutThisLife Jun 13, 2026
b82d2e5
fix(desktop): keep the diffusion placeholder circular at any aspect
OutThisLife Jun 13, 2026
9cd3d8a
Merge pull request #45466 from NousResearch/bb/fix-image-generation-p…
OutThisLife Jun 13, 2026
b2bc48c
Merge branch 'main' into bb/desktop-stick-to-bottom
OutThisLife Jun 13, 2026
b6c7ebf
fix(tui): honor provider_routing config in the desktop/TUI backend (#…
xxxigm Jun 13, 2026
bdd3868
fix(desktop): keep profile color picker open from the context menu (#…
OutThisLife Jun 13, 2026
3803e5f
fix(agent): don't treat custom:<name> pools as cross-provider mismatc…
teknium1 Jun 13, 2026
bc060c7
fix(models): remove unavailable claude-fable-5 (#45492)
teknium1 Jun 13, 2026
b62e57b
Merge pull request #45445 from NousResearch/bb/desktop-stick-to-bottom
OutThisLife Jun 13, 2026
8cf9d86
fix(desktop): keep composer usable during reconnect (#45488)
teknium1 Jun 13, 2026
197337c
fix(gateway): suppress duplicate final stream sends (#45517)
teknium1 Jun 13, 2026
2a5dc0e
fix(slack): make video attachments available to agents (#45512)
teknium1 Jun 13, 2026
2d474e3
fix(acp): preserve memory provider tools
helix4u Jun 12, 2026
202e318
fix(gateway): sync compression session splits before failures
justinbao19 Jun 13, 2026
266b5a1
feat(desktop): expand the full command inline from the approval bar
xxxigm Jun 12, 2026
5d6c16e
test(desktop): cover the inline command expander on the approval bar
xxxigm Jun 12, 2026
a5e9b17
fix(doctor): stop recommending the npm-crashing audit fix, explain bu…
xxxigm Jun 13, 2026
bea6c1c
test(doctor): assert audit-fix hint avoids crashing form and explains…
xxxigm Jun 13, 2026
905ed41
fix(doctor): avoid unsafe npm audit fallback
teknium1 Jun 13, 2026
5b85720
fix(profiles): correct misleading per-profile gateway port docstrings
xxxigm Jun 13, 2026
fa2aba9
docs(docker): explain per-profile gateway ports for multi-profile setups
xxxigm Jun 13, 2026
2681c5a
fix(photon): correct gateway start command (#45566)
teknium1 Jun 13, 2026
bd66e7e
fix(auth): self-heal Codex refresh_token rotation by reimporting from…
Jun 12, 2026
311ff96
review: validate refresh_token, path-agnostic recovery log, map autho…
Jun 12, 2026
aa07983
fix(auth): self-heal missing Codex access tokens
teknium1 Jun 13, 2026
573b964
fix(installer): clear an unmerged git index before stashing on update
xxxigm Jun 13, 2026
c814d3d
test(installer): regression for unmerged-index update failure
xxxigm Jun 13, 2026
2abcae9
fix(cli): preserve renderer state on resize
H-Ali13381 Jun 1, 2026
62b4618
fix(dashboard): scope sessions and analytics to selected profile (#45…
teknium1 Jun 13, 2026
4b646bc
fix(auxiliary): preserve main provider base url (#45587)
teknium1 Jun 13, 2026
a59d5e3
feat(telegram): make rich messages always on (#45584)
teknium1 Jun 13, 2026
cb125c2
fix(kanban): pin assigned profile toolsets for workers (#45590)
teknium1 Jun 13, 2026
e256f4a
fix(gateway): don't restore a bare billing provider as the resumed se…
HaozheZhang6 Jun 11, 2026
643dc82
Fix custom provider identity loss in session persistence
Jun 11, 2026
2667601
fix(tui): keep reasoning-only assistant turns visible on session resume
Jun 11, 2026
39a35b7
chore(release): map custom provider resume contributors
teknium1 Jun 13, 2026
5acd185
fix(moonshot): handle union type arrays in tool schemas
Tranquil-Flow Jun 13, 2026
0333a99
fix: merge session-only model analytics rows (#45582)
teknium1 Jun 13, 2026
aa53a78
fix(desktop): hand off Windows bootstrap recovery (#45594)
teknium1 Jun 13, 2026
6724daa
fix: keep CLI idle timer ticking (#45592)
teknium1 Jun 13, 2026
74c5158
fix(model): show bare custom endpoints in gateway picker (#45597)
teknium1 Jun 13, 2026
eed61a1
fix(gemini): add role field to systemInstruction
hbentel Jun 13, 2026
6f43ff5
chore(release): map Gemini schema contributor
teknium1 Jun 13, 2026
16fb573
fix(gateway): clear bloated compression binding on compression-exhaus…
konsisumer May 31, 2026
d206e1f
fix(dashboard): keep local file browser on home
teknium1 Jun 13, 2026
4373e80
fix(docs): reuse healthy skills index during Pages deploys (#45616)
teknium1 Jun 13, 2026
45f9099
fix(matrix): preserve markdown table structure
sarvesh1327 Jun 13, 2026
4fd9397
fix(codex): drop extra_headers for chatgpt.com backend
Tranquil-Flow Jun 13, 2026
f82cb48
fix(platform): add .xls, .doc, .ppt to SUPPORTED_DOCUMENT_TYPES
Jun 13, 2026
1185dfd
test: cover legacy Office document extensions
teknium1 Jun 13, 2026
fc46354
fix(security): fail closed when an own-policy gateway adapter has no …
Que0x Jun 13, 2026
ad7436a
fix(gateway): preserve WeCom per-group sender allowlists
teknium1 Jun 13, 2026
3380563
fix(security): stop /api/status leaking host paths and PID on gated b…
Que0x Jun 13, 2026
28bf8fb
feat(dashboard): clone profiles from any source
WompaJango Jun 13, 2026
d146b85
chore(release): map WompaJango author
teknium1 Jun 13, 2026
9b5f7b6
fix(profile): make clone-from a full source selector
teknium1 Jun 13, 2026
cc14b74
docs(profile): update clone-from references
teknium1 Jun 13, 2026
e650447
Merge upstream/main (NousResearch) into nico fork — sync 2026-06-13
Fede654 Jun 13, 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
  •  
  •  
  •  
42 changes: 42 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,45 @@ data/
# Compose/profile runtime state (bind-mounted; avoid ownership/secret issues)
hermes-config/
runtime/

# ---------- Not needed inside the Docker image ----------

# Desktop app source (Tauri/Electron); never installed in the container
apps/

# Test suite — not shipped in production images
tests/

# Documentation site (Docusaurus) and supplementary docs
website/
docs/

# Assets only used by the GitHub README
assets/
infographic/

# Plugin-level docs (hermes-achievements ships docs/ but the runtime doesn't read them)
plugins/hermes-achievements/docs/

# Nix / Homebrew / AUR packaging metadata — irrelevant to Docker
nix/
flake.nix
flake.lock
packaging/

# Design and planning documents
plans/
.plans/

# ACP registry manifest (icon + agent.json) — not consumed at runtime
acp_registry/

# Repo-level dotfiles that are git-only or dev-tooling config
.env.example
.envrc
.gitattributes
.hadolint.yaml
.mailmap

# Top-level LICENSE (not matched by *.md); not needed inside the container
LICENSE
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
95 changes: 86 additions & 9 deletions .github/workflows/deploy-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,20 @@ on:
- 'optional-skills/**'
- '.github/workflows/deploy-site.yml'
workflow_dispatch:
inputs:
skills_index_run_id:
description: 'Optional Build Skills Index run ID whose skills-index artifact should be deployed'
required: false
type: string
rebuild_skills_index:
description: 'Force a fresh multi-source crawl instead of reusing the latest healthy index'
required: false
default: false
type: boolean

permissions:
contents: read
actions: read
pages: write
id-token: write

Expand Down Expand Up @@ -44,7 +56,7 @@ jobs:

- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 20
node-version: 22
cache: npm
cache-dependency-path: website/package-lock.json

Expand All @@ -55,16 +67,81 @@ jobs:
- name: Install PyYAML for skill extraction
run: pip install pyyaml==6.0.2 httpx==0.28.1

- name: Build skills index (unified multi-source catalog)
- name: Prepare skills index (unified multi-source catalog)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ github.token }}
GITHUB_TOKEN: ${{ github.token }}
SKILLS_INDEX_RUN_ID: ${{ github.event.inputs.skills_index_run_id || '' }}
REBUILD_SKILLS_INDEX: ${{ github.event.inputs.rebuild_skills_index || 'false' }}
run: |
# Always rebuild — the file isn't committed (gitignored), so a
# fresh checkout starts without it and we want the freshest crawl
# in every deploy. Failure is non-fatal: extract-skills.py will
# fall back to the legacy snapshot cache and the Skills Hub page
# still renders, just without the latest community catalog.
python3 scripts/build_skills_index.py || echo "Skills index build failed (non-fatal)"
# The unified external catalog is expensive to crawl and can burn
# through the repository installation's GitHub API quota when several
# docs deploys land close together. Normal docs deploys therefore
# reuse the latest healthy catalog: first the artifact from a
# scheduled skills-index run, then the currently live index. Only a
# manual force rebuild does a fresh crawl here.
#
# If we do crawl, the build remains fatal. build_skills_index.py runs
# the health check BEFORE writing and exits non-zero on source
# collapse, keeping the last good Pages deployment live instead of
# publishing a degenerate catalog.
set -euo pipefail
INDEX_PATH="website/static/api/skills-index.json"
mkdir -p "$(dirname "$INDEX_PATH")"

validate_index() {
python3 - "$INDEX_PATH" <<'PY'
import json
import sys
from pathlib import Path

path = Path(sys.argv[1])
try:
data = json.loads(path.read_text(encoding="utf-8"))
except Exception as exc:
print(f"invalid skills index JSON: {exc}", file=sys.stderr)
sys.exit(1)
skills = data.get("skills")
if not isinstance(skills, list) or len(skills) < 1500:
count = len(skills) if isinstance(skills, list) else "missing"
print(f"skills index too small: {count}", file=sys.stderr)
sys.exit(1)
print(f"skills index ready: {len(skills)} skills")
PY
}

if [ "$REBUILD_SKILLS_INDEX" = "true" ]; then
python3 scripts/build_skills_index.py
validate_index
exit 0
fi

if [ -n "$SKILLS_INDEX_RUN_ID" ]; then
tmpdir="$(mktemp -d)"
echo "Downloading skills-index artifact from run $SKILLS_INDEX_RUN_ID"
if gh run download "$SKILLS_INDEX_RUN_ID" --name skills-index --dir "$tmpdir"; then
candidate="$(find "$tmpdir" -name skills-index.json -type f | head -n 1 || true)"
if [ -n "$candidate" ]; then
cp "$candidate" "$INDEX_PATH"
if validate_index; then
exit 0
fi
fi
fi
echo "::warning::Could not use skills-index artifact from run $SKILLS_INDEX_RUN_ID; trying live index"
fi

echo "Downloading currently live skills index"
if curl -fsSL --retry 3 --retry-delay 5 \
"https://hermes-agent.nousresearch.com/docs/api/skills-index.json" \
-o "$INDEX_PATH" && validate_index; then
exit 0
fi

echo "::warning::Live skills index unavailable or unhealthy; falling back to a fresh crawl"
rm -f "$INDEX_PATH"
python3 scripts/build_skills_index.py
validate_index

- name: Extract skill metadata for dashboard
run: python3 website/scripts/extract-skills.py
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ jobs:
# (see `_SKIP_PARTS` in scripts/run_tests_parallel.py) because each
# shard would otherwise reach the session-scoped ``built_image``
# fixture in ``tests/docker/conftest.py`` and start a 3-7min
# ``docker build`` under a 180s pytest-timeout cap — guaranteed to
# ``docker build`` — guaranteed to
# die in fixture setup.
#
# Piggybacking here avoids a second image build: the smoke test
Expand All @@ -114,7 +114,7 @@ jobs:
run: |
uv venv .venv --python 3.11
source .venv/bin/activate
# ``dev`` extra pulls in pytest, pytest-asyncio, pytest-timeout
# ``dev`` extra pulls in pytest, pytest-asyncio —
# everything tests/docker/ needs. We deliberately avoid ``all``
# here because the docker tests only drive the container via
# subprocess and don't import hermes_agent's optional deps.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs-site-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:

- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 20
node-version: 22
cache: npm
cache-dependency-path: website/package-lock.json

Expand Down
11 changes: 6 additions & 5 deletions .github/workflows/nix-lockfile-fix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,10 @@ jobs:
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)"
# Ensure only nix/lib.nix (home of the single npmDepsHash) was
# modified — prevents accidental self-triggering if fix-lockfiles
# ever touches package files.
unexpected="$(git diff --name-only | grep -Ev '^nix/lib\.nix$' || true)"
if [ -n "$unexpected" ]; then
echo "::error::Unexpected modified files: $unexpected"
exit 1
Expand All @@ -89,7 +90,7 @@ jobs:

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 add nix/lib.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"
Expand Down Expand Up @@ -216,7 +217,7 @@ jobs:
set -euo pipefail
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 add nix/lib.nix
git commit -m "fix(nix): refresh npm lockfile hashes"
git push

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/skills-index.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,4 @@ jobs:
- name: Trigger Deploy Site workflow
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh workflow run deploy-site.yml --repo ${{ github.repository }}
run: gh workflow run deploy-site.yml --repo ${{ github.repository }} -f skills_index_run_id=${{ github.run_id }}
82 changes: 59 additions & 23 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ on:
push:
branches: [main]
paths-ignore:
- '**/*.md'
- 'docs/**'
- "**/*.md"
- "docs/**"
pull_request:
branches: [main]
paths-ignore:
- '**/*.md'
- 'docs/**'
- "**/*.md"
- "docs/**"

permissions:
contents: read
Expand All @@ -30,13 +30,17 @@ jobs:
slice: [1, 2, 3, 4, 5, 6]
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Restore duration cache
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: test_durations.json
# Single stable key. main always overwrites, PRs always find it.
# main always writes a new suffix, but jobs pick the latest one with the same prefix
# quote from https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching#cache-hits-and-misses
# If you provide restore-keys, the cache action sequentially searches for any caches that match the list of restore-keys.
# If there are no exact matches, the action searches for partial matches of the restore keys.
# When the action finds a partial match, the most recent cache is restored to the path directory.
key: test-durations

- name: Install ripgrep (prebuilt binary)
Expand All @@ -54,16 +58,32 @@ jobs:
rg --version

- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
with:
# Persist uv's download/wheel cache (~/.cache/uv) across runs.
# Keyed on the dependency manifests, so the cache is reused until
# pyproject.toml or uv.lock changes. `uv sync` still runs every
# time, but resolves from the warm cache instead of re-downloading
# and re-building wheels.
enable-cache: true
cache-dependency-glob: |
pyproject.toml
uv.lock

- name: Set up Python 3.11
run: uv python install 3.11

- name: Install dependencies
run: |
uv venv .venv --python 3.11
source .venv/bin/activate
uv pip install -e ".[all,dev]"
# `uv sync --locked` installs the exact pinned set from uv.lock (and
# fails if the lock is out of sync with pyproject.toml), giving a
# reproducible env. It also creates .venv itself, so no separate
# `uv venv` step is needed.
run: uv sync --locked --python 3.11 --extra all --extra dev

- name: Minimize uv cache
# Optimized for CI: prunes pre-built wheels that are cheap to
# re-download, keeping the persisted cache small and fast to restore.
run: uv cache prune --ci

- name: Run tests (slice ${{ matrix.slice }}/6)
# Per-file isolation via scripts/run_tests_parallel.py: discovers
Expand Down Expand Up @@ -99,7 +119,7 @@ jobs:
NOUS_API_KEY: ""

- name: Upload per-slice durations
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: test-durations-slice-${{ matrix.slice }}
path: test_durations.json
Expand All @@ -109,11 +129,11 @@ jobs:
# (including PRs) get balanced slicing.
save-durations:
needs: test
if: always() && github.ref == 'refs/heads/main'
if: needs.test.result == 'success' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Download all slice durations
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: test-durations-slice-*
path: durations
Expand All @@ -133,17 +153,17 @@ jobs:
"

- name: Save merged duration cache
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: test_durations.json
key: test-durations
key: test-durations-${{ github.run_id }}

e2e:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Install ripgrep (prebuilt binary)
run: |
Expand All @@ -160,16 +180,32 @@ jobs:
rg --version

- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
with:
# Persist uv's download/wheel cache (~/.cache/uv) across runs.
# Keyed on the dependency manifests, so the cache is reused until
# pyproject.toml or uv.lock changes. `uv sync` still runs every
# time, but resolves from the warm cache instead of re-downloading
# and re-building wheels.
enable-cache: true
cache-dependency-glob: |
pyproject.toml
uv.lock

- name: Set up Python 3.11
run: uv python install 3.11

- name: Install dependencies
run: |
uv venv .venv --python 3.11
source .venv/bin/activate
uv pip install -e ".[all,dev]"
# `uv sync --locked` installs the exact pinned set from uv.lock (and
# fails if the lock is out of sync with pyproject.toml), giving a
# reproducible env. It also creates .venv itself, so no separate
# `uv venv` step is needed.
run: uv sync --locked --python 3.11 --extra all --extra dev

- name: Minimize uv cache
# Optimized for CI: prunes pre-built wheels that are cheap to
# re-download, keeping the persisted cache small and fast to restore.
run: uv cache prune --ci

- name: Packaged-wheel i18n smoke test
run: |
Expand Down
Loading
Loading