Commit Graph

1138 Commits

Author SHA1 Message Date
Michael Lam 8ef8fae831 fix: show config-managed custom providers 2026-05-20 06:27:00 -07:00
nesquena-hermes bd819f5e68 Stage 388: PR #2533 2026-05-20 00:17:47 +00:00
Eleanor Berger 2e91c0f81e fix: honour skin value in theme command 2026-05-20 00:09:06 +00:00
Eleanor Berger 4598adfd04 feat: add Geist Contrast skin 2026-05-20 00:09:06 +00:00
AJV20 739c948e74 fix(system): allow browser-only dashboard links 2026-05-19 22:47:55 +00:00
nesquena-hermes cc8ef201be Stage 387: PR #2600 2026-05-19 22:10:20 +00:00
nesquena-hermes 4bb60d9b10 Stage 387: PR #2601 2026-05-19 22:08:56 +00:00
nesquena-hermes 3a404874aa Stage 387: PR #2603 2026-05-19 22:08:56 +00:00
nesquena-hermes c3fd395bd6 Stage 387: PR #2597 2026-05-19 22:08:56 +00:00
nesquena-hermes 536a8b7636 Stage 387: PR #2566 2026-05-19 22:08:55 +00:00
starship-s 692ea22f9e fix(streaming): finish auto-compression card after rotation 2026-05-19 14:35:11 -06:00
starship-s 37df7d76a4 fix(webui): prevent composer draft rollback on refresh 2026-05-19 13:31:12 -06:00
Lumen Yang 8d2b9d4a16 feat(webui): render indexed context metadata 2026-05-19 18:52:50 +00:00
Dennis Soong acd1df1112 fix: time out hung browser api requests 2026-05-20 02:41:00 +08:00
Bryan Bartley b1b93f9c97 fix(i18n): add download_folder key to all non-en locales
CI parity tests enforce that every key in the English locale block exists
in zh, ja, ko, ru, and es. The PR introducing download_folder added it to
en only, which broke the 5 hard-parity test files. Adds the English
fallback to all 10 non-en blocks (it/ja/ru/es/de/zh/zh-Hant/pt/ko/fr) with
the project's // TODO: translate marker so translators can refine later.

Tests: tests/test_chinese_locale.py, test_japanese_locale.py,
test_korean_locale.py, test_russian_locale.py, test_spanish_locale.py —
26/26 passing locally.
2026-05-19 13:40:29 -05:00
nesquena-hermes 96cb4a556a Stage 386: PR #2584 2026-05-19 18:20:47 +00:00
nesquena-hermes 86f52f67b8 Stage 386: PR #2581
# Conflicts:
#	api/streaming.py
2026-05-19 18:20:47 +00:00
nesquena-hermes 0585881511 Stage 386: PR #2583 2026-05-19 18:20:07 +00:00
nesquena-hermes 7675f2f139 Stage 386: PR #2588
# Conflicts:
#	CHANGELOG.md
2026-05-19 18:20:07 +00:00
nesquena-hermes 42c2eda0fc Stage 386: PR #2579 2026-05-19 18:20:06 +00:00
nesquena-hermes 4b72539b3c Stage 386: PR #2576 2026-05-19 18:20:06 +00:00
Michael Lam bc7648271f fix: preserve provider for configured model picker selections 2026-05-19 08:05:52 -07:00
Florian Krause 646f18c696 fix: prevent queued follow-up message from draining into wrong chat
When a queued message was waiting for the active stream to finish,
the 120ms setTimeout drain in setBusy(false) would write the queued
text to the shared #msg composer and call send(), which reads
S.session.session_id at call time. If the user switched to a different
chat during the 120ms window, the queued message was sent to the
wrong session.

Two fixes:

1. setBusy(false) drain: guard the setTimeout callback — if the
   currently viewed session no longer matches the drain session,
   put the message back into the original session's queue instead
   of sending it.

2. _sendInProgress re-queue: track _sendInProgressSid alongside
   _sendInProgress so that when a concurrent send() is caught by the
   guard, the re-queued message targets the in-flight session rather
   than the currently viewed one.
2026-05-19 15:50:12 +02:00
dobby-d-elf 2a95c1e482 Fix profile-aware assistant display names 2026-05-19 07:17:11 -06:00
Michael Lam 79652935d3 fix: centralize workspace tree toggle width 2026-05-19 01:49:52 -07:00
starship-s 2e9ca283dc fix: display canonical cache hit percentage 2026-05-19 02:27:12 -06:00
Lumen Yang a63ab310b5 fix(webui): preserve reconciled session invariants 2026-05-19 08:02:43 +00:00
Lumen Yang f12fef280d fix(webui): clear stale prompts on external refresh
Force same-session external refreshes to dismiss stale approval and clarification prompts immediately so completed state.db updates do not leave the composer blocked.
2026-05-19 08:02:43 +00:00
Lumen Yang 467ef33a24 feat(webui): reconcile external session updates
When API server runs append messages directly to state.db, reconcile WebUI sidecar sessions with those canonical rows across API responses, model-facing streaming context, and active browser refresh.

Add append-only state.db merge helpers, metadata-only counts for refresh polling, and regression coverage for API visibility, context incorporation, and frontend refresh behavior.
2026-05-19 08:02:43 +00:00
dobby-d-elf 11e1e9a342 Fix settled rendering for file markdown links 2026-05-18 22:32:20 -06:00
nesquena-hermes a978612b76 Update brittle-source-string assertions for widened compressed-event guard 2026-05-19 03:21:26 +00:00
nesquena-hermes 54875f2110 Stage 385: PR #2550 2026-05-19 03:13:47 +00:00
nesquena-hermes e9079548ab Stage 385: PR #2567
# Conflicts:
#	CHANGELOG.md
2026-05-19 03:13:47 +00:00
nesquena-hermes 975928ffb7 Stage 385: PR #2561 2026-05-19 03:13:46 +00:00
Dennis Soong ea978a1989 fix: surface auto-compression handoff 2026-05-19 10:45:43 +08:00
Bryan Bartley 6caf86ba96 feat(workspace): download folder as zip via /api/folder/download
Adds a "Download Folder" item to the workspace file-tree right-click
menu and a GET /api/folder/download endpoint that streams the
directory as a zip with Content-Disposition: attachment.

