Commit Graph

2351 Commits

Author SHA1 Message Date
Michael Lam 48b82d57db fix: reduce browser storage pressure 2026-05-16 08:44:04 -07:00
nesquena-hermes e3035b3e40 Merge pull request #2369 from nesquena/stage-367
Release v0.51.74 (stage-367) — 4-PR safe-lane batch with first-timer contributions
v0.51.74
2026-05-15 22:58:20 -07:00
Hermes Agent 8303d59acd stage-367: stamp CHANGELOG v0.51.74 (4-PR safe-lane batch)
v0.51.74 — Release AX:
- PR #2362 (fixes #2360) — Markdown table cell paragraph spacing
- PR #2363 (refs #2361 + #1925) — Run state consistency RFC docs
- PR #2365 (fixes #1106) — custom_providers.models YAML list format
- PR #2367 — Settings sidebar i18n (with maintainer locale-parity fix)

None of the PRs touched CHANGELOG.md, so adding the canonical entries
manually with proper PR # attribution and issue refs.

Stage-367 maintainer fix on #2367: CI failed on 5 locale-parity tests
because the PR added settings_tab_plugins to English only. Added
translations to all 10 non-English locales (commit ddf8eb5d on the
PR's integration branch).
2026-05-16 05:45:01 +00:00
Hermes Agent b8d2fca52f Stage 367: PR #2367 — fix: add i18n support to settings sidebar menu items by @mccxj 2026-05-16 05:43:27 +00:00
Hermes Agent fcc9329ae5 Stage 367: PR #2365 — Fix: support YAML list format for custom_providers.models in model dropdown by @mccxj 2026-05-16 05:43:27 +00:00
Hermes Agent bf78cebb55 Stage 367: PR #2363 — Document WebUI run state consistency contract by @franksong2702 2026-05-16 05:43:26 +00:00
Hermes Agent 031331662f Stage 367: PR #2362 — Fix Markdown table cell paragraph spacing by @franksong2702 2026-05-16 05:43:25 +00:00
BonyFish b48e44a24a Add tests for list-format custom_providers.models
Covers 9 scenarios: plain string list, dict list, unnamed provider,
mixed formats, dedup, empty list, fallback keys, @-prefix routing,
and mixed list/dict items from multiple providers.
2026-05-16 05:43:09 +00:00
BonyFish f82a763dfb fix: support list format for custom_providers.models in model dropdown
The get_available_models() function only handled dict-format models
(`{model_id: {}}`) for custom_providers entries, silently dropping
models specified as YAML lists (`[model1, model2]`) or list of dicts
(`[{id: ..., label: ...}]`).

This caused users who define their custom providers with list-format
model declarations to see zero or incomplete model entries in both
Settings → Preferences → Default Model dropdown and the chat
interface model picker.

The fix adds an `elif isinstance(_cp_models_dict, list)` branch with
support for three list sub-formats:
  - Plain string list: `models: [m1, m2]`
  - Dict list: `models: [{id: m1, label: ...}]`
  - Mixed: `models: [m1, {id: m2}]`

Refs: hermes-agent issue where YAML list models were invisible
2026-05-16 05:43:09 +00:00
Frank Song 58a43d7abd Document WebUI run state consistency contract 2026-05-16 05:43:06 +00:00
Frank Song 80be1d08dc Fix Markdown table cell paragraph spacing 2026-05-16 05:43:04 +00:00
Hermes Agent ddf8eb5d54 stage-367: locale-parity fix for settings_tab_plugins (10 locales)
PR #2367 added settings_tab_plugins to English only. The locale-parity
tests (test_chinese_locale.py, test_japanese_locale.py, etc.) require
every English key to exist in all 10 other locales. CI failed on 5 of them.

Adds the key to all 10 non-English locales with translations:
- it: Plugin, ja: プラグイン, ru: Плагины, es/de/pt/fr: Plugins (loanword),
  zh: 插件, zh-TW: 外掛, ko: 플러그인

Co-authored-by: mccxj <mccxj@users.noreply.github.com>
2026-05-16 05:42:53 +00:00
BonyFish 9593380899 fix: add i18n support to settings sidebar menu items
Adds data-i18n attributes to all settings sidebar menu items
(Conversation, Appearance, Preferences, Plugins, System) so they
respect the user's selected locale.

Also adds missing settings_tab_plugins key to English locale.
2026-05-16 13:09:09 +08:00
nesquena-hermes 59ffd573ae Merge pull request #2366 from nesquena/stage-366
Release v0.51.73 (stage-366) — 1-PR compression card anchoring fix
v0.51.73
2026-05-15 21:46:18 -07:00
Hermes Agent 54f680a8ef stage-366: stamp CHANGELOG v0.51.73 (1-PR safe-lane batch)
v0.51.73 — Release AW:
- PR #2357 (fixes #2355) — Compression reference card anchoring fix

The contributor's CHANGELOG entry was wiped during the --ours rebase
conflict resolution (because v0.51.72 stamping moved Unreleased entries
elsewhere). Added the canonical PR-numbered entry manually.

Stage-366 carries only #2357. Two other recent PRs were deferred:
- #2347 (live timeline restore, 380 LOC) — real semantic conflicts with
  v0.51.72's #2348 (_stripLiveVisibleAssistantEchoFromThinking +
  visibleInterimSnippets logic). Needs contributor rebase against current
  master.
