Commit Graph

1140 Commits

Author SHA1 Message Date
nesquena-hermes dd36d09f89 Stage 389: PR #2626
# Conflicts:
#	CHANGELOG.md
2026-05-20 16:41:45 +00:00
Michael Lam c3eafa34f8 fix: surface custom provider model endpoint errors 2026-05-20 03:12:33 -07:00
Michael Lam 9ca846eb8f feat: cap pinned sessions from sidebar 2026-05-19 20:50:26 -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