Commit Graph
100 Commits
Author SHA1 Message Date
nesquena-hermes b337609b38 Release exp-v0.52.170: resolve @provider:model through shared parser at gateway boundary (#6723) 2026-08-07 23:09:55 +00:00
nesquena-hermes 434c61a376 lint: drop unused pytest import in test_custom_provider_dict_models (F401) 2026-08-07 22:41:05 +00:00
nesquena-hermes 207ce37eed Release exp-v0.52.169: expand dict-shaped custom-provider models in Providers card (#6774) 2026-08-07 22:36:48 +00:00
nesquena-hermes 19b85e84a1 Release exp-v0.52.168: classify Matrix gateway sessions as messaging (#6816) 2026-08-07 21:55:07 +00:00
nesquena-hermes afc3066ec0 Release exp-v0.52.167: close leaked state.db read-only connections (#6823) 2026-08-07 21:34:53 +00:00
nesquena-hermes d018233e84 lint: remove unused pathlib import in #6498 test (ruff F401) 2026-08-06 02:41:27 +00:00
nesquena-hermes e6e9dde276 changelog: #6498 gate memory/user-profile reads via nested config (re-gate) 2026-08-06 02:26:59 +00:00
nesquena-hermes 2c9e621b3d Merge PR #6498: gate memory/user-profile reads via nested config (re-gate) 2026-08-06 02:26:24 +00:00
nesquena-hermes 2673fd24e2 changelog: #6486 render final report alongside tool-limit card 2026-08-06 01:06:13 +00:00
nesquena-hermes 874d62bc3a Merge PR #6486: show final assistant report with tool-limit status card 2026-08-06 01:05:50 +00:00
nesquena-hermes 84ace41206 changelog: #6670 don't duplicate active turn user row on mid-run reload 2026-08-06 00:27:33 +00:00
nesquena-hermes 8ecf391340 Merge PR #6670: don't duplicate active turn's user row on mid-run reload 2026-08-06 00:26:35 +00:00
nesquena-hermes 408d77a073 changelog: #6688 Force-recovery dirty stable no-ref checkout 2026-08-05 23:21:20 +00:00
nesquena-hermes 4c042dbfdf Merge PR #6688: clean dirty stable no-ref checkouts on Force recovery 2026-08-05 23:20:27 +00:00
nesquena-hermes 23d66d45ce changelog: #6663 OIDC allow_values whitespace warning 2026-08-05 22:54:04 +00:00
nesquena-hermes a260746d04 Merge PR #6663: warn on ambiguous legacy OIDC allow_values scalars 2026-08-05 22:53:47 +00:00
nesquena-hermes 5312f30899 changelog: batch-3 exp — #6706 HTML inline preview no-store 2026-08-05 22:22:55 +00:00
nesquena-hermes 8fc9a7e2de Merge PR #6706: HTML inline preview no-store (fix stale preview) 2026-08-05 22:22:23 +00:00
nesquena-hermes a3504778e9 changelog: batch-2 exp — #6690 CLI sessions on named profiles, #6763 Windows backslash artifact paths 2026-08-05 21:39:46 +00:00
nesquena-hermes 791ca4d883 chore: drop contributor's personal .firstmate/ gitignore entry from #6690 (out-of-scope personal tool) 2026-08-05 21:39:22 +00:00
nesquena-hermes bbe5283e99 Merge PR #6690: fix CLI sessions unreadable on named profiles 2026-08-05 21:39:06 +00:00
nesquena-hermes 0e122174be Merge PR #6763: fix(workspace) open artifacts with Windows backslash paths 2026-08-05 21:39:05 +00:00
nesquena-hermes 03b11d1f8b changelog: batch exp release — #6458 docker editable install, #6614 autoScrollFollow guard 2026-08-05 21:26:17 +00:00
nesquena-hermes c7b5a2cba5 Merge PR #6614: guard _autoScrollFollow ReferenceError before settings init 2026-08-05 21:14:57 +00:00
nesquena-hermes 372aa44694 Merge PR #6458: fix(docker) editable install for hermes-agent 2026-08-05 21:14:55 +00:00
nesquena-hermes 32581913ba test: correct staged-source lifecycle wording 2026-07-31 19:42:07 +00:00
nesquena-hermes dbe58ffff5 changelog: preserve live Worklog through final settlement — no blank frame (#6473) 2026-07-30 18:06:22 +00:00
nesquena-hermes f989c4828d changelog: reconnect transcript ordering — pending user above live worklog (#6419, #6457) 2026-07-29 22:51:18 +00:00
nesquena-hermes 86d3e6a571 changelog: hard-refresh session restore + PWA launch-action consume (#6507) 2026-07-29 22:22:05 +00:00
nesquena-hermes 3c53afeb12 chore: drop stray .claude pr-sweep proof artifact (not for repo) 2026-07-29 20:54:51 +00:00
nesquena-hermes 16dfeeb3f0 docs(changelog): stamp v0.52.106 stable section (promotion) 2026-07-29 20:50:41 +00:00
nesquena-hermes bff58ffb31 Revert "Merge pull request #6599 from nesquena/changelog/stamp-v0.52.113"
This reverts commit edb69763a7, reversing
changes made to b8f615e4bd.
2026-07-29 20:40:42 +00:00
nesquena-hermes 15e290dff0 docs(changelog): stamp v0.52.113 stable section (promotion) 2026-07-29 20:06:57 +00:00
nesquena-hermes 4e1a217670 changelog: reject trivial-echo session titles (#6529) 2026-07-26 20:23:01 +00:00
nesquena-hermesandHermes Agent b145f59312 fix(titles): reject trivial-echo new session titles (gate-rebase of #6529)
Co-authored-by: Hermes Agent <hermes@nousresearch.com>
2026-07-26 20:22:25 +00:00
nesquena-hermes 10223e3145 changelog: SSE apperror relay-close fix (#6527) 2026-07-26 20:15:14 +00:00
nesquena-hermes c6e9ad79d2 test: update legacy SSE-break regression test for SSE_RELAY_CLOSE_EVENTS (#6527 maintainer fold-in)
The R5b static-pattern test pinned the old inline ('stream_end','error','cancel')
tuple; #6527 replaced it with the named SSE_RELAY_CLOSE_EVENTS frozenset. Accept
either shape and assert behavior (cancel+apperror in the resolved close set)
rather than source syntax. Intent-preserving; non-vacuous (fails on master:
SSE_RELAY_CLOSE_EVENTS absent + apperror not in old tuple).
2026-07-26 19:58:43 +00:00
nesquena-hermesandHermes Agent c49568101c fix(sse): close relays on apperror terminal events (gate-rebase of #6527)
Co-authored-by: Hermes Agent <hermes@nousresearch.com>
2026-07-26 19:45:38 +00:00
nesquena-hermesandperejaslav d56123f796 feat: add max reasoning effort level (salvage of #4627)
Salvaged from #4627 by @perejaslav. Core Hermes already supports
reasoning_effort=max; this closes the WebUI parity gap (Anchor-A) — adds
max to VALID_REASONING_EFFORTS + dropdown/chip/reasoning-command, keeps
the degrade ladder for capped models.

Co-authored-by: perejaslav <perejaslav@users.noreply.github.com>
2026-07-11 01:13:36 +00:00
nesquena-hermesandigorroncevic 89408b7b2d test: skip fail-closed pricing test on openrouter-group pollution
The pricing3-null case failed on one CI shard with StopIteration: pytest-shard's
partitioning interleaves this test with modules that mutate config.cfg away from
the openrouter active provider, so get_available_models() omits the openrouter
group and next(...) raised. Make the group lookup resilient (next(..., None) +
pytest.skip) — the exact defensive guard the sibling live-fetch tests in this
file already use for the same pollution. Passes both with and without hermes_cli.

Co-authored-by: igorroncevic <igorroncevic@users.noreply.github.com>
2026-07-10 16:54:26 +00:00
nesquena-hermesandstarship-s 07b3f411d7 fix: preserve same-session load ownership on redundant reload + guard hint cleanup
Gate review (Codex) reproduced two SILENT regressions in the generation-token
ownership change, both validated against PR head + merge base:

1. sessions.js:1428 — the no-op early-return did NOT fire for a redundant
   same-session load (currentSid===sid, !_loadingSessionId was false because a
   keep-stale refresh was in flight). The redundant loadSession() then bumped
   _loadSessionGeneration and CANCELLED the authoritative in-flight refresh —
   stale rows remained while message_count advanced, so later polling could not
   detect them. Restore the pre-existing behavior: also return when the in-flight
   load is for the SAME sid (!_loadingSessionId || _loadingSessionId===sid).

2. sessions.js:2781 — _ensureMessagesLoaded's finally cleared the
   transcript-width reload hint unconditionally, so a stale same-session response
   collapsed a long session to the default tail window. Guard the cleanup with
   _ownsLoad() so only the owning load clears the hint.

Both fixes retain the PR's cross-session, same-session-rejection, and INFLIGHT
race behavior (47 tests pass incl. the new isolation suite + the 4 edited files).

Co-authored-by: starship-s <starship-s@users.noreply.github.com>
2026-07-10 16:52:37 +00:00
nesquena-hermesandigorroncevic 2dc6530f2b test: guard optional hermes_cli import in fail-closed pricing test
The new test_openrouter_free_tier_pricing_fails_closed did an unguarded
'from hermes_cli import models', but hermes_cli (the agent package) is an
optional dependency not installed in the WebUI CI test environment, so the
test failed with ModuleNotFoundError on 4-5 shards (master green, PR head red).

Wrap the import in the same try/except guard the sibling tests in this file
already use — when hermes_cli is present we force its live-fetch to empty so
the fail-closed static path is exercised; when absent, that static path is
already the only one and the api/config.py fix under test still runs via the
mocked urlopen. Verified: 10/10 with hermes_cli, 5/5 with it blocked.

Co-authored-by: igorroncevic <igorroncevic@users.noreply.github.com>
2026-07-10 16:49:18 +00:00
nesquena-hermes 898f46dd3d docs(changelog): #5789 gateway SSE terminal idle-timeout 2026-07-09 08:04:03 +00:00
nesquena-hermesandai-ag2026 dfd9b57183 fix(gateway): keep 600s read-timeout default (gate finding — 120s would kill legit long silent tool calls)
Co-authored-by: ai-ag2026 <ai-ag2026@users.noreply.github.com>
2026-07-09 08:03:02 +00:00
nesquena-hermes 087d469ee8 docs(changelog): #5557 centralize static-asset resolution 2026-07-09 06:29:01 +00:00
nesquena-hermes 1c70f7b987 docs(changelog): #5803 session-load perf 2026-07-09 06:06:43 +00:00
nesquena-hermes e34afa58b8 docs(changelog): #5800 streaming lock-free contract doc 2026-07-09 05:50:54 +00:00
nesquena-hermes 264e733fce docs(changelog): #5768 localize background-wakeup label 2026-07-09 04:36:32 +00:00
nesquena-hermes 9b1fb1f3dc docs(changelog): #5798 single-flight health probe 2026-07-09 03:54:39 +00:00
nesquena-hermes cbf949f6a8 docs(changelog): #5799 run-journal next-seq cache 2026-07-09 03:49:40 +00:00
nesquena-hermes dadd6f117c docs(changelog): #5801 login retry clearInterval 2026-07-09 03:42:12 +00:00
nesquena-hermes 8c96d42be3 docs(changelog): #5766 background wakeup status rows 2026-07-09 03:22:27 +00:00
nesquena-hermes dd3ffda0b6 docs(changelog): #5762 service-tier from agent metadata 2026-07-09 03:17:25 +00:00
nesquena-hermes 1d3cf5028b docs(changelog): #5773 single reasoning renderer path 2026-07-09 03:13:03 +00:00
nesquena-hermes 7b6a23f902 docs(changelog): #5770 code-block containment 2026-07-09 03:08:48 +00:00
nesquena-hermes db7b146de9 docs(changelog): #5721 workspace switcher a11y 2026-07-09 02:41:05 +00:00
nesquena-hermes e0a23ba0f5 docs(changelog): #5729 sidebar child-stream bucket 2026-07-09 02:36:20 +00:00
nesquena-hermes 6c8944450c docs(changelog): #5786 terminal EventSource error recovery 2026-07-09 02:26:49 +00:00
nesquena-hermes 5f2ec9e1f0 docs(changelog): #5761 OpenCode Go catalog refresh 2026-07-09 01:23:33 +00:00
nesquena-hermes a1aca345e1 docs(changelog): #5782 drain-loop backoff 2026-07-09 01:18:50 +00:00
nesquena-hermes 80276850a6 docs(changelog): #5785 passkey-login Content-Length 2026-07-09 01:05:56 +00:00
nesquena-hermes 2c46e9e251 docs(changelog): #5787 metering session begin/end pairing 2026-07-09 00:51:59 +00:00
nesquena-hermes d4120b47b5 test(updates): update timeout-guard assertions for the channel-threaded apply/force bodies 2026-07-08 22:52:53 +00:00
nesquena-hermes 236a2c8032 fix(updates): thread offered channel through apply/force to close the debounce race
Codex gate CORE: /api/updates/apply + /force ignored the request-body channel
and re-read the saved setting, so a channel switch whose debounced autosave
hadn't landed could apply the OLD channel. The banner now sends the channel the
CHECK reported for each target; the endpoints validate it against the enum and
thread it into apply_update/apply_force_update (None → saved-setting fallback,
preserving prior behavior). Agent stays channel-neutral server-side.
2026-07-08 22:42:54 +00:00
nesquena-hermes 37adf8b7ce docs(changelog): #5784 evict run-journal writer-lock cache on delete 2026-07-08 21:14:04 +00:00
nesquena-hermes 81a77efc91 docs(changelog): #5783 serialize daemon-thread start under lifecycle lock 2026-07-08 20:58:54 +00:00
nesquena-hermes 4f9d63218b docs(changelog): #5781 sweep completion-dedup map by delivery lifecycle 2026-07-08 20:42:35 +00:00
nesquena-hermes 3a8de74758 docs(changelog): #5780 open state.db read-only for lineage reads + watcher 2026-07-08 20:18:25 +00:00
nesquena-hermes c95c1f492d docs(changelog): #5772 scope MCP list reads to active profile 2026-07-08 16:19:34 +00:00
nesquena-hermes e4eb330da5 docs(changelog): #5751 non-virtualized transcript scroll jump-back 2026-07-07 21:17:41 +00:00
nesquena-hermes b40bc50d67 docs(changelog): #5742 desktop stale-snapshot scroll compensation 2026-07-07 20:13:23 +00:00
nesquena-hermes 5915f9b5b5 docs(changelog): #5463 mirror WebUI usage counters to state.db 2026-07-07 20:05:18 +00:00
nesquena-hermes cf769dc823 docs(changelog): #5723 clear dead steer busy state 2026-07-07 16:42:08 +00:00
nesquena-hermesandrodboev 2717ea0ac5 feat(chat): add final answer only activity display mode (#5706, picker grid fixed)
Clean rebase of rodboev's #5746 (rebase-first).

Co-authored-by: rodboev <rodboev@users.noreply.github.com>
2026-07-07 14:38:08 +00:00
nesquena-hermes b65158c0ce docs(changelog): #5701 iPad keyboard composer inset 2026-07-07 05:16:34 +00:00
nesquena-hermes 1a2dcc7231 docs(changelog): #5737 drop empty tool_calls before API send 2026-07-07 04:52:55 +00:00
nesquena-hermes f36dad7b23 test(tls): drain full stdout for the TLS-fallback assertion (flake fix)
test_tls_startup_failure_fallback_to_http read only the first 2000 bytes of
server stdout to assert 'TLS setup failed'. When the test interpreter lacks
optional deps (requests/websockets), startup emits a burst of plugin/tool
import warnings + the startup-config banner BEFORE the TLS line, pushing the
marker past the 2000-byte window -> spurious failure. Drain all
currently-available stdout (5s deadline, short-circuit on the marker) instead
of a single fixed-size read. Verified failing->passing in a fresh venv without
the optional deps. Test-only; distinct from the agent-package-isolation flake
cause already fixed in the same test.
2026-07-07 04:09:15 +00:00
nesquena-hermes 4fb7b03200 docs(changelog): #5567 model-picker provider resolution fix 2026-07-07 03:52:04 +00:00
nesquena-hermesandb3nw 8d496ceaef fix(#5567): resolve model provider by matching value, not the selected option
Frontend fix for the model-picker provider-contamination vector of #5567 (the
backend HERMES_HOME vector shipped in #5577). Credit @b3nw for the root-cause trace.

_modelStateForSelect(sel, modelId) resolved the provider from sel.selectedOptions[0]
(the dropdown's CURRENTLY-selected option) instead of the option whose value matches
modelId. During a profile/tab switch or a model-list rebuild the dropdown transiently
still holds the PREVIOUS profile's default option (e.g. an ollama model), so the wrong
provider was stamped onto a model it doesn't own, persisted into the session's
model_provider, and (since _modelProviderForSend reads the stored value first) re-sent
on every turn -> 'Provider ollama...no API key' for a provider the session never used.

Fix: resolve the provider from the option whose VALUE === modelId; trust the
currently-selected option only when its value matches (preserving the user's exact
pick in the same-value/different-provider collision case). A genuinely-absent model
yields a null provider so the backend re-infers.

This is the WRITE-site fix — it stops all NEW contamination (new-session + send paths
route through _modelStateForSelect). Both Codex and Fable reviewed it SAFE.

Repairing sessions ALREADY poisoned before this shipped is deliberately deferred to a
separate follow-up: a 3-round Codex+Fable gate proved a frontend load-time repair that
reads the shared #modelSelect DOM is a cross-session race surface (it re-manufactured
the reverse-contamination it aimed to fix), and it can't reliably heal live-only-model
sessions anyway. The robust place for that repair is the backend chat-start boundary,
where session + profile identity is unambiguous. Already-poisoned sessions self-heal on
their next healthy send / manual re-pick in the meantime.

Tests: node-behavioral resolver scenarios (tab-switch race, same-value collision,
missing-model null, match-by-value, default->null) + the unrelated-selected-option
case from #5727. Partially addresses #5567 (write-vector); follow-up tracks the
already-poisoned-session repair.

Co-authored-by: b3nw <b3nw@users.noreply.github.com>
2026-07-07 03:42:16 +00:00
nesquena-hermes eb02c8ecd0 docs(changelog): Windows git subprocess console-window fix (#5692) 2026-07-07 02:19:40 +00:00
nesquena-hermes 6c7746aef6 docs(changelog): iteration-limit graceful summary (#5717, #5494) 2026-07-07 01:44:48 +00:00
nesquena-hermes 16c3b4d91e docs(changelog): add Czech locale entry (#5546) 2026-07-06 21:37:22 +00:00
nesquena-hermes e7fa04ef24 merge master into review-5655 (base refresh for up-to-date branch protection) 2026-07-06 03:05:41 +00:00
nesquena-hermesandFrank Song f501898791 release: show compression-recovery card from session state on rebuilt sessions (#5655)
Follow-up to #5538: the recovery card now also renders from _activeCompressionRecoveryPayload() on the final assistant message when a rebuilt/legacy session lacks the per-message _compressionRecovery marker (guarded to last/turn-final assistant only; no double-render; cleared recovery still hidden). Gate: Codex SAFE, Fable SHIP-UX, suite 12179/0, browser clean.

Co-authored-by: Frank Song <franksong2702@gmail.com>
2026-07-06 02:56:55 +00:00
nesquena-hermes 8929977b5b review: merge #5655 (77f54eeb) 2026-07-06 02:46:52 +00:00
nesquena-hermesandRod Boev 7d3057c7c9 release: reload config cache on profile switch (#5645, #5619)
Root fix for the #5619 profile-switch config-cache bug: split the reload gate so a profile-PATH change forces reload unconditionally (was wrongly suppressed by in-memory overrides → stale default-profile config/models/keys), while a file-mtime change still respects overrides. Folded in a test-isolation fix (Codex): the stage302 regression test leaked _cfg_cache/_cfg_mtime/_cfg_path/_cfg_fingerprint/cfg globals (deepcopy snapshot + clear/update restore, since reload_config mutates _cfg_cache in place). Full gate: Codex SAFE (2 rounds), suite 12178/0, 121 profile/provider tests.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-06 02:33:45 +00:00
nesquena-hermes f7fe895c63 review: merge #5645 (00a69521) 2026-07-06 02:09:22 +00:00
nesquena-hermesandRod Boev c601e11324 release: fork read-only cron sessions into a new writable chat (#5555)
Relaxes the /api/session/branch read-only gate so a canonical-cron session can be forked into a new WebUI-owned session (source never saved). Gate hardening folded in: the read-only branch gate now covers BOTH the synthesized/missing-sidecar path AND the persisted/loaded path (Codex found a stored read-only non-cron session could be branched + saved); relaxation keys on the server-authoritative resolved source (source_tag/raw_source/source == 'cron'), never the id prefix. Full gate: Codex adversarial SAFE, 84 branch/claim tests + suite 12175/0, browser clean.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-06 02:02:52 +00:00
nesquena-hermes f10cb2a35c review: merge #5555 (11eed2af) 2026-07-06 01:44:21 +00:00
nesquena-hermesandRod Boev 936c5b051b release: redesign cron preset schedule builder — sentence UI with time picker + day dropdowns (#5554)
Reworks the #5552 preset builder per maintainer UX feedback + Fable design advisory: one natural 'Schedule: [preset] on [day] at [time]' row; native time picker (themed) replacing hour/minute number boxes; day-of-week + day-of-month dropdowns; raw cron field shown only on Custom; live cron preview; Custom last; new jobs default to Daily 09:00; keystroke-clamp + mid-typing-hide bugs fixed. New i18n keys across all 14 locales. Full gate: Codex SAFE, Fable SHIP-UX, suite 12160/0, browser clean.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-06 01:35:55 +00:00
nesquena-hermes 13ecbd79fb review: merge #5554 (2e27ff64) 2026-07-06 00:38:30 +00:00
nesquena-hermesandRod Boev 02e18d4d69 release: restore prose-level fade for Transparent Stream (#5506)
Re-adds the per-word prose fade for newly-streamed assistant text in Transparent Stream WITHOUT reintroducing the row-level entrance flicker (#5367). Reduced-motion honored at both JS and CSS layers; thinking/tool rows not animated. Option A: the fade is part of Transparent Stream regardless of the off-by-default 'Fade text effect' toggle; settings description clarified accordingly. Gate: Codex SAFE, Fable SHIP-UX, suite 12158/0, browser-smoke clean.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-06 00:26:45 +00:00
nesquena-hermes e6b2ac9119 review: merge #5506 (0c1bdce0) 2026-07-06 00:16:29 +00:00
nesquena-hermesandRod Boev c2e9277c46 release: reuse the rich model picker in Preferences (#5502)
Generalizes renderModelDropdown() to serve both the composer and Preferences pickers (backward-compatible defaults keep the composer identical). Folded in Fable UX fixes: label->chip association, downward shadow for the down-opening settings picker, and mobile keyboard-pop suppression across all 3 render paths (open/internal-filter/refresh) with focus preserved while typing. Full gate (4 rounds): Codex SAFE, Fable SHIP-UX, suite 12153/0, browser clean; composer picker verified unchanged.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-05 23:22:31 +00:00
nesquena-hermes d5dae70c43 review: merge #5502 (087c694c) 2026-07-05 22:35:58 +00:00
nesquena-hermesandRod Boev eef981d3dc release: copyable workspace relative paths (#5548)
Adds 'Copy relative path' to the workspace file-tree context menu + preview header. Folded in gate fixes: preview-header button folds to icon-only on a narrow pane via @container rightpanel (not viewport @media), with data-i18n-title/aria-label so the tooltip+accessible name localize. Full gate: Codex SAFE, Fable SHIP-UX, suite 12147/0, browser clean.

Co-authored-by: Rod Boev <rod.boev@gmail.com>
2026-07-05 22:26:31 +00:00
nesquena-hermes f53bfb6c97 review: merge #5548 (bac619e767) 2026-07-05 21:57:42 +00:00
d76d11abb4 release: tiny-fix batch — sidebar auto-refresh on new session (#5632) + composer-divider hidden when left group empty (#5499)
Both gate-clean: Codex SAFE, Fable SHIP-UX, suite 12140/0, browser-smoke clean. #5499 supersedes #5451.

Co-authored-by: nankingjing <1079826437@qq.com>
Co-authored-by: wangyichen <wang.echen@foxmail.com>
2026-07-05 21:39:01 +00:00
nesquena-hermes 57a8467266 stage: merge #5499 (aa201b1550) 2026-07-05 21:21:35 +00:00
nesquena-hermes baddaccca1 stage: merge #5632 (8fc3179a8a) 2026-07-05 21:21:34 +00:00