Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1491 commits
Select commit Hold shift + click to select a range
1d93883
test(kanban): patch dashboard websocket token stub
stephenschoettler May 1, 2026
c77a6e3
chore(security): add OSV-Scanner CI + Dependabot for github-actions o…
teknium1 May 5, 2026
ef94aa2
docs(teams): add Teams to sidebar
May 1, 2026
93869b4
docs: add Microsoft Teams to platform lists across docs
May 1, 2026
10f89d7
docs(teams): add Teams to messaging/index.md
May 1, 2026
69aeba0
feat(teams): implement threading via app.reply()
May 1, 2026
3f02345
fix(teams): fall back to flat send when threading returns 400
May 1, 2026
2333b7a
fix(tests): patch TypingActivityInput after mock on Python <3.12
May 1, 2026
601e5f1
fix(teams): log reply() fallback for diagnostics
teknium1 May 5, 2026
13a7cbc
fix(nix): refresh stale tui npmDepsHash + fix cache-blind detection (…
alt-glitch May 5, 2026
c3112ad
fix(tui): improve clipboard copy fallbacks
bjianhang Apr 26, 2026
2785355
chore(release): map bjianhang@gmail.com → @bjianhang
teknium1 May 5, 2026
8ad5e98
fix(gateway): preserve pending update prompts across restarts
simbam99 May 1, 2026
91ce8fc
fix(setup): offer Keep/Replace/Clear when API key already exists
teknium1 May 5, 2026
ca5595f
fix(kanban): dispatcher skips ready tasks whose assignee is not a rea…
Brecht-H May 5, 2026
f25d3ec
fix(kanban): suppress dispatcher stuck-warn when ready queue holds on…
Brecht-H May 5, 2026
fc4aa66
feat(tips): add 100 new CLI startup tips (#20168)
teknium1 May 5, 2026
542e06c
fix: include default profile in kanban assignees
Interstellar-code May 5, 2026
28f4d6d
fix(tool-schemas): reactive strip of pattern/format on llama.cpp gram…
cdanis May 5, 2026
2a285d5
fix(agent): stateful streaming scrubber for reasoning-block leaks (#1…
teknium1 May 5, 2026
8c82d06
fix(kanban): ignore stale current board pointers
steezkelly May 5, 2026
d472d69
chore(release): map stevekelly622@gmail.com → @steezkelly
teknium1 May 5, 2026
b22b3f5
fix(cli): pin HERMES_KANBAN_BOARD at chat boot to stop subprocess boa…
0xDevNinja May 5, 2026
f8a6db6
test(kanban): isolate HERMES_KANBAN_BOARD writes in pin-env tests
teknium1 May 5, 2026
4a3e3e2
fix(compression): preserve iterative summary continuity
revaraver Apr 28, 2026
fe8dc26
chore: AUTHOR_MAP entry for revaraver noreply
teknium1 May 5, 2026
aacf36e
fix(cli): persist manual compress handoff
revaraver Apr 28, 2026
f6b68f0
fix(gateway): keep DoH-confirmed Telegram IPs that match system DNS (…
0xsir0000 Apr 28, 2026
1a03e3b
fix(kanban): detect darwin zombie workers
LeonSGP43 May 5, 2026
660ce7c
fix(ui-tui): prevent React effect cleanup from killing python TUI gat…
Apr 28, 2026
c725d7d
chore: AUTHOR_MAP entry for TheEpTic
teknium1 May 5, 2026
2eef395
fix(compaction): mark end of context summary in role=user fallback
wmagev Apr 28, 2026
b93643c
chore: AUTHOR_MAP entry for wmagev
teknium1 May 5, 2026
5168226
feat(file_tools): post-write delta lint on write_file + patch, add JS…
teknium1 May 5, 2026
68c1a08
fix(curator): protect hub skills by frontmatter name
LeonSGP43 May 4, 2026
4d0f59f
test(skill_usage): add mark_agent_created to regression test
teknium1 May 5, 2026
cca8587
docs(quickstart): link Onchain AI Garage Hermes tutorials playlist (#…
teknium1 May 5, 2026
354502e
fix(kanban): preserve dashboard completion summaries
LeonSGP43 May 5, 2026
6b76ea4
fix(gateway): load reply_to_mode from config.yaml for Discord and Tel…
ashermorse Apr 28, 2026
4577f39
chore: AUTHOR_MAP entry for ashermorse
teknium1 May 5, 2026
efe1cb0
fix: prevent stale reasoning from being reused across turns
happy5318 May 5, 2026
9e0ef2a
test: pin per-turn reasoning extraction semantics
teknium1 May 5, 2026
83a07f4
chore: AUTHOR_MAP entry for happy5318
teknium1 May 5, 2026
8f4c0bf
fix(wecom): pad base64 AES key before decode
chengoak Apr 28, 2026
046c293
chore: AUTHOR_MAP entry for chengoak
teknium1 May 5, 2026
0a7cc85
fix(honcho): pass user_message as search_query in get_prefetch_context
qxxaa Apr 28, 2026
4f76166
chore: AUTHOR_MAP entry for qxxaa
teknium1 May 5, 2026
436672d
feat(curator): add archive and prune subcommands (#20200)
teknium1 May 5, 2026
fe8560f
feat(api-server): X-Hermes-Session-Key header for long-term memory sc…
teknium1 May 5, 2026
b10e38e
fix(skills): pin protects against deletion only, not edits (#20220)
teknium1 May 5, 2026
f15b0fb
fix: add PLATFORM_HINTS entry for api_server platform
beardthelion Apr 28, 2026
005b2f4
chore: AUTHOR_MAP entry for beardthelion
teknium1 May 5, 2026
44cf334
fix(mcp): add periodic keepalive to _wait_for_lifecycle_event
vominh1919 May 5, 2026
9e893d1
fix(aux): default Codex reasoning effort to medium when extra_body.re…
briandevans Apr 28, 2026
c1a2710
test(aux): cover effort: 0 fallback in Codex reasoning translation
briandevans Apr 28, 2026
34c6f93
fix: resolve model.aliases from config.yaml in /model alias resolution
nazirulhafiy Apr 28, 2026
7f735b4
fix: return effective session_id after context compression (#16938)
vominh1919 Apr 28, 2026
3143617
test(api_server): _run_agent result now carries session_id for #16938
teknium1 May 5, 2026
80b386a
fix(feishu): refresh bot identity during hydration
Apr 28, 2026
c7fc5af
chore: AUTHOR_MAP entry for tangyuanjc
teknium1 May 5, 2026
96514de
fix(auxiliary): avoid locking into custom path when api_key is empty
vominh1919 Apr 28, 2026
19eebf6
fix(openrouter): treat xiaomi models as reasoning-capable
Apr 28, 2026
f844e51
chore: AUTHOR_MAP entry for agentlinker
teknium1 May 5, 2026
f667774
fix(claw): handle missing dir in _scan_workspace_state
Apr 28, 2026
37b5731
chore: AUTHOR_MAP entry for npmisantosh
teknium1 May 5, 2026
4e6f511
fix(cli): fall back on invalid HERMES_MAX_ITERATIONS
novax635 Apr 28, 2026
349d0da
chore: AUTHOR_MAP entry for novax635
teknium1 May 5, 2026
3b16c59
fix(gateway): ignore malformed custom delay env vars in natural mode
Krionex Apr 28, 2026
285c208
fix(gateway): also tolerate malformed env vars in custom human-delay …
teknium1 May 5, 2026
fb31195
chore: AUTHOR_MAP entry for Krionex
teknium1 May 5, 2026
c46bc92
fix(run_agent): use aux provider for compression context length lookup
rxdxxxx May 5, 2026
8ebb81f
chore: AUTHOR_MAP entry for rxdxxxx
teknium1 May 5, 2026
02147cc
fix(cli): sanitize bracketed paste markers during setup
MaHaoHao-ch Apr 28, 2026
7530ce0
chore: AUTHOR_MAP entry for MaHaoHao-ch
teknium1 May 5, 2026
b7bd177
docs(AGENTS.md): add curator/cron/delegation/toolsets, fix plugin tre…
teknium1 May 5, 2026
7de3c86
feat(i18n): add display.language for static message translation (zh/j…
teknium1 May 5, 2026
de9238d
feat(kanban): hallucination gate + recovery UX for worker-created-car…
teknium1 May 5, 2026
969bfff
fix: merge _get_hermes_home() dynamic resolution and feishu receive_i…
Apr 21, 2026
b014a3d
test(cron): update _isolate_tick_lock fixture for _get_lock_paths
teknium1 May 5, 2026
8e18d10
fix(feishu): force text mode for markdown tables
Apr 22, 2026
db84c15
fix(ssh): add scp availability check to preflight validation
sprmn24 Apr 21, 2026
ecc909d
fix(session): serialize JSONL transcript appends under existing lock
sprmn24 Apr 21, 2026
e805380
Discover plugin commands during CLI dispatch
jkausel-ai Apr 21, 2026
5795b3b
fix(acp): use SessionDB.replace_messages for atomic history rewrite
Junass1 May 5, 2026
e4e0090
test(acp): regression for #13675 — save_session preserves existing me…
teknium1 May 5, 2026
45949e9
chore: AUTHOR_MAP entry for Junass1
teknium1 May 5, 2026
dad62c4
fix(whatsapp): auto-convert mp3/wav to ogg/opus in send-media for nat…
bartokmagic Apr 21, 2026
c62d8c9
chore: AUTHOR_MAP entry for Bartok9
teknium1 May 5, 2026
d8097d5
refactor(env): use shared Hermes dotenv loader
Bongulielmi Apr 21, 2026
269be4e
chore: AUTHOR_MAP entry for Bongulielmi
teknium1 May 5, 2026
6430d67
fix(openrouter): use canonical X-Title attribution header
JTroyerOvermatch May 5, 2026
935cf2f
chore: AUTHOR_MAP entry for JTroyerOvermatch
teknium1 May 5, 2026
247c9d4
fix(gateway): ensure deterministic thread eviction in helpers
hharry11 Apr 21, 2026
d9f0875
chore: AUTHOR_MAP entry for hharry11
teknium1 May 5, 2026
0120d8f
fix: merge plugin tools into builtin toolsets
wysie Apr 21, 2026
12135b4
chore: AUTHOR_MAP entry for wysie
teknium1 May 5, 2026
5267421
Prefer fallback for Gemini CloudCode rate limits
jkausel-ai Apr 21, 2026
77a102b
chore: AUTHOR_MAP entry for jkausel-ai
teknium1 May 5, 2026
a877c3f
fix(feishu): tolerate malformed dedup timestamps
Es1la May 5, 2026
4553e32
chore: AUTHOR_MAP entry for Es1la
teknium1 May 5, 2026
244bacd
fix(skills): support category-qualified local skill names
LeonSGP43 Apr 21, 2026
8c0f254
chore: AUTHOR_MAP entry for LeonSGP43
teknium1 May 5, 2026
f8ba265
fix(aux): trigger fallback on 429 rate-limit errors in auxiliary client
zeejaytan Apr 21, 2026
dbe9b15
chore: AUTHOR_MAP entry for zeejaytan
teknium1 May 5, 2026
e8e9147
fix(acp): preserve assistant reasoning metadata in session persistence
Aslaaen Apr 21, 2026
cc2c820
chore: AUTHOR_MAP entry for Aslaaen
teknium1 May 5, 2026
60235db
feat(cli): add list_picker_providers for credential-filtered picker
Tkander17 Apr 21, 2026
87b113c
chore: AUTHOR_MAP entry for Tkander1715
teknium1 May 5, 2026
0397be5
feat(tui): remove /provider alias for /model (#20358)
teknium1 May 5, 2026
3b75071
fix: resolve lazy session creation regressions (#18370 fallout) (#20363)
alt-glitch May 5, 2026
a628992
docs(web_tools): correct web_extract summarizer timeout comment
beardthelion May 5, 2026
ce9888b
docs(config): fix fallback provider config paths
LeonSGP43 May 5, 2026
27a8ba4
docs(prompt): clarify supported customization surfaces
Beandon13 May 5, 2026
c85a25f
chore: AUTHOR_MAP entry for Beandon13
teknium1 May 5, 2026
2d5f206
docs: remove dead reference links in flash-attention skill
WadydX Apr 23, 2026
58f93fb
docs: remove dead papers.md link from saelens references
WadydX Apr 23, 2026
0664bf9
docs: fix broken nix-setup anchor for container-aware CLI
WadydX Apr 23, 2026
41545f7
fix(telegram): keep DM topic typing scoped
helix4u May 5, 2026
d5357f8
refactor(telegram): make typing thread-id resolver symmetric with send
teknium1 May 5, 2026
c28c2a2
docs(tts): document per-provider max_text_length caps
r266-tech Apr 22, 2026
0dc677f
docs(skill/hermes-agent): sync slash commands + add durable-systems s…
teknium1 May 5, 2026
ee502e5
docs(cli): add --deliver-only flag to hermes webhook subscribe
r266-tech Apr 19, 2026
00d2559
perf(ui-tui): narrow overlay subscriptions to focused selectors
OutThisLife May 5, 2026
ec7f2f2
docs(cli): add skills reset subcommand to CLI reference
r266-tech Apr 17, 2026
f67063b
feat(kanban): generic diagnostics engine for task distress signals (#…
teknium1 May 5, 2026
72c33df
docs(agent): remove stale BuiltinMemoryProvider references from memor…
Bartok9 Apr 23, 2026
91f339b
docs(plugins): document ctx.dispatch_tool() in plugin capabilities table
r266-tech Apr 16, 2026
b6e4e40
docs(guide): add Dispatch tools from slash commands section
r266-tech Apr 16, 2026
e4723f6
docs(cron): add context_from chaining section
May 5, 2026
2b500ed
chore: AUTHOR_MAP entry for asimons81
teknium1 May 5, 2026
20a4f79
feat: provider modules — ProviderProfile ABC, 33 providers, fetch_mod…
kshitijk4poor May 5, 2026
9022804
feat(providers): make all 33 providers pluggable under plugins/model-…
teknium1 May 5, 2026
84ec276
docs(cli): expand hermes import reference — add description, warning,…
Sertug17 Apr 23, 2026
7b05ccd
docs(bedrock): fix IAM permissions, add quickstart entry, add fallbac…
JiaDe-Wu Apr 16, 2026
af312cc
docs: fix Camofox Docker setup instructions
wysie Apr 29, 2026
acca3ec
docs(providers): Together/Groq/Perplexity cookbook via custom_providers
perlowja Apr 25, 2026
794f487
fix(tui): close slash parity gaps with CLI (#20339)
OutThisLife May 5, 2026
b1476c7
docs(gemini): add Google Gemini guide
jethac Apr 28, 2026
8fa5a03
chore: AUTHOR_MAP entry for jethac
teknium1 May 5, 2026
0df80f4
docs: align terminal-backend count and naming across docs and code
deep-name May 3, 2026
7cc0008
chore: AUTHOR_MAP entry for deep-name
teknium1 May 5, 2026
3beef57
docs: refresh stale platform/LOC/test counts; clarify gateway vs plug…
deep-name May 3, 2026
80c579a
docs(skills): explain restoring bundled skills
LeonSGP43 May 3, 2026
398efdb
docs(docker): add section on connecting to local inference servers (v…
Magicray1217 Apr 19, 2026
de0ac21
docs(docker): document API_SERVER_* env vars for exposing the OpenAI-…
May 5, 2026
1b10371
chore: AUTHOR_MAP entry for CES4751
teknium1 May 5, 2026
5f8e59b
docs(discord): fix Server Members Intent + SSRC-mapping drift; add /v…
malaiwah May 5, 2026
15be493
docs(skills): modernize Obsidian file workflows
counterposition May 3, 2026
79902a0
chore: AUTHOR_MAP entry for counterposition
teknium1 May 5, 2026
5bd75c7
docs(kanban): document handoff evidence metadata
Fearvox May 4, 2026
bb2b129
chore: AUTHOR_MAP entry for Fearvox
teknium1 May 5, 2026
f13b349
docs: clarify Telegram group chat troubleshooting
LeonSGP43 May 2, 2026
ca8e688
docs(codex): clarify OAuth auth prerequisite
LeonSGP43 May 2, 2026
39560c9
docs(voice): add Doubao speech integration examples (TTS + STT)
Hypnus-Yuan Apr 30, 2026
391e3ff
chore: AUTHOR_MAP entry for Hypnus-Yuan
teknium1 May 5, 2026
144ba71
docs(faq): use messaging extra for gateway deps
xsfX20 Apr 30, 2026
587ef55
chore: AUTHOR_MAP entry for xsfX20
teknium1 May 5, 2026
1fc8733
fix(kanban): unify failure counter across spawn/timeout/crash outcome…
teknium1 May 5, 2026
9a0a4c5
docs(guides): add guide for running Hermes locally with Ollama
binhnt92 Apr 7, 2026
92a08c6
chore: AUTHOR_MAP entry for binhnt92
teknium1 May 5, 2026
1c42d8f
docs: add Open WebUI bootstrap script
Apr 14, 2026
a860a10
chore: AUTHOR_MAP entry for acesjohnny
teknium1 May 5, 2026
a11234d
docs(browser): document WSL-to-Windows Chrome MCP bridge
liu-collab Apr 12, 2026
a321874
chore: AUTHOR_MAP entry for liu-collab
teknium1 May 5, 2026
74e4f5f
docs(i18n): add zh-Hans Tool Gateway, image gen, and Windows WSL guide
haidao1919 Apr 17, 2026
05cdcac
docs: add Chinese (zh-CN) README translation
zhanggttry Apr 21, 2026
f97d022
chore: AUTHOR_MAP entry for zhanggttry
teknium1 May 5, 2026
0d945d1
docs: update VS Code setup instructions for ACP Client integration
formulahendry Apr 19, 2026
50ab0a8
chore: AUTHOR_MAP entry for formulahendry
teknium1 May 5, 2026
0b9cbc8
test(kanban): cover metadata handoff round-trip
Fearvox May 4, 2026
f0d2784
feat(gateway): respect kanban.max_spawn config to limit concurrent tasks
momowind May 4, 2026
56b4795
guard kanban worker lifecycle by run id
misery-hl May 4, 2026
1efed67
chore(release): AUTHOR_MAP entries for momowind and misery-hl
teknium1 May 5, 2026
3082fa0
feat(hindsight): probe API for update_mode='append' support, dedupe a…
nicoloboschi May 5, 2026
3188e63
fix(api_server): SSE token batching + error handling for Open WebUI p…
bogerman1 May 5, 2026
ee8edd4
chore: AUTHOR_MAP entry for bogerman1
teknium1 May 5, 2026
0d41e94
feat(i18n): add French (fr) locale support
May 5, 2026
c4b287b
feat(i18n): add Ukrainian locale
olisikh May 5, 2026
735349c
chore: AUTHOR_MAP entry for olisikh
teknium1 May 6, 2026
2d4eaed
arcee temperature + compression
rob-maron May 5, 2026
f0b95cc
test(arcee): cover Trinity Large Thinking temperature + compression o…
teknium1 May 6, 2026
eda326d
fix(doctor): report Kanban worker tools as runtime-gated
suncokret12 May 1, 2026
6d302b3
fix(kanban): accept created_cards linked as child of completing task
LeonSGP43 May 5, 2026
b28ab4f
fix(kanban): measure max runtime from current run
mioimotoai-lgtm May 4, 2026
8a1a42d
test(kanban): backdate task_runs.started_at alongside tasks.started_at
teknium1 May 5, 2026
d2c6ece
fix(kanban): prevent child task dispatch when parent is not done
SimbaKingjoe May 4, 2026
3f97297
feat(kanban): surface task_runs.summary on dashboard cards + ``kanban…
Brecht-H May 5, 2026
a49670c
fix(kanban): wire dependency selects
LeonSGP43 May 5, 2026
fab3ad9
chore(release): AUTHOR_MAP entries for suncokret12 and mioimotoai-lgtm
teknium1 May 5, 2026
9851338
feat(i18n): add Turkish (tr) locale
etherman-os May 5, 2026
39f451f
fix: add Turkish locale references in config, tests, and docs
etherman-os May 5, 2026
e598e18
docs: document custom model aliases for /model command (#20475)
teknium1 May 6, 2026
477e4a2
feat(models): add deepseek/deepseek-v4-pro to OpenRouter + Nous Porta…
teknium1 May 6, 2026
f27fcb6
feat(models): add x-ai/grok-4.3 to OpenRouter + Nous Portal curated l…
teknium1 May 6, 2026
aa88dcc
fix: salvage batch — compaction guidance, memory authority, cache evi…
kshitijk4poor May 6, 2026
395dbcc
feat(browser): add Lightpanda engine support with automatic Chrome fa…
kshitijk4poor May 4, 2026
3ebdd26
fix(browser): surface Lightpanda Chrome fallback warnings
kshitijk4poor May 6, 2026
d78c349
feat(tui): collapsible sections in startup banner (skills, system pro…
kshitijk4poor May 6, 2026
68162eb
fix(tui): collapse long system messages in transcript with expand toggle
kshitijk4poor May 6, 2026
629d8b8
fix(browser): tighten Lightpanda fallback edge cases
kshitijk4poor May 6, 2026
466f3a1
fix(gateway): preserve model picker current context
helix4u May 6, 2026
a6f5f9c
fix(update): drop pip --quiet so slow installs don't look hung (#20679)
teknium1 May 6, 2026
e70e490
fix(cli): guard logger.debug in signal handler (#13710 regression) (#…
teknium1 May 6, 2026
043a118
fix: harden install.sh against inherited Python env leakage
adybag14-cyber May 5, 2026
a869a52
chore: AUTHOR_MAP entry for adybag14-cyber
teknium1 May 6, 2026
e45df2e
fix(ui): reduce status-line jitter while scrolling
adybag14-cyber May 5, 2026
ca5febf
fix(tui): stabilize FaceTicker elapsed width to prevent composer drift
adybag14-cyber May 6, 2026
a0556b8
fix(tui): restore gap before duration when verb segment is hidden
teknium1 May 6, 2026
b1e0ef8
chore(release): map liuguangyong@hellobike -> liuguangyong93
teknium1 May 6, 2026
1768791
fix(kanban): reset code element background inside board
May 6, 2026
76074d9
fix(cli): recover classic CLI output after resize
helix4u May 5, 2026
b045e7a
feat(skills): add shop-app personal shopping assistant (optional) (#2…
teknium1 May 6, 2026
a0fedfb
feat(checkpoints): v2 single-store rewrite with real pruning + disk g…
teknium1 May 6, 2026
906881c
fix(cli): catch OSError in _resolve_attachment_path to prevent ENAMET…
curiouscleo May 5, 2026
3ce1233
chore(release): map cleo@edaphic.xyz → curiouscleo
teknium1 May 6, 2026
90a7adc
docs(wsl2): expand Windows (WSL2) guide — filesystem, networking, ser…
teknium1 May 6, 2026
b62a82e
docs: pluggable surfaces coverage — model-provider guide, full plugin…
teknium1 May 6, 2026
63c51d8
change: enable ruff/ty
ethernet8023 May 4, 2026
9627ee7
feat(ci): add typecheck (warnings only in CI)
ethernet8023 May 4, 2026
ad7aad2
feat(skills/linear): add Documents support + Python helper script (#2…
teknium1 May 6, 2026
773cf48
docs(plugins): close the gaps \u2014 image-gen-provider-plugin guide …
teknium1 May 6, 2026
a24789d
fix(opencode-go): keep users on opencode-go instead of hijacking to n…
teknium1 May 6, 2026
6388aaf
feat(dashboard): add 'default-large' built-in theme with 18px base si…
teknium1 May 6, 2026
cd2cbc7
refactor(web): per-capability backend selection for search/extract split
kshitijk4poor May 6, 2026
5c906d7
feat(web): add SearXNG as a native search-only backend
kshitijk4poor May 6, 2026
94016dd
docs+skill: add searxng-search optional skill and documentation
kshitijk4poor May 6, 2026
48c2418
docs: add Web Search + Extract feature page with SearXNG setup guide
kshitijk4poor May 6, 2026
441ef75
fix(feishu): keep topic replies in threads
yuqianma May 4, 2026
28299af
chore: follow-up cleanup for Feishu topic thread fix
kshitijk4poor May 6, 2026
b1d420e
fix(kanban): avoid fragile failure-column renames
helix4u May 6, 2026
a2ff193
chore: follow-up cleanup for Kanban migration fix
kshitijk4poor May 6, 2026
a345f7b
Merge pull request #19908 from NousResearch/typecheck
ethernet8023 May 6, 2026
946ef0e
fix(tui): bound virtual history offset searches
asheriif May 5, 2026
f4031df
ci(docker): don't cancel overlapping builds, guard :latest
ethernet8023 May 6, 2026
d514dd4
docs(tool-gateway): rewrite as pitch-first marketing page (#20827)
teknium1 May 6, 2026
33bf5f6
fix(auth): fall back to global-root auth.json for providers missing i…
teknium1 May 6, 2026
b71f80e
feat(gateway): per-platform gateway_restart_notification flag
guillaumemeyer May 6, 2026
7df6115
feat(gateway): also gate pre-restart "Gateway restarting" notification
guillaumemeyer May 6, 2026
d8b85bf
chore: add guillaumemeyer to AUTHOR_MAP
teknium1 May 6, 2026
5044e1c
fix(cli): submit LF enter in thin PTYs (#20896)
OutThisLife May 6, 2026
da60198
fix(tui): refresh virtual offsets after row resize (#20898)
OutThisLife May 6, 2026
f1a8e99
fix(tui): honor skin highlight colors (#20895)
OutThisLife May 6, 2026
53a0249
Merge pull request #20890 from NousResearch/fix/docker-push
ethernet8023 May 6, 2026
5ccab51
fix(tui): steady transcript scrollbar (#20917)
OutThisLife May 6, 2026
04cf478
fix(tui): restore voice push-to-talk parity (#20897)
OutThisLife May 6, 2026
3cdbf33
fix(gateway): don't dead-end setup wizard when only system-scope unit…
teknium1 May 6, 2026
d797755
fix(gateway): wait for systemd restart readiness
helix4u May 6, 2026
5a3cadf
fix(discord): narrow rate-limit catch and move sync state under gateway/
teknium1 May 7, 2026
45cbf93
docs(kanban): fix orchestrator skill setup instructions (#20958)
helix4u May 7, 2026
49c3c2e
docs(kanban): fix worker skill setup instructions too (#20960)
teknium1 May 7, 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
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@

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

# Built artifacts that are regenerated inside the image. Excluded so local
# rebuilds on the developer's machine don't invalidate the npm-install layer
# that now depends on the full ui-tui/packages/hermes-ink/ tree being present.
ui-tui/dist/
ui-tui/packages/hermes-ink/dist/

# CI/CD
.github
Expand All @@ -17,3 +25,7 @@ node_modules

# Runtime data (bind-mounted at /opt/data; must not leak into build context)
data/

# Compose/profile runtime state (bind-mounted; avoid ownership/secret issues)
hermes-config/
runtime/
25 changes: 25 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,15 @@ BROWSERBASE_PROXIES=true
# Uses custom Chromium build to avoid bot detection altogether
BROWSERBASE_ADVANCED_STEALTH=false

# Browser engine for local mode (default: auto = Chrome)
# "auto" — use Chrome (don't pass --engine flag)
# "lightpanda" — use Lightpanda (1.3-5.8x faster navigation, no screenshots)
# "chrome" — explicitly request Chrome
# Requires agent-browser v0.25.3+. Lightpanda commands that fail or return
# empty results are automatically retried with Chrome.
# Also configurable via browser.engine in config.yaml.
# AGENT_BROWSER_ENGINE=auto

# Browser session timeout in seconds (default: 300)
# Sessions are cleaned up after this duration of inactivity
BROWSER_SESSION_TIMEOUT=300
Expand Down Expand Up @@ -398,3 +407,19 @@ IMAGE_TOOLS_DEBUG=false
# Override STT provider endpoints (for proxies or self-hosted instances)
# GROQ_BASE_URL=https://api.groq.com/openai/v1
# STT_OPENAI_BASE_URL=https://api.openai.com/v1

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

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

runs:
using: composite
steps:
- uses: DeterminateSystems/nix-installer-action@ef8a148080ab6020fd15196c2084a2eea5ff2d25 # v22
- uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
with:
name: hermes-agent
authToken: ${{ inputs.cachix-auth-token }}
continue-on-error: true
44 changes: 44 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Dependabot configuration for hermes-agent.
#
# Deliberately scoped to github-actions only.
#
# We do NOT enable Dependabot for pip / npm / any source-dependency ecosystem
# because we pin source dependencies exactly (uv.lock, package-lock.json) as
# part of our supply-chain posture. Automatic version-bump PRs against those
# pins would undermine the strategy — pins are moved deliberately, after
# review, not on a schedule.
#
# github-actions is the exception: action pins (we use full commit SHAs per
# supply-chain policy) must be updated when upstream actions publish
# patches — usually themselves security fixes. Dependabot opens a PR with
# the new SHA and release notes; we review and merge like any other PR.
#
# Security-update PRs for source dependencies (opened ONLY when a CVE is
# published affecting a currently-pinned version) are enabled separately
# via the repo's Dependabot security updates setting
# (Settings → Code security → Dependabot → Dependabot security updates).
# Those are CVE-only, not schedule-driven, and do not conflict with our
# pinning strategy — they fire when a pinned version becomes known-bad,
# which is exactly when we want to move the pin.

version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
labels:
- "dependencies"
- "github-actions"
commit-message:
prefix: "chore(actions)"
include: "scope"
groups:
# Batch routine action bumps into one PR per week to reduce noise.
# Security updates still open individually and bypass grouping.
actions-minor-patch:
update-types:
- "minor"
- "patch"
10 changes: 10 additions & 0 deletions .github/workflows/deploy-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@ jobs:
run: |
mkdir -p _site/docs
cp -r website/build/* _site/docs/
# llms.txt / llms-full.txt are also published at the site root
# (https://hermes-agent.nousresearch.com/llms.txt) because some
# agents and IDE plugins probe the classic root-level path rather
# than /docs/llms.txt. Same file, two URLs, one source of truth.
if [ -f website/build/llms.txt ]; then
cp website/build/llms.txt _site/llms.txt
fi
if [ -f website/build/llms-full.txt ]; then
cp website/build/llms-full.txt _site/llms-full.txt
fi

- name: Upload artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
Expand Down
145 changes: 142 additions & 3 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,32 @@ on:
permissions:
contents: read

# Top-level concurrency: do NOT cancel in-flight builds when a new push lands.
# Every commit deserves its own SHA-tagged image in the registry, and we guard
# the :latest tag in a separate job below (with its own concurrency group) so
# a slow run can't clobber :latest with older bits.
concurrency:
group: docker-${{ github.ref }}
cancel-in-progress: true
cancel-in-progress: false

jobs:
build-and-push:
# Only run on the upstream repository, not on forks
if: github.repository == 'NousResearch/hermes-agent'
runs-on: ubuntu-latest
timeout-minutes: 60
outputs:
pushed_sha_tag: ${{ steps.mark_pushed.outputs.pushed }}
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: recursive
# Fetch enough history to run `git merge-base --is-ancestor` in the
# move-latest job. That job reuses this checkout via its own
# actions/checkout call, but commits reachable from main up to ~1000
# back are plenty for any realistic race window.
fetch-depth: 1000

- name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
Expand Down Expand Up @@ -74,18 +85,30 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Push multi-arch image (main branch)
# Always push a per-commit SHA tag on main. This is race-free because
# every commit has a unique SHA — concurrent runs can't clobber each
# other here. We also embed the git SHA as an OCI label so the
# move-latest job (below) can read it back off the registry's `:latest`.
- name: Push multi-arch image with SHA tag (main branch)
id: push_sha
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: .
file: Dockerfile
push: true
platforms: linux/amd64,linux/arm64
tags: nousresearch/hermes-agent:latest
tags: nousresearch/hermes-agent:sha-${{ github.sha }}
labels: |
org.opencontainers.image.revision=${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Mark SHA tag pushed
id: mark_pushed
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: echo "pushed=true" >> "$GITHUB_OUTPUT"

- name: Push multi-arch image (release)
if: github.event_name == 'release'
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
Expand All @@ -97,3 +120,119 @@ jobs:
tags: nousresearch/hermes-agent:${{ github.event.release.tag_name }}
cache-from: type=gha
cache-to: type=gha,mode=max

# Second job: moves `:latest` to point at the SHA tag the first job pushed.
#
# Has its own concurrency group with `cancel-in-progress: true`, which
# gives us the serialization we need: if a newer push arrives while an
# older run is mid-way through this job, the older run is cancelled
# before it can clobber `:latest`. Combined with the ancestor check
# below, this means `:latest` only ever moves forward in git history.
move-latest:
if: |
github.repository == 'NousResearch/hermes-agent'
&& github.event_name == 'push'
&& github.ref == 'refs/heads/main'
&& needs.build-and-push.outputs.pushed_sha_tag == 'true'
needs: build-and-push
runs-on: ubuntu-latest
timeout-minutes: 10
concurrency:
group: docker-move-latest-${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 1000

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3

- name: Log in to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

# Read the git revision label off the current `:latest` manifest, then
# use `git merge-base --is-ancestor` to check whether our commit is a
# descendant of it. If `:latest` doesn't exist yet, or its label is
# missing, we treat that as "safe to publish". If another run already
# advanced `:latest` past us (or diverged), we skip and leave it alone.
- name: Decide whether to move :latest
id: latest_check
run: |
set -euo pipefail
image=nousresearch/hermes-agent

# Pull the JSON for the linux/amd64 sub-manifest's config and extract
# the OCI revision label with jq — Go template field access can't
# handle dots in map keys, so using json+jq is the robust route.
image_json=$(
docker buildx imagetools inspect "${image}:latest" \
--format '{{ json (index .Image "linux/amd64") }}' \
2>/dev/null || true
)

if [ -z "${image_json}" ]; then
echo "No existing :latest (or inspect failed) — safe to publish."
echo "push_latest=true" >> "$GITHUB_OUTPUT"
exit 0
fi

current_sha=$(
printf '%s' "${image_json}" \
| jq -r '.config.Labels."org.opencontainers.image.revision" // ""'
)

if [ -z "${current_sha}" ]; then
echo "Registry :latest has no revision label — safe to publish."
echo "push_latest=true" >> "$GITHUB_OUTPUT"
exit 0
fi

echo "Registry :latest is at ${current_sha}"
echo "This run is at ${GITHUB_SHA}"

if [ "${current_sha}" = "${GITHUB_SHA}" ]; then
echo ":latest already points at our SHA — nothing to do."
echo "push_latest=false" >> "$GITHUB_OUTPUT"
exit 0
fi

# Make sure we have the :latest commit locally for merge-base.
if ! git cat-file -e "${current_sha}^{commit}" 2>/dev/null; then
git fetch --no-tags --prune origin \
"+refs/heads/main:refs/remotes/origin/main" \
|| true
fi

if ! git cat-file -e "${current_sha}^{commit}" 2>/dev/null; then
echo "Registry :latest points at an unknown commit (${current_sha}); refusing to overwrite."
echo "push_latest=false" >> "$GITHUB_OUTPUT"
exit 0
fi

# Our SHA must be a descendant of the current :latest to be safe.
if git merge-base --is-ancestor "${current_sha}" "${GITHUB_SHA}"; then
echo "Our commit is a descendant of :latest — safe to advance."
echo "push_latest=true" >> "$GITHUB_OUTPUT"
else
echo "Another run advanced :latest past us (or diverged) — leaving it alone."
echo "push_latest=false" >> "$GITHUB_OUTPUT"
fi

# Retag the already-pushed SHA manifest as :latest. This is a registry-
# side operation — no rebuild, no layer re-push — so it's quick and
# atomic per-tag. The ancestor check above plus the cancel-in-progress
# concurrency on this job together guarantee we only ever move :latest
# forward in git history.
- name: Move :latest to this SHA
if: steps.latest_check.outputs.push_latest == 'true'
run: |
set -euo pipefail
image=nousresearch/hermes-agent
docker buildx imagetools create \
--tag "${image}:latest" \
"${image}:sha-${GITHUB_SHA}"
Loading