Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
254 commits
Select commit Hold shift + click to select a range
c9a806e
fix(browser): pin named sessions to their own tab on shared browsers
teknium1 Aug 15, 2026
7fe3bf0
fix(update): self-heal stale git locks and stop false 'update availab…
RGerrish Aug 6, 2026
ed4f91c
fix(update): widen stale-lock self-heal to banner and desktop; align …
teknium1 Aug 15, 2026
07161e1
chore: map contributor email for @RGerrish
teknium1 Aug 15, 2026
bda83a4
style: satisfy desktop eslint (curly braces, import order)
teknium1 Aug 15, 2026
45af7a7
fmt(js): `npm run fix` on merge (#86935)
hermes-seaeye[bot] Aug 15, 2026
165c889
fix(cli): stop pushing Kitty keyboard protocol that breaks Ctrl+C
kshitijk4poor Aug 15, 2026
3e46389
fix(desktop): settle a turn that ends with no assistant payload
briandevans Jul 29, 2026
4b583e4
fix(desktop): discriminate backend-confirmed turns with turnLive so t…
teknium1 Aug 15, 2026
a525bbe
fix(update): avoid cryptography self-lock on Windows
duclucky Aug 3, 2026
93a9b23
feat(desktop): show per-turn wall-clock duration in the transcript
Tommy00748 Aug 12, 2026
9859e88
chore: map 807847218@qq.com -> Tommy00748 for attribution audit
teknium1 Aug 15, 2026
9f78a0d
fix(desktop): preserve turn-elapsed timer across session switches
yingliang-zhang Jul 31, 2026
eec4d5e
style: order deep-parent fixture import before siblings (perfectionis…
yingliang-zhang Aug 13, 2026
79b7d96
fix(gateway): reject unstamped durable ordinal rewinds
fangliquanflq Aug 15, 2026
0640fe7
fix(gateway): route truncation writes to profile database
fangliquanflq Aug 15, 2026
3863de3
revert(gateway): keep profile truncation routing out of scope
fangliquanflq Aug 15, 2026
9c7f92b
fmt(js): `npm run fix` on merge (#87251)
hermes-seaeye[bot] Aug 15, 2026
0c50bdb
fmt(js): `npm run fix` on merge (#87257)
hermes-seaeye[bot] Aug 15, 2026
763b10c
fix(gateway): run session-finalize plugin hooks off-loop and bounded
teknium1 Aug 15, 2026
92c998c
fix(update): restore quarantined hermes.exe shims after no-op install…
teknium1 Aug 15, 2026
fe0a56e
fix(nemo_relay): bound plugin Relay marks so a wedged native pipeline…
teknium1 Aug 15, 2026
48dd9c8
feat(computer-use): user-facing authorization for cua-driver browser …
teknium1 Aug 14, 2026
20cf326
fix(computer-use): align browser authorization with live-verified cua…
teknium1 Aug 14, 2026
c2a50a8
fix(desktop): skip failed turns in the backend-facing user ordinal space
vondelomlo Aug 15, 2026
3e8ab06
fix(desktop): never send ordinal-only truncation — resolve durable ro…
teknium1 Aug 15, 2026
2e9dcb7
fix(gateway): session.history ships durable row_id stamps
teknium1 Aug 15, 2026
17c7b0b
fmt(js): `npm run fix` on merge (#87296)
hermes-seaeye[bot] Aug 15, 2026
bbd3462
fix(computer-use): merge refs+content_refs in _ref_map for cua-driver…
weisiwu Aug 5, 2026
951ae62
test(computer-use): pin 0.17+ split refs/content_refs merge behavior
teknium1 Aug 15, 2026
9c58a78
feat(desktop): Capabilities-wide profile scoping + one-click hub inst…
teknium1 Aug 15, 2026
33242d5
feat(evals): compaction recall eval harness
teknium1 Aug 15, 2026
8fe9025
feat(compression): lean tail mode + recovery-aware eval arm
teknium1 Aug 15, 2026
7a82457
feat(compression): digest noise filter + FTS5 recovery sim + digest-a…
teknium1 Aug 15, 2026
c4bbb14
feat(compression): mechanical anchor index + region-scoping tripwire
teknium1 Aug 15, 2026
31ca120
feat(compression): field-proven summarizer prompt upgrades
teknium1 Aug 15, 2026
44536bd
docs(evals): 4-transcript compaction scorecard
teknium1 Aug 16, 2026
9146f4c
fix(evals): explicit encoding on all file I/O (ruff PLW1514)
teknium1 Aug 16, 2026
95aa709
fix(computer-use): diagnose empty window discovery; fail fast on dead…
teknium1 Aug 15, 2026
d5773bf
feat(desktop): Skills tab hub browser + full-skill detail pane; drop …
teknium1 Aug 15, 2026
a2cc867
fix(tests): de-flake sequential-tool-timeout race on loaded runners
teknium1 Aug 16, 2026
e299042
docs(evals): ship transcript-building scripts + full eval detail in-repo
teknium1 Aug 16, 2026
04c61f2
feat: import and resume Claude Code / Codex CLI sessions
teknium1 Aug 16, 2026
d6f02e3
feat: per-terminal --continue via terminal breadcrumbs
teknium1 Aug 16, 2026
99500ac
fix: guard breadcrumb writes for bare test fakes; fold session catego…
teknium1 Aug 16, 2026
933ef69
feat: session picker lifecycle status + delete
teknium1 Aug 16, 2026
d24d294
test(tool-executor): deterministic worker start kills sequential-time…
teknium1 Aug 16, 2026
61f2738
test(tool-executor): close the second race — deadline vs middleware p…
teknium1 Aug 16, 2026
d303e18
fix(computer_use): ignore placeholder pid/window_id ids
0xGr1mm Aug 7, 2026
460d345
fix(computer-use): flag macOS zero-display capture in doctor + discov…
teknium1 Aug 16, 2026
0ee5ae6
docs(evals): real Codex CLI head-to-head arm + results
teknium1 Aug 16, 2026
b7790d9
merge: refresh onto current main (take main's superior sequential-tim…
teknium1 Aug 16, 2026
b7f6280
fix(computer-use): refuse wrong-window input on app= mismatch; hint n…
teknium1 Aug 16, 2026
4a9411c
Merge pull request #87326 from NousResearch/feat/compaction-eval-and-…
teknium1 Aug 16, 2026
1d5fc2b
feat(config): wire compression.tail_mode + docs (en/zh)
teknium1 Aug 16, 2026
9b9dd6e
fix(computer-use): zero-rect AX bounds serialize as unknown, not a po…
teknium1 Aug 16, 2026
f3bf718
feat(desktop): drag-resizable panes on the Capabilities Skills tab
teknium1 Aug 16, 2026
d083b85
feat(hooks): pre_tool_call content transformation via `modify` directive
NikolaRHristov Aug 16, 2026
20fcc11
refactor(hooks): share fail-closed approve logic; update sibling tests
teknium1 Aug 16, 2026
411903b
chore: contributor mapping for NikolaRHristov
teknium1 Aug 16, 2026
9975180
fix(mcp): handle DCR clients with secrets across all OAuth paths
5Hyeons Aug 16, 2026
128fb74
chore: map contributor email for 5Hyeons
teknium1 Aug 16, 2026
21d3e63
fix(compression): watermark commit — appends flow freely, concurrent …
teknium1 Aug 16, 2026
652f5c2
fix(compression): rotation path clones the concurrent tail into the c…
teknium1 Aug 16, 2026
406c5da
fix(compression): bound the rotation tail clone below the rotator's o…
teknium1 Aug 16, 2026
8ad0554
fix(terminal): warn when exit_code 0 masks a piped build/test failure
teknium1 Aug 16, 2026
6bb8f60
fix(desktop): defer credential-warning onboarding to the first chat a…
teknium1 Aug 16, 2026
1f8f79b
fmt(js): `npm run fix` on merge (#87505)
hermes-seaeye[bot] Aug 16, 2026
c6dfdcb
fix(agent): reject masked verification results
fangliquanflq Aug 10, 2026
b353ac3
fix(cli): map all Ctrl/Alt/Shift+key combos under modifyOtherKeys lev…
kshitijk4poor Aug 16, 2026
2be1831
refactor: extract _install_paired helper, fix misleading comment, iso…
kshitijk4poor Aug 16, 2026
2cd5393
chore: map justin@bowes.org to @justinbowes
kshitijk4poor Aug 16, 2026
37445d6
feat(desktop): unify MCP Servers and Catalog into one coherent list
teknium1 Aug 16, 2026
b236917
Merge pull request #87516 from kshitijk4poor/chore/author-map-justinb…
kshitijk4poor Aug 16, 2026
60be8ef
perf(desktop): make session resume incremental
embwl0x Jul 11, 2026
bd1a44f
test(tui): wait for deferred profile DB close
embwl0x Aug 7, 2026
7a1b2cd
test(desktop): preserve bounded deferred resume
embwl0x Aug 15, 2026
a2fd20f
test(tui): isolate deferred hydration worker
embwl0x Aug 15, 2026
69f7c65
docs(tui): document defer_history vs omit_messages precedence
teknium1 Aug 16, 2026
a15de34
feat(desktop-sdk): host.deleteProfile — teardown-routed profile delet…
teknium1 Aug 16, 2026
2f6bbfb
fix(gateway): release loop ticks after empty responses
fangliquanflq Aug 15, 2026
9219cd3
fix(gateway): isolate post-turn loop failures
fangliquanflq Aug 16, 2026
f887819
fix(install): capture npm output on failure for diagnosable errors (#…
RelaxJonh Aug 16, 2026
eac1f65
fix(install): validate --commit SHA and fail hard on fetch/checkout e…
RelaxJonh Aug 16, 2026
f13f340
fix(webhook): authenticate Linear deliveries via linear-signature HMA…
liuhao1024 Aug 16, 2026
3beea05
fix: persist computer_use provider selection so Desktop picker surviv…
RelaxJonh Aug 15, 2026
08baf96
fix(runtime): exempt loopback custom-provider pool credentials from t…
ygd58 Aug 15, 2026
9ac1e65
fix(cron): do not treat directories as unsafe lifecycle scripts (#86753)
Aug 15, 2026
faaf2ae
fix(gateway): read routed profile model config
fangliquanflq Aug 15, 2026
ae7b5c8
fix(batch_runner): propagate fatal and validation errors as non-zero …
Christopher-Schulze Aug 15, 2026
5cfa2b2
fix(gateway): surface actionable message for local model server conne…
Christopher-Schulze Aug 15, 2026
3a61fa8
fix(gateway): keep broad connection phrases out of the provider-error…
Christopher-Schulze Aug 15, 2026
b7936c8
fix(gateway): catch BaseException in _process_message_background to n…
webtecnica Aug 15, 2026
d6688ad
fix(cli): use custom provider default_model when --provider is set
Christopher-Schulze Aug 15, 2026
3cbd86a
fix(cli): warn when --provider default_model cannot be resolved
Christopher-Schulze Aug 15, 2026
25672c0
fix(cli): allow persisted contributor tier consent
fangliquanflq Aug 15, 2026
d6f18cd
fix(mcp): prefer server-native tool over generated utility on name co…
PRATHAMESH75 Aug 15, 2026
a11fb1c
fix(desktop): restore mod-chord keybinds while typing in inputs
DavidMetcalfe Aug 15, 2026
ca50ff3
fix(desktop): reject bare modifier combos in the input gate
DavidMetcalfe Aug 15, 2026
26b2b47
fix(agent): preserve local reasoning timeout opt-out
fangliquanflq Aug 15, 2026
1596148
fix(approval): deterministic approvals.single_query_mode for -q sessions
VIVAAN-DHAWAN Aug 15, 2026
730c5fc
fix(gateway): treat Ready scheduled tasks as Windows supervisors
monerostar Aug 15, 2026
c69a087
fix(gateway): preserve launchd supervisor marker across stderr_timest…
Christopher-Schulze Aug 15, 2026
7008fb8
fix(gateway): put --external-supervisor on launchd gateway argv
Christopher-Schulze Aug 15, 2026
0fd059e
fix(agent): preserve stalled-provider escalation
fangliquanflq Aug 15, 2026
a6f4053
fix(agent): cover provider wait teardown paths
fangliquanflq Aug 15, 2026
29dfbf2
fix(sessions): surface open sessions skipped by prune
fangliquanflq Aug 16, 2026
0b8a097
fix(sessions): address prune skip review notes
fangliquanflq Aug 16, 2026
0a42bc7
fix(sessions): align prune filter derivation
fangliquanflq Aug 16, 2026
b48ab1b
fix(agent+discord): guard truncated-response continuation loops and c…
webtecnica Aug 15, 2026
f1e3e0a
fix(agent): bound worker finalization when iteration budget exhausted…
webtecnica Aug 15, 2026
0a8092a
fix: guard exit watchdog against mid-cleanup overlap
zhao0112 Aug 15, 2026
7cc006a
fix(desktop): hard-exit a lock-losing second instance before ready
alkaiyali Aug 15, 2026
df89995
fix(desktop): keep startHermes inert without the single-instance lock
alkaiyali Aug 15, 2026
a7b25b3
fix(desktop): never reap a backend whose parent Electron is alive
alkaiyali Aug 15, 2026
da39204
fix(agent): include timezone and UTC offset in system prompt timestamp
Aug 16, 2026
f4f08f9
fix(gateway): make managed Node suppress PATH fallback
enwaiax Aug 15, 2026
a55d29d
fix(agent): canonicalize duplicate tool call arguments
fangliquanflq Aug 15, 2026
8fc4189
fix(agent): harden canonical tool call deduplication
fangliquanflq Aug 16, 2026
be8b58d
fix(gateway): let an explicit workspace move win for a running session
ayushnangia Aug 15, 2026
f33ec68
fix(ui): ignore inherited esbuild binary overrides
fangliquanflq Aug 16, 2026
7f1c49c
fix(ui): scrub esbuild override during builds
fangliquanflq Aug 16, 2026
8fe8633
fix(codex): clamp xAI max/ultra aliases to the model's reasoning ceil…
liuhao1024 Aug 15, 2026
076b8a5
fix(backup): bound locked database snapshot waits
fangliquanflq Aug 15, 2026
95190e4
fix(gemini): raise maxOutputTokens when thinking is enabled
lextiz Aug 15, 2026
2d7c9ef
fix(gateway): don't crash on a foreign XDG_RUNTIME_DIR in user-system…
PRATHAMESH75 Aug 15, 2026
2cb8381
fix(agent): do not let hygiene idle timeouts block in-agent compression
Christopher-Schulze Aug 15, 2026
5602f04
fix(agent): clear in-memory cooldown when hygiene overwrites the shar…
Christopher-Schulze Aug 15, 2026
39d2d85
fix(gateway): persist hygiene failure cooldown rung
fangliquanflq Aug 15, 2026
b3df990
fix(gateway): offload hygiene streak persistence
fangliquanflq Aug 15, 2026
ed0a8a4
fix(skills): resolve skills dir before relative_to so junction instal…
Enough1122 Aug 15, 2026
9ca1139
fix(telegram): honor group_allowed_chats in early auth under multiple…
PRATHAMESH75 Aug 15, 2026
7af27c6
fix(desktop): close safe preview blockers before update
ryankhart Aug 5, 2026
c32dd75
fix(desktop): identify unsafe update blockers
ryankhart Aug 8, 2026
095d25c
fix(gateway): keep persisted model routes consistent
fangliquanflq Aug 15, 2026
53daff0
fix(desktop): don't cancel the running turn on Esc while an overlay i…
forkercat Aug 9, 2026
ff4df5e
fix(caching): engage prompt caching for LiteLLM Claude on the OpenAI …
Aug 13, 2026
1b0e953
fix(caching): use the envelope layout for LiteLLM Claude on the OpenA…
kshitijk4poor Aug 16, 2026
435d6f3
fix(caching): match the litellm provider id token-wise too
kshitijk4poor Aug 16, 2026
0038d96
perf(caching): narrow the widened capability lookup to the LiteLLM grant
kshitijk4poor Aug 16, 2026
4ce0d64
test(caching): pin signal precedence and the openrouter-host opt-out
kshitijk4poor Aug 16, 2026
1e6717b
fix(web_server): discover root user plugins under profile-scoped proc…
teknium1 Aug 16, 2026
25fabcf
fix(telegram): keep /loop and synthetic sends in the active DM topic
teknium1 Aug 16, 2026
eb2dceb
fix(desktop): show failed status for timed-out subagents in fallback …
teknium1 Aug 16, 2026
8033389
fix(desktop): match custom provider aliases in model catalog menu
teknium1 Aug 16, 2026
f325008
chore(contributors): map emails for P2-sweep salvage wave
teknium1 Aug 16, 2026
c3d7460
fix(desktop): avoid PowerShell parent marker boot gate
yu-xin-c Aug 15, 2026
c6db207
fix(desktop): give Windows start-marker PowerShell probe a 30s budget
teknium1 Aug 16, 2026
577093d
perf(desktop): hydrate transcripts with a small tail page + on-demand…
teknium1 Aug 16, 2026
e22fa90
feat(desktop): MCP fleet cost/usage overlay with schema token estimat…
teknium1 Aug 16, 2026
e14b095
fix(tui): map lineage edit ordinals past compression prefix
rainbowgore Aug 9, 2026
3e0bf6d
fix(desktop): hoist GatewayMock type into #82462 edit recovery suite
rainbowgore Aug 9, 2026
56eafcf
feat(desktop): hermes:// deep link to install MCP servers with explic…
teknium1 Aug 16, 2026
5d33efd
fmt(js): `npm run fix` on merge (#87599)
hermes-seaeye[bot] Aug 16, 2026
1c3fbd2
feat(desktop): background MCP health checks with re-auth nudges
teknium1 Aug 16, 2026
0a3e61c
fmt(js): `npm run fix` on merge (#87607)
hermes-seaeye[bot] Aug 16, 2026
e264b48
fix(desktop): scope messaging to active remote profile
dokterdok Aug 11, 2026
1f24b3e
fix(desktop): retain messaging totals per profile
dokterdok Aug 14, 2026
a0f2223
fix(desktop): ignore stale messaging page responses
dokterdok Aug 14, 2026
8477a5a
docs(desktop): document profile scope helpers
dokterdok Aug 14, 2026
4f670a3
fix(desktop): reject stale profile refreshes
dokterdok Aug 14, 2026
4e4d37f
fix(desktop): harden profile-scoped refreshes
dokterdok Aug 14, 2026
58a9062
fix(desktop): resolve sessions from sidebar caches
dokterdok Aug 15, 2026
6c745e8
fix(tools-config): stop reconfigure flow clobbering image_gen.use_gat…
teknium1 Aug 16, 2026
34271eb
feat(desktop): make the multi-gateway Connections registry discoverable
teknium1 Aug 16, 2026
ea2daa0
docs: full multi-gateway setup guide for Hermes Desktop
teknium1 Aug 16, 2026
4539895
fix(desktop): never resolve a missing named gateway scope to the primary
teknium1 Aug 16, 2026
39bf984
fix(desktop): sync connection atoms and share the switch mutex for ag…
teknium1 Aug 16, 2026
0a9337d
feat(desktop): expose busy turn flags on plugin SDK
Adolanium Aug 16, 2026
28fc9d9
fix(desktop): make plugin SDK turn flags follow the focused chat
teknium1 Aug 16, 2026
1e54e05
feat(desktop): paste-anything MCP server import
teknium1 Aug 16, 2026
3bc52fb
feat(desktop): running is not busy
professorpalmer Aug 16, 2026
be38224
fix(desktop): lint and map contributor email for running-is-not-busy
professorpalmer Aug 16, 2026
68bd8be
feat(desktop-sdk): expose focused-session state atoms to plugins
lepetitprince716-prog Aug 6, 2026
74b7d5d
test(desktop-sdk): contract-test the focused-session host.state atoms
lepetitprince716-prog Aug 6, 2026
a445a81
fix(desktop-sdk): type focusedUsage as Partial<UsageStats>, fix expec…
lepetitprince716-prog Aug 6, 2026
5fa092b
fix(desktop-sdk): address adversarial review — type honesty, real til…
lepetitprince716-prog Aug 6, 2026
6ce7922
chore: map contributor email for focused-session atoms salvage
teknium1 Aug 16, 2026
9e06291
fix(desktop): exclude process-less descriptors from backend pool LRU cap
teknium1 Aug 16, 2026
28c729e
fix(desktop): tear down renderer secondaries when a registry connecti…
teknium1 Aug 16, 2026
f4c80e4
fix(desktop): recycle live backends and sockets when a connection edi…
teknium1 Aug 16, 2026
03bf85d
fix(cli): restore Kitty keyboard protocol push and complete the exten…
kshitijk4poor Aug 16, 2026
56526bc
Merge pull request #87630 from kshitijk4poor/fix/kitty-extended-keys-…
kshitijk4poor Aug 16, 2026
029a0d8
fix(cron): process .pth files for Windows uv-venv script jobs (#86567)
pittosporum-seu Aug 15, 2026
58d6bf2
fix(cron): log and document the .pth bootstrap fallback (#86816 review)
pittosporum-seu Aug 16, 2026
bd0586e
fix(update): surface config mutations applied silently during version…
3Nya3 Aug 15, 2026
309cf2c
fix: honor JSON-array string forms for skills.disabled and agent.disa…
pasmud Aug 15, 2026
b44f956
fix(desktop-update): put --daemonized ahead of ORIGINAL_ARGS in posix…
fukutake1207 Aug 15, 2026
a7253a6
fix(cli): deliver the Bedrock API key through a named provider
darko-mesaros Aug 15, 2026
b921fdd
fix(gateway): improve Windows detach diagnostics
QDung210 Aug 15, 2026
0a1cca5
refactor(gateway): share breakaway marker constant
QDung210 Aug 15, 2026
ad85fee
fix(tui): settle session close against active turns
Aug 15, 2026
089b437
fix(tui): stop queued dispatch after session close
Aug 15, 2026
4058608
fix(cron): reject NUL-bearing script paths before any Path call (#767…
pittosporum-seu Aug 15, 2026
5c290ca
test(cron): pin the eager NUL rejection contract for _run_job_script …
pittosporum-seu Aug 15, 2026
795e035
fix(cron): coerce script_path to str in the NUL guard so it can never…
pittosporum-seu Aug 16, 2026
b560c0d
docs(agents): record multiplex profile-scoped env fail-closed rule (#…
pittosporum-seu Aug 15, 2026
8ff5f13
fix(auth): resolve provider auto-detection keys through the profile s…
pittosporum-seu Aug 15, 2026
047c72e
test(auth): cover profile-scoped key resolution in resolve_provider (…
pittosporum-seu Aug 15, 2026
275f8d4
fix(auth): only fall back to os.getenv on ImportError in resolve_prov…
pittosporum-seu Aug 16, 2026
c2e9482
test(gitlock): pin the git-process guard in sweep tests (deflake slic…
teknium1 Aug 16, 2026
fccf2b7
fix(gateway): complete /loop ticks after streamed already_sent turns
Adolanium Aug 15, 2026
a2fcac0
fix(cli): chat -c fails loudly on stderr and gains --create-if-missing
yflmq001 Aug 15, 2026
0816ba2
fix(cli): address review feedback on chat -c fail-loudly PR
yflmq001 Aug 15, 2026
de254c4
chore: map contributor email for @yflmq001
teknium1 Aug 16, 2026
877e851
fix(acp): probe CLI for --acp support before spawning subprocess
Aug 15, 2026
5b19c8e
fix(acp): make --acp probe tri-state, cached, and mock-safe
teknium1 Aug 16, 2026
4e3de14
fix(cli): bound the Windows process-scan probes so a slow WMI scan ca…
kshitijk4poor Aug 15, 2026
00ecb5d
test(cli): retarget the wmic-encoding regression test at bounded_prob…
teknium1 Aug 16, 2026
7095e23
fix(agent): attribute background-review usage and add cost controls
ojassharma7 Aug 16, 2026
d905954
fix(desktop): route registry 'local' entry to the genuinely-local run…
teknium1 Aug 16, 2026
9caff74
fix(desktop): key fan-out event consumption by (connectionId, profile)
teknium1 Aug 16, 2026
12eeadf
style(desktop): order @hermes/shared import before nanostores (perfec…
teknium1 Aug 16, 2026
b007b80
fmt(js): `npm run fix` on merge (#87839)
hermes-seaeye[bot] Aug 16, 2026
410c437
fmt(js): `npm run fix` on merge (#87844)
hermes-seaeye[bot] Aug 16, 2026
d709d29
fix(agent): trim background_review to the enabled switch
teknium1 Aug 16, 2026
5331ae2
fix(update): reload _subprocess_compat and dashboard_procs after git …
yukinomon Aug 16, 2026
ddc51ec
fix(update): reload process-scan modules at the dashboard-cleanup ent…
teknium1 Aug 16, 2026
df4b651
chore: release v0.20.2 (2026.8.16)
teknium1 Aug 16, 2026
21c1fe6
fix(tui): modified Enter and bare LF insert a newline in the composer…
OutThisLife Aug 16, 2026
06b9141
fix(state): classify structural DB corruption as its own persistence …
teknium1 Aug 16, 2026
587ad87
Revert "fix(agent): preserve local reasoning timeout opt-out"
teknium1 Aug 16, 2026
250232f
Revert "fix(agent): harden canonical tool call deduplication"
teknium1 Aug 16, 2026
f97cc25
fix(update): restart hermes-serve systemd units alongside gateways
chelsealong Aug 11, 2026
0b42cae
fix(update): tighten hermes-serve unit gate, dedupe fleet/cleanup res…
chelsealong Aug 16, 2026
19631b5
fix(update): tighten gateway-side unit gates to exact/hyphenated shape
teknium1 Aug 16, 2026
0a6ead0
fix(desktop): ignore stale remote connection attempts
604maestro Jul 16, 2026
2c51abe
chore: map contributor email for xkam7ar
teknium1 Aug 16, 2026
c23605e
fix(apps): dial primary sleep/wake reconnect at window backend not ac…
fangliquanflq Jul 30, 2026
2eb9d29
fix(desktop): scope pluginSocket's connection to the active profile
pierrenode Aug 11, 2026
ca84f13
fmt(js): `npm run fix` on merge (#87880)
hermes-seaeye[bot] Aug 16, 2026
f06c415
fix(image_gen): disable default-on upscaling everywhere — opt-in only
teknium1 Aug 16, 2026
c257e91
fix: make every tool interruptible — sequential executor abandons on …
teknium1 Aug 16, 2026
a403fe6
feat(computer-use): support Cua Driver 0.20 runtime contracts
f-trycua Aug 16, 2026
81af2ef
fix(computer-use): reconcile existing cua-driver installs
f-trycua Aug 16, 2026
9a96fdc
fix(computer-use): enforce existing-profile grant, unblock the opt-in
f-trycua Aug 16, 2026
5f049b5
fix(computer-use): make the typed-browser bind/snapshot split discove…
f-trycua Aug 16, 2026
cdbea83
fix(computer-use): keep a v3 capability manifest on approval-bypassed…
f-trycua Aug 16, 2026
3e0087a
fix(computer-use): warn when an approval bypass widens the driver mode
f-trycua Aug 16, 2026
3162745
fix(computer-use): report unusable driver exit status
f-trycua Aug 16, 2026
c83ea25
fix(computer-use): preserve missing driver overrides
f-trycua Aug 16, 2026
5b010f4
fix(computer-use): verify Windows driver repair
f-trycua Aug 16, 2026
12b1f0f
fix(computer-use): align browser guidance and screenshots
f-trycua Aug 16, 2026
42be3c5
feat: expose public gateway injection seam (#1)
randlee Aug 11, 2026
e7467f7
fix(gateway): notify visible internal-message notices
randlee Aug 11, 2026
baa95f1
test(gateway): cover soft visible-notice failure
randlee Aug 11, 2026
7738aea
docs(atm): patch contract + fork-maintenance process
randlee Aug 16, 2026
906e15d
docs(atm): name loki as escalation agent and non-trivial-PR approver
randlee Aug 16, 2026
d667bb2
docs(atm): routine chain contessa->alpha-prime; loki reserved for non…
randlee Aug 16, 2026
81d89e2
merge: resolve PR #7 conflict against current main (keep rebased stac…
randlee Aug 16, 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
  •  
  •  
  •  
24 changes: 24 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -1288,6 +1288,30 @@ automatically scope to the active profile.
This is intentional — it lets `hermes -p coder profile list` see all profiles regardless
of which one is active.

7. **Multiplex profile-scoped env reads MUST fail closed — never borrow from `os.environ`**
(`agent/secret_scope.py` contract; #72348, #86905). Under `gateway.multiplex_profiles`,
`os.environ` holds the **default profile's** values; a secondary profile's `.env` lives
only in its secret scope (installed per-turn by `_profile_runtime_scope`). Any
profile-level env config — credentials (`app_secret`, tokens) AND authorization
(`FEISHU_ALLOWED_USERS`, `{PLATFORM}_ALLOW_ALL_USERS`, `GATEWAY_ALLOW_ALL_USERS`,
`group_policy`, `allow_bots`, ...) — must be read scope-aware:
- Adapters: `_get_scoped_secret()` (canonical fail-closed copy in
`plugins/platforms/feishu/adapter.py`, #86905).
- Gateway authz: `_auth_env()` / `_platform_gate_env()` (`gateway/authz_mixin.py`).
Rules:
- Scope installed + multiplex active → a scoped miss returns the **default**.
NEVER fall through to `os.environ` — that leaks another profile's value and
silently breaks routing/admission (a leaked default allowlist skips the
allow-all check and rejects every secondary-profile sender, #86905).
- Unscoped default-profile path (`UnscopedSecretError`) and single-profile
deployments keep the `os.environ` read — there it IS the profile's own value.
- Authorization config is the sharpest edge: allowlist/allow-all leaks cause
silent rejections (or worse, fail-open) that only show up as missing replies.
- The `_get_scoped_secret` wrapper is copy-pasted across ~15 platform adapters —
when touching any of them, make sure the fail-closed semantics are present;
do not reintroduce the `except _UnscopedSecretError: val = os.getenv(...)`
fallback-after-miss shape.

## Known Pitfalls

### DO NOT hardcode `~/.hermes` paths
Expand Down
6 changes: 6 additions & 0 deletions agent/agent_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -1987,6 +1987,11 @@ def init_agent(
compression_enabled = str(_compression_cfg.get("enabled", True)).lower() in {"true", "1", "yes"}
compression_target_ratio = float(_compression_cfg.get("target_ratio", 0.20))
compression_protect_last = int(_compression_cfg.get("protect_last_n", 20))
# Tail retention mode (compression.tail_mode). "legacy" (default) keeps
# the 0.20*window verbatim tail; "lean" switches to the clamped
# 2.5%/10K-25K tail with recovery-pointer machinery (#87326). Unknown
# values fall back to legacy inside the compressor.
compression_tail_mode = str(_compression_cfg.get("tail_mode", "legacy")).strip().lower()
# Minimum REAL (actionable) user messages guaranteed to survive in the
# uncompressed tail (compression.min_tail_user_messages). Default 1
# preserves current behavior exactly — the existing single-user tail
Expand Down Expand Up @@ -2617,6 +2622,7 @@ def _parse_prune_int(raw, default):
proactive_prune_min_result_chars=compression_proactive_prune_min_chars,
proactive_prune_min_reclaim_tokens=compression_proactive_prune_min_reclaim,
min_tail_user_messages=compression_min_tail_users,
tail_mode=compression_tail_mode,
)
_bind_session_state = getattr(agent.context_compressor, "bind_session_state", None)
if callable(_bind_session_state):
Expand Down
95 changes: 88 additions & 7 deletions agent/agent_runtime_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2145,6 +2145,32 @@ def plan_cache_sections_for_destination(
return plan.messages, plan.tools


def _is_litellm_route(provider_lower: str, base_url: str) -> bool:
"""True when a route is a LiteLLM proxy, by provider id or host token.

Provider naming varies per install (``litellm``, ``custom:litellm``, or a
bare ``custom`` alias pointed at a LiteLLM host), so both signals are
checked. Both match ``litellm`` as a whole delimited token rather than a
raw substring: ``base_url_hostname``'s own docstring names substring host
matching as the false-positive class to avoid, and a plain
``"litellm" in ...`` grants Anthropic markers to unrelated routes like
``notlitellm.example.com`` or a provider named ``custom:notlitellm``.
A ``litellm`` *path* segment never qualifies — only the host does.
"""
if _has_litellm_token(provider_lower, ":-_/"):
return True
return _has_litellm_token(base_url_hostname(base_url), ".-")


def _has_litellm_token(value: str, delimiters: str) -> bool:
"""True when ``value`` contains ``litellm`` as a whole delimited token."""
if not value:
return False
for delimiter in delimiters:
value = value.replace(delimiter, " ")
return "litellm" in value.split()


def anthropic_prompt_cache_policy(
agent,
*,
Expand Down Expand Up @@ -2269,8 +2295,23 @@ def anthropic_prompt_cache_policy(
# capability declaration instead; explicit false is authoritative too.
# This preserves the runtime model id (and therefore request/cache keys)
# while avoiding unsafe alias-name guesses.
#
# Also consulted for a LiteLLM route on the OpenAI wire: that grant is
# inferred from the provider/host name, so an operator who explicitly
# declares prompt_caching for the route+model must still win over the
# inference — in either direction. Narrowed to the routes the LiteLLM
# branch below can actually grant (chat_completions + Claude): the lookup
# calls get_compatible_custom_providers, which rebuilds its normalized
# view on every call (~1.5ms uncached), and this function runs per
# request destination. Widening it unconditionally regressed the
# non-declaring common case ~200x (7.5us -> 1528us).
custom_prompt_caching = None
if is_anthropic_wire:
_litellm_openai_wire = (
eff_api_mode == "chat_completions"
and is_claude
and _is_litellm_route(provider_lower, eff_base_url)
)
if is_anthropic_wire or _litellm_openai_wire:
try:
from hermes_cli.config import get_custom_provider_model_capability

Expand All @@ -2286,7 +2327,11 @@ def anthropic_prompt_cache_policy(
_cap_exc,
)
if custom_prompt_caching is not None:
return custom_prompt_caching, custom_prompt_caching
# Layout follows the transport, not the declaration: the native
# inner-block form is only honored on the Anthropic Messages wire
# (see the LiteLLM OpenAI-wire branch below for why a top-level
# marker is dropped or 400s on chat_completions).
return custom_prompt_caching, custom_prompt_caching and is_anthropic_wire

# MiniMax-M3 rides MiniMax's server-side automatic prefix cache on the
# Anthropic wire (content-keyed, no marker needed); explicit cache_control
Expand Down Expand Up @@ -2334,6 +2379,42 @@ def anthropic_prompt_cache_policy(
# Third-party Anthropic-compatible gateway.
return True, True

# LiteLLM fronting a Claude model on the OpenAI-compatible wire.
# The branch above only matches LiteLLM in Anthropic proxy mode
# (api_mode == "anthropic_messages"). A LiteLLM deployment that
# exposes /v1/chat/completions instead matched no grant branch above
# and fell through to (False, False): no cache_control is injected, the
# system prompt goes on the wire as a plain string, and the provider
# serves zero cache hits — the entire prompt is re-billed at full price
# every turn. Same failure class already documented above for
# Qwen/DashScope. The endpoint supports Anthropic-style cache_control
# fine; only the provider detection missed it (#84506).
#
# Gated on the Claude family only: a Gemini/GPT/Qwen route through the
# same proxy must not receive markers — some strict OpenAI-wire relays
# reject the cache_control block format outright (cf. the DeepSeek /
# OpenCode exclusion below, #77217).
#
# Envelope layout (native_anthropic=False), matching every other
# OpenAI-wire grant in this function. The native inner-block layout
# writes a TOP-LEVEL msg["cache_control"] on role:tool and
# empty-content messages and relies on the Anthropic adapter to
# relocate it — but that adapter only runs for api_mode ==
# "anthropic_messages" (agent/transports/anthropic.py), and the
# chat_completions transport performs no relocation. On this wire the
# native layout therefore (a) silently loses those breakpoints, spending
# 2 of the 4 available on markers the provider never sees, and (b) when
# LiteLLM relocates a top-level marker itself for an OpenRouter-backed
# Claude route, lands it on an empty text block — the HTTP 400
# "text content blocks must contain" shape handled in
# agent/anthropic_adapter.py (#69512).
#
# Gated on chat_completions explicitly rather than `not
# is_anthropic_wire`: codex_responses / bedrock_converse are separate
# transports with their own marker handling and must not be swept in.
if _litellm_openai_wire:
return True, False

# MiniMax on its Anthropic-compatible endpoint serves its own
# model family (MiniMax-M2.7, M2.5, M2.1, M2) with documented
# cache_control support (0.1× read pricing, 5-minute TTL). The
Expand Down Expand Up @@ -2992,17 +3073,17 @@ def invoke_tool(agent, function_name: str, function_args: dict, effective_task_i
block_message: Optional[str] = None
if not pre_tool_block_checked:
try:
from hermes_cli.plugins import resolve_pre_tool_block
block_message = resolve_pre_tool_block(
function_name,
function_args,
task_id=effective_task_id or "",
from hermes_cli.plugins import _dispatch_pre_tool_call_hooks
block_message, modified_args = _dispatch_pre_tool_call_hooks(
function_name, function_args, task_id=effective_task_id or "",
session_id=getattr(agent, "session_id", "") or "",
tool_call_id=tool_call_id or "",
turn_id=getattr(agent, "_current_turn_id", "") or "",
api_request_id=getattr(agent, "_current_api_request_id", "") or "",
middleware_trace=list(_tool_middleware_trace),
)
if modified_args is not None:
function_args = modified_args
except Exception:
block_message = None
if block_message is not None:
Expand Down
Loading
Loading