Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
355 commits
Select commit Hold shift + click to select a range
5286fe1
fix(disk-cleanup): exclude project directories from test-pattern auto…
Baophan00 Jul 31, 2026
6f400d2
fix(disk-cleanup): re-validate stale test entries and protect new dir…
Baophan00 Jul 31, 2026
57a8073
fix(telegram): send_image uploads still went out on the short read ti…
Drexuxux Jul 31, 2026
4a1bff6
fix(cli): heal a bare custom provider to its config key, not its disp…
Drexuxux Jul 31, 2026
c74f4c5
Merge pull request #75890 from NousResearch/bb/disk-full-toast
OutThisLife Aug 1, 2026
750ef49
fix(config): route _SECRET-suffixed keys to .env
Baophan00 Jul 31, 2026
95cff54
test(config): add _SECRET suffix case to env-routing parametrization
Baophan00 Jul 31, 2026
75aeba0
Merge pull request #73914 from JoaoMarcos44/fix/codex-oauth-cancel-ra…
teknium1 Aug 1, 2026
fa9e967
fix(gateway): scope session lists before limiting
GodsBoy Jul 16, 2026
4aa029b
fix(install): expose hermes-agent and hermes-acp launchers on PATH
Enough1122 Jul 30, 2026
95eae03
fix(gateway): offload /model context-length resolution off the event …
Drexuxux Jul 29, 2026
a0b2934
fix(gateway): offload preflight-compression warning enrichment; behav…
teknium1 Aug 1, 2026
a42e3e8
fix(distribution): respect distribution_owned allowlist in _copy_dist…
webtecnica Jul 29, 2026
ee5a66a
fix(distribution): path-aware allowlist; preserve legacy copy-everyth…
teknium1 Aug 1, 2026
fae0c4f
fix(hindsight): create embedded profile env file owner-only (0600)
teknium1 Aug 1, 2026
e3bc517
fix(agent): stop double-counting api_content in the token estimator
israellot Jul 31, 2026
5c45d9c
fix(agent): mirror substitute_api_content's guard in the estimator sh…
israellot Jul 31, 2026
6b6435a
feat(cache): enable DeepSeek caching on OpenCode
wz-heng Jul 30, 2026
0d98923
docs(kanban): document profile-owned notification delivery in multi-g…
teknium1 Aug 1, 2026
9ceb085
fix(codex): defang reserved Harmony tokens in requests
Xipong Jul 20, 2026
031b0a6
fix(desktop): pin @assistant-ui/react back to 0.14.24
OutThisLife Aug 1, 2026
41e4b96
fix(desktop): restore reactive message and composer runtime hooks
OutThisLife Aug 1, 2026
5826450
fix(desktop): declare @assistant-ui/core as a direct dependency
OutThisLife Aug 1, 2026
b5ca191
fix(mcp): guard against duplicate spawns and stale connecting entries…
nanami7777777 Aug 1, 2026
a11d0bd
fix(tests): remove stale shadowed test definitions in test_doctor.py
teknium1 Aug 1, 2026
1f5040b
Merge pull request #75918 from NousResearch/bb/pin-assistant-ui-0.14
OutThisLife Aug 1, 2026
a1f7034
fix(agent): clamp tail-cut boundary and summary-scan indices to preve…
x7peeps Jul 31, 2026
d209833
test(agent): add compress()-level E2E regression for short tool-suffi…
teknium1 Aug 1, 2026
8e9702d
fix: persist session hygiene compression cooldown to state DB
rkfshakti Jul 29, 2026
021d191
test(gateway): real-DB restart regression for persisted hygiene coold…
teknium1 Aug 1, 2026
3127ddc
fix(agent): preserve a non-empty user query after compression
Doud-FR Jul 31, 2026
530503a
fix: exclude reasoning_details from preflight token estimate
JonthanaHanh Jul 28, 2026
3b9cf56
fix(agent): exclude reasoning_details envelope from tail-budget walk …
teknium1 Aug 1, 2026
6989a79
chore: contributor email mappings (rkfshakti, x7peeps)
teknium1 Aug 1, 2026
609cd28
feat(tui): rank the slash menu by the skills you actually use
OutThisLife Aug 1, 2026
40ec983
fix(tui): keep slash completion alive after a leading command
OutThisLife Aug 1, 2026
73b8847
fix(desktop): toggle every pane off the tree, not off its own boolean
OutThisLife Aug 1, 2026
3ba67fd
fix(config): preserve scalar model id when setting model sub-keys
Baophan00 Jul 31, 2026
05103c6
test(config): add regression test for scalar model sub-key preservation
Baophan00 Jul 31, 2026
a266155
fix(cli): untrack sqlite connections only after close succeeds
trippyogi Jul 31, 2026
2aaeee2
fix(agent): invalidate flush-scan cursor when finalizer pops db marker
spfcraze Jul 31, 2026
d5463e5
fix(agent): invalidate flush-scan cursor at the defrag marker-pop sib…
teknium1 Aug 1, 2026
14eca89
fix(state): retry transient 'no more rows available' across all sqlit…
Dannou Aug 1, 2026
b6ca4fc
fix(state): heal session_model_usage PK unconditionally to restore to…
RelaxJonh Aug 1, 2026
e008b62
fix(state): route no-more-rows retries through the shared patience he…
teknium1 Aug 1, 2026
64dd865
fix(deps): repair Google transitive security floors (#72108)
egilewski Jul 28, 2026
4773e96
chore: add hans@groupg.org → hansai-art to AUTHOR_MAP
kshitijk4poor Aug 1, 2026
15b0b95
refactor(desktop): one edge-faded scroller for the whole app
OutThisLife Aug 1, 2026
0b8a358
fix(desktop): cap the changed-files card and fade its overflow
OutThisLife Aug 1, 2026
feaa325
Merge origin/main into bb/toggle-terminal-persist
OutThisLife Aug 1, 2026
80c86c4
fix(desktop): make the Windows app icon match native icon size
OutThisLife Aug 1, 2026
d41d9e4
Merge pull request #75935 from NousResearch/bb/card-retire
OutThisLife Aug 1, 2026
41e5567
Merge pull request #75848 from NousResearch/bb/toggle-terminal-persist
OutThisLife Aug 1, 2026
e524310
fix(desktop): render the ico truly full-bleed
OutThisLife Aug 1, 2026
df09a90
fix(config): refuse to write when config.yaml has YAML syntax errors
Baophan00 Jul 31, 2026
595be54
test(config): add regression tests for broken-YAML config preservation
Baophan00 Jul 31, 2026
4be138e
fix(config): skip URL alias without extra_headers instead of returnin…
webtecnica Jul 30, 2026
85148f7
Merge pull request #75937 from NousResearch/bb/win-icon-size
OutThisLife Aug 1, 2026
1d97c03
fix(desktop): drag-select and ⌘C work on user bubbles again
OutThisLife Aug 1, 2026
90e6fe4
fix(desktop): terminal selection mirror yields to chat copy
OutThisLife Aug 1, 2026
d1c40a7
Merge pull request #75949 from NousResearch/bb/fix-copy-with-reactions
OutThisLife Aug 1, 2026
3572d4b
fix(mcp): ensure MCP discovery completes before agent build in non-in…
kshitijk4poor Aug 1, 2026
18627ff
Merge pull request #75931 from NousResearch/bb/tui-slash-priority
OutThisLife Aug 1, 2026
e5ba319
chore: add contributor email mappings for @Prontsevich
kshitijk4poor Aug 1, 2026
dae4cf6
fix(telegram): let pairing-bound DMs past early auth with allowlist
xxxigm Jul 31, 2026
29b3adf
test(telegram): cover allowlist + unauthorized_dm_behavior pair pass-…
xxxigm Jul 31, 2026
151e72a
refactor: simplify pairing check return and drop over-defensive getattr
kshitijk4poor Aug 1, 2026
ba75633
fix(desktop): never show the thinking indicator anywhere but the thre…
OutThisLife Aug 1, 2026
eb545dd
feat(desktop): ⌘-click closes a terminal rail tab
OutThisLife Aug 1, 2026
c450fb9
feat(desktop): switching sessions re-selects the terminal tab in its cwd
OutThisLife Aug 1, 2026
bfc014e
Merge pull request #75966 from NousResearch/bb/dither-tail-only
OutThisLife Aug 1, 2026
57b1eb8
Merge pull request #75975 from NousResearch/bb/terminal-session-link
OutThisLife Aug 1, 2026
5b4c57a
feat(desktop): shared path display collapses home to ~
OutThisLife Aug 1, 2026
3707741
fix(desktop): statusbar cwd follows the focused session
OutThisLife Aug 1, 2026
883076c
feat(desktop): ⌘N/⌘T keep the focused session's project
OutThisLife Aug 1, 2026
d109138
fix(mcp): avoid replaying historical events on startup (#13414)
HeLLGURD Aug 1, 2026
47d7b7f
fix(desktop): keep review/files rails at their declared size
OutThisLife Aug 1, 2026
5657c4a
fix(desktop): sort display-path import for eslint
OutThisLife Aug 1, 2026
3d5f396
Merge pull request #75984 from kshitijk4poor/chore/contributor-emails…
kshitijk4poor Aug 1, 2026
1a25214
Merge pull request #75998 from NousResearch/bb/pane-size-remember
OutThisLife Aug 1, 2026
9b1d834
Merge pull request #75988 from NousResearch/bb/cwd-focus-and-display
OutThisLife Aug 1, 2026
89f0b63
perf(mcp): non-blocking startup via background MCP discovery + TUI fa…
spro-work May 26, 2026
640de65
fix(acp): add bounded wait + late-refresh for configured MCP servers
Prontsevich Jul 13, 2026
23c1358
fix(acp): serialize late MCP refresh with turn start + self-sufficien…
kshitijk4poor Aug 1, 2026
40e0e7a
docs(acp): correct late-refresh docstring — post-first-turn tools lan…
kshitijk4poor Aug 1, 2026
7d54cb2
chore: add contributor email mapping for @rodboev
kshitijk4poor Aug 1, 2026
e9d52d2
fix(caching): honor prompt_caching.cache_ttl disable in config
BB-light Aug 1, 2026
c4e8613
Merge pull request #76031 from kshitijk4poor/chore/contributor-email-…
kshitijk4poor Aug 1, 2026
f09c56c
fix(gateway): dedup model-switch markers so they don't accumulate in …
hansai-art Jul 17, 2026
9fc12bf
perf(prompt-caching): preserve tool-loop cache boundaries (#20880)
rodboev Jul 31, 2026
34c11fa
fix(terminal): honor explicit config keys over stale env
ajzrva-sys Jul 25, 2026
a1ff62a
fix: context-length fallback logging, batch trajectory durability, po…
kshitijk4poor Aug 1, 2026
4c2d0c7
refactor: dedupe fallback warning per model, drive pool-cleanup tests…
kshitijk4poor Aug 1, 2026
e078c8c
fix: widen fallback warning to the sibling custom-endpoint 256K path
kshitijk4poor Aug 1, 2026
7ae4a5e
fix(prompt-caching): consolidate static-prefix split, guard empty vol…
kshitijk4poor Aug 1, 2026
af06308
refactor(prompt-caching): collapse triplicated destination-plan and l…
kshitijk4poor Aug 1, 2026
e7340ea
perf(prompt-caching): make PromptCachePlan.marker_count lazy
kshitijk4poor Aug 1, 2026
5367549
fix(auxiliary): replan cache sections on the async fallback path too
kshitijk4poor Aug 1, 2026
84952e8
chore: map tron@chriswykel.com -> Wpnx330 (PR #68334 salvage)
kshitijk4poor Aug 1, 2026
13ad903
perf(redact): eliminate exponential backtracking in config-key patterns
carlotestor Jul 20, 2026
321cbcc
test(redact): add YAML ReDoS test, strengthen existing test with keyword
kshitijk4poor Aug 1, 2026
5b3c66a
chore: add carlotestor to contributor email directory
kshitijk4poor Aug 1, 2026
d508585
fix(tui): preserve queued image ownership
fyzanshaik Aug 1, 2026
8daf030
fix(compression): add pre-LLM feasibility check to skip costly no-op …
Jul 21, 2026
85e0073
refactor(compression): fold simplify-pass findings into feasibility skip
kshitijk4poor Aug 1, 2026
baecc84
fix(update): catch partially-updated trees that parse but can't import
kshitijk4poor Aug 1, 2026
aa5d4fd
fix(update): probe the venv interpreter, not the driving one
kshitijk4poor Aug 1, 2026
822571f
fix(update): don't roll back a good update over uninstalled deps
kshitijk4poor Aug 1, 2026
bf18710
fix(update): make the git-path import check non-destructive
kshitijk4poor Aug 1, 2026
15cb86e
refactor(update): one definition of "first-party module"
kshitijk4poor Aug 1, 2026
83314ca
fix(update): make the ZIP replace atomic across all entries + dedupe …
kshitijk4poor Aug 1, 2026
c1f36f5
fix(update): extend atomicity to top-level files, clean up failed sta…
kshitijk4poor Aug 1, 2026
66ba36e
fix(update): let callers pass the platform verdict to the venv helpers
kshitijk4poor Aug 1, 2026
bbe93ab
fix(update): restore mid-swap backup before clearing leftovers in sta…
kshitijk4poor Aug 1, 2026
b675fb2
docs: correct os.replace claim and complete the hand-rolled site list
kshitijk4poor Aug 1, 2026
470cf66
fix(update): discard staging litter when the commit phase fails
kshitijk4poor Aug 1, 2026
fed098b
fix(gateway): use connector-owned no-clobber guard for relay thread r…
benbarclay Aug 1, 2026
a71f20d
feat(desktop): copy the branch-bar worktree path on hover
OutThisLife Aug 1, 2026
d5e135a
fix(nix): update electron headers sha
ethernet8023 Aug 1, 2026
cb1e059
fix(agent): reader/writer path roles in parallel batch planner — sear…
teknium1 Aug 1, 2026
5eeafc8
fix(security): cache OSV malware preflight verdicts and stop double c…
teknium1 Aug 1, 2026
8e06b30
fix(desktop): refuse a second update hand-off while one is already live
chelsealong Aug 1, 2026
64c1db9
fix(desktop): close the same handoff race in bootstrap recovery
chelsealong Aug 1, 2026
467c312
chore: map salvage contributor email (chelsealong)
teknium1 Aug 1, 2026
50d4d25
fix(tests): stub the auth function doctor actually calls + restore dr…
teknium1 Aug 1, 2026
a22d651
fix(gateway): don't re-home a non-git session onto a repo it only vis…
PRATHAMESH75 Jul 27, 2026
8babfe9
fix(gateway): only follow settles into same-repo worktrees; never ove…
teknium1 Aug 1, 2026
81c0691
fix(gateway): per-profile Discord/Telegram allow-deny gates under mul…
teknium1 Aug 1, 2026
c05f0bb
test: importorskip discord.py in the slash-gate isolation test
teknium1 Aug 1, 2026
3087841
fix(gateway): stop stale streamed finalize from suppressing the compl…
teknium1 Aug 1, 2026
d2fa459
fix: block persistent self-restart jobs
John-Lussier Jul 12, 2026
31dc4f0
fix: close indirect lifecycle guard bypasses
John-Lussier Jul 12, 2026
d8b041e
fix(gateway): resolve sweeper review for indirect lifecycle guard
John-Lussier Jul 17, 2026
56cf874
fix(gateway): add submit/bootstrap to lifecycle guard Branch B and la…
teknium1 Aug 1, 2026
090d146
fix(desktop): stop pullRemotePins from reverting fresh local pin toggles
teknium1 Aug 1, 2026
f40f471
fix(install): support non-pid-1 container entrypoints
konsisumer Aug 1, 2026
003af7f
fix(docker): update runtime tests and docs for the entrypoint dispatcher
teknium1 Aug 1, 2026
87bc710
fix(agent): scope parallel batches from V4A patch headers
fangliquanflq Jul 22, 2026
7e271d9
Merge pull request #76290 from NousResearch/bb/coding-cwd-copy
OutThisLife Aug 1, 2026
c5be6e7
fmt(js): `npm run fix` on merge (#76404)
hermes-seaeye[bot] Aug 1, 2026
a09ad04
refactor(desktop): share the composer's floating pill treatment
OutThisLife Aug 1, 2026
9175b05
fix(desktop): ship example plugin off by default
OutThisLife Aug 1, 2026
d7c24f2
Merge pull request #76409 from NousResearch/bb/example-plugin-off-by-…
OutThisLife Aug 1, 2026
f88ed6c
fix: fix @nousresearch/ui version, update to npm 12
ethernet8023 Aug 1, 2026
0b69a6a
feat(kanban): let a task pin its own thinking depth
OutThisLife Aug 1, 2026
f0ed0ae
feat(kanban): expose the per-task reasoning effort over REST
OutThisLife Aug 1, 2026
b35c34d
refactor(desktop): make the composer's model picker a reusable primitive
OutThisLife Aug 1, 2026
602fc5f
feat(kanban): pick a task's model and thinking depth from the board
OutThisLife Aug 1, 2026
d5d3086
fix(desktop): let the model catalog own curation, not each host
OutThisLife Aug 1, 2026
defee93
fix(desktop): keep the composer's model menu pixel- and behaviour-ide…
OutThisLife Aug 1, 2026
afdf8f9
fix(model-picker): stop Copilot token-exchange retry backoff from sta…
teknium1 Aug 1, 2026
131aee9
feat(desktop): add configurable terminal font family (terminal.font_f…
baoyu0 Jun 20, 2026
0399711
feat(desktop): add terminal font picker
Zeraphim Jul 24, 2026
261c67b
fix(desktop): cover pending agent terminal font cleanup
Zeraphim Jul 30, 2026
ff8df58
fix(desktop): derive font-setting save base from the config cache, no…
teknium1 Aug 1, 2026
53b8f44
feat(desktop): add notch wake indicator
itsflownium Jul 30, 2026
4ebdbad
fix(desktop): close wake indicator with main window
itsflownium Jul 31, 2026
d6be88f
fix(desktop): map SSH profiles to remote profiles
Jul 30, 2026
621975d
fix(dashboard): anchor the SSH token dir to $HOME/.hermes, not the ac…
Sora-bluesky Jul 22, 2026
e2c6f2e
test(desktop): cover mapped non-default SSH profile
Aug 1, 2026
6d3cb23
fix(desktop): reject reserved remote profile names
Aug 1, 2026
5cb19d7
fix(desktop): keep Windows SSH runtime at machine root
Aug 1, 2026
f3cb7c0
style(desktop): satisfy mapped-profile test lint
Aug 1, 2026
8b8ebc2
chore: map contributors arcabotai, Sora-bluesky
teknium1 Aug 1, 2026
8c17272
fix(patch): anchor V4A Begin/End Patch markers to full lines
spfcraze Jul 29, 2026
fcd5e2c
fix(file-tools): resolve local V4A patch paths before apply
necoweb3 Aug 1, 2026
414e5af
fix(desktop): the composer hint stops acting like text you typed
OutThisLife Aug 1, 2026
9772e3b
perf(model-picker): serve stale model caches instantly, refresh in ba…
teknium1 Aug 1, 2026
ff6ed7c
fix(update): detect EOL-only churn via numstat, not name-only
teknium1 Aug 1, 2026
a5f94e9
fix(acp): bind session_id in session context for subprocess isolation
necoweb3 Aug 1, 2026
9797164
Merge pull request #76417 from NousResearch/bb/kanban-model-picker
OutThisLife Aug 1, 2026
93ec02b
fix(desktop): keep the hint off the text during IME composition
OutThisLife Aug 1, 2026
cc0af6b
ci: skip Desktop E2E + Docker build on tests-only PRs (python_prod lane)
teknium1 Aug 1, 2026
d752211
fix(cli): route keyless first run into provider onboarding instead of…
teknium1 Aug 1, 2026
a98c8ee
fix(gateway): isolate deferred platform imports from os.environ leaks
jbbottoms Jul 12, 2026
eec6d3e
fix(teams): suppress SDK import-time dotenv instead of clearing environ
jbbottoms Jul 12, 2026
38453ba
fix(setup): warn loudly when the wizard finishes without a working pr…
teknium1 Aug 1, 2026
9467e99
docs(site): redirect /quickstart and /installation short paths
teknium1 Aug 1, 2026
9d08c95
fix(tools): dedup eviction task_id + workdir cwd leak
teknium1 Aug 1, 2026
021a076
fix(file-ops): prevent non-UTF-8 corruption and symlink data-loss
teknium1 Aug 1, 2026
c0b0c88
fix(fuzzy-match): stop context_aware from silently replacing wrong co…
teknium1 Aug 1, 2026
62f0031
fix(patch-parser): tolerate CRLF patch bodies and Move-then-Update
teknium1 Aug 1, 2026
7f4d155
fix(tools): validate timeout, reject whitespace old_string, narrow /p…
teknium1 Aug 1, 2026
6b51925
fix(update): provision a managed Node runtime when system npm fails e…
teknium1 Aug 1, 2026
968b663
fix(env): clear inherited Hermes keys missing from profile .env (ACP …
keepConcentration Jul 30, 2026
61b2fa7
fix(env): strip export prefix in dotenv key scan for cleanup (review …
keepConcentration Jul 31, 2026
fe5a718
fix(env): narrow startup env scrub to profile-managed ACP keys
teknium1 Aug 1, 2026
18e0683
fix(auth): route anthropic adapter credential reads through the profi…
JoaoMarcos44 Aug 1, 2026
ed1170c
fix(config): make get_env_value scope-aware — the last scope-blind cr…
webtecnica Aug 1, 2026
8e29971
chore: map salvaged contributor emails (keepConcentration, JoaoMarcos44)
teknium1 Aug 1, 2026
38c09e5
fix(tool-executor): emit tool results on hard interrupt to keep alter…
teknium1 Aug 1, 2026
3f497e2
fix(gateway): relay thread-rename must carry the parent-channel discr…
benbarclay Aug 2, 2026
3bed7d4
fix(desktop,install): keep bundled Node ahead of system Node on Windows
ethernet8023 Aug 1, 2026
f5130f0
fix: pin uv python to 3.11
ethernet8023 Aug 2, 2026
aaa6a97
fix(managed_uv): keep project uv config on the candidate locked sync
OutThisLife Aug 2, 2026
cb2311f
Merge pull request #76493 from NousResearch/bb/sqlite-repair-locked
OutThisLife Aug 2, 2026
baec57d
Merge pull request #76429 from NousResearch/bb/composer-placeholder
OutThisLife Aug 2, 2026
25d0bcd
fix(runtime): resolve Hermes-managed Node and uv before bare PATH
ethernet8023 Aug 2, 2026
aa4ce7a
feat: add .nvmrc w/ node 26
ethernet8023 Aug 2, 2026
713a983
feat(runtime)!: require Node 26 across all installers, heal, and upgr…
ethernet8023 Aug 2, 2026
b13148d
feat(runtime): heal outdated managed Node trees up to the target major
ethernet8023 Aug 2, 2026
5ba2564
feat(desktop): act on composer directive chips from a hover pill
OutThisLife Aug 1, 2026
777512b
fmt(js): `npm run fix` on merge (#76498)
hermes-seaeye[bot] Aug 2, 2026
0c35518
fix(gateway): probe the target user's Node tree when generating a sys…
ethernet8023 Aug 2, 2026
2ad0ea4
fix(docker): drop corepack and add libatomic1 for the Node 26 bump
ethernet8023 Aug 2, 2026
eca996a
Merge pull request #76401 from NousResearch/bb/composer-link-open
OutThisLife Aug 2, 2026
a041526
feat(gateway): key Discord auto-thread sessions on prospective_thread…
benbarclay Aug 2, 2026
5b3b761
fix(desktop/windows): don't pre-write the update marker for stale ins…
OutThisLife Aug 2, 2026
e1ccd67
fix(desktop): apply the stale-installer marker guard to both hand-offs
OutThisLife Aug 2, 2026
22df184
fix(desktop): restore localStorage in jsdom tests under Node 26
ethernet8023 Aug 2, 2026
ee276a7
Merge pull request #76517 from NousResearch/bb/win-update-lock-handoff
OutThisLife Aug 2, 2026
6fdc64e
fix(install): install npm 12 into the vendored Node 26 tree
ethernet8023 Aug 2, 2026
97f1360
fix(install): install npm 12 into the vendored Node tree on Windows
ethernet8023 Aug 2, 2026
3e0720d
fix(npm): relax engine range for Node 22 / npm 11 (#76486)
webtecnica Aug 2, 2026
abb84c4
fix(install): upgrade npm on the managed-Node reuse path too
OutThisLife Aug 2, 2026
8de9c16
Merge branch 'main' into ethie/bundled-node-path-windows-layout
OutThisLife Aug 2, 2026
f979e47
fix(desktop): the branch-bar path copy confirms in place
OutThisLife Aug 2, 2026
c7b4b4e
Merge pull request #76536 from NousResearch/bb/composer-path-copy
OutThisLife Aug 2, 2026
85c8956
Merge pull request #76459 from NousResearch/ethie/bundled-node-path-w…
OutThisLife Aug 2, 2026
8bfd5af
fmt(js): `npm run fix` on merge (#76547)
hermes-seaeye[bot] Aug 2, 2026
8e08a4a
fix(install): restore installs — engines floor no shipping toolchain …
OutThisLife Aug 2, 2026
c51c92a
fix(update): survive a hermes_constants cached from before the update
OutThisLife Aug 2, 2026
8ced76d
Merge pull request #76562 from NousResearch/bb/npm-engine-outage
OutThisLife Aug 2, 2026
63ff4b8
fix(install): sync the lockfile engines mirrors with the manifests
OutThisLife Aug 2, 2026
927662e
Merge pull request #76575 from NousResearch/bb/desktop-lockfile-engines
OutThisLife Aug 2, 2026
ff01e2f
chore: add contributor email mapping for 686f6c61
kshitijk4poor Aug 2, 2026
58e85f4
fix(browser): replace expired cloud sessions
helix4u Aug 1, 2026
0044876
fix(browser): guard against concurrent expired-session replacement race
kshitijk4poor Aug 2, 2026
f0c87da
Merge pull request #76618 from kshitijk4poor/chore/author-map-686f6c61
kshitijk4poor Aug 2, 2026
6035f50
chore(contributors): add contributor map fangliquan@qq.com
fangliquanflq Jul 31, 2026
ddfc634
fix(gateway): revoke WhatsApp sole allowlist entry without restart
fangliquanflq Aug 1, 2026
810c877
fix(gateway): preserve WhatsApp allowlist config precedence on live c…
fangliquanflq Aug 2, 2026
b35f219
fix(gateway): apply WhatsApp identity aliases to cloud pairing revoke
fangliquanflq Aug 2, 2026
f5ca0e2
fix(gateway): honor empty WhatsApp allow_from over env grants
fangliquanflq Aug 2, 2026
8a29703
fix(agent): honor prompt_caching.cache_ttl=off on stub policy paths
686f6c61 Aug 1, 2026
67db870
test(agent): drop unused pytest import from cache-disable tests
686f6c61 Aug 1, 2026
8e1a351
fix(agent): preserve None cache_disabled when MoA has no agent
686f6c61 Aug 1, 2026
8ee5174
fix(agent): consolidate cache-disable stubs with blank_cache_policy_stub
686f6c61 Aug 1, 2026
88a629b
refactor(agent): share the cache_ttl disable predicate across init an…
kshitijk4poor Aug 2, 2026
026707a
fix(tts): per-sentence prefetch pipeline with PortAudio resilience
beardedeagle Aug 2, 2026
fa60bc5
fix(tts): apply 7 review fixes to prefetch pipeline
kshitijk4poor Aug 2, 2026
582606f
test(tts): reconcile test file with main and add regression tests
kshitijk4poor Aug 2, 2026
ed2ae20
chore(contributors): add contributor map sswdarius@gmail.com
kshitijk4poor Aug 2, 2026
f86693c
fix(tui): fail closed when prompt.submit cannot persist history trunc…
necoweb3 Aug 2, 2026
c19c63d
fix(agent): make auxiliary auto-chain fallback configurable and free-…
webtecnica Aug 1, 2026
077317a
simplify: collapse aux config reads, trim comments, use load_config_r…
kshitijk4poor Aug 2, 2026
14478ee
chore: AUTHOR_MAP webtecnica@gmail.com → webtecnica (#75838)
kshitijk4poor Aug 2, 2026
226e270
ci: temporarily disable Desktop E2E — red on every PR since Aug 1 eng…
teknium1 Aug 2, 2026
594de1f
FR15: join fr9 remote history before refresh
Aug 2, 2026
3d5acc3
FR15: refresh fr9 onto official main 88a629b9
Aug 2, 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
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .github/actions/detect-changes/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ 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 }}
Expand Down
21 changes: 18 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:
timeout-minutes: 10
outputs:
python: ${{ steps.classify.outputs.python }}
python_prod: ${{ steps.classify.outputs.python_prod }}
frontend: ${{ steps.classify.outputs.frontend }}
site: ${{ steps.classify.outputs.site }}
scan: ${{ steps.classify.outputs.scan }}
Expand Down Expand Up @@ -89,7 +90,19 @@ jobs:
e2e-desktop:
name: Desktop E2E
needs: detect
if: needs.detect.outputs.python == 'true' || needs.detect.outputs.frontend == 'true'
# python_prod (not python): the Playwright suite exercises the built app
# + `hermes serve` backend, which never import anything under tests/.
# Tests-only PRs (~17% of commits) skip this 5-minute job — the longest
# single job in the workflow — while still running the full pytest lanes.
#
# ⛔ TEMPORARILY DISABLED (Aug 2, 2026, Teknium) — the suite is red on
# every PR and on main itself since the Aug 1 night engines/npm churn
# (#76499 → #76562 → #76575): the mock-backend Electron window never
# gets a title, so boot/chat/setup/interim specs all fail identically
# regardless of the PR's diff (verified on #76573 and the docs-only
# #76582). Tracking issue: #76627 (assigned: Ari). To re-enable,
# delete the `false &&` below — nothing else changed.
if: ${{ false && (needs.detect.outputs.python_prod == 'true' || needs.detect.outputs.frontend == 'true') }}
uses: ./.github/workflows/e2e-desktop.yml

docs-site:
Expand Down Expand Up @@ -137,8 +150,10 @@ jobs:
needs: detect
# Trusted main pushes run docker.yml directly so its container-publish
# environment secrets never cross this reusable-workflow call. PR runs
# remain build/test-only and secret-free.
if: needs.detect.outputs.event_name == 'pull_request' && (needs.detect.outputs.python == 'true' || needs.detect.outputs.frontend == 'true' || needs.detect.outputs.docker_meta == 'true')
# remain build/test-only and secret-free. Gated on python_prod (not
# python): the image copies installed code, never tests/ — tests-only
# PRs skip the build.
if: needs.detect.outputs.event_name == 'pull_request' && (needs.detect.outputs.python_prod == 'true' || needs.detect.outputs.frontend == 'true' || needs.detect.outputs.docker_meta == 'true')
uses: ./.github/workflows/docker.yml

supply-chain:
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/deploy-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,14 @@ jobs:

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

- name: grab npm 12
run: |
npm i -g npm@12

- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.11'
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/docs-site-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,14 @@ jobs:

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

- name: grab npm 12
run: |
npm i -g npm@12
- name: Install website dependencies
uses: ./.github/actions/retry
with:
Expand Down
17 changes: 11 additions & 6 deletions .github/workflows/e2e-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,13 @@ jobs:
# ── Node ───────────────────────────────────────────────────────────
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
node-version: 26
cache: npm

- name: grab npm 12
run: |
npm i -g npm@12

# Full npm ci (not --ignore-scripts): electron's postinstall
# downloads the binary we launch, and node-pty's native build is
# needed for the terminal pane.
Expand All @@ -56,7 +61,7 @@ jobs:
# fetching a manifest from raw.githubusercontent.com on EVERY job —
# a transient fetch failure fails the whole job (2026-07-28 slice-5
# incident). Pinned, the binary downloads directly; no manifest hop.
version: "0.9.28"
version: '0.9.28'
enable-cache: true
cache-dependency-glob: |
pyproject.toml
Expand Down Expand Up @@ -106,11 +111,11 @@ jobs:
npx playwright test --reporter=list
fi
env:
CI: "true"
CI: 'true'
# Ensure no real API keys leak into the test env.
OPENROUTER_API_KEY: ""
OPENAI_API_KEY: ""
NOUS_API_KEY: ""
OPENROUTER_API_KEY: ''
OPENAI_API_KEY: ''
NOUS_API_KEY: ''

# ── Save updated baselines to cache (main only) ───────────────────
- name: Save updated baselines to cache
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/js-autofix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,13 @@ jobs:

- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
node-version: 26
cache: npm

- name: grab npm 12
run: |
npm i -g npm@12

# --ignore-scripts: eslint only needs TS sources + eslint packages.
- uses: ./.github/actions/retry
with:
Expand Down
14 changes: 12 additions & 2 deletions .github/workflows/js-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
node-version: 26
cache: npm

- name: grab npm 12
run: |
npm i -g npm@12

- uses: ./.github/actions/retry
with:
command: npm ci --ignore-scripts
Expand Down Expand Up @@ -61,8 +66,13 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
node-version: 26
cache: npm

- name: grab npm 12
run: |
npm i -g npm@12

- uses: ./.github/actions/retry
with:
command: npm ci
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/osv-scanner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,13 @@ jobs:
uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8
with:
# Scan explicit lockfiles rather than recursing, so we only look at
# the three sources of truth and skip vendored / test / worktree dirs.
# the five sources of truth and skip vendored / test / worktree dirs.
scan-args: |-
--lockfile=uv.lock
--lockfile=package-lock.json
--lockfile=website/package-lock.json
--lockfile=plugins/platforms/photon/sidecar/package-lock.json
--lockfile=scripts/whatsapp-bridge/package-lock.json
# The upstream reusable workflow uploads this exact file under its
# fixed artifact name, which the wrapper downloads below.
results-file-name: osv-results.sarif
Expand Down
4 changes: 4 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,7 @@ min-release-age-exclude[]=vite
min-release-age-exclude[]=rolldown
min-release-age-exclude[]=@rolldown/*
min-release-age-exclude[]=@oxc-project/types

# ink needs
min-release-age-exclude[]=lightningcss
min-release-age-exclude[]=postcss
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
26
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.11
75 changes: 45 additions & 30 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@ RUN apt-get -o Acquire::Retries=3 update && \
make install

FROM ghcr.io/astral-sh/uv:0.11.6-python3.13-trixie@sha256:b3c543b6c4f23a5f2df22866bd7857e5d304b67a564f4feab6ac22044dde719b AS uv_source
# Node 22 LTS source stage. Debian trixie's bundled nodejs is pinned to 20.x
# which reached EOL in April 2026 — we copy node + npm + corepack from the
# upstream node:22 image instead so we can stay on a supported LTS without
# waiting for Debian 14 (forky, ~mid-2027). Bookworm-based slim image used
# so the produced binary links against glibc 2.36, which runs cleanly on
# our Debian 13 (trixie, glibc 2.41) runtime. Bumping to a new Node major
# is a one-line ARG change; see #4977.
FROM node:22-bookworm-slim@sha256:7af03b14a13c8cdd38e45058fd957bf00a72bbe17feac43b1c15a689c029c732 AS node_source
# Node 26 source stage. Debian trixie's bundled nodejs is pinned to 20.x
# which reached EOL in April 2026 — we copy node + npm from the upstream
# node:26 image instead (Hermes pins its toolchain to Node 26 everywhere).
# Bookworm-based slim image used so the produced binary links
# against glibc 2.36, which runs cleanly on our Debian 13 (trixie, glibc
# 2.41) runtime. Bumping to a new Node major is a one-line ARG change; see
# #4977.
FROM node:26-bookworm-slim@sha256:9e6f9357d371591e32ab6f2d8a26d63bdd0d17c29eee3f4f3e7e454d9634bf73 AS node_source
FROM debian:13.4

# Disable Python stdout buffering to ensure logs are printed immediately.
Expand All @@ -70,7 +70,7 @@ ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright
# hermes process, the dashboard, and per-profile gateways.
RUN apt-get -o Acquire::Retries=3 update && \
apt-get -o Acquire::Retries=3 install -y --no-install-recommends \
ca-certificates curl iputils-ping python3 python-is-python3 ripgrep ffmpeg gcc g++ make cmake python3-dev python3-venv libffi-dev libolm-dev procps git openssh-client docker-cli xz-utils && \
ca-certificates curl iputils-ping python3 python-is-python3 ripgrep ffmpeg gcc g++ make cmake python3-dev python3-venv libffi-dev libolm-dev libatomic1 procps git openssh-client docker-cli xz-utils && \
rm -rf /var/lib/apt/lists/*

# Prefer the fixed SQLite over Debian's vulnerable libsqlite3.so.0. Keep the
Expand Down Expand Up @@ -151,17 +151,20 @@ RUN useradd -u 10000 -m -d /opt/data hermes

COPY --chmod=0755 --from=uv_source /usr/local/bin/uv /usr/local/bin/uvx /usr/local/bin/

# Node 22 LTS: copy the node binary plus the bundled npm + corepack JS
# installs from the upstream image. npm and npx are recreated as symlinks
# because they're symlinks in the source image (and need to live on PATH).
# Node 26: copy the node binary plus the bundled npm JS install from the
# upstream image. npm and npx are recreated as symlinks because they're
# symlinks in the source image (and need to live on PATH).
#
# No corepack: Node unbundled it upstream, so node:26 ships only npm in
# /usr/local/lib/node_modules. Nothing here needs it — no package.json
# declares a `packageManager`, and no build step shells out to yarn or pnpm.
#
# See node_source stage at the top of the file for the version-bump
# rationale (#4977).
COPY --chmod=0755 --from=node_source /usr/local/bin/node /usr/local/bin/
COPY --from=node_source /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm
COPY --from=node_source /usr/local/lib/node_modules/corepack /usr/local/lib/node_modules/corepack
RUN ln -sf /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \
ln -sf /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx && \
ln -sf /usr/local/lib/node_modules/corepack/dist/corepack.js /usr/local/bin/corepack
ln -sf /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx

WORKDIR /opt/hermes

Expand Down Expand Up @@ -400,6 +403,8 @@ ENV HERMES_LAZY_INSTALL_TARGET=/opt/data/lazy-packages
# Recursion is impossible because the shim exec's the venv binary by
# absolute path (/opt/hermes/.venv/bin/hermes). See the shim source for
# the opt-out env var (HERMES_DOCKER_EXEC_AS_ROOT=1).
COPY --chmod=0755 docker/hermes-exec-shim.sh /opt/hermes/bin/hermes
COPY --chmod=0755 docker/entrypoint-dispatch.sh /opt/hermes/docker/entrypoint-dispatch.sh

# Pre-s6 entrypoint.sh did `source .venv/bin/activate` which exported
# the venv bin onto PATH; Architecture B's main-wrapper.sh does the
Expand All @@ -416,27 +421,37 @@ ENV PATH="/opt/hermes/bin:/opt/hermes/.venv/bin:/opt/data/.local/bin:${PATH}"
RUN mkdir -p /opt/data
VOLUME [ "/opt/data" ]

# s6-overlay's /init is PID 1. It sets up the supervision tree, runs
# /etc/cont-init.d/* (our stage2 hook), starts s6-rc services
# declared in /etc/s6-overlay/s6-rc.d/, then exec's its remaining
# argv as the container's "main program" with stdin/stdout/stderr
# inherited (this is what makes interactive --tui work). When the
# main program exits, /init begins stage 3 shutdown and the container
# exits with the program's exit code. Replaces tini — see Phase 2 of
# docs/plans/2026-05-07-s6-overlay-dynamic-subagent-gateways.md.
# The image ENTRYPOINT is a tiny dispatcher rather than `/init` directly.
# When the image really owns PID 1 (normal Docker / Podman), the dispatcher
# execs `/init` and preserves the full s6 supervision tree. When a platform
# wraps the image entrypoint under its own PID-1 init (Fly Machines,
# `docker run --init`, some schedulers), `/init` would abort with
# `can only run as pid 1`; in that case the dispatcher falls back to
# `stage2-hook.sh` + `main-wrapper.sh` directly so foreground commands still
# work. See #38349.
#
# On the PID-1 path, s6-overlay's /init sets up the supervision tree, runs
# /etc/cont-init.d/* (our stage2 hook), starts s6-rc services declared in
# /etc/s6-overlay/s6-rc.d/, then exec's its remaining argv as the container's
# "main program" with stdin/stdout/stderr inherited (this is what makes
# interactive --tui work). When the main program exits, /init begins stage 3
# shutdown and the container exits with the program's exit code. Replaces
# tini — see Phase 2 of docs/plans/2026-05-07-s6-overlay-dynamic-subagent-gateways.md.
#
# We use the ENTRYPOINT+CMD split rather than CMD alone so the
# wrapper is prepended to user-supplied args automatically:
#
# docker run <image> → /init main-wrapper.sh (CMD default)
# docker run <image> chat -q "hi" → /init main-wrapper.sh chat -q hi
# docker run <image> sleep infinity → /init main-wrapper.sh sleep infinity
# docker run <image> --tui → /init main-wrapper.sh --tui
# docker run <image> → entrypoint-dispatch.sh (CMD default)
# docker run <image> chat -q "hi" → entrypoint-dispatch.sh chat -q hi
# docker run <image> sleep infinity → entrypoint-dispatch.sh sleep infinity
# docker run <image> --tui → entrypoint-dispatch.sh --tui
#
# main-wrapper.sh handles arg routing (bare-exec vs. hermes
# subcommand vs. no-args), drops to the hermes user via s6-setuidgid,
# and exec's the final program so its exit code becomes the container
# exit code. Without the wrapper-as-ENTRYPOINT, leading-dash args
# like `--version` would be intercepted by /init's POSIX shell.
ENTRYPOINT [ "/init", "/opt/hermes/docker/main-wrapper.sh" ]
# exit code. The dispatcher preserves that contract across both the
# supervised PID-1 path and the non-PID-1 fallback path. Without the
# wrapper-as-ENTRYPOINT, leading-dash args like `--version` would be
# intercepted by /init's POSIX shell.
ENTRYPOINT [ "/opt/hermes/docker/entrypoint-dispatch.sh" ]
CMD [ ]
20 changes: 13 additions & 7 deletions acp_adapter/entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,16 +247,22 @@ def main(argv: list[str] | None = None) -> None:
import acp
from .server import HermesACPAgent

# MCP tool discovery from config.yaml — run before asyncio.run() so
# it's safe to use blocking waits. (ACP also registers per-session
# MCP servers dynamically via asyncio.to_thread inside the event
# loop; that path is unaffected.) Moved from model_tools.py module
# scope to avoid freezing the gateway's loop on lazy import (#16856).
# MCP tool discovery from config.yaml — fire-and-forget in a
# background daemon thread so the ACP server becomes responsive
# immediately while MCP servers connect. Previously this blocked
# asyncio.run() for 2-5 s. (ACP also registers per-session MCP
# servers dynamically via asyncio.to_thread inside the event loop;
# that path is unaffected.) Moved from model_tools.py module scope
# to avoid freezing the gateway's loop on lazy import (#16856).
# Metadata-only hosts can opt out of unrelated global MCP startup.
if os.environ.get("HERMES_ACP_SKIP_CONFIGURED_MCP", "").strip() != "1":
try:
from tools.mcp_tool import discover_mcp_tools
discover_mcp_tools()
from hermes_cli.mcp_startup import start_background_mcp_discovery

start_background_mcp_discovery(
logger=logger,
thread_name="acp-mcp-discovery",
)
except Exception:
logger.debug("MCP tool discovery failed at ACP startup", exc_info=True)

Expand Down
Loading