Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
260 commits
Select commit Hold shift + click to select a range
dc5ef20
test(reasoning-floor): isolate stale-timeout floor tests from config-…
teknium1 Jun 29, 2026
f5ecbe1
feat(dashboard): auto-initiate portal SSO redirect on unauthenticated…
benbarclay Jun 29, 2026
61f56d2
refactor(dashboard-auth): drop redundant _interactive_providers helper
teknium1 Jun 29, 2026
23c03ce
fix(session-db): enrich NULL session metadata via upsert instead of I…
teknium1 Jun 29, 2026
576424c
fix(security): redact browser CDP endpoint logs
Ruzzgar Apr 5, 2026
9e49013
fix(security): fail-closed feishu webhook rate limiter + whatsapp bri…
Mibayy Jun 29, 2026
0fe9755
fix(gateway): use last_prompt_tokens for session-reset activity check
Mibayy Jun 29, 2026
cdd8e0a
test(gateway): exercise last_prompt_tokens in reset-activity tests
teknium1 Jun 29, 2026
1debd5e
fix(security): add session-id filename sanitizer to prevent path trav…
Xowiek Jun 29, 2026
ea1372d
fix(security): wire session-id sanitizer into artifact paths + API bo…
teknium1 Jun 29, 2026
09666ce
fix(gateway): neutralize untrusted session metadata in prompts
Xowiek Apr 7, 2026
dbad6d4
fix(gateway): also neutralize untrusted Matrix room name in prompt
teknium1 Jun 29, 2026
f53ba9b
fix(s6): dot-prefix gateway staging dir so svscan ignores it mid-buil…
benbarclay Jun 29, 2026
88e6f9b
fix(auxiliary): preserve max_tokens for NVIDIA NIM aux calls
HexLab98 Jun 29, 2026
f134529
test(auxiliary): cover NVIDIA NIM max_tokens in _build_call_kwargs
HexLab98 Jun 29, 2026
fd32456
feat(desktop): add context usage breakdown popover
austinpickett Jun 29, 2026
3bbeb9e
Merge pull request #54907 from NousResearch/austin/feat/context-usage…
OutThisLife Jun 29, 2026
c6c1fd8
docs: create dev venv outside the source tree (root-cause fix for #77…
teknium1 Jun 29, 2026
ee8cbfd
feat(web_extract): truncate-and-store instead of LLM summarization (#…
teknium1 Jun 29, 2026
7cf6758
feat(desktop): read-only spectator transcript for subagent watch windows
OutThisLife Jun 29, 2026
929dd9c
Merge pull request #55033 from NousResearch/bb/subagent-watch-readonly
OutThisLife Jun 29, 2026
7a6b3cb
fix(desktop): show Gateway statusbar tooltip via composed trigger Slots
OutThisLife Jun 29, 2026
ccc92c5
Merge pull request #55086 from NousResearch/fix/gateway-statusbar-too…
OutThisLife Jun 29, 2026
b963d32
feat(gateway): suppress home-channel shutdown broadcast on flagged dr…
benbarclay Jun 29, 2026
c6d6a1c
feat(desktop): add pet roam + motion/direction store signals
OutThisLife Jun 29, 2026
964ec68
feat(desktop): pick directional run row from travel direction
OutThisLife Jun 29, 2026
a8f1d9c
feat(desktop): add surface-aware pet wander loop
OutThisLife Jun 29, 2026
7d3c1d5
feat(desktop): wire roaming into the floating pet
OutThisLife Jun 29, 2026
4da744e
feat(desktop): let the pet perch on the status bar and profile rail
OutThisLife Jun 29, 2026
b72c9e1
feat(desktop): add pet roam opt-in toggle + i18n
OutThisLife Jun 29, 2026
57d98eb
fix(web): remove marketing backdrop stack for lighter dashboard shell
austinpickett Jun 26, 2026
10374bb
fix(web): theme terminal foreground and restore backdrop plugin slot
austinpickett Jun 29, 2026
1abf0c6
fix(web): polish dashboard sidebar chrome and model card menus
austinpickett Jun 29, 2026
dbe92b9
fix(web): confirm sidebar gateway restart and use DS checkboxes
austinpickett Jun 29, 2026
75d4aa9
fix(web): confirm sidebar Update Hermes before running
austinpickett Jun 29, 2026
0e2a5a3
feat(desktop): ground the roaming pet — sprite-paced walk + feet on s…
OutThisLife Jun 29, 2026
a1e699a
feat(desktop): roaming pet patrols the base of an open overlay
OutThisLife Jun 29, 2026
d417ffb
Merge pull request #55114 from NousResearch/bb/pet-roam
OutThisLife Jun 29, 2026
bff91f9
feat(desktop): type voice.auto_tts in desktop config
OutThisLife Jun 29, 2026
09abbf8
feat(desktop): mirror voice.auto_tts into an $autoSpeakReplies store
OutThisLife Jun 29, 2026
572c7db
feat(desktop): add read-replies-aloud composer strings
OutThisLife Jun 29, 2026
fcdc05c
feat(desktop): add auto-speak watcher hook
OutThisLife Jun 29, 2026
596b813
feat(desktop): add read-replies-aloud toggle and wire auto-speak
OutThisLife Jun 29, 2026
290fa7f
fix(gateway): skip confirmed-dead delivery targets (deleted groups, b…
teknium1 Jun 29, 2026
f171842
Merge pull request #55154 from NousResearch/bb/desktop-auto-speak-rep…
OutThisLife Jun 29, 2026
89daacb
test(gateway): cover AsyncSessionDB offload + raw-call guard (failing)
yoniebans Jun 29, 2026
ea26f22
feat(gateway): add AsyncSessionDB offload facade
yoniebans Jun 29, 2026
0896fac
fix(gateway): route SessionDB calls through AsyncSessionDB
yoniebans Jun 29, 2026
0a997aa
fix(gateway): route aliased SessionDB calls through AsyncSessionDB
yoniebans Jun 29, 2026
6735162
fix(gateway): offload the Telegram topic-recovery helper tree off the…
yoniebans Jun 29, 2026
d2ce2c8
test(gateway): assert interleaving safety of concurrent offloaded DB …
yoniebans Jun 29, 2026
f3d2dfb
fix(dashboard_auth): allow any http:// host in self-hosted OIDC redir…
spjoes Jun 29, 2026
3a55f66
refactor(relay): adopt scope_id wire key (guild_id → scope_id dual-re…
benbarclay Jun 30, 2026
808ba82
feat(ci): add CI timing report
ethernet8023 Jun 25, 2026
66ba9e0
change(ci): remove lint PR comment
ethernet8023 Jun 25, 2026
cca8b4e
fix(ci): unify amd64/arm64 docker pipelines
ethernet8023 Jun 29, 2026
41c85fb
fix(agents.md): fix documentation on subprocess isolation in tests
ethernet8023 Jun 29, 2026
481caa6
feat(display): friendly human-phrased tool labels for built-in tools …
teknium1 Jun 30, 2026
53a75f1
feat(dashboard_auth): support confidential clients (client_secret) in…
benbarclay Jun 30, 2026
6aefc9d
feat(gateway): show per-category context breakdown in /usage (#55204)
teknium1 Jun 30, 2026
b7322f9
feat(desktop): calmer, more realistic pet roam + split roam modules
OutThisLife Jun 30, 2026
30cd39d
refactor(desktop): collapse stroll-direction coin to a single draw
OutThisLife Jun 30, 2026
33d044c
Merge pull request #55400 from NousResearch/bb/pet-roam-calmer
OutThisLife Jun 30, 2026
184c10c
fix(slack): warn when configured token is a user token, not a bot token
benbarclay Jun 30, 2026
9ce79cd
feat(xai): Imagine public-URL storage, chaining & video edit/extend
Jaaneek Jun 29, 2026
5a3d7fb
fix(xai): suppress false-positive windows-footgun on binary image read
teknium1 Jun 30, 2026
d4c1401
feat(claude-design): add surface-first conditioning + slop diagnostic…
teknium1 Jun 30, 2026
d3f2931
fix(container-boot): autostart a gateway stranded in 'draining' state
benbarclay Jun 29, 2026
463b1df
fix(container-boot): also autostart a gateway stranded in 'degraded'
teknium1 Jun 30, 2026
05ac167
feat(gateway): per-platform typing_indicator toggle
benbarclay Jun 30, 2026
04639ad
feat(desktop): flag already-installed themes in the install pickers
OutThisLife Jun 30, 2026
972b162
Merge pull request #55410 from NousResearch/bb/install-theme-dedupe
OutThisLife Jun 30, 2026
0b33bc5
fix(kanban): gate goal_mode task completion with auxiliary judge
beardthelion Jun 3, 2026
b3c1b3b
fix(kanban): address review feedback on goal_mode judge gate
beardthelion Jun 3, 2026
14c4a84
fix(kanban): make goal_mode judge gate truly fail-open
beardthelion Jun 3, 2026
96552c3
feat(learning): profile-scoped memory + learned-skill graph API
OutThisLife Jun 30, 2026
dec4499
feat(desktop): Memory Graph — playable radial timeline of memories + …
OutThisLife Jun 30, 2026
a101136
feat(agent): add pre_verify hook and verify-on-stop coding guidance
OutThisLife Jun 30, 2026
821d9f7
feat(agent): add configurable coding_instructions
OutThisLife Jun 30, 2026
a81c592
Merge pull request #55413 from NousResearch/bb/pre-stop-hook
OutThisLife Jun 30, 2026
7ff6908
refactor(desktop): split thread.tsx god file into focused modules
OutThisLife Jun 30, 2026
88e29e3
refactor(desktop): split sidebar/index.tsx god file into focused modules
OutThisLife Jun 30, 2026
dd659c8
refactor(desktop): extract composer pure helpers into composer-utils
OutThisLife Jun 30, 2026
25c7900
refactor(desktop): thin desktop-controller by extracting session-list…
OutThisLife Jun 30, 2026
0ea318a
test: make windows no-window-flag assertions immune to update-check d…
OutThisLife Jun 30, 2026
7548910
perf(desktop): cache memory-graph paint + billboard node sizing
OutThisLife Jun 30, 2026
bde2dc1
refactor(desktop): extract use-prompt-actions standalone helpers into…
OutThisLife Jun 30, 2026
aa3c1d6
Merge pull request #55457 from NousResearch/bb/fix-windows-subprocess…
OutThisLife Jun 30, 2026
4dbd869
feat(agent): restore surface-aware "auto" default for verify_on_stop
OutThisLife Jun 30, 2026
d6396e6
Merge pull request #55449 from NousResearch/bb/verify-on-stop-auto-de…
OutThisLife Jun 30, 2026
c0b308e
fix(desktop): center memory-graph timeline stars, surface quiet buckets
OutThisLife Jun 30, 2026
5e51f9c
refactor(desktop): add iconSize token and migrate ad-hoc icon sizes o…
OutThisLife Jun 30, 2026
c2fb651
refactor(desktop): formalize row-as-button primitive (RowButton)
OutThisLife Jun 30, 2026
f3cd744
docs(desktop): tighten iconSize doc comment
OutThisLife Jun 30, 2026
57dd86f
docs(desktop): tighten RowButton doc comment
OutThisLife Jun 30, 2026
b6e57e2
refactor(desktop): share theme-repaint observer; memory-graph depth p…
OutThisLife Jun 30, 2026
03311ab
fix(desktop): make ⌘K / session-switcher HUDs ignore titlebar drag band
OutThisLife Jun 30, 2026
bd1d354
tune(desktop): ignite memory-graph nodes in clusters, not 1-by-1
OutThisLife Jun 30, 2026
ddf0d98
Merge pull request #55473 from NousResearch/bb/cmdk-drag-region
OutThisLife Jun 30, 2026
374d38f
Merge pull request #55451 from NousResearch/bb/desktop-split-thread
OutThisLife Jun 30, 2026
6121196
Merge pull request #55453 from NousResearch/bb/desktop-split-sidebar
OutThisLife Jun 30, 2026
116acf3
Merge pull request #55455 from NousResearch/bb/desktop-split-composer
OutThisLife Jun 30, 2026
b69c2d2
Merge pull request #55456 from NousResearch/bb/desktop-split-controller
OutThisLife Jun 30, 2026
28ba01c
Merge pull request #55459 from NousResearch/bb/desktop-split-prompt-a…
OutThisLife Jun 30, 2026
8f8487b
Merge pull request #55468 from NousResearch/bb/desktop-icon-size-token
OutThisLife Jun 30, 2026
a1b6e7e
Merge pull request #55470 from NousResearch/bb/desktop-button-consist…
OutThisLife Jun 30, 2026
c1b9de7
perf(context-refs): expand @-references concurrently
kshitijk4poor Jun 29, 2026
c9269fb
fix(web_extract): bound stored full-text size + give concrete read_fi…
kshitijk4poor Jun 29, 2026
fa7bce0
refactor(desktop): colocate hook/component families into scoped folders
OutThisLife Jun 30, 2026
6763d63
Merge pull request #55493 from NousResearch/bb/desktop-hook-folders
OutThisLife Jun 30, 2026
3a83b6b
fix(gateway): self-heal stale sessions.json routing at message time
davidgut1982 Jun 30, 2026
ed47f2b
refactor(desktop): split use-session-actions into folder + utils
OutThisLife Jun 30, 2026
0863438
refactor(desktop): split use-message-stream into folder + utils
OutThisLife Jun 30, 2026
643b0dc
fix(cron): raise default pre-run script timeout from 120s to 1h (#55489)
teknium1 Jun 30, 2026
08c83d0
refactor(desktop): extract slash dispatcher into use-prompt-actions/s…
OutThisLife Jun 30, 2026
5edfda5
Merge pull request #55497 from NousResearch/bb/desktop-split-session-…
OutThisLife Jun 30, 2026
f2ccb28
fix(agent): persist compression backoff across resume (#54465)
rodboev Jun 28, 2026
53ef954
fix(agent): keep cooldown and lock refresh on one authority (#54465)
rodboev Jun 28, 2026
f2ace45
fix(agent): release refreshed compression locks on every exit path (#…
rodboev Jun 29, 2026
cafe9d9
fix(agent): prevent stale lock leases after early compression exits (…
rodboev Jun 29, 2026
6fd701a
fix(agent): keep cooldown state on the active session (#54465)
rodboev Jun 29, 2026
7479f26
fix(agent): keep unbound compressors on the fail-open path (#54465)
rodboev Jun 29, 2026
58d8e25
fix(agent): make compression lock-lease refresher tolerate transient …
kshitijk4poor Jun 30, 2026
51a710e
refactor(desktop): extract gateway-event dispatcher into its own sub-…
OutThisLife Jun 30, 2026
7337248
refactor(desktop): extract submit pipeline into use-prompt-actions/su…
OutThisLife Jun 30, 2026
90f59ec
Merge pull request #55501 from NousResearch/bb/desktop-split-message-…
OutThisLife Jun 30, 2026
f9b619d
Merge pull request #55504 from NousResearch/bb/desktop-split-prompt-body
OutThisLife Jun 30, 2026
3e7ed0c
feat(desktop): memory-graph share dialog + core/zoom & light-mode polish
OutThisLife Jun 30, 2026
fa3ab2f
fix: normalize tool_call_id whitespace in sanitizer
Jun 30, 2026
babbefb
fix(desktop): scope memory graph cache by profile
OutThisLife Jun 30, 2026
5746234
fix(desktop): keep composer preview links visible when a bg task appears
OutThisLife Jun 30, 2026
3f19df2
fix(mcp): late-refresh must see desktop/dashboard discovery thread ow…
teknium1 Jun 30, 2026
67783ad
Merge pull request #55542 from NousResearch/bb/desktop-preview-stack-…
OutThisLife Jun 30, 2026
f47459c
fix(desktop): proper agent icon for subagents + give the queue an icon
OutThisLife Jun 30, 2026
90c5433
Merge pull request #55543 from NousResearch/bb/desktop-status-stack-i…
OutThisLife Jun 30, 2026
e0a7833
refactor(desktop): extract composer sizing into useComposerMetrics
OutThisLife Jun 30, 2026
00694b9
perf(desktop): composer typing no longer re-renders ChatBar (imperati…
OutThisLife Jun 30, 2026
cf05b38
refactor(desktop): extract composer voice engine into useComposerVoice
OutThisLife Jun 30, 2026
bd53230
refactor(desktop): extract composer drag-and-drop into useComposerDrop
OutThisLife Jun 30, 2026
9ee7333
refactor(desktop): extract composer draft engine into useComposerDraft
OutThisLife Jun 30, 2026
4c4b790
refactor(desktop): extract composer queue engine into useComposerQueue
OutThisLife Jun 30, 2026
773a370
refactor(desktop): extract composer submit engine into useComposerSubmit
OutThisLife Jun 30, 2026
33d9102
perf+fix(desktop): coalesce composer paste/input flush; scope dock gl…
OutThisLife Jun 30, 2026
94d70de
perf(desktop): stop ChatBar re-rendering on cross-session status/queu…
OutThisLife Jun 30, 2026
e5253d8
fix(desktop): tree-kill Windows terminal descendants
OutThisLife Jun 30, 2026
2f46fde
fix(desktop): keep queued composer edit ref in sync
OutThisLife Jun 30, 2026
eeb69c7
Merge pull request #55547 from NousResearch/bb/54744-windows-bash-spawn
OutThisLife Jun 30, 2026
9998ff4
fix(desktop): persist live composer draft before swap/reload
OutThisLife Jun 30, 2026
aa07400
chore(desktop): keep draft persist effect deps clean
OutThisLife Jun 30, 2026
6d20ac4
Merge pull request #55500 from NousResearch/bb/desktop-composer-draft
OutThisLife Jun 30, 2026
1d495cf
Merge pull request #55226 from NousResearch/bb/desktop-memory-graph
OutThisLife Jun 30, 2026
b03635d
fix(approval): catch hermes gateway stop/restart behind a profile fla…
teknium1 Jun 30, 2026
cb9308f
fix(discord): channel name matching and flush pending sends on shutdown
Apr 12, 2026
b604517
fix(discord): extend channel-name matching to slash-command auth; cla…
teknium1 Jun 30, 2026
26f39f7
fix(credentials): prefer ~/.hermes/.env over stale os.environ on key …
kshitijk4poor Jun 30, 2026
e6f66bc
fix(security): cover Move and no-space headers in patch_tool sensitiv…
0xbyt4 Jun 30, 2026
c8376e0
fix(auxiliary): stop SDK retries from multiplying compression stall (…
teknium1 Jun 30, 2026
3b2bb30
fix(security): harden heredoc approval, NFKC homograph fold, env-var …
MarioYounger Jun 30, 2026
35a0803
fix(delegation): budget subagent summaries against parent context hea…
teknium1 Jun 30, 2026
ebb81f1
fix(tui_gateway): prevent WS disconnect under GIL pressure
peetwan Jun 24, 2026
9d10dcd
fix(tui_gateway): route frontend-polled inline RPCs to pool under GIL…
Zyxxx-xxxyZ Jun 30, 2026
1a0c576
fix(tui_gateway): drop emit-only session.info from _LONG_HANDLERS
teknium1 Jun 30, 2026
db88018
chore(release): add AUTHOR_MAP entries for #51841 and #54287 salvage
teknium1 Jun 30, 2026
eeb4735
test(web_server): assert ws-ping invariant, not frozen 20.0 literal
teknium1 Jun 30, 2026
cd9f5cc
fix(delegate): route subagent progress lines through _safe_print for …
theAgenticBuilder Jun 30, 2026
b8ebe32
fix(agent): flatten multi-part user_message in codex intermediate-ack…
DataAdvisory Jun 30, 2026
c6eb7f9
fix(memory/mem0): recall on the current question + stronger search gu…
kartik-mem0 Jun 30, 2026
f4a54b6
fix(gateway): abort startup during restart
Disaster-Terminator Apr 24, 2026
fee3d4e
test(gateway): update startup-restart-race fixtures for current main
teknium1 Jun 30, 2026
cb9d18c
fix(gateway): stop media-send fallbacks from leaking host paths into …
UgwujaGeorge Jun 30, 2026
f5eb4c3
fix(gateway): stop Matrix upload fallback from leaking host path
teknium1 Jun 30, 2026
62b9fb6
fix(acp): thread-safe interactive approval via contextvars
georgex8001 Jun 30, 2026
c7e0bde
fix(agent): stop over-cap max_tokens 400s from death-looping into com…
teknium1 Jun 30, 2026
0df3c12
fix(agent): guard against non-dict model_extra in tool call normaliza…
huangxudong663-sys Jun 30, 2026
bf2dc18
test+chore: real-path regression test for #15157 model_extra guard + …
teknium1 Jun 30, 2026
fbd15e2
fix(copilot): switch to VS Code client ID and derive enterprise base URL
difujia Apr 24, 2026
fb07215
fix(copilot): recognize enterprise subdomains in host checks
difujia May 22, 2026
15e4452
fix(copilot): prefer endpoints.api for base URL, guard empty chat bas…
teknium1 Jun 30, 2026
3ecc58a
chore: map trevorgordon981 in AUTHOR_MAP for #50590 co-authorship
teknium1 Jun 30, 2026
d3d768e
test(copilot): update stale get_copilot_api_token mock to tuple signa…
teknium1 Jun 30, 2026
da4f15c
fix(cron): log and redact on secrets-redaction failure
sprmn24 May 14, 2026
d76ca3a
fix(moa): propagate api_mode from slot runtime to call_llm
liuhao1024 Jun 28, 2026
1366f37
fix(moa): pin chat_completions on live switch to a MoA preset
teknium1 Jun 30, 2026
84f350e
feat(whatsapp): opt-in forwarding of owner-typed messages in bot mode
keiravoss94 Apr 27, 2026
a61cf77
feat(whatsapp): tag owner-typed inbound text with [owner reply] prefix
keiravoss94 Apr 28, 2026
db52ad0
fix(whatsapp): gate owner-typed forwards on customer chatId allowlist
keiravoss94 Apr 27, 2026
24aa021
test(whatsapp): repoint owner test import after adapter relocation
vKongv Jun 27, 2026
6d6702e
fix(whatsapp-bridge): clarify FIFO outbound-id tracker semantics
vKongv Jun 27, 2026
2e0b591
fix(tools): validate acp_command binary exists before forcing copilot…
nikshepsvn May 17, 2026
d82a69b
fix(tools): prune acp_command from delegate_task schema when no ACP C…
nikshepsvn May 17, 2026
ea95fdd
chore(release): add nikshepsvn to AUTHOR_MAP for PR #27426 salvage
teknium1 Jun 30, 2026
c701c6d
fix(security): redact Fireworks AI API keys in logs
flamiinngo May 17, 2026
018009b
fix(kanban): unknown skill warns instead of crashing the worker
jimmyjohansson84 Jun 30, 2026
2ae9e22
chore: AUTHOR_MAP entry for PR #27123 salvage (jimmyjohansson84)
teknium1 Jun 30, 2026
6dd188d
fix(gateway): add session staleness guard to stream consumer
jasonQin6 Jun 30, 2026
c510f48
chore(release): add jasonQin6 to AUTHOR_MAP for PR #15093 salvage
teknium1 Jun 30, 2026
d634fa0
fix(pool): sync anthropic entry on access_token change, not just refr…
EloquentBrush0x May 18, 2026
ea9f8bd
fix(security): sanitize LSP diagnostic fields to prevent indirect pro…
memosr May 29, 2026
af5cea0
fix(discord): split oversized final edits, truncate mid-stream previe…
teknium1 Jun 30, 2026
b7c4369
fix(telegram): chunk formatted messages with UTF-16 length accounting
Jeffgithub0029 Jun 30, 2026
abca776
chore(release): map Jeffgithub0029 author email for #28558 salvage
teknium1 Jun 30, 2026
ac38005
fix(credential-pool): distinguish OpenRouter upstream 429s from accou…
znding04 Jun 30, 2026
179eb8c
fix(security): require operator opt-in for plugin tool_override to pr…
memosr May 28, 2026
3101222
fix(security): enforce tool_override opt-in at registry sink to close…
memosr Jun 27, 2026
12f5624
fix(security): bind tool_override authorization to handler's defining…
memosr Jun 27, 2026
bff61f5
feat(plugins): enable-time consent prompt for tool_override grant
teknium1 Jun 30, 2026
e7ca53e
fix(moa): disabled presets no longer hijack a plain model switch (#55…
teknium1 Jun 30, 2026
d6c53dc
fix(gateway): stop per-turn agent-cache eviction from model + message…
fayenix Jun 30, 2026
d2d470e
test(compression): tolerate safe contention rollback in concurrent-fo…
teknium1 Jun 30, 2026
cbe397e
fix(agent): merge consecutive assistant messages before API replay (#…
teknium1 Jun 30, 2026
5582b51
fix(gateway): stop poisoning the LLM prompt with STT-mode chatter
nnnet Jun 30, 2026
6148a9a
chore(release): map nnnet author email for PR #25142 salvage
teknium1 Jun 30, 2026
1cae1bd
test(cli): deterministically join bg worker thread instead of polling…
teknium1 Jun 30, 2026
a8841e2
fix(aux): preserve provider identity for resolved endpoints
helix4u Jun 30, 2026
c080a53
fix(cli): redact status API keys with --all
londo161 Apr 25, 2026
9dc6dc0
fix(agent): handle string context compression messages
londo161 Apr 25, 2026
fe355d0
fix(moa): handle dict/str message shape in MoA response extraction
teknium1 Jun 30, 2026
8e6fd4c
chore(release): add AUTHOR_MAP entry for londo161 (#15795 salvage)
teknium1 Jun 30, 2026
c969090
fix(cli): clear input-blocking overlays when interrupting a running a…
neo-2026 Jun 30, 2026
6e84257
fix(registry): derive toolset availability from per-tool checks
xxxigm Jun 29, 2026
efebe45
test(registry): cover mixed terminal toolset doctor false negative
xxxigm Jun 29, 2026
824f227
refactor(registry): drop dead toolset-check helpers after per-tool av…
kshitijk4poor Jun 30, 2026
a40f227
fix(installer): reset managed clone when ff-only pull fails
xxxigm Jun 30, 2026
665d0f0
test(installer): cover diverged managed-clone recovery in install scr…
xxxigm Jun 30, 2026
1324add
fix(image-gen): honor top-level image_gen.model for Nous/OpenRouter
xxxigm Jun 30, 2026
63731fe
test(image-gen): cover Nous/OpenRouter top-level model resolution
xxxigm Jun 30, 2026
1b37685
docs(image-gen): align OpenRouter model-resolution docstrings with ne…
kshitijk4poor Jun 30, 2026
217b3c2
test(desktop): cover projects RPC capability probing
xxxigm Jun 30, 2026
83e10a6
fix(desktop): detect stale backend for projects.create
xxxigm Jun 30, 2026
62a1bf4
fix(tools): return previews on zero-match in replace/remove to preven…
kyssta-exe Jun 9, 2026
a5e8cd4
fix(memory): degrade gracefully after repeated at-capacity consolidat…
kshitijk4poor Jun 30, 2026
c717be8
fix(config): route every migration write through one default-strippin…
kshitijk4poor Jun 30, 2026
efd87a1
Merge pull request #55715 from kshitijk4poor/fix/config-migration-no-…
kshitijk4poor Jun 30, 2026
c4b59e6
Merge pull request #55663 from xxxigm/fix/bootstrap-diverged-git-pull
jquesnelle Jun 30, 2026
f99ba56
Merge pull request #55331 from xxxigm/fix/desktop-projects-stale-backend
OutThisLife Jun 30, 2026
18d54bf
refactor(desktop): split onboarding overlay god file into onboarding/…
OutThisLife Jun 30, 2026
885e80d
Merge pull request #55807 from NousResearch/bb/desktop-split-onboarding
OutThisLife Jun 30, 2026
936af2f
Merge consecutive same-role contents for native Gemini
MaxFreedomPollard Jun 29, 2026
4d2351a
feat(moa): stream the aggregator response to the user
lEWFkRAD Jun 27, 2026
0b3752e
chore(release): add AUTHOR_MAP entry for lEWFkRAD (#53848 salvage)
teknium1 Jun 30, 2026
56771f7
merge: sync upstream main (250 commits ahead of our main)
Jun 30, 2026
3fc16d4
feat: knowledge-graph dashboard plugin (table view + obsidian indexer)
Jun 29, 2026
f88535f
fix(knowledge-graph): persist parent reindex job so polling works
Jun 29, 2026
bd9f00d
fix(knowledge-graph): /search was double-serialising results
Jun 29, 2026
384254d
fix(knowledge-graph): detail overlay z-index + Escape closes panel
Jun 29, 2026
eb647d5
fix(knowledge-graph): detail panel got envelope instead of node
Jun 29, 2026
db528dc
feat(knowledge-graph): GraphView (Cytoscape.js) + TimelineView
Jun 30, 2026
87d68b4
fix(knowledge-graph): import useRef from SDK.hooks (GraphView crashed)
Jun 30, 2026
c6f97e8
feat(plugin:knowledge-graph): add Obsidian-style backlinks panel + /n…
Jun 30, 2026
4fae380
fix(knowledge-graph): DetailPanel used titleOf as function but it is …
Jun 30, 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
  •  
  •  
  •  
64 changes: 64 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,67 @@ jobs:
sys.exit(1)
print('All checks passed (or were skipped)')
"

# ─────────────────────────────────────────────────────────────────────
# CI timing report: collect per-job/step durations from the GitHub API,
# cache them on main (as a baseline), and on PRs generate an HTML diff
# report with a gantt chart + per-step breakdown. The report is uploaded
# as an artifact and a markdown summary is written to $GITHUB_STEP_SUMMARY.
# ─────────────────────────────────────────────────────────────────────
ci-timings:
name: CI timing report
needs: [all-checks-pass, docker]
if: always()
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Restore baseline cache (PR only)
if: github.event_name == 'pull_request'
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ci-timings-baseline.json
# Prefix-match: exact key will never hit (run_id differs), so
# restore-keys finds the most recent baseline from main.
key: ci-timings-baseline-never-exact
restore-keys: |
ci-timings-baseline-

- name: Collect timings and generate report
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python3 scripts/ci/timings_report.py \
--baseline ci-timings-baseline.json \
--output ci-timings-report.html \
--json-out ci-timings.json \
--summary-out ci-timings-summary.md

- name: Upload HTML report
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
id: ci-timings-artifact
with:
name: ci-timings-report
path: ci-timings-report.html
retention-days: 14
archive: false

- name: Output summary
env:
REPORT_URL: ${{ steps.ci-timings-artifact.outputs.artifact-url}}
run: |
echo "# CI Timing report" >> "$GITHUB_STEP_SUMMARY"
echo "[View the full interactive report]($REPORT_URL)" >> "$GITHUB_STEP_SUMMARY"
cat ci-timings-summary.md >> "$GITHUB_STEP_SUMMARY"

- name: Save baseline cache (main only)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: cp ci-timings.json ci-timings-baseline.json

- name: Upload baseline to cache (main only)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ci-timings-baseline.json
key: ci-timings-baseline-${{ github.run_id }}
216 changes: 55 additions & 161 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,11 @@ on:

permissions:
contents: read
# Needed so the arm64 job can push/pull its registry-backed build cache
# to ghcr.io (cache-to/cache-from type=registry). See the build-arm64
# job for why registry cache replaced the gha cache on that arch.
packages: write

# Concurrency: push/release runs are NEVER cancelled so every merge gets
# its own image. PR runs reuse a PR-scoped group with
# cancel-in-progress: true so rapid pushes to the same PR collapse to the
# latest commit.
# cancel-in-progress: true so rapid pushes to the same PR collapse to
# the latest commit.
concurrency:
group: docker-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
Expand All @@ -24,79 +20,47 @@ env:
IMAGE_NAME: nousresearch/hermes-agent

jobs:
# Build, test, and optionally push the amd64 image.
build-amd64:
# Only run on the upstream repository, not on forks
# Build, test, and optionally push the image for each architecture.
build:
if: github.repository == 'NousResearch/hermes-agent'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- arch: amd64
runner: ubuntu-latest
platform: linux/amd64
cache-from: type=gha,scope=docker-amd64
cache-to: type=gha,mode=max,scope=docker-amd64
- arch: arm64
runner: ubuntu-24.04-arm
platform: linux/arm64
cache-from: type=gha,scope=docker-arm64
cache-to: type=gha,mode=max,scope=docker-arm64

runs-on: ${{ matrix.runner }}
timeout-minutes: 45
outputs:
digest: ${{ steps.push.outputs.digest }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

# The image build + integration tests run on every event
# (PRs, push-to-main, release). Publish steps below are gated to
# push-to-main / release only.
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3

# Build once, load into the local daemon for testing. Cached
# to gha with a per-arch scope; the push step below reuses every
# layer from this build.
- name: Build image (amd64)
# per-arch; the push step below reuses every layer from this build.
- name: Build image (${{ matrix.arch }})
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
file: Dockerfile
load: true
platforms: linux/amd64
platforms: ${{ matrix.platform }}
tags: ${{ env.IMAGE_NAME }}:test
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
cache-from: type=gha,scope=docker-amd64
cache-to: type=gha,mode=max,scope=docker-amd64

# Run the docker-integration test suite against the freshly-built
# image already loaded into the local daemon (`:test`).
#
# Piggybacking here avoids a second image build: the build step
# already loaded the image into the daemon under
# `${IMAGE_NAME}:test`, so we just point ``HERMES_TEST_IMAGE`` at
# that. The fixture's ``HERMES_TEST_IMAGE`` branch (see
# tests/docker/conftest.py:62-63) short-circuits the rebuild.
#
# Why this job and not a standalone one: the image is 5GB+; passing
# it between jobs via ``docker save``/``upload-artifact`` is slower
# than the build itself. Reusing the existing daemon state is the
# cheapest path to coverage on every PR that touches docker code.
# ---------------------------------------------------------------------
- name: Install uv (for docker tests)
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # 8.2.0

- name: Set up Python 3.11 (for docker tests)
run: uv python install 3.11

- name: Install Python dependencies (for docker tests)
run: |
# ``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.
uv sync --locked --python 3.11 --extra dev

- name: Run docker integration tests
env:
# Skip rebuild; use the image already loaded by the build step.
HERMES_TEST_IMAGE: ${{ env.IMAGE_NAME }}:test
# Match the policy in tests.yml :: test job — no accidental
# real-API calls from inside the harness.
OPENROUTER_API_KEY: ""
OPENAI_API_KEY: ""
NOUS_API_KEY: ""
run: |
scripts/run_tests.sh tests/docker/ --file-timeout 600
cache-from: ${{ matrix.cache-from }}
cache-to: ${{ (github.event_name != 'pull_request') && matrix.cache-to || '' }}

- name: Log in to Docker Hub
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
Expand All @@ -105,24 +69,24 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

# Push amd64 by digest only (no tag). The merge job assembles the
# Push by digest only (no tag). The merge job assembles the
# tagged manifest list. `push-by-digest=true` is docker's recommended
# pattern for multi-runner multi-platform builds.
- name: Push amd64 by digest
- name: Push ${{ matrix.arch }} by digest
id: push
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
file: Dockerfile
platforms: linux/amd64
platforms: ${{ matrix.platform }}
labels: |
org.opencontainers.image.revision=${{ github.sha }}
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=gha,scope=docker-amd64
cache-to: type=gha,mode=max,scope=docker-amd64
cache-from: ${{ matrix.cache-from }}
cache-to: ${{ matrix.cache-to }}

# Write the digest to a file and upload it as an artifact so the
# merge job can stitch both per-arch digests into a manifest list.
Expand All @@ -137,121 +101,51 @@ jobs:
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: digest-amd64
name: digest-${{ matrix.arch }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

# ---------------------------------------------------------------------------
# Build, test, and optionally push the arm64 image.
# ---------------------------------------------------------------------------
build-arm64:
if: github.repository == 'NousResearch/hermes-agent'
runs-on: ubuntu-24.04-arm
timeout-minutes: 45
outputs:
digest: ${{ steps.push.outputs.digest }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

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

# Log in to ghcr.io so the registry-backed build cache below can be
# read (cache-from) on every event and written (cache-to) on
# push/release. Uses the workflow's GITHUB_TOKEN, which is valid for
# the whole job — unlike the gha cache backend's short-lived Azure SAS
# token, which expired mid-build on slow cold-cache arm64 runs and
# crashed the build before the tests ran (the reason the gha cache
# was removed from arm64 PRs in the first place).
- name: Log in to ghcr.io (build cache)
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

# Build once, load into the local daemon for testing, then push
# by digest below. Reads AND writes the registry-backed cache so the
# push reuses layers from this build and the next build starts warm.
# Run the docker-integration test suite against the freshly-built
# image already loaded into the local daemon (`:test`).
#
# Registry cache (type=registry on ghcr.io) is used instead of the gha
# cache that previously broke here: its credential is the job-lifetime
# GITHUB_TOKEN, not a short-lived SAS token, so the cold-build-outlives-
# token failure mode cannot recur.
- name: Build image (arm64, cached publish)
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
file: Dockerfile
load: true
platforms: linux/arm64
tags: ${{ env.IMAGE_NAME }}:test
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
cache-from: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64
cache-to: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64,mode=max

- name: Install uv for docker tests
# Piggybacking here avoids a second image build: the build step
# already loaded the image into the daemon under
# `${IMAGE_NAME}:test`, so we just point ``HERMES_TEST_IMAGE`` at
# that. The fixture's ``HERMES_TEST_IMAGE`` branch (see
# tests/docker/conftest.py:62-63) short-circuits the rebuild.
#
# Why this job and not a standalone one: the image is 5GB+; passing
# it between jobs via ``docker save``/``upload-artifact`` is slower
# than the build itself. Reusing the existing daemon state is the
# cheapest path to coverage on every PR that touches docker code.
# ---------------------------------------------------------------------
- name: Install uv (for docker tests)
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # 8.2.0

- name: Set up Python 3.11 for docker tests
- name: Set up Python 3.11 (for docker tests)
run: uv python install 3.11

- name: Install Python dependencies for docker tests
- name: Install Python dependencies (for docker tests)
run: |
# ``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.
uv sync --locked --python 3.11 --extra dev

- name: Run docker tests
- name: Run docker integration tests
env:
# Skip rebuild; use the image already loaded by the build step.
HERMES_TEST_IMAGE: ${{ env.IMAGE_NAME }}:test
# Match the policy in tests.yml :: test job — no accidental
# real-API calls from inside the harness.
OPENROUTER_API_KEY: ""
OPENAI_API_KEY: ""
NOUS_API_KEY: ""
run: |
scripts/run_tests.sh tests/docker/ --file-timeout 600

- name: Log in to Docker Hub
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Push arm64 by digest
id: push
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
file: Dockerfile
platforms: linux/arm64
labels: |
org.opencontainers.image.revision=${{ github.sha }}
build-args: |
HERMES_GIT_SHA=${{ github.sha }}
outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64
cache-to: type=registry,ref=ghcr.io/nousresearch/hermes-agent:buildcache-arm64,mode=max

- name: Export digest
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
run: |
mkdir -p /tmp/digests
digest="${{ steps.push.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"

- name: Upload digest artifact
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: digest-arm64
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

# ---------------------------------------------------------------------------
# Stitch both per-arch digests into a single tagged multi-arch manifest.
# This is a registry-side operation — no building, no layer re-push —
Expand All @@ -263,7 +157,7 @@ jobs:
merge:
if: github.repository == 'NousResearch/hermes-agent' && (github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release')
runs-on: ubuntu-latest
needs: [build-amd64, build-arm64]
needs: [build]
timeout-minutes: 10
steps:
- name: Download digests
Expand Down
Loading