- #2356 (mobile panel touch targets, 98 LOC) — incompatible architectural
  conflicts in static/style.css (.sidebar-nav vs .rail layout choice).
  Needs contributor redesign against current sidebar-nav layout.
2026-05-16 04:27:05 +00:00
Hermes Agent c24eb4e648 Stage 366: PR #2357 — Fix compression reference card anchoring by @franksong2702 2026-05-16 04:26:08 +00:00
Frank Song 433ad29939 Fix compression reference card anchoring 2026-05-16 04:25:22 +00:00
nesquena-hermes a08dfffd58 Merge pull request #2358 from nesquena/stage-365
Release v0.51.72 (stage-365) — 2-PR safe-lane batch
v0.51.72
2026-05-15 21:23:09 -07:00
Hermes Agent 7516c9591f stage-365: stamp CHANGELOG v0.51.72 (2-PR safe-lane batch)
v0.51.72 — Release AV:
- PR #2354 (fixes #2353) — Recovered pending turn context fix
- PR #2348 (fixes #2346) — Thinking card interim-text echo suppression

Hit Pitfall 6 again: contributor branches predated v0.51.70+71 so their
CHANGELOG entries landed in pre-existing v0.51.68/69 sections after rebase.
Manually moved entries to a new v0.51.72 section above v0.51.71, with
proper PR # attribution (#2348 was 'PR TBD' on the contributor branch).
2026-05-16 04:17:51 +00:00
Hermes Agent 4dac7940e7 Stage 365: PR #2348 — Suppress interim text echoes in Thinking cards by @franksong2702 2026-05-16 04:08:42 +00:00
Hermes Agent 2811ba8fd0 Stage 365: PR #2354 — Keep recovered pending turns in model context by @franksong2702 2026-05-16 04:08:42 +00:00
Frank Song d94320b4bf Avoid duplicate Thinking echo helper names 2026-05-16 04:07:03 +00:00
Frank Song dd5f3ff9b5 Suppress interim text echoes in Thinking cards 2026-05-16 04:07:03 +00:00
Frank Song 40f69a2b75 Keep recovered pending turns in context 2026-05-16 04:07:02 +00:00
nesquena-hermes 761cf550de Merge pull request #2352 from nesquena/stage-364
Release v0.51.71 (stage-364) — 3-PR batch with Opus-caught replay fix
v0.51.71
2026-05-15 21:01:28 -07:00
Hermes Agent b293bf8bc5 stage-364: Opus-caught live SSE event_id fix (side-channel approach)
Replace the earlier frontend-reset approach with a backend side-channel
approach that preserves the queue (event, data) tuple shape.

Problem (Opus catch):
- Live SSE frames emitted by _sse() in api/streaming.py:2296 carried no
  'id:' field. Only journal-replay frames (via _sse_with_id) emitted IDs.
- Frontend's _lastRunJournalSeq cursor stayed at 0 during live streaming.
- Mid-stream error → reconnect-to-replay arrived with after_seq=0.
- Server replayed every journaled event from seq 1.
- assistantText (closure-scoped) had accumulated all live tokens already
  → double-rendered output.

Fix:
- api/config.py: STREAM_LAST_EVENT_ID: dict = {} module-level dict.
- api/streaming.py put(): capture journal event_id, write to
  STREAM_LAST_EVENT_ID[stream_id]. Keep queue tuple as (event, data).
- api/routes.py _handle_sse_stream: read STREAM_LAST_EVENT_ID[stream_id]
  at emit time, use _sse_with_id when set.
- api/streaming.py finally block: pop STREAM_LAST_EVENT_ID for cleanup.

Why side-channel instead of 3-tuple:
- Earlier attempt (queue tuple → (event, data, event_id)) broke 4 existing
  tests: test_cancel_interrupt, test_sprint42, test_sprint51,
  test_issue1857_usage_overwrite. These all unpack 'event, data = q.get()'.
- Frontend-reset approach (reset assistantText before replay) broke 3
  other tests: test_smooth_text_fade, test_streaming_markdown,
  test_streaming_race_fix. _wireSSE must NOT reset accumulators because
  legacy reconnect doesn't replay events; only journal-replay does.

Side-channel preserves both invariants:
- Queue contract stays (event, data) — legacy consumers unbroken.
- Frontend accumulators stay alive on _wireSSE — legacy reconnect unbroken.
- Live SSE emits 'id:' so the journal cursor advances correctly.

6 regression tests added in test_stage364_opus_live_sse_event_id.py.
1 existing test (test_run_journal_streaming_static.test_streaming_journals_sse_events_before_queue_delivery) updated to be tuple-shape-agnostic.

Test results:
- Full pytest: 5713 passed, 10 skipped, 1 xfailed, 2 xpassed, 0 failed
- Previously-failing 5 tests: ALL PASS
- 6 new regression tests: ALL PASS
2026-05-16 03:58:54 +00:00
Hermes Agent f3b0c2cb5f stage-364: Opus-caught replay double-render fix + regression test
Opus advisor caught that the new run-journal replay path could double-render
when the live stream errors mid-stream:

- Live SSE frames emitted by _sse() in api/streaming.py:2296 carry no 'id:'
  field. Only _sse_with_id() (used in _replay_run_journal at routes.py:5853)
  emits IDs.
- During live streaming, EventSource.lastEventId stays empty, so the frontend's
  _lastRunJournalSeq stays at 0.
- If the server dies mid-stream, the error reconnect handler opens replay with
  after_seq=0 — server replays every journaled event from seq 1.
- assistantText accumulator (closure scope in messages.js) carries over from
  the live phase. The token handler unconditionally appends d.text. Double-
  rendered text.

Fix: reset assistantText, reasoningText, liveReasoningText, segmentStart, and
set _smdReconnect=true before opening the replay EventSource. Next live token
clears assistantBody.innerHTML to match the reset accumulator.

4 regression tests added in test_stage364_opus_replay_doublerender_fix.py.
Revert-fix verification confirms 3/4 tests fail against reverted code.

This is the TWO-LAYER catch in action: agent self-verified the producer→
consumer chain works end-to-end (Step 3 in agent-side-empirical-verification.md
PASSED for #2283), and Opus independently caught a separate frontend coupling
issue. Both checks required and both fire.
2026-05-16 03:28:07 +00:00
Hermes Agent a204c75b54 stage-364: stamp CHANGELOG v0.51.71 (3-PR batch)
v0.51.71 — Release AU:
- PR #2349 (fixes #2345) — Stale-stream cleanup non-touching of updated_at
- PR #2343 (refs #2147) — Profiles vs workspaces help card
- PR #2283 (refs #1925) — WebUI run event journal replay (RFC slice 1)

Also relabeled #2283's CHANGELOG entry to add proper PR #2283 attribution
(it had been added without the PR number prefix during the contributor PR),
and #2349's 'PR TBD' placeholder filled in.
2026-05-16 03:19:58 +00:00
Hermes Agent c0662a4624 Stage 364: PR #2283 — Add WebUI run event journal replay by @franksong2702 2026-05-16 03:08:35 +00:00
Hermes Agent e38a4260eb Stage 364: PR #2343 — feat: clarify profiles and workspaces by @Michaelyklam 2026-05-16 03:08:34 +00:00
Hermes Agent 21d9b90bdc Stage 364: PR #2349 — Avoid touching updated_at during stale stream cleanup by @franksong2702 2026-05-16 03:08:33 +00:00
Frank Song a3eace4380 Preserve SSE handler test shape 2026-05-16 02:58:34 +00:00
Frank Song 80d8d4b42c Address run journal replay review 2026-05-16 02:58:34 +00:00
Frank Song 3b96035af0 Add WebUI run event journal replay 2026-05-16 02:58:34 +00:00
Michael Lam b373f090bd feat: clarify profiles and workspaces 2026-05-16 02:58:33 +00:00
Frank Song 685b075dd0 Avoid touching updated_at during stale stream cleanup 2026-05-16 02:58:33 +00:00
nesquena-hermes dbd2c79891 Merge pull request #2350 from nesquena/stage-363
Release v0.51.70 (stage-363) — 4-PR snapshot+journal+UI batch
v0.51.70
2026-05-15 19:56:41 -07:00
Hermes Agent 15100344f6 stage-363: stamp CHANGELOG v0.51.70 + retroactive v0.51.69 section
v0.51.70 — Release AS (this batch):
- PR #2337 (compression snapshot runtime-clear branch 2)
- PR #2334 (turn-journal fcntl lock)
- PR #2342 (INFLIGHT reattach pending user row)
- PR #2339 (workspace panel edge reopen toggle)

v0.51.69 — Release AT (retroactive — these PRs shipped at v0.51.69
tag yesterday but were never moved out of Unreleased at release time;
restoring proper attribution):
- PR #2332, #2333, #2322, #2326, #2327, #2328, #2330, #2331

CHANGELOG drift detected via Pitfall 6 in test-augmentation pitfalls
doc — Unreleased section contained 8 orphan PRs that shipped at the
v0.51.69 tag but were never sectioned correctly. Retroactively splicing
the v0.51.69 header to attribute them properly so future release notes
don't mis-attribute work to v0.51.70.
2026-05-16 02:49:34 +00:00
Hermes Agent 8399a1ade4 Stage 363: PR #2339 — feat: add workspace panel edge reopen toggle by @Michaelyklam 2026-05-16 02:39:23 +00:00
Hermes Agent 2f633ae32e Stage 363: PR #2342 — Fix pending user row on active reattach by @franksong2702 2026-05-16 02:39:23 +00:00
Hermes Agent 0d70ed9e26 Stage 363: PR #2334 — fix: lock turn journal appends by @Michaelyklam 2026-05-16 02:38:53 +00:00
Hermes Agent 9c6ebea393 Stage 363: PR #2337 — fix: clear runtime fields on loaded compression snapshots by @Michaelyklam 2026-05-16 02:38:52 +00:00
Frank Song 2162dab4a5 Fix pending user row on active reattach 2026-05-16 10:34:55 +08:00
Michael Lam 4d613e723f feat: add workspace panel edge reopen toggle 2026-05-15 18:33:27 -07:00
Michael Lam 0e91f89ce3 fix: clear runtime fields on loaded compression snapshots 2026-05-15 17:55:35 -07:00
Michael Lam 4dbf6712dc fix: lock turn journal appends 2026-05-15 16:39:45 -07:00
nesquena-hermes 352064eb93 Merge pull request #2335 from nesquena/stage-362
stage-362: 8-PR follow-up batch — Ollama routing + legacy toolset + cancel copy + cleanup + custom provider mismatch + cron metadata + dead-code removal (with #2323 revert after Opus-caught silent regression)
v0.51.69
2026-05-15 16:27:05 -07:00
Hermes Agent b7859cf98d stage-362: revert #2323 — Opus caught silent regression in profile routing 2026-05-15 23:23:18 +00:00
Hermes Agent 2161b81da2 Revert "Merge pull request #2323 into stage-362"
This reverts commit 0651fe13b0, reversing
changes made to 1e6ce3d2e7.
2026-05-15 23:22:44 +00:00
Hermes Agent 013a158fd1 docs: CHANGELOG stage-362 — close v0.51.68 (stage-361), open Unreleased for 9-PR stage-362 batch with proper attribution 2026-05-15 22:57:56 +00:00