Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1471 commits
Select commit Hold shift + click to select a range
ab48096
feat(#6033): show delegated goal titles for child sessions
rodboev Jul 14, 2026
d08116b
fix: harden gateway restart recovery targeting
Jul 14, 2026
12fd727
test(providers): clear cache between tests for auth-state isolation
Jul 14, 2026
186fef2
Merge branch 'master' into fix/6010-cache-providers
SeanWit Jul 14, 2026
59e9246
fix: fail closed on wrapped gateway pid helpers
Jul 14, 2026
b49c93c
Merge branch 'rebase-6054' into stage/6054
Jul 14, 2026
132bd8b
Release exp: fail-closed gateway-restart recovery for agent updates (…
Jul 14, 2026
3f3fa9b
Merge pull request #6057 from nesquena/stage/6054
nesquena-hermes Jul 14, 2026
73b6c5d
fix(sessions): cascade delegated subagents on parent deletion
pxxD1998 Jul 11, 2026
b8605e5
Merge branch 'rebase-5926' into stage/5926
Jul 14, 2026
0a85a84
Release exp: cascade delegated subagent sessions on parent deletion (…
Jul 14, 2026
a81872a
Merge pull request #6073 from nesquena/stage/5926
nesquena-hermes Jul 14, 2026
74fd7ed
docs: add change guidelines (GUIDELINES.md) + wire into AGENTS.md and…
Jul 14, 2026
fd8539c
docs(changelog): stamp v0.52.41 stable section (promotion) (#6075)
nesquena-hermes Jul 14, 2026
13b640a
Merge branch 'master' into docs/change-guidelines
nesquena-hermes Jul 14, 2026
7532e4a
Merge pull request #6076 from nesquena/docs/change-guidelines
nesquena-hermes Jul 14, 2026
4f2190c
fix(chat): preserve visible reasoning ownership
Jul 14, 2026
54f43b3
fix(chat): isolate reasoning fallback by session
Jul 14, 2026
e79f3cf
fix(chat): recover reasoning after stale live turn
Jul 14, 2026
a89a6be
fix(chat): avoid duplicate reasoning fallback owner
Jul 14, 2026
90e9f04
fix(chat): key reasoning fallback to exact anchor row
Jul 14, 2026
e5c5fd6
test(chat): accept keyed reasoning fallback path
Jul 14, 2026
e13ebd9
fix(chat): align reasoning fallback identity key
Jul 14, 2026
4f5f197
Merge commit 'refs/pull/6048/head' of github.com:nesquena/hermes-webu…
Jul 14, 2026
f803eb2
Release exp: preserve visible reasoning on deferred anchor paint (#60…
Jul 14, 2026
c677e4c
Merge pull request #6077 from nesquena/stage/6048
nesquena-hermes Jul 14, 2026
7707ea1
fix(webui): stop password managers autofilling the search box, and ke…
Jul 15, 2026
b6733cc
fix(webui): give the onboarding password inputs a form owner too
Jul 15, 2026
40d5e17
fix: allow manual force-check even when auto-update is disabled (#6082)
webtecnica Jul 15, 2026
2a19100
Merge branch 'master' into fix/6010-cache-providers
SeanWit Jul 15, 2026
078a64c
Merge commit 'refs/pull/6083/head' of github.com:nesquena/hermes-webu…
Jul 15, 2026
0881b8e
Release exp: fix new-conversations-unstartable (password-manager auto…
Jul 15, 2026
02e5acb
fix(#6083 follow-up): bound never-persisted empty session shells
Jul 15, 2026
3005908
fix(#6083): only grace-evict CONFIRMED never-persisted shells (Codex …
Jul 15, 2026
57e8aaf
Merge pull request #6096 from nesquena/stage/6083-brick
nesquena-hermes Jul 15, 2026
139c765
fix tool-limit final answer classification
Jul 15, 2026
e41507d
Release exp: suppress false no-response after tool-limit turn with a …
Jul 15, 2026
ad88366
Merge pull request #6097 from nesquena/stage/6081-noresp
nesquena-hermes Jul 15, 2026
754dcca
Merge commit 'refs/pull/6088/head' of github.com:nesquena/hermes-webu…
Jul 15, 2026
2e93d04
Release exp: allow manual update check when auto-update is disabled (…
Jul 15, 2026
3c9304a
Merge pull request #6098 from nesquena/stage/6088-manualupd
nesquena-hermes Jul 15, 2026
5b46c54
feat(ui): show read ranges in collapsed tool labels
Jul 14, 2026
59c8f98
fix(ui): reject invalid read range limits
Jul 14, 2026
6efbf89
Release exp: show requested line range in collapsed read_file tool la…
Jul 15, 2026
93a9bdc
Merge pull request #6101 from nesquena/stage/6062-readrange
nesquena-hermes Jul 15, 2026
b96405e
Merge commit 'refs/pull/6056/head' of github.com:nesquena/hermes-webu…
Jul 15, 2026
80cb79c
Release exp: show delegated goal titles for generic subagent child se…
Jul 15, 2026
ffbc913
fix(#6056): redact display_title/_state_db_title/parent_title on the …
Jul 15, 2026
f5ef368
fix(cache): keep streaming TTLs above poll cadence
starship-s Jul 15, 2026
38119fa
fix(#6056): extend sidebar title-field redaction to /api/sessions/sea…
Jul 15, 2026
0f0f733
Merge pull request #6103 from nesquena/stage/6056-delegtitles
nesquena-hermes Jul 15, 2026
2143563
fix: ensure approval/clarify popups have min-width on narrow screens …
webtecnica Jul 15, 2026
9ac68fe
fix: stream event timestamps layout on narrow foldable screens (#6099)
webtecnica Jul 15, 2026
b877c9a
Merge commit 'refs/pull/6102/head' of github.com:nesquena/hermes-webu…
Jul 15, 2026
a2d70b9
Release exp: hold streaming CLI-cache TTL above sidebar poll cadence …
Jul 15, 2026
a486c2f
Merge pull request #6110 from nesquena/stage/6102-cachettl
nesquena-hermes Jul 15, 2026
7419b1b
feat: add pinch-to-zoom support for Mermaid diagrams on touch devices
silent-reader-cn Jul 10, 2026
0403f00
fix: address Greptile review and fix CI test mock for touch handlers
silent-reader-cn Jul 11, 2026
9c0e098
Release exp: pinch-to-zoom for Mermaid diagrams on touch devices (#59…
Jul 15, 2026
a155a61
Merge pull request #6111 from nesquena/stage/5913-pinchzoom
nesquena-hermes Jul 15, 2026
89e4436
Merge commit 'refs/pull/6104/head' of github.com:nesquena/hermes-webu…
Jul 15, 2026
928646a
Merge commit 'refs/pull/6106/head' of github.com:nesquena/hermes-webu…
Jul 15, 2026
ee7ec5e
Release exp batch: narrow-screen CSS fixes β€” approval/clarify popup m…
Jul 16, 2026
7a862c9
Merge pull request #6115 from nesquena/stage/css2-batch
nesquena-hermes Jul 16, 2026
fca5056
fix: reparent mobile model picker to body so fixed positioning escape…
Jul 16, 2026
6e30fd2
docs: CHANGELOG for #6105 model-picker reparent
Jul 16, 2026
7091c4a
fix(#6105): close floating model picker before gesture-opening mobile…
Jul 16, 2026
7ed5851
fix(#6105): also close floating picker on breakpoint-crossing resize …
Jul 16, 2026
a69bc3a
fix(#6105): close the drawer-over-picker stacking class via z-index, …
Jul 16, 2026
1845e63
Merge pull request #6116 from nesquena/fix/6105-reparent
nesquena-hermes Jul 16, 2026
500fa48
Merge commit 'refs/pull/6013/head' of github.com:nesquena/hermes-webu…
Jul 16, 2026
d9f6a4e
Release exp: cache GET /api/providers per-profile with short TTL (#60…
Jul 16, 2026
6e60ae5
Merge pull request #6119 from nesquena/stage/6013
nesquena-hermes Jul 16, 2026
c39e8ed
fix(#6100): clear stale gateway approval attention badge (#6117) (#6125)
nesquena-hermes Jul 16, 2026
6ed474c
fix(models): route list-shaped custom provider models (#6127) (#6128)
nesquena-hermes Jul 16, 2026
be21deb
fix(models): preserve provider-aware duplicate selections
Jul 16, 2026
015171e
fix(models): cap _CLI_SESSIONS_CACHE with LRU eviction (drop-oldest)
rh-id Jul 16, 2026
bbda885
fix(stream): cap StreamChannel per-subscriber queues (drop-oldest on …
rh-id Jul 16, 2026
5df6b1f
fix: stop stale agent runtime after source updates
pxxD1998 Jul 15, 2026
5f1791e
fix: reject stale runtime before chat mutation
pxxD1998 Jul 15, 2026
f722f68
fix: scope stale runtime guard by execution owner
pxxD1998 Jul 16, 2026
66dceb1
fix: ignore untracked enclosing agent repositories
pxxD1998 Jul 16, 2026
0bab6a3
fix: handle remaining stale runtime entrypoints
pxxD1998 Jul 16, 2026
2415995
fix(runtime): ignore in-memory agent module swaps
pxxD1998 Jul 16, 2026
0cee7db
fix: stop closing SessionDB under live background subagents
carlotestor Jul 16, 2026
798bc5f
fix(compression): reject stale runtime before async job
pxxD1998 Jul 16, 2026
7d2ca8c
fix: address greptile review on SessionDB adopt helper
carlotestor Jul 16, 2026
aae2830
fix(compression): preserve running job reuse
pxxD1998 Jul 16, 2026
df0c204
docs(rfc): reconcile Live-to-Final assistant-reply contracts with shi…
nesquena-hermes Jul 16, 2026
aafa673
test(models): harden provider selection harness
Jul 16, 2026
6e3543d
merge master into provider-aware model selection
Jul 16, 2026
dec0419
fix(models): add defensive row backstop to display-path state.db mess…
rh-id Jul 16, 2026
dcdcfb9
fix(streaming): degrade self-heal SessionDB to None on failed rebuild
Jul 16, 2026
3bb4fc8
Merge remote-tracking branch 'origin/master' into pr6143-gate
Jul 16, 2026
fbe10fd
Merge pull request #6143 from carlotestor/fix/sessiondb-close-under-l…
nesquena-hermes Jul 16, 2026
3bc757d
merge master into provider-aware model selection
Jul 16, 2026
b537be3
test(core): accept new limit kwarg in get_state_db_session_messages stub
Jul 16, 2026
ecb6653
test(diagnostics): add subscriber_dropped_events to diagnostic_snapsh…
Jul 16, 2026
1101da4
Merge remote-tracking branch 'origin/master' into p6140
Jul 16, 2026
b38586d
Merge pull request #6140 from rh-id/fix/mem-cli-sessions-cache-cap
nesquena-hermes Jul 16, 2026
c5ff4f5
merge master into provider-aware model selection
Jul 16, 2026
11773af
docs(changelog): add #6143 (SessionDB subagent use-after-close) + #61…
nesquena-hermes Jul 16, 2026
f6d2264
merge master into provider-aware model selection
Jul 16, 2026
ea3cba3
Merge remote-tracking branch 'origin/master' into pr6092-gate
Jul 16, 2026
eac20f2
Merge pull request #6092 from pxxD1998/fix/webui-agent-runtime-update…
nesquena-hermes Jul 16, 2026
17834a6
merge master into provider-aware model selection
Jul 16, 2026
d57fa7b
fix(stream): retry (not break) on queue.Empty so terminal frames surv…
rh-id Jul 17, 2026
f445c3a
fix(routes): gate state.db row backstop on absence of truncation_boun…
rh-id Jul 17, 2026
a8143af
Merge remote-tracking branch 'origin/master' into p6137b
Jul 17, 2026
5832b1e
test(stream): drop unused MagicMock import (ruff F401)
Jul 17, 2026
13efcbe
Merge remote-tracking branch 'origin/master' into p6153b
Jul 17, 2026
196f6e2
Merge pull request #6137 from rh-id/fix/mem-streamchannel-queue
nesquena-hermes Jul 17, 2026
c8edc97
Merge remote-tracking branch 'origin/master' into p6153b
Jul 17, 2026
484f00a
merge master into provider-aware model selection
Jul 17, 2026
650810d
Merge pull request #6153 from rh-id/fix/mem-state-db-read-backstop
nesquena-hermes Jul 17, 2026
765b691
merge master into provider-aware model selection
Jul 17, 2026
92ebc10
Merge pull request #6134 from franksong2702/franksong2702/fix-6131-pr…
nesquena-hermes Jul 17, 2026
2e1867c
fix(#6108): keep session_search alive through transient state.db lock…
rodboev Jul 17, 2026
1bcf8f8
perf(sessions): cache reconciliation message keys
hermes-agent Jul 17, 2026
7330570
fix(#6108): bound SessionDB retries to transient sqlite contention
rodboev Jul 17, 2026
d6c2358
Merge pull request #6181 from rodboev/pr/6108-sessiondb-retry
nesquena-hermes Jul 17, 2026
a3d27eb
Merge remote-tracking branch 'origin/master' into pr6182-g
Jul 17, 2026
f6265cc
Merge pull request #6182 from starship-s/perf/session-switch-merge-ke…
nesquena-hermes Jul 17, 2026
6c863ae
fix: omit unsupported Codex handoff token cap
Gerkinfeltser Jul 17, 2026
04783d1
fix: normalize Codex handoff base URL
Gerkinfeltser Jul 17, 2026
920cdd5
Merge pull request #6191 from Gerkinfeltser/fix/codex-handoff-summary…
nesquena-hermes Jul 17, 2026
b741e17
fix(streaming): recover interrupted reasoning
Jul 17, 2026
59b6022
fix(streaming): harden recovered reasoning context ownership
Jul 17, 2026
3330bb4
fix(streaming): preserve recovered context shape
Jul 17, 2026
e0dee87
fix(streaming): keep recovered tool call anchors
Jul 17, 2026
5c34dd9
fix(streaming): skip reasoning rows for tool anchors
Jul 17, 2026
9504bce
Merge pull request #6186 from franksong2702/franksong2702/investigate…
nesquena-hermes Jul 17, 2026
509263e
perf: linearize session truncate alignment
hermes-agent Jul 17, 2026
939848d
test: cover unsafe alignment metadata
hermes-agent Jul 17, 2026
d8360bf
refactor: clarify alignment safety checks
hermes-agent Jul 17, 2026
0e28cc2
test: broaden truncation alignment coverage
hermes-agent Jul 17, 2026
64f98da
fix: preserve lazy alignment semantics
hermes-agent Jul 17, 2026
d65c0ba
Merge pull request #6193 from starship-s/fix/session-truncate-linear-…
nesquena-hermes Jul 17, 2026
b470793
Release: msg_limit ceiling + row-loss-safe pagination (#6152 + #6154,…
nesquena-hermes Jul 18, 2026
ebf64b8
docs: fold in Rod's PR-review feedback into GUIDELINES + CONTRIBUTING…
nesquena-hermes Jul 18, 2026
ab937ef
Release: msg_limit ceiling metadata decoupling (#6214, @webtecnica) (…
nesquena-hermes Jul 18, 2026
52c962c
Release: Transparent Stream multi-segment prefix dedupe (#6189, @ai-a…
nesquena-hermes Jul 18, 2026
fbdbca3
Live Stream: hydrate ID-linked historical tool turns
franksong2702 Jul 18, 2026
02aa91b
Release: stop false Compressing-context card (#6184, @carlotestor) (#…
nesquena-hermes Jul 18, 2026
486d203
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
735ba1c
Release: extension session-open handler + renderTranscript API (#5508…
nesquena-hermes Jul 18, 2026
198d8e1
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
45eff68
test: cover ordered multi-tool anchor hydration
Jul 18, 2026
92a7189
Release: durable run-journal recovery + full tool args (#6197, @frank…
nesquena-hermes Jul 18, 2026
4d1c83f
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
a4a2f49
Release: folder-download subpath baseURI fix (#6227, @steezypunk) (#6…
nesquena-hermes Jul 18, 2026
ff430fc
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
d195b09
Release: GLM per-version reasoning controls (#6219, @rh-id) (#6243)
nesquena-hermes Jul 18, 2026
5c4f38a
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
0a31a4a
Release: intercept /sessions and /resume slash commands (#6245, @webt…
nesquena-hermes Jul 18, 2026
a86d180
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
c428452
Release: OIDC allowlist whitespace fix (#6244, @webtecnica) (#6259)
nesquena-hermes Jul 18, 2026
1929cbd
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
c9deb98
Release: remove dead rowIndex param from settled-scene pushRow (#6258…
nesquena-hermes Jul 18, 2026
5047813
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
69ffaf3
Release: byte-size threshold for reconnect tail optimization (#6260, …
nesquena-hermes Jul 18, 2026
cf66ad6
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
76690c6
fix: deduplicate configured model badges (#6221)
happy5318 Jul 18, 2026
bbb5446
Release: deduplicate configured model badges (#6221, @happy5318) (#6268)
nesquena-hermes Jul 18, 2026
cd3fb5b
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
805db14
fix(renderer): render data:image URIs as images instead of raw base64…
ai-ag2026 Jul 18, 2026
be45c39
Release: render data:image URIs as images (#6209, @ai-ag2026) (#6270)
nesquena-hermes Jul 18, 2026
fd48f26
Fail closed on historical anchor hydration throws
Jul 18, 2026
9243b08
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
9451445
docs(changelog): stamp v0.52.76 stable section (promotion) (#6269)
nesquena-hermes Jul 18, 2026
44f470e
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
2ea0cc6
ci: docs-only fast-path + minimal docs CI (#6279)
nesquena-hermes Jul 18, 2026
3d38047
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 18, 2026
0ef23c9
fix(models): prevent bare-id picker revert when provider hint is empt…
webtecnica Jul 18, 2026
b324eb9
Release: prevent bare-id picker revert on empty provider hint (#6199,…
nesquena-hermes Jul 18, 2026
f4a9abb
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
c67fd2d
Release: Artifacts filename-first + session-own-streaming + reduced-m…
nesquena-hermes Jul 19, 2026
1ae6b79
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
6ad84d7
fix(wakeup): route async-delegation completions by origin + durable-c…
nesquena-hermes Jul 19, 2026
0ae40dc
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
704e19a
fix(#6240): fall back when test skills symlink is unavailable (#6276)
rodboev Jul 19, 2026
bf961ce
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
ce048b0
fix(wakeup): recover terminal process completions after restart (#6287)
allenliang2022 Jul 19, 2026
17c2f20
Release: bg-process restart recovery (#6287) + Windows test-fixture s…
nesquena-hermes Jul 19, 2026
8ff17ea
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
5771a51
fix(#6099): make transparent stream activity timestamps optional (#6130)
rodboev Jul 19, 2026
60017c7
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
31d4281
Release: optional Transparent Stream event timestamp chips (#6130, @r…
nesquena-hermes Jul 19, 2026
abdb0cb
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
deac138
Live Stream: add public conversation lifecycle browser gate (#6251)
franksong2702 Jul 19, 2026
7e0582b
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
4e768fe
Release: gateway approval_id fallback (#6168) + update-check guard (#…
nesquena-hermes Jul 19, 2026
2234277
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
10e5c52
Release: broadcast terminal output to every viewer (#5836, @ai-ag2026…
nesquena-hermes Jul 19, 2026
307b7fc
Release: terminal-error settlement timing/seal (#6323) + Docker exper…
nesquena-hermes Jul 19, 2026
7b0ef79
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 19, 2026
4d9965b
Release: content search no longer evicts the working-set cache (#6084…
nesquena-hermes Jul 20, 2026
80d40d6
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
98a67ee
Release: pip-installable packaging metadata (#6337, @rodboev) (#6344)
nesquena-hermes Jul 20, 2026
b1dcdd6
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
02b2b0a
Release: Live Stream stable Anchor run identity (#6201, @franksong270…
nesquena-hermes Jul 20, 2026
942e952
Release: fix Kanban column scrolling on mobile (#6306, @jpalazz2) (#6…
nesquena-hermes Jul 20, 2026
3fa08e4
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
dd554c1
Release: Live Stream Anchor side-effects projection (#6204, @frankson…
nesquena-hermes Jul 20, 2026
ed53013
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
be29c3f
Release: run-journal summary cache (#6291, @sjungwon03) (#6355)
nesquena-hermes Jul 20, 2026
a91f34a
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
c2b5a54
Harden historical anchor hydration edges
Jul 20, 2026
a61880b
Release: terminal-error lifecycle gate row (#6354, @franksong2702) (#…
nesquena-hermes Jul 20, 2026
2e9c2b1
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
4bdc22b
Release: gateway-default MoA send (#5869, @rodboev) (#6365)
nesquena-hermes Jul 20, 2026
39ef186
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
33d55ec
Release: raster-data-URI redaction fast-path (#6311, @inch772) (#6367)
nesquena-hermes Jul 20, 2026
d3374c5
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
c414c39
feat(extensions): token-v1 proxy→sidecar authentication boundary (#6331)
nesquena-hermes Jul 20, 2026
c9a9679
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
302843c
Release: compact completed image tool-results (#6315, @sjungwon03) (#…
nesquena-hermes Jul 20, 2026
7fa8f94
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 20, 2026
9dfe136
Preserve historical anchor final text
Jul 20, 2026
a725a0f
Release p1-batch: session cache cap 300β†’100 (#6362) + virtualization …
nesquena-hermes Jul 21, 2026
14180a9
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
0deef39
Release: consolidated Kanban board fills vertical space (#6308) (#6376)
nesquena-hermes Jul 21, 2026
fea77cc
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
48b40d9
Release: isolate Hermes home per streaming turn (#5877, @starship-s) …
nesquena-hermes Jul 21, 2026
8b6241d
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
6b9b9dc
Release: Kanban New-Task modal reachable on mobile (#6301, @jpalazz2)…
nesquena-hermes Jul 21, 2026
0ea013c
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
4f063d1
Release: Artifacts pane long-filename readability + long-parent conta…
nesquena-hermes Jul 21, 2026
c1ce5a8
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
c0d9d81
Release: add preference to hide new-chat welcome panel (#6183, @vaidu…
nesquena-hermes Jul 21, 2026
9e7106d
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
1dd5cc4
fix(tests): isolate model-selection env vars so the suite passes on a…
nesquena-hermes Jul 21, 2026
dbbd6c1
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
de96c1d
fix: harden terminal error worklog settlement
Jul 20, 2026
9bde2cf
fix: reject future terminal turn origins
Jul 21, 2026
5ff16c5
fix(streaming): catch OverflowError in _terminal_turn_duration so a h…
Jul 21, 2026
5f91f5d
Merge pull request #6312 from franksong2702/lifecycle-terminal-error-…
nesquena-hermes Jul 21, 2026
ae8fb0a
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
4fd314d
docs(changelog): stamp #6312 terminal-error Worklog settlement harden…
nesquena-hermes Jul 21, 2026
72d5c62
Merge remote-tracking branch 'origin/master' into paperclip/pr-6222
Jul 21, 2026
62ac52f
feat(i18n): refresh Japanese (ja) locale to parity with upstream master
koshikai Jul 21, 2026
005589b
fix(i18n): drop workspace_artifact_source_session from ja
koshikai Jul 21, 2026
bc05221
Merge pull request #6403 from koshikai/i18n/ja-locale-refresh
nesquena-hermes Jul 21, 2026
71fafbe
Merge remote-tracking branch 'origin/master' into gate-6222
Jul 21, 2026
a231317
Merge pull request #6222 from franksong2702/franksong2702/live-stream…
nesquena-hermes Jul 21, 2026
7a3646b
docs(changelog): stamp #6403 (ja locale) + #6222 (id-linked tool anch…
nesquena-hermes Jul 21, 2026
8586572
Release: #6389 stream-teardown leak fix (exp-v0.52.139) (#6416)
nesquena-hermes Jul 22, 2026
478f774
Release: #6107 per-model reasoning_efforts precedence (exp-v0.52.140)…
nesquena-hermes Jul 22, 2026
e9e9ed0
Release: #6148 alias-prefix model routing fix (exp-v0.52.141) (#6418)
nesquena-hermes Jul 22, 2026
3c618c1
fix(ipad): incremental batched session-list rendering on touch to pre…
CharlesMcquade Jul 22, 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
  •  
  •  
  •  
31 changes: 31 additions & 0 deletions .env.docker.example
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,37 @@ GID=1000
# the agent.
# HERMES_WEBUI_PASSWORD=change-me-to-something-strong

# ──────────────────────────────────────────────────────────────────────────
# Additional security / networking / limit knobs β€” advanced
# ──────────────────────────────────────────────────────────────────────────
# The WebUI process reads more HERMES_WEBUI_* variables than the compose
# files forward by default. To use any of these in Docker, uncomment it here
# AND add a matching passthrough line under `environment:` in your compose
# file (e.g. `- HERMES_WEBUI_SESSION_TTL=${HERMES_WEBUI_SESSION_TTL:-}`).
# Full descriptions live in .env.example.
#
# Auth cookie lifetime in seconds (default 2592000 = 30 days):
# HERMES_WEBUI_SESSION_TTL=2592000
#
# Force the Secure cookie flag when serving HTTPS via a reverse proxy:
# HERMES_WEBUI_SECURE=1
#
# Allowed public origins (scheme required) when behind a reverse proxy:
# HERMES_WEBUI_ALLOWED_ORIGINS=https://myapp.example.com
#
# Trust reverse-proxy forwarded headers (only enable behind a proxy YOU run):
# HERMES_WEBUI_TRUST_FORWARDED_HOST=1
# HERMES_WEBUI_TRUST_FORWARDED_FOR=1
# HERMES_WEBUI_TRUST_FORWARDED_PROTO=1
#
# Enable the passkey/WebAuthn login surface (default off):
# HERMES_WEBUI_PASSKEY=1
#
# Archive extraction cap (MB) and "download folder as ZIP" caps:
# HERMES_WEBUI_MAX_EXTRACTED_MB=2048
# HERMES_WEBUI_FOLDER_ZIP_MAX_MB=1024
# HERMES_WEBUI_FOLDER_ZIP_MAX_FILES=50000

# ──────────────────────────────────────────────────────────────────────────
# Permission handling for bind-mounted .hermes β€” advanced
# ──────────────────────────────────────────────────────────────────────────
Expand Down
117 changes: 117 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,120 @@

# Display name for the assistant in the UI (default: Hermes)
# HERMES_WEBUI_BOT_NAME=Hermes

# ── Security & remote access ─────────────────────────────────────────────────

# Password for the login page. REQUIRED if you bind to anything other than
# 127.0.0.1 β€” without it, anyone who can reach the port can run commands.
# HERMES_WEBUI_PASSWORD=change-me-to-something-strong

# Enable the passkey/WebAuthn login surface (default: off).
# Alternative: set `webui_passkey_enabled: true` in the profile's config.yaml.
# HERMES_WEBUI_PASSKEY=1

# Auth cookie lifetime in seconds (default: 2592000 = 30 days).
# Clamped to [60, 31536000]. Also settable as session_ttl_seconds in settings.json.
# HERMES_WEBUI_SESSION_TTL=2592000

# Force the Secure flag on auth cookies: 1/true or 0/false.
# Unset = auto-detect (direct TLS socket, or a trusted X-Forwarded-Proto).
# HERMES_WEBUI_SECURE=1

# Override the auth cookie name (default: derived internally).
# HERMES_WEBUI_COOKIE_NAME=hermes_webui_session

# Extra allowed origins for CSRF/origin checks when serving behind a reverse
# proxy or on a public hostname. Comma-separated; each entry MUST include the
# scheme. Entries without a scheme are ignored with a warning.
# HERMES_WEBUI_ALLOWED_ORIGINS=https://myapp.example.com:8000

# Serve HTTPS directly (both must be set; otherwise plain HTTP).
# HERMES_WEBUI_TLS_CERT=/path/to/fullchain.pem
# HERMES_WEBUI_TLS_KEY=/path/to/privkey.pem

# Extra sources appended to the Content-Security-Policy (space-separated).
# HERMES_WEBUI_CSP_CONNECT_EXTRA=https://api.example.com wss://api.example.com
# HERMES_WEBUI_CSP_FRAME_EXTRA=https://embed.example.com

# ── Reverse-proxy header trust (opt-in; only enable behind a proxy YOU run) ───
# By default these forwarded headers are NOT trusted, because any direct client
# could forge them. Enable (1/true/yes/on) only when a reverse proxy you control
# sets them. TRUST_FORWARDED_HOST: honor X-Forwarded-Host/X-Real-Host in origin
# checks. TRUST_FORWARDED_FOR: honor X-Forwarded-For for the client IP.
# TRUST_FORWARDED_PROTO: honor X-Forwarded-Proto for HTTPS detection.
# HERMES_WEBUI_TRUST_FORWARDED_HOST=1
# HERMES_WEBUI_TRUST_FORWARDED_FOR=1
# HERMES_WEBUI_TRUST_FORWARDED_PROTO=1

# ── Trusted-header auth / reverse-proxy SSO (opt-in; OFF by default) ──────────
# Delegate authentication to a reverse proxy you run (Authelia, oauth2-proxy,
# corporate SSO, …) that authenticates the user and forwards their identity in a
# header. When HERMES_WEBUI_TRUSTED_AUTH_HEADER is set, the WebUI treats a request
# as that identity β€” but ONLY when the request's un-spoofable raw socket peer is
# an allowlisted proxy (HERMES_WEBUI_TRUSTED_PROXY_CIDRS below). With no header
# set, this path is disabled and normal password/passkey auth applies.
#
# ⚠️ SECURITY: HERMES_WEBUI_TRUSTED_PROXY_CIDRS MUST list the EXACT IP(s) of your
# proxy β€” e.g. 10.0.0.5/32 or 127.0.0.1/32. NEVER use 0.0.0.0/0 or a broad range:
# any client whose peer IP falls in the range could forge the identity header and
# log in as anyone. If the allowlist is empty/malformed, the header is ignored
# (fails closed). Loopback is trusted by default. Set the CIDR to your proxy only.
# HERMES_WEBUI_TRUSTED_AUTH_HEADER=Remote-User
# HERMES_WEBUI_TRUSTED_PROXY_CIDRS=10.0.0.5/32
# Optional: map a forwarded groups header to WebUI profiles (JSON object), and a
# logout URL to redirect to after clearing the local session (SSO single-logout).
# HERMES_WEBUI_TRUSTED_GROUPS_HEADER=Remote-Groups
# HERMES_WEBUI_GROUP_PROFILE_MAP={"admins":"default","team-a":"projecta"}
# HERMES_WEBUI_TRUSTED_AUTH_LOGOUT_URL=https://sso.example.com/logout

# ── Uploads & limits ─────────────────────────────────────────────────────────

# Where chat attachments are stored (default: <state dir>/attachments).
# Attachments are transient agent context, kept out of the workspace by default.
# HERMES_WEBUI_ATTACHMENT_DIR=~/.hermes/webui/attachments

# Cap on total bytes an uploaded archive may expand to (zip-bomb guard).
# Default derives from the upload size limit; override in MB.
# HERMES_WEBUI_MAX_EXTRACTED_MB=2048

# Caps for the "download folder as ZIP" feature in the workspace browser.
# HERMES_WEBUI_FOLDER_ZIP_MAX_MB=1024
# HERMES_WEBUI_FOLDER_ZIP_MAX_FILES=50000

# Requests slower than this many seconds get a stack-dump diagnostic in the log
# (default: 5.0; set 0 to log every request's timing).
# HERMES_WEBUI_SLOW_REQUEST_SECONDS=5.0

# ── Onboarding ───────────────────────────────────────────────────────────────

# Skip the first-run onboarding wizard entirely.
# HERMES_WEBUI_SKIP_ONBOARDING=1

# ── Advanced integrations ────────────────────────────────────────────────────

# Script whose stdout prefills new-session context (legacy generic hook; the
# WebUI dynamic-recall hook in config.yaml takes precedence when configured).
# HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT=/path/to/script
# HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT_TIMEOUT=5
# HERMES_WEBUI_PREFILL_CONTEXT_MAX_CHARS=12000

# Extra sources for the notes drawer (see docs for the expected format).
# HERMES_WEBUI_EXTERNAL_NOTES_SOURCES=

# Directory scanned for WebUI plugins (default: ~/.hermes/plugins).
# HERMES_WEBUI_PLUGINS_DIR=~/.hermes/plugins

# API key used when polling the Hermes gateway health endpoint.
# HERMES_WEBUI_GATEWAY_API_KEY=

# Override the Claude Code projects directory scanned by the CLI session
# bridge (default: auto-discovered ~/.claude/projects).
# HERMES_WEBUI_CLAUDE_PROJECTS_DIR=~/.claude/projects

# Override the Codex CLI home scanned by the CLI session bridge and model
# catalog merge (default: ~/.codex).
# CODEX_HOME=~/.codex

# Path to the LLM wiki root shown in the wiki panel (default: resolved from
# HERMES_HOME's wiki env file).
# WIKI_PATH=/path/to/wiki
80 changes: 80 additions & 0 deletions .github/workflows/browser-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ name: Browser smoke
#
# No secrets, no credentials: the server boots agent-free and the smoke script
# strips every *_API_KEY from the environment before launch.
#
# Docs-only fast path: `browser-smoke` is a REQUIRED status check in the master
# ruleset, and a skipped required check reports as pending forever (auto-merge
# would hang). So on a docs/CHANGELOG/README-only change we keep the job running
# and reporting green but short-circuit the expensive browser install + smoke.
# Detection FAILS SAFE: any uncertainty or any non-doc path -> full smoke runs.

on:
pull_request:
Expand All @@ -16,13 +22,85 @@ on:
branches: [master]

jobs:
changes:
runs-on: ubuntu-latest
outputs:
docs_only: ${{ steps.detect.outputs.docs_only }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Detect docs-only change set
id: detect
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
# Fail-safe: ALWAYS exits 0 and ALWAYS emits docs_only (default 'false' =
# run full smoke), so a detection hiccup can never wedge the required
# browser-smoke context into perpetual pending.
docs_only="false"
emit() { echo "docs_only=$docs_only" >> "$GITHUB_OUTPUT"; }
trap emit EXIT
set -uo pipefail
# STRICT ALLOWLIST β€” docs iff doc extension (*.md/.markdown/.rst) or an
# extensionless doc basename. NOT docs: *.txt (requirements.txt!), anything
# under docs/ that isn't a doc extension, and code files merely NAMED
# README/CHANGELOG. See tests.yml for the full rationale.
is_docs() {
f="$1"; low="$(printf '%s' "$f" | tr '[:upper:]' '[:lower:]')"; base="${f##*/}"
case "$low" in
*.md|*.markdown|*.rst) return 0 ;;
esac
case "$base" in
LICENSE|README|CHANGELOG|NOTICE|AUTHORS|CONTRIBUTING) return 0 ;;
esac
return 1
}
if [ -n "${BASE_SHA:-}" ] && [ -n "${HEAD_SHA:-}" ]; then
git fetch --no-tags --depth=1 origin "$BASE_SHA" 2>/dev/null || git fetch --no-tags origin master || true
RANGE="$BASE_SHA...$HEAD_SHA"
else
RANGE="${{ github.event.before }}...${{ github.sha }}"
fi
# --no-renames so a rename reveals BOTH sides (a renamed-away code file is visible).
if ! FILES="$(git diff --name-only --no-renames "$RANGE" 2>/dev/null)"; then
echo "Could not diff $RANGE β€” running full smoke (fail-safe)."; exit 0
fi
if [ -z "$FILES" ]; then
echo "Empty diff β€” running full smoke (fail-safe)."; exit 0
fi
echo "Changed files:"; echo "$FILES"
result="true"
while IFS= read -r f; do
[ -z "$f" ] && continue
if ! is_docs "$f"; then
echo "Non-docs path -> full smoke required: $f"
result="false"
break
fi
done <<< "$FILES"
docs_only="$result"
echo "docs_only=$docs_only"

browser-smoke:
needs: changes
# Belt-and-suspenders (see tests.yml): run even if `changes` errored/was skipped
# so this required context can never wedge; step guards degrade to full smoke.
if: ${{ always() }}
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Docs-only short-circuit
if: needs.changes.outputs.docs_only == 'true'
run: echo "Docs-only change set β€” skipping browser smoke (no page-executable change)."

- uses: actions/checkout@v4
if: needs.changes.outputs.docs_only != 'true'

- name: Set up Python
if: needs.changes.outputs.docs_only != 'true'
uses: actions/setup-python@v5
with:
python-version: '3.12'
Expand All @@ -32,11 +110,13 @@ jobs:
**/pyproject.toml

- name: Install dependencies
if: needs.changes.outputs.docs_only != 'true'
run: |
python -m pip install --upgrade pip
pip install "pyyaml>=6.0" playwright
# Install only the Chromium browser + its system deps.
python -m playwright install --with-deps chromium

- name: Run browser smoke
if: needs.changes.outputs.docs_only != 'true'
run: python tests/browser_smoke.py
69 changes: 69 additions & 0 deletions .github/workflows/conversation-lifecycle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Conversation lifecycle (informational)

# Scoped to the code this browser gate actually exercises β€” the chat
# render/streaming surface β€” so it doesn't spin up playwright+chromium on
# docs-only or unrelated changes. If none of these paths change, the run is
# skipped entirely (GitHub treats a path-filtered no-match as "not triggered").
on:
pull_request:
branches: [master]
paths:
- 'static/**'
- 'api/**.py'
- 'server.py'
- 'tests/browser_conversation_lifecycle.py'
- 'requirements*.txt'
- 'pyproject.toml'
- '.github/workflows/conversation-lifecycle.yml'
push:
branches: [master]
paths:
- 'static/**'
- 'api/**.py'
- 'server.py'
- 'tests/browser_conversation_lifecycle.py'
- 'requirements*.txt'
- 'pyproject.toml'
- '.github/workflows/conversation-lifecycle.yml'

jobs:
live-to-final:
runs-on: ubuntu-latest
timeout-minutes: 10
continue-on-error: true
strategy:
fail-fast: false
matrix:
scenario: [normal, terminal-error]
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
cache-dependency-path: |
**/requirements*.txt
**/pyproject.toml
.github/workflows/conversation-lifecycle.yml

- name: Install browser gate dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt playwright
python -m playwright install --with-deps chromium

- name: Run conversation lifecycle gate
env:
LIFECYCLE_ARTIFACT_DIR: lifecycle-artifacts
LIFECYCLE_SCENARIO: ${{ matrix.scenario }}
run: python tests/browser_conversation_lifecycle.py

- name: Upload failure artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: conversation-lifecycle-failure-${{ matrix.scenario }}
path: lifecycle-artifacts
if-no-files-found: ignore
Loading
Loading