Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
10000 commits
Select commit Hold shift + click to select a range
f1133c9
chore: map bot@bkstock.dev to BKStock
kshitijk4poor Aug 3, 2026
7e47a0f
Merge pull request #77779 from kshitijk4poor/chore/attrib-bkstock
kshitijk4poor Aug 3, 2026
eaf4d51
perf(session): route SQLite PRAGMAs through central apply_database_pr…
crayfish-ai Jul 30, 2026
3ac7168
fix(pr): remove remnant local PRAGMAs from PR branch
crayfish-ai Jul 30, 2026
7026177
test(session): guard config-gated performance PRAGMAs across all conn…
kshitijk4poor Aug 3, 2026
416b56b
fix(desktop): flush queued deltas on window focus
unixwzrd Jul 30, 2026
7700597
perf(desktop): stop scroll and status loops in busy sessions
myk0la-b Jul 30, 2026
52fb96d
perf(desktop): pause hidden-pane timers in agents view, cron sidebar,…
hariNEzuMI928 Aug 3, 2026
e2a2149
style(desktop): restore alphabetical import order in agents/index.tsx
kshitijk4poor Aug 3, 2026
aece98c
refactor(desktop): shared pulse beat + fully-gated cron peek (simplif…
kshitijk4poor Aug 3, 2026
9d76d48
fix(lint): import sort + eslint-disable for timer-handle ref clear in…
kshitijk4poor Aug 3, 2026
dab7c88
fix(state): narrow FTS UPDATE triggers with AFTER UPDATE OF + migration
Jul 31, 2026
a5ce909
fix(state): fail closed on CJK trigger migration
yuzilongleif-collab Aug 1, 2026
b66111f
fix(state): quarantine CJK when ensure soft-fails after OF migration
Aug 1, 2026
ae17163
refactor(state): drop unreachable regex guard in trigger migration
kshitijk4poor Aug 3, 2026
c7fd21a
fix(security): reject always-blocked OpenViking endpoints
zapabob Jul 23, 2026
65bcca6
fix(openviking): fail closed on blocked endpoints
zapabob Aug 2, 2026
a3f6953
fix(openviking): don't spawn a second server onto a live port
jeff-mettel Jul 30, 2026
9014aa0
fix(openviking): drop stale "disabled for this Hermes run" warnings
Jul 26, 2026
f0cb219
fix(openviking): re-arm the commit guard after in-place compression
jeff-mettel Jul 30, 2026
f94914f
test(openviking): cover the compression lifecycle, not a hand-set latch
jeff-mettel Jul 30, 2026
5396dd8
fix(memory): read non-secret provider config from config.yaml for Ope…
PRATHAMESH75 Jul 20, 2026
4ebe990
fix(openviking): read recall settings from config.yaml first, env var…
justemu Jul 11, 2026
4b57943
test(openviking): cover config.yaml recall settings with temp-HERMES_…
justemu Jul 11, 2026
e43bc0b
fix(openviking): integrate reliability and configuration hardening
ehz0ah Aug 2, 2026
8fb9c3b
chore(contributors): map OpenViking source authors
ehz0ah Aug 2, 2026
e443d32
test(retaindb): guard scoped secret config resolution
ehz0ah Aug 3, 2026
a49a9e5
fix(openviking): verify servers before sending credentials
ehz0ah Aug 3, 2026
41cc4a1
fix(openviking): catch endpoint errors in setup validation functions
kshitijk4poor Aug 3, 2026
7d066c3
fix(state): deduplicate session system prompts
embwl0x Aug 2, 2026
26133b5
chore: map cicav legacy noreply email
kshitijk4poor Aug 3, 2026
5828687
fix(tui): avoid writable Kanban opens on empty polls
joncaldwell90 Jul 31, 2026
fe4cf36
Merge pull request #77796 from kshitijk4poor/chore/attrib-cicav
kshitijk4poor Aug 3, 2026
5bbd0db
fix(context): dedupe subdirectory hints by content digest and skip ba…
Jul 27, 2026
06ae5b6
perf(state): batch the turn flush into one SQLite transaction
Aug 3, 2026
b58b3ad
perf(tui-gateway): batch branch-seed history copies (whole-bug-class)
kshitijk4poor Aug 3, 2026
84146fb
test(run-agent): update flush-path fakes and assertions for batched w…
kshitijk4poor Aug 3, 2026
da6d960
refactor(state): fold simplify findings — reuse _insert_message_rows,…
kshitijk4poor Aug 3, 2026
5bff398
fix(tests): update two more append_message.call_args assertions to ap…
kshitijk4poor Aug 3, 2026
128ca2e
perf(tui): memoize useSessionLifecycle return (idea from #38491)
stremtec Aug 3, 2026
1770028
ci: retry uv python install
ethernet8023 Aug 3, 2026
67d4bbb
fix(state): route session-resume reads through the WAL read-only conn…
pierrenode Jul 28, 2026
d48a78a
chore: add contributor email mapping for ArcherQAQ
kshitijk4poor Aug 3, 2026
d5584a3
Merge pull request #77821 from kshitijk4poor/chore-archer-email
kshitijk4poor Aug 3, 2026
fc32a38
fix(model_metadata): rewrite localhost->IPv4 for the remaining local …
pierrenode Aug 3, 2026
733e7d2
fix(model_metadata): guard _localhost_to_ipv4 against non-string urls
kshitijk4poor Aug 3, 2026
25a9c2c
perf(cold-start): mitigate ~14s GIL stall during backend init (#60800)
jinglun010-cpu Jul 8, 2026
0bb1462
test: harden cold-start regression tests + debug-log the env-var skip
kshitijk4poor Aug 3, 2026
003b4c8
perf(gateway): per-platform skip_context_files to cut agent build lat…
ArcherQAQ Aug 3, 2026
2f09df5
fix(relay): route Discord tool-progress into the auto-thread, not the…
benbarclay Aug 3, 2026
1f8acb3
fix(agent): stop re-probing endpoints that blackhole TCP connects
rlaope Aug 3, 2026
3c27eb6
chore: release v0.20.0 (2026.8.3)
teknium1 Aug 3, 2026
3763706
chore: add contributor email mapping for Ahmett101
kshitijk4poor Aug 3, 2026
f03eb25
Merge pull request #77867 from kshitijk4poor/chore-ahmett-email
kshitijk4poor Aug 3, 2026
d1c6c6b
perf(moa): cache resolved preset + per-slot runtime to cut cold-start…
Jul 18, 2026
e6f1d61
fix(discord): leave voice channels before cancelling the bot task
BrinShadewater Aug 1, 2026
c0b0cc3
feat(image): parallelize image_generate batches
EndeavorYen May 28, 2026
952d86b
fix(file-sync): serialize concurrent sync cycles
EndeavorYen Jul 13, 2026
a7ad713
fix(tool-executor): unpack 5-tuple runnable_calls in _max_workers_for…
kshitijk4poor Aug 3, 2026
9267c78
fix: exponential backoff for rate-limit fallback cooldown
May 22, 2026
df9dbba
fix(backoff): keep 60s first-hit cooldown, escalate only on consecuti…
kshitijk4poor Aug 3, 2026
861ca18
fix(catalog): wire api_key auth headers for http MCP servers
JonthanaHanh Aug 3, 2026
f8f4755
perf(compressor): release allocator pages after successful compaction
kshitijk4poor Aug 3, 2026
00475e1
fix(catalog): validate http+api_key manifests declare the header's en…
kshitijk4poor Aug 3, 2026
23f8ae3
fix(agent): cap auxiliary LLM concurrency per task
konsisumer Jul 18, 2026
ddae511
fix: thread extra_headers through the call_llm split
kshitijk4poor Aug 3, 2026
7eefb09
fix(nix): tie devShell's HERMES_PYTHON to the venv actually on PATH
ethernet8023 Aug 3, 2026
9b9cbdd
fix(system_prompt): move skills index to the volatile band
marzukia Jun 2, 2026
9555525
docs(system_prompt): fix stale reconstruct_static_prefix docstring ex…
kshitijk4poor Aug 3, 2026
efbfe08
fix(prompt_size): search volatile tier for skills block after the sta…
kshitijk4poor Aug 3, 2026
164c3d6
chore: add contributor email mapping for zabih-sudo
kshitijk4poor Aug 3, 2026
d92a28d
Merge pull request #77902 from kshitijk4poor/chore-zabih-email
kshitijk4poor Aug 3, 2026
f40d63d
chore: add contributor email mapping for HAOWANG116
kshitijk4poor Aug 3, 2026
53cc628
Merge pull request #77912 from kshitijk4poor/chore-haowang-email
kshitijk4poor Aug 3, 2026
aad8f74
fix(backup): serialize and atomically publish snapshots
Jul 22, 2026
827bb0d
chore: add contributor email mapping for ElSnacko
kshitijk4poor Aug 3, 2026
0845232
fix: prefer explicit anthropic api key
kshitijk4poor Aug 3, 2026
a991dfc
docs: document /personality none|default|neutral reset across persona…
teknium1 Aug 3, 2026
9a9b670
fix(relay): avoid concurrent turn scope corruption
bbednarski9 Jul 30, 2026
704baa5
fix(relay): preserve legacy turn shims
bbednarski9 Jul 30, 2026
a2a08fe
fix(relay): gate skipped turn metrics
bbednarski9 Jul 30, 2026
2e65b0c
test(relay): enforce LIFO in overlap regression
bbednarski9 Jul 31, 2026
e1caa61
fix(relay): preserve skipped turn context
bbednarski9 Aug 3, 2026
dac4bbe
fix comment about relay workaround
jquesnelle Aug 3, 2026
3c3ae74
feat(models): add qwen3.8-max to Nous portal + OpenRouter catalogs, r…
teknium1 Aug 3, 2026
91937a6
test: swap context-switch-guard fixture off qwen3.8-max-preview
teknium1 Aug 3, 2026
70db671
Merge pull request #76643 from NousResearch/fix/termux-nemo-relay
jquesnelle Aug 4, 2026
d218496
Merge pull request #77924 from kshitijk4poor/chore/author-map-elsnacko
kshitijk4poor Aug 4, 2026
3a0a295
fix(agent): keep context_length pin for named custom providers
xxxigm Aug 3, 2026
942ff91
test(gateway): cover named-custom context pin on session-info banner
xxxigm Aug 3, 2026
60c721a
fix(model_metadata): read llama.cpp context from meta.n_ctx + accept …
ElSnacko Jul 15, 2026
f66d625
chore: add contributor email mapping for johnrazmus
kshitijk4poor Aug 4, 2026
e4888a9
Merge pull request #78226 from kshitijk4poor/chore-razmus-email
kshitijk4poor Aug 4, 2026
3b0bb3b
fix(gateway): keep event loop alive during /compress and Relay drain
Dannyzen Aug 4, 2026
9c88625
fix(gateway): bound go_dormant ws.close with teardown timeout
kshitijk4poor Aug 4, 2026
e623432
fix: close the Codex app-server session on agent teardown
johnrazmus Aug 4, 2026
ba9068c
fix(agent): discard bare tool-call marker before fallback/persistence…
JoaoMarcos44 Aug 4, 2026
70d7e4c
fix(agent): repair sessions already contaminated with stale tool-call…
JoaoMarcos44 Aug 4, 2026
e1a2739
feat(cli): add sessions clean-markers to permanently purge stale tool…
JoaoMarcos44 Aug 4, 2026
e18c040
fix(cli): back up state.db before clean-markers writes by default
JoaoMarcos44 Aug 4, 2026
15d51bb
refactor: dedup stale-marker regex — use compiled _STALE_MARKER_RE in…
kshitijk4poor Aug 4, 2026
9938d20
fix(conversation_loop): compress messages on output-cap retry path (#…
Rafa-Ross Aug 3, 2026
04098e2
fix(conversation_loop): prune dead vision-strip fallback; harden outp…
BobClawblaw Aug 3, 2026
78c8bcd
chore: drop CHANGELOG.md and docs/reports/ — not shipped with salvage…
kshitijk4poor Aug 4, 2026
9fc8926
perf: reuse request_input_estimate instead of recomputing estimate_re…
kshitijk4poor Aug 4, 2026
743dc94
chore: AUTHOR_MAP — add BobClawblaw for PR #77870 salvage
kshitijk4poor Aug 4, 2026
9ce917f
chore(ci): rerun checks
bbednarski9 Aug 4, 2026
bdc82e3
perf(gateway): prewarm /model picker cache on TUI startup
ZachariahChu Jul 26, 2026
5c078b9
test(tui): pin picker-cache prewarm wiring in entry.main()
kshitijk4poor Aug 4, 2026
dbafb59
perf(cli): check local auth.json/config before slow provider registry…
frohsinnllc Jul 12, 2026
8f52040
test(cli): regression tests pinning auth-first ordering skips registr…
kshitijk4poor Aug 4, 2026
9a20d7f
perf(desktop): keep spinner frames out of React commits
myk0la-b Jul 29, 2026
be54f28
test(desktop): cover minimized/hidden window-state + visibilitychange…
kshitijk4poor Aug 4, 2026
9076ada
fmt(js): `npm run fix` on merge (#78271)
hermes-seaeye[bot] Aug 4, 2026
7098862
perf(gateway): replace SSE poll loop with call_soon_threadsafe-fed as…
zabih-sudo Jul 15, 2026
7a1f2e3
refactor(gateway): extract _sse_frame() helper, dedup 5 inline SSE en…
zabih-sudo Jul 15, 2026
1a09b07
refactor(gateway): route all three SSE writers through _sse_frame()
zabih-sudo Jul 16, 2026
221afc0
refactor(gateway): route session event stream through _sse_frame (ens…
zabih-sudo Jul 16, 2026
fc8e393
test: add cross-thread put_threadsafe + long-reasoning tail tests
zabih-sudo Jul 31, 2026
98165da
fix: reconstruct fused test after conflict resolution
kshitijk4poor Aug 3, 2026
64882bc
perf(tui): bound reasoning-clean input to the displayed tail
zabih-sudo Aug 4, 2026
7e344dc
test: exercise the production _loop_ref path in put_threadsafe tests
kshitijk4poor Aug 4, 2026
fb4e17b
fix(test): feed the SSE writers an asyncio queue, not queue.Queue
kshitijk4poor Aug 4, 2026
db0bd42
fix(credential-pool): re-select in acquire_lease after a deferred ref…
kshitijk4poor Aug 4, 2026
4075c8f
fix(credential-pool): lock the quarantine read-modify-write of _entries
kshitijk4poor Aug 4, 2026
cb3e8e9
perf(file-ops): eliminate redundant subprocess calls in write_file an…
zzy-git Jun 30, 2026
eb78ab2
fix(file-ops): decouple BOM detection from pre_content, add V4A backw…
zzy-git Jul 15, 2026
fcae5ad
fix(file-ops): surrogatepass in bytes_written encode (review finding)
kshitijk4poor Aug 3, 2026
8c19e29
refactor(file-ops): fold simplify-pass findings
kshitijk4poor Aug 3, 2026
622b9a9
chore: update uv.lock for tomli dependency (rebase fix)
kshitijk4poor Aug 3, 2026
1709f82
chore: remove dead tomli dependency declaration
kshitijk4poor Aug 4, 2026
e05eba2
fix(telegram+sqlite): resolve polling conflict loop + misleading WAL …
kshitijk4poor Aug 4, 2026
e9a8b70
chore: map jun@junho.co to junhohong
kshitijk4poor Aug 4, 2026
3aeff23
Merge pull request #78362 from kshitijk4poor/chore/attrib-junhohong
kshitijk4poor Aug 4, 2026
cab8673
fix(dashboard): reload loopback tabs after stale session-token closes
izumi0uu Jun 28, 2026
19e697d
fix: update ChatPage test import for react-router v7
kshitijk4poor Aug 4, 2026
b8b17b8
fix: wire HermesConsoleModal WS into stale-token reload guard
kshitijk4poor Aug 4, 2026
d2772b4
fix(xai): honor configured web search backend on Responses path
xxxigm Aug 4, 2026
29eba9c
test(xai): cover Firecrawl vs native web_search on Responses
xxxigm Aug 4, 2026
f5be923
refactor(xai): simplify _xai_prefers_native_web_search to use registry
kshitijk4poor Aug 4, 2026
80c7ccf
fix(relay): gate skipped task completion
bbednarski9 Aug 4, 2026
f663190
fix(model-switch): treat models dict as metadata, not allowlist
HexLab98 Jul 27, 2026
e6977f4
test(model-switch): cover Ollama context_length models dict probing
HexLab98 Jul 27, 2026
42708f8
Merge pull request #74864 from bbednarski9/fix/relay-concurrent-turn-…
jquesnelle Aug 4, 2026
5943bab
Merge branch 'main' into feat/hermes-relay-model-metrics
jquesnelle Aug 4, 2026
3fa318a
Merge pull request #68881 from afourniernv/feat/hermes-relay-model-me…
jquesnelle Aug 4, 2026
daf67f2
Merge branch 'main' into feat/hermes-relay-tool-metrics
jquesnelle Aug 4, 2026
d20debd
Merge updated tool metrics into skill metrics
afourniernv Aug 4, 2026
91337e5
fix(desktop): ⌘1 / ⌃Tab return to the chat from a full-page view
OutThisLife Aug 4, 2026
5d24594
feat(desktop): expose native OS notifications to plugins via ctx.noti…
serefyarar Aug 2, 2026
1ed702b
refactor(desktop): share render weight between the two transcript bud…
OutThisLife Aug 4, 2026
a538b1c
fix(desktop): bound the transcript reaching assistant-ui by render co…
OutThisLife Aug 4, 2026
62012a5
feat(desktop): Show earlier pages the DOM, then pulls older history f…
OutThisLife Aug 4, 2026
e8ccb4a
feat(desktop): ctx.os — the curated OS door for plugins
OutThisLife Aug 4, 2026
fe859a1
fix(credential-pool): clear exhaustion state on key rotation (#22622)
pasevin Aug 4, 2026
be55e99
Merge pull request #78679 from NousResearch/bb/tab-keys-leave-pages
OutThisLife Aug 4, 2026
6acae30
feat(desktop): ctx.os — plugins get a curated door to native notifica…
OutThisLife Aug 4, 2026
2d70f56
fix(agent): adopt .env credential/base-url edits at the turn boundary…
rapsealk Aug 4, 2026
97641a8
fix(debug): say where a client-side log lives instead of "(file not f…
OutThisLife Aug 4, 2026
b281b2c
Merge pull request #78683 from NousResearch/bb/55191-transcript-window
OutThisLife Aug 4, 2026
dcd7504
fix(credential-pool): short cooldown for sole credential on transient…
ahmadalzaro1 Jun 26, 2026
d1eb08f
fix: thread sole_credential into next_available_at sibling site
kshitijk4poor Aug 4, 2026
9cd0338
fix(credential-pool): bench a billing 403 fully, even as the sole key
OutThisLife Aug 4, 2026
9712b8f
test: teach the hand-rolled fake pools the failure_reason kwarg
OutThisLife Aug 4, 2026
d119675
feat(profiles): REST export/import + extra_files overlay hook
OutThisLife Aug 4, 2026
bde8c4e
feat(cli): /export and /import slash commands for profile sharing
OutThisLife Aug 4, 2026
6e7eafc
feat(desktop): share a profile as a portable bundle - theme, layout, …
OutThisLife Aug 4, 2026
b3e45a3
Discord drops an empty outbound message instead of sending it (#78815)
OutThisLife Aug 4, 2026
ec0c8d9
feat(state): sessions carry read/unread state
OutThisLife Aug 4, 2026
f40fbcf
Merge pull request #68882 from afourniernv/feat/hermes-relay-tool-met…
jquesnelle Aug 4, 2026
cc8e974
feat(desktop): the layout tree moves a tab block as one unit
OutThisLife Aug 4, 2026
33c1d1f
feat(desktop): shift-click and opt-click select tabs to drag together
OutThisLife Aug 4, 2026
d98287f
Merge pull request #78831 from NousResearch/bb/session-read-state
OutThisLife Aug 4, 2026
28b3b0d
feat(gateway): session.workspace.move — re-home a stored session's wo…
OutThisLife Aug 4, 2026
edae3ee
feat(desktop): move a session to another project from its row menu
OutThisLife Aug 4, 2026
1d6606d
fix(profiles): exported archives open in Finder (GNU tar, not PAX)
OutThisLife Aug 4, 2026
0106844
Merge pull request #78849 from NousResearch/bb/multi-tab-drag
OutThisLife Aug 4, 2026
ec9572f
Merge pull request #78854 from NousResearch/bb/session-move-project
OutThisLife Aug 4, 2026
0a48af2
Merge pull request #78812 from NousResearch/bb/profile-share
OutThisLife Aug 4, 2026
4371712
fix(models): a model id missing its vendor prefix says so instead of …
OutThisLife Aug 4, 2026
fdc342c
fix(models): a model id missing its vendor prefix says so instead of …
OutThisLife Aug 4, 2026
9621f90
fix(install): resolve 8.3 profile aliases so a built desktop app stop…
xxxigm Aug 4, 2026
dae7e54
test(install): exercise 8.3 normalization by running install.ps1, not…
Sahil-SS9 Aug 4, 2026
3483330
ci(install): actually run the PowerShell installer tests
OutThisLife Aug 4, 2026
84874c5
feat(dev-sandbox): support fake installer / fake main / git clones
ethernet8023 Jul 28, 2026
3d9ec4d
test(install): prove updating from a release reaches this commit
ethernet8023 Aug 4, 2026
36cb5ae
ci: test updating from sampled release tags, on tag + every 12h
ethernet8023 Aug 4, 2026
334c02b
test(observability): exercise the active worktree in metrics smoke
afourniernv Aug 4, 2026
451a078
Merge latest origin/main into skill metrics
afourniernv Aug 4, 2026
42e92c9
fix(git): kill the whole probe process tree on timeout (port of opena…
teknium1 Aug 5, 2026
aec3318
chore: suppress windows-footgun false positive on gated killpg
teknium1 Aug 5, 2026
652ebc5
fix(console): handle string SystemExit code in _capture_output
golldyck Jul 4, 2026
649ce1f
fix(cli): make profile.yaml and skin writes atomic to stop silent fie…
briandevans Aug 4, 2026
63c0bb6
fix(cli): correct the skin_cmd fallback comment to match the actual r…
briandevans Aug 4, 2026
a6e1e27
refactor: trim verbose comments + drop redundant default_flow_style k…
kshitijk4poor Aug 5, 2026
530d814
fix(desktop): scope restored navigation by profile (#67709)
Aug 5, 2026
2221010
fmt(js): `npm run fix` on merge (#79155)
hermes-seaeye[bot] Aug 5, 2026
34c3f06
fix(cache): scope prompt_cache_key by session to stop cross-session b…
JoaoMarcos44 Aug 5, 2026
c4f3d5a
fix(agent): prevent historical steer replay
burak33bb Aug 4, 2026
82c6aca
chore: add contributor mapping for burak33bb
kshitijk4poor Aug 5, 2026
84e93ff
fix(state): stop delegate/tool children corrupting compression lineage
RyderFreeman4Logos Aug 5, 2026
d55bc06
fix(delegation): keep subagents alive during slow model waits
xxxigm Aug 4, 2026
62800dd
docs(delegation): note in-flight model waits count as progress
xxxigm Aug 4, 2026
1be70d6
fix: join heartbeat thread in finally + add error-path test
kshitijk4poor Aug 5, 2026
ae6c2e5
Merge pull request #78682 from NousResearch/bb/win-8dot3-profile-paths
OutThisLife Aug 5, 2026
49d8a15
fix(terminal): skip binary content on the referenced-script remote-re…
PRATHAMESH75 Aug 3, 2026
949babd
ci: add detailed logging to live comment poller
ethernet8023 Jul 24, 2026
1d7d0e4
ci: poll review statuses from artifacts every cycle
ethernet8023 Jul 24, 2026
ee7c614
fix(ci): follow artifact download redirect without auth
ethernet8023 Aug 5, 2026
b846f0c
fix(desktop): stop dialogs clipping popovers opened inside them
ethernet8023 Jul 31, 2026
b818c42
fix(desktop): mount one worktree dialog instead of one per composer
ethernet8023 Jul 31, 2026
cb7f594
feat(desktop): let convert-a-branch reach remote branches too
ethernet8023 Aug 4, 2026
b879df2
fix(desktop): worktree dialog names the project, not the branch
ethernet8023 Aug 5, 2026
eea6044
feat(desktop): register a Linux launcher entry for `hermes desktop`
ethernet8023 Aug 1, 2026
b27cdc3
feat(nix): desktop app icon
ethernet8023 Aug 5, 2026
acb590f
fix(nix): fix electron headers sha
ethernet8023 Aug 5, 2026
b4312f9
docs: state the /goal vs Kanban boundary on both pages
notwitcheer Aug 4, 2026
abaa43e
docs: add 'Which File Does What?' - one-page map of SOUL/USER/MEMORY/…
notwitcheer Aug 4, 2026
8cc4ff2
docs: add per-plan subscription billing table to providers page
notwitcheer Aug 4, 2026
e20cfd3
docs: four small accuracy fixes
notwitcheer Aug 4, 2026
6cd0aca
docs: surface existing answers users can't find (migration, prompt-si…
notwitcheer Aug 5, 2026
8618eba
docs: add security-posture guide for running Hermes on a personal or …
notwitcheer Aug 5, 2026
a5ab9b2
docs: add troubleshooting checklist for perceived agent-quality regre…
notwitcheer Aug 5, 2026
f8aed15
docs: warn against pointing two agents at one Hermes home (memory, pr…
notwitcheer Aug 5, 2026
7ce6f97
docs: explain the slow silent first turn (prefill) on local hardware
notwitcheer Aug 5, 2026
2183ed3
docs: fix stale PATH location in windows-native common pitfalls
notwitcheer Aug 5, 2026
cc245e8
fix: correct cron mid-run restart claim in salvaged docs
kshitijk4poor Aug 5, 2026
105fbf6
feat(wake): client-capture wake word for remote desktop
Jul 31, 2026
d401c27
fix(wake): address review on client-capture re-arm and feed queue
Jul 31, 2026
60808dc
fix(wake): auto capture keeps the backend mic when one exists
OutThisLife Aug 5, 2026
6df3912
perf(desktop): coalesce wake.feed frames
OutThisLife Aug 5, 2026
dfc1cbe
docs(config): document wake_word.capture in cli-config.yaml.example
OutThisLife Aug 5, 2026
069551d
fix(desktop): preview remote HTML over SSH (#76008)
BearHuddleston Aug 5, 2026
17a5a95
fix(desktop): open remote file rows in the in-app preview
OutThisLife Aug 5, 2026
7c33b80
chore: fix import order, map contributor email
OutThisLife Aug 5, 2026
18ed612
fmt(js): `npm run fix` on merge (#79496)
hermes-seaeye[bot] Aug 5, 2026
4aeffb8
fix(desktop): open remote file rows in the in-app preview (#79494)
OutThisLife Aug 5, 2026
c864827
In-app browser and previews are real layout-tree tabs (#77705)
OutThisLife Aug 5, 2026
c6fe31a
test(desktop): expect client_capture in wake.start/status params
OutThisLife Aug 5, 2026
c8fdc51
fix(desktop): render remote PDFs in preview rail
mattprusak Aug 2, 2026
7e16241
feat(wake): hands-free wake word for remote desktop via client mic st…
OutThisLife Aug 5, 2026
9e9b3fc
fmt(js): `npm run fix` on merge (#79505)
hermes-seaeye[bot] Aug 5, 2026
950b55d
feat(update): emit an action-scoped terminal receipt from hermes update
OutThisLife Aug 5, 2026
eb68ffb
fix(desktop): make remote backend updates terminal-state driven
OutThisLife Aug 5, 2026
28a3fe5
Merge pull request #79507 from NousResearch/bb/remote-pdf-preview
OutThisLife Aug 5, 2026
64646dd
Hermes can read the in-app browser (#79482)
OutThisLife Aug 5, 2026
69bedb7
fix(desktop): stop reporting false failure on successful backend upda…
OutThisLife Aug 5, 2026
25c7827
fmt(js): `npm run fix` on merge (#79521)
hermes-seaeye[bot] Aug 5, 2026
0531aad
Merge pull request #68883 from afourniernv/feat/hermes-relay-skill-me…
jquesnelle Aug 5, 2026
ee60fad
merge: upstream/main v0.20 lineage into fork (DAN-2485)
dizhaky Aug 5, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
74 changes: 74 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,30 @@
.gitignore
.gitmodules

# Python
__pycache__
*.py[cod]
*$py.class
*.so
.Python
*.egg-info/
dist/
build/

# Virtual environments
venv/
env/
ENV/

# Dependencies
node_modules
**/node_modules
.venv
**/.venv
.notebooklm-cli-venv/
.notebooklm-playwright/
.pip-cache/
.uv-cache/

# Built artifacts that are regenerated inside the image. Excluded so local
# rebuilds on the developer's machine don't invalidate the npm-install layer
Expand All @@ -20,12 +39,67 @@ ui-tui/packages/hermes-ink/dist/

# Environment files
.env
.env.*

# IDE
.vscode/
.idea/
*.swp
*.swo

# Testing
.pytest_cache/
.coverage
htmlcov/

# Documentation
*.md

# Runtime data (bind-mounted at /opt/data; must not leak into build context)
data/
.hermes-docker/
.notebooklm-home/

# 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/shared is the dashboard↔desktop websocket helper and is linked from
# web/package.json as a file: workspace dep — keep it in the build context.
apps/
!apps/shared/
!apps/shared/**

# 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/

# Repo-level dotfiles that are git-only or dev-tooling config
.env.example
.envrc
.gitattributes
.hadolint.yaml
.mailmap
32 changes: 29 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# Hermes Agent Environment Configuration
# Copy this file to .env and fill in your API keys

# =============================================================================
# LLM PROVIDER (Fireworks AI)
# =============================================================================
# Get your key at: https://app.fireworks.ai/settings/users/api-keys
# Address models directly by catalog ID, e.g.
# accounts/fireworks/models/kimi-k2p6, accounts/fireworks/models/glm-5p2
# FIREWORKS_API_KEY=
# =============================================================================
# LLM PROVIDER (OpenRouter)
# =============================================================================
Expand Down Expand Up @@ -105,8 +112,13 @@
# Get your token at: https://huggingface.co/settings/tokens
# Required permission: "Make calls to Inference Providers"
# HF_TOKEN=
# HF_BASE_URL=https://router.huggingface.co/v1 # Override default base URL
# OPENCODE_GO_BASE_URL=https://opencode.ai/zen/go/v1 # Override default base URL

# DeepInfra — 100+ top open models, pay-per-use.
# Get your key at: https://deepinfra.com/dash/api_keys
# DEEPINFRA_API_KEY=

# =============================================================================
# LLM PROVIDER (Qwen OAuth)
# =============================================================================
Expand All @@ -124,6 +136,15 @@
# Optional base URL override:
# XIAOMI_BASE_URL=https://api.xiaomimimo.com/v1

# =============================================================================
# LLM PROVIDER (Upstage Solar)
# =============================================================================
# Upstage provides access to Upstage Solar models.
# Get your key at: https://console.upstage.ai/api-keys
# UPSTAGE_API_KEY=your_key_here
# Optional base URL override:
# UPSTAGE_BASE_URL=https://api.upstage.ai/v1

# =============================================================================
# TOOL API KEYS
# =============================================================================
Expand Down Expand Up @@ -417,26 +438,31 @@ IMAGE_TOOLS_DEBUG=false
# Groq API key (free tier — used for Whisper STT in voice mode)
# GROQ_API_KEY=

# ElevenLabs API key (cloud STT/TTS — Scribe transcription)
# ELEVENLABS_API_KEY=

# =============================================================================
# STT PROVIDER SELECTION
# =============================================================================
# Default STT provider is "local" (faster-whisper) — runs on your machine, no API key needed.
# Install with: pip install faster-whisper
# Model downloads automatically on first use (~150 MB for "base").
# To use cloud providers instead, set GROQ_API_KEY or VOICE_TOOLS_OPENAI_KEY above.
# Provider priority: local > groq > openai
# Configure in config.yaml: stt.provider: local | groq | openai
# To use cloud providers instead, set GROQ_API_KEY, VOICE_TOOLS_OPENAI_KEY, or ELEVENLABS_API_KEY above.
# Provider priority: local > groq > openai > mistral > xai > elevenlabs
# Configure in config.yaml: stt.provider: local | groq | openai | mistral | xai | elevenlabs

# =============================================================================
# STT ADVANCED OVERRIDES (optional)
# =============================================================================
# Override default STT models per provider (normally set via stt.model in config.yaml)
# STT_GROQ_MODEL=whisper-large-v3-turbo
# STT_OPENAI_MODEL=whisper-1
# STT_ELEVENLABS_MODEL=scribe_v2

# 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
# ELEVENLABS_STT_BASE_URL=https://api.elevenlabs.io/v1

# =============================================================================
# MICROSOFT TEAMS INTEGRATION
Expand Down
6 changes: 3 additions & 3 deletions .envrc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
watch_file pyproject.toml uv.lock
watch_file ui-tui/package-lock.json ui-tui/package.json
watch_file flake.nix flake.lock nix/devShell.nix nix/tui.nix nix/package.nix nix/python.nix
watch_file pyproject.toml uv.lock hermes
watch_file package-lock.json package.json web/package.json ui-tui/package.json website/package.json apps/shared/package.json apps/desktop/package.json ui-tui/packages/hermes-ink/package.json
watch_file flake.nix flake.lock nix/devShell.nix nix/tui.nix nix/package.nix nix/python.nix nix/hermes-agent.nix nix/desktop.nix

use flake
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
# Auto-generated files — collapse diffs and exclude from language stats
web/package-lock.json linguist-generated=true

# Enforce LF for scripts that run inside Linux containers.
# Without this, Windows checkout converts to CRLF and breaks `exec` in the
# container entrypoint with "no such file or directory".
*.sh text eol=lf
Dockerfile text eol=lf
*.dockerfile text eol=lf
docker/entrypoint.sh text eol=lf
111 changes: 111 additions & 0 deletions .github/actions/detect-changes/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Detect affected areas
description: >-
Classify a PR's changed files into CI work lanes (python, frontend, site,
scan, deps, mcp_catalog) so the orchestrator can conditionally call only
the sub-workflows a PR can affect. Outputs are always "true" on push/dispatch
events and fail open (everything "true") when the diff cannot be computed.

inputs:
github-token:
description: Token for the GitHub API (gh CLI). Pass steps.app-token.outputs.token from the calling workflow.
required: false
default: ${{ github.token }}

outputs:
python:
description: Run Python tests / ruff / ty / windows-footguns.
value: ${{ steps.classify.outputs.python }}
python_prod:
description: Python changes outside tests/ — gates product jobs (Desktop E2E, Docker).
value: ${{ steps.classify.outputs.python_prod }}
frontend:
description: Run the TypeScript testing matrix + desktop build.
value: ${{ steps.classify.outputs.frontend }}
docker_meta:
description: Docker setup and meta files have changed.
value: ${{ steps.classify.outputs.docker_meta }}
site:
description: Build the Docusaurus docs site.
value: ${{ steps.classify.outputs.site }}
scan:
description: Run the supply-chain critical-pattern scanner.
value: ${{ steps.classify.outputs.scan }}
deps:
description: Check pyproject.toml dependency upper bounds.
value: ${{ steps.classify.outputs.deps }}
npm_lock:
description: Post/update the semantic package-lock.json diff PR comment.
value: ${{ steps.classify.outputs.npm_lock }}
installer:
description: Run the PowerShell installer tests on a Windows runner.
value: ${{ steps.classify.outputs.installer }}
mcp_catalog:
description: Require MCP catalog security review label.
value: ${{ steps.classify.outputs.mcp_catalog }}
ci_review:
description: Require CI-sensitive file review label.
value: ${{ steps.classify.outputs.ci_review }}
ci_review_files:
description: JSON list of CI-sensitive files changed by the pull request.
value: ${{ steps.classify.outputs.ci_review_files }}

runs:
using: composite
steps:
- name: Classify changed files
id: classify
shell: bash
env:
# Fall back to the built-in read-only token when the caller passes an
# empty value. Fork PRs get no repo secrets, so AUTOFIX_BOT_PAT is ""
# there, and an input `default:` only applies when the input is omitted,
# not when it's passed empty. Without this fallback the compare API
# fails on forks and the classifier fails open (every lane forced on).
GH_TOKEN: ${{ inputs.github-token || github.token }}
REPO: ${{ github.repository }}
EVENT_NAME: ${{ github.event_name }}
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
set -euo pipefail

# Only pull_request events are gated. Other events (push, release,
# dispatch) leave CHANGED empty, so the classifier fails open and every
# lane runs. Post-merge / on-demand validation is never weakened.
if [ "$EVENT_NAME" = "pull_request" ]; then
# Use the compare endpoint with the pinned base/head SHAs from the
# event payload instead of the "current PR files" endpoint. The SHAs
# are frozen at trigger time, so the file list is deterministic even
# if the PR receives a new push between trigger and detect.
#
# Retried: a rate-limit blip or eventual-consistency 404 on a
# freshly-pushed HEAD would otherwise silently fall open (all lanes
# run — safe, but wasteful and it masks the API failure).
#
# `.files[]?` (null-safe): with --paginate, a PR more than 100
# commits ahead of its merge-base paginates the compare, and pages
# after the first carry `files: null` — bare `.files[]` makes jq
# die with "cannot iterate over: null", which fails every retry
# and forces the fail-open path (seen on stacked PRs). The full
# file list (up to the API's 300-file cap) is on page one.
CHANGED=""
for i in 1 2 3; do
if CHANGED="$(gh api \
--paginate \
"repos/${REPO}/compare/${BASE_SHA}...${HEAD_SHA}" \
--jq '.files[]?.filename')"; then
break
fi
if [ "$i" = 3 ]; then
echo "::warning::compare API failed after 3 attempts — failing open (all lanes run)"
CHANGED=""
break
fi
echo "::warning::compare API failed (attempt $i); retrying in 10s"
sleep 10
done
fi

echo "Changed files:"
printf '%s\n' "${CHANGED:-(none)}"
printf '%s\n' "${CHANGED:-}" | python3 scripts/ci/classify_changes.py
69 changes: 69 additions & 0 deletions .github/actions/get-app-token/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Get GitHub App Token
description: >-
Mint a short-lived (1-hour) installation access token from the repo's
GitHub App, replacing the long-lived AUTOFIX_BOT_PAT. App tokens get
5,000 req/hr per installation (vs 1,000 for the default GITHUB_TOKEN)
and are scoped to the App's installation permissions, not a user account.

Callers must source App credentials from a protected, main-only environment.
Never pass an App private key to a pull_request job, a local action, or a
reusable workflow resolved from an untrusted PR ref. The fallback keeps a
trusted caller functional when its protected environment is misconfigured.

Composite actions cannot access contexts directly, so callers pass the
public vars.APP_CLIENT_ID and protected secrets.APP_PRIVATE_KEY as inputs.
When the private key is empty, the fallback fires.

inputs:
client-id:
description: GitHub App Client ID. Pass vars.APP_CLIENT_ID from the calling workflow.
required: false
default: ''
private-key:
description: GitHub App private key PEM. Pass secrets.APP_PRIVATE_KEY from the calling workflow.
required: false
default: ''
owner:
description: GitHub App installation owner. Empty scopes the token to the current repository.
required: false
default: ''
repositories:
description: Comma- or newline-separated repositories to scope within the installation owner.
required: false
default: ''

outputs:
token:
description: A GitHub App installation access token (1-hour TTL), or GITHUB_TOKEN on forks.
value: ${{ steps.app-token.outputs.token || steps.fallback.outputs.token }}

runs:
using: composite
steps:
- name: Check if App credentials exist
id: check
shell: bash
env:
CLIENT_ID: ${{ inputs.client-id }}
run: |
if [ -n "$CLIENT_ID" ]; then
echo "has_app=true" >> "$GITHUB_OUTPUT"
else
echo "has_app=false" >> "$GITHUB_OUTPUT"
fi

- name: Create GitHub App token
id: app-token
if: steps.check.outputs.has_app == 'true'
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ inputs.client-id }}
private-key: ${{ inputs.private-key }}
owner: ${{ inputs.owner }}
repositories: ${{ inputs.repositories }}

- name: Fall back to GITHUB_TOKEN
id: fallback
if: steps.check.outputs.has_app != 'true'
shell: bash
run: echo "token=${{ github.token }}" >> "$GITHUB_OUTPUT"
Loading
Loading