Commit Graph

1026 Commits

Author SHA1 Message Date
BonyFish f87e32d0c7 fix: add i18n support to settings conversation page action buttons
- Add data-i18n attributes to JSON, Import tooltip, and Clear button
- Reuse existing 'clear' and 'import' i18n keys for button labels
- Add 'export_session_json', 'export_session_json_tooltip',
  'import_session_json_tooltip', 'clear_conversation_btn_tooltip'
  keys to all 11 locales (en, it, ja, ru, es, de, zh, zh-Hant, pt, ko, fr)
2026-05-16 14:57:01 +08: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
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
Frank Song 433ad29939 Fix compression reference card anchoring 2026-05-16 04:25:22 +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
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 c0662a4624 Stage 364: PR #2283 — Add WebUI run event journal replay by @franksong2702 2026-05-16 03:08:35 +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
Hermes Agent 8399a1ade4 Stage 363: PR #2339 — feat: add workspace panel edge reopen toggle by @Michaelyklam 2026-05-16 02:39:23 +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
Hermes Agent 1e6ce3d2e7 Merge pull request #2328 into stage-362
fix: clean session attachment and stream recovery leftovers (Michaelyklam, closes #2325)
2026-05-15 22:55:37 +00:00
Hermes Agent 59f73ba45a Merge pull request #2332 into stage-362
feat: show cron output usage metadata (Michaelyklam)
2026-05-15 22:55:36 +00:00
Hermes Agent 62e4d9b2f5 Merge pull request #2327 into stage-362
fix: use assistant name in cancel copy (dotBeeps)
2026-05-15 22:55:35 +00:00
Hermes Agent 300571936c Merge pull request #2331 into stage-362
fix: show readable live activity progress (Michaelyklam)

# Conflicts:
#	CHANGELOG.md
2026-05-15 22:55:33 +00:00
Michael Lam 8186577c7b feat: show cron output usage metadata 2026-05-15 14:54:20 -07:00
Michael Lam 2e039ab7f7 fix: show readable live activity progress 2026-05-15 14:11:58 -07:00
Michael Lam 5a2137bedb fix: skip provider mismatch for named custom providers 2026-05-15 13:50:18 -07:00
Michael Lam c991f36021 fix: clean session attachment and stream recovery leftovers 2026-05-15 13:30:46 -07:00
dot 🐶 3add6f450f fix: use assistant name in cancel copy
Replace the hardcoded Skyly cancellation wording with the configured bot_name from settings, falling back to Hermes when unset.

Keep the client-side fallback in sync by using window._botName if the session refresh after cancellation fails.

Co-authored-by: Obryn 🐉 <obryn-ai@dotbeeps.dev>
2026-05-15 16:00:30 -04:00
Hermes Agent ab749575df Merge pull request #2318 into stage-361
fix: defer mobile stream errors while tab is hidden (Michaelyklam, closes #2307)

# Conflicts:
#	CHANGELOG.md
2026-05-15 19:17:06 +00:00
Hermes Agent 62413067e6 Merge pull request #2317 into stage-361
fix: preserve explicit light/dark theme fallback (Michaelyklam, refs #2312)
2026-05-15 19:17:03 +00:00
Michael Lam aeda75271c fix: defer stream errors while mobile tabs are hidden 2026-05-15 11:25:53 -07:00
Michael Lam 957bffc49e fix: preserve explicit light dark theme fallback 2026-05-15 10:10:34 -07:00
Hermes Agent b2ebbebf01 Merge pull request #2279 into stage-360
Fix WebUI stream completion recovery gaps (franksong2702, closes #2262 + #2168)
2026-05-15 16:15:38 +00:00
dobby-d-elf fe1689caef style: remove opacity from .close-preview so X button matches other panel icons 2026-05-15 09:43:18 -06:00
dobby-d-elf 0f86030f5f fix: single close button on workspace panel, tooltip → 'Close'
- Remove duplicate mobile-close-btn from HTML
- Remove dead .mobile-close-btn CSS rules; unhide .close-preview at all viewports
- Change btnClearPreview tooltip from 'Hide workspace panel' to 'Close'
- Update tests across test_sprint41.py, test_sprint44.py, test_issue781.py,
  and test_mobile_layout.py to match new single-button model
2026-05-15 09:43:18 -06:00
dobby-d-elf 0e9017a665 refine workspace panel header layout 2026-05-15 09:43:18 -06:00
Hermes Agent 90fd16e273 Merge pull request #2306 into stage-359
Fix iPhone PWA mobile shell and workspace header layout (dobby-d-elf, regression fix for #2238)
2026-05-15 14:55:17 +00:00
Hermes Agent d510b8d2d5 Merge pull request #2303 into stage-359
Add assistant question jump buttons (franksong2702, fixes #2246)

# Conflicts:
#	CHANGELOG.md
2026-05-15 14:55:15 +00:00
Hermes Agent f7d98cdf3f Merge pull request #2301 into stage-359
Add cron detail expansion controls (franksong2702, fixes #2289)
2026-05-15 14:55:13 +00:00
Hermes Agent b28a132f91 Merge pull request #2296 into stage-359
fix: align offline banner with active theme palette (Jordan-SkyLF)

# Conflicts:
#	CHANGELOG.md
2026-05-15 14:55:12 +00:00
Hermes Agent ad76db8651 Merge pull request #2291 into stage-359
feat: add Nous Research skin (linuxid10t)
2026-05-15 14:55:10 +00:00
Hermes Agent 8e610ce790 Merge pull request #2288 into stage-359
fix: prevent theme reset on refresh when autosave failed (linuxid10t)
2026-05-15 14:55:09 +00:00
Hermes Agent 4365758a78 Merge pull request #2287 into stage-359
feat: make upload size limit runtime-configurable (mslovy, refs #2284)
2026-05-15 14:55:06 +00:00
dobby-d-elf 256b9d6294 fix: restore iPhone PWA mobile workspace layout 2026-05-15 08:14:53 -06:00
Frank Song 05a5ed5af1 Add assistant question jump buttons 2026-05-15 19:39:27 +08:00
Frank Song 079d6b4e86 Add cron detail expansion controls 2026-05-15 18:04:53 +08:00
Jordan SkyLF b7f8b97e76 Fix offline banner warning theme colors 2026-05-15 00:40:21 -07:00
linuxid10t b2d4f13c5b feat: add Nous Research skin
Adds a cold steel-blue/monospace skin inspired by nousresearch.com:
- Steel-blue accent (#4682B4) replacing warm gold
- Monospace typography (SF Mono, Roboto Mono, Courier New)
- Sharp corners, technical dashed borders
- Dark navy palette (#0A0E14) for dark mode

Files changed:
- static/style.css — Nous skin CSS variables and component overrides
- static/boot.js — Nous skin entry in _SKINS array
- static/index.html — nous in inline skin validation list
- api/config.py — nous + sienna in server-side _SETTINGS_SKIN_VALUES
2026-05-15 00:28:34 -05:00
linuxid10t 45fe6294f9 fix: prevent theme reset on refresh when autosave failed
The boot IIFE unconditionally overwrote localStorage with whatever
settings.json had on the server.  If the appearance autosave POST
ever failed (network glitch, transient error) the next page load
would revert the user's chosen theme/skin to the server's stale
defaults.

Fix: reconcile localStorage against the server on boot.  When
localStorage carries a non-default skin or system theme (the user
explicitly chose something), localStorage wins and the fix pushes
those values back to the server.  When localStorage is at defaults
(new browser / first visit), the server still wins.

Tested scenarios:
- User chose non-default skin, autosave failed → preserved + reconciled
- New browser, server has non-default skin → server value applied
- Normal use (autosave works) → unchanged behavior
2026-05-14 23:52:57 -05:00
Yao Ning b1bf800fa4 feat: make upload size limit runtime-configurable
Signed-off-by: Yao Ning <zay11022@gmail.com>
2026-05-15 11:39:23 +08:00
Frank Song 5dddaf0f3d Fix settings i18n parity coverage 2026-05-15 08:51:30 +08:00