Configurable caps:
  HERMES_WEBUI_FOLDER_ZIP_MAX_MB    (default 1024)
  HERMES_WEBUI_FOLDER_ZIP_MAX_FILES (default 50000)

Pre-flights the walk so cap-exceeded returns 413 + JSON BEFORE any
zip bytes are sent. Symlinks resolving outside the workspace are
skipped. Mirrors the existing _handle_file_raw shape (session_id
resolution, safe_resolve, RFC 5987 filename via
_content_disposition_value). Stdlib zipfile only; no new dependencies.

Tests: 11 static-inspection tests matching the style of
tests/test_issue1867_upload_size_preflight.py. All passing on
Python 3.11/3.12/3.13.
2026-05-18 21:40:02 -05:00
Michael Lam b473b21a2f fix: align workspace tree file icons 2026-05-18 18:38:13 -07:00
Nanook Claw b6b9deca4c fix: refresh project move cache 2026-05-19 00:08:07 +00:00
keyos c7d0c6343c feat(ui): add PWA standalone reload button and pull-to-refresh gesture
Adds a reload button to the app titlebar visible only in PWA standalone
or fullscreen mode, and a pull-to-refresh gesture on the messages container
that smooth-scrolls to the top before activating.

The reload button sits next to the message count label and provides a
one-tap refresh for users who installed the WebUI as a home-screen app
where browser navigation controls are unavailable.

The pull-to-refresh gesture detects downward drag at the top of the
message list, shows a visual indicator ('Pull to refresh' / 'Release to refresh'),
and reloads on release past the 80px threshold. When triggered mid-conversation,
it smooth-scrolls to the top first.
2026-05-18 18:10:20 +00:00
Michael Lam e94827f460 fix: stop replaying reasoning-only history 2026-05-18 10:50:42 -07:00
nesquena-hermes 63d75df818 Stage 383: PR #2530
# Conflicts:
#	CHANGELOG.md
2026-05-18 16:44:36 +00:00
nesquena-hermes d161e9a074 Stage 383: PR #2528
# Conflicts:
#	CHANGELOG.md
2026-05-18 16:44:36 +00:00
nesquena-hermes 69b2289671 Stage 383: PR #2512
# Conflicts:
#	CHANGELOG.md
2026-05-18 16:44:36 +00:00
nesquena-hermes c713b80197 Stage 383: PR #2459 2026-05-18 16:44:26 +00:00
Frank Song 0cd62ab474 fix: keep kanban drag drop from opening detail 2026-05-18 22:13:04 +08:00
Michael Lam b76d698a79 fix: guard new conversation cold-start clicks 2026-05-18 06:48:05 -07:00
Frank Song 9d6eb5f0df Fix board selector label overlap 2026-05-18 16:02:56 +08:00
Dennis Soong d72b3382fd fix: clarify compression elapsed cap 2026-05-18 14:22:29 +08:00
Dennis Soong 516d2a588c fix: show auto-compression elapsed time 2026-05-18 13:08:38 +08:00
Nathan Esquenazi e8dbf94a6f fix(i18n+tests): complete locale parity + bump test windows for new menu action
PR #2294 added the show_previous_messaging_sessions setting and a "Hide
from list" menu action for external sessions, but tripped 8 tests:

  - 4 locale-parity tests (tests/test_{japanese,russian,spanish,chinese}_locale.py)
    demand every en key be defined in ja/ru/es/zh blocks. The contributor
    only added the 5 new keys to en + ko, leaving ja/ru/es/zh/it/de/zh-TW/pt/fr
    missing them. tests/test_provider_quota_status.py also requires the two
    settings_{label,desc}_previous_messaging_sessions keys in ALL 11 locales.

  - tests/test_1466_sidebar_cancel_clarify.py read the first 5200 chars of
    _openSessionActionMenu to find cancelSessionStream/delete actions; the
    new "Hide from list" branch (17 lines for external sessions) pushed
    those past the read window.

  - tests/test_issue1611_session_profile_filtering.py grep'd for the
    literal string `_keep_latest_messaging_session_per_source(scoped)`,
    which no longer exists after the call was rewritten as a multi-line
    keyword-arg form.

Fixes:

1. Translations for the 5 new i18n keys added to all 9 missing locales
   (it, ja, ru, es, de, zh-CN, zh-TW, pt, fr):
   - session_hide_external
   - session_hide_external_desc
   - session_hidden
   - settings_label_previous_messaging_sessions
   - settings_desc_previous_messaging_sessions

   Where the locale already used the English fallback for related keys
   (ru/es/de session_archive), I provided localized translations for the
   new keys to match the project's general direction. Native-script
   quality, not machine-translation.

2. test_1466 window bumped 5200 → 6400 with a comment explaining the
   bump (mirrors the existing 3200→4400→5200 history annotations).

3. test_1611 dedupe-position check loosened to match the function name
   without the `(scoped)` suffix so it tolerates both single-line and
   keyword-arg call shapes.

Tests: full suite 5828 passed / 63 skipped / 0 failed (was 8 failed).
Behavioral harness verifies the toggle's claimed behavior — off (default)
hides reset/compression segments, on shows all rows in timestamp order.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 21:38:06 -07:00