From fcfaa4686a4a916c492d7204d152f956a74cdb30 Mon Sep 17 00:00:00 2001 From: Mohamed Habib Date: Fri, 12 Jun 2026 04:45:41 +0300 Subject: [PATCH] feat: add transparent stream activity display --- .gitignore | 3 + CHANGELOG.md | 5 + api/config.py | 2 + static/boot.js | 4 + static/i18n.js | 78 ++ static/icons.js | 1 + static/index.html | 16 + static/messages.js | 3 +- static/panels.js | 46 +- static/style.css | 296 +++++++ static/ui.js | 821 ++++++++++++++++-- tests/test_issue3592_thinking_settlement.py | 2 +- ...st_issue3820_chat_activity_display_mode.py | 435 ++++++++++ tests/test_sprint49.py | 1 + 14 files changed, 1654 insertions(+), 59 deletions(-) create mode 100644 tests/test_issue3820_chat_activity_display_mode.py diff --git a/.gitignore b/.gitignore index ab6ed33c1..adb10eaa8 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,9 @@ docs/AGENTS.md docs/CLAUDE.md docs/.cursorrules docs/.windsurfrules +.specify/ +AGENT_TRACE.yaml +EXECUTION_LOG.md # Local-only PR review harness: rendering drivers, sample bank, fixtures. # Used by Claude during deep reviews; never shared in the repo. diff --git a/CHANGELOG.md b/CHANGELOG.md index dc44d97eb..db38aab70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ ## [Unreleased] +### Added + +- **Transparent Stream activity display mode.** Settings → Appearance now includes an opt-in chat activity display mode that renders each Thinking/tool event as its own chronological expandable row, with live tool completion updating the same row and settled/reloaded transcripts preserving the same event shape. Compact Worklog remains the default. (#3820) +- **Transparent Stream turn-level collapse + old-event fading + per-turn footer.** In Transparent Stream, clicking the assistant role label (the Hermes chat name tag) collapses the entire event stack underneath into a compact "output only" view with an animated chevron. Older event rows fade progressively from medium to low opacity (steps of ~0.18, floor at 0.32) so the eye lands on the most recent activity; hover restores full opacity. A bottom-of-turn footer mirrors the live run-status line for settled turns, showing elapsed time, first-token time (TTFT), token usage, and final status. (#3820) + ## [v0.51.359] — 2026-06-11 — Release LW (assistant turn anchor phase 0 scaffold) ### Added diff --git a/api/config.py b/api/config.py index a12c3ef18..150b2ce4b 100644 --- a/api/config.py +++ b/api/config.py @@ -5746,6 +5746,7 @@ _SETTINGS_DEFAULTS = { "font_size": "default", # small | default | large | xlarge "session_jump_buttons": False, # show Start/End transcript jump pills "session_endless_scroll": False, # auto-load older transcript pages while scrolling upward + "chat_activity_display_mode": "compact_worklog", # compact_worklog | transparent_stream "worklog_details_expanded_default": False, # opt-in: expand Worklog details by default; default remains folded "pinned_sessions_limit": 3, # maximum active pinned sessions shown in the sidebar "inflight_state_max_sessions": 8, # max active-stream recovery snapshots kept in browser localStorage @@ -5900,6 +5901,7 @@ _SETTINGS_ENUM_VALUES = { "font_size": {"small", "default", "large", "xlarge"}, "auto_title_refresh_every": {"0", "5", "10", "20"}, "busy_input_mode": {"queue", "interrupt", "steer"}, + "chat_activity_display_mode": {"compact_worklog", "transparent_stream"}, } _SETTINGS_INT_RANGES = { "pinned_sessions_limit": (1, 99), diff --git a/static/boot.js b/static/boot.js index 8fff26ed7..3c93611ea 100644 --- a/static/boot.js +++ b/static/boot.js @@ -1798,6 +1798,8 @@ function applyBotName(){ window._whatsNewSummaryEnabled=!!s.whats_new_summary_enabled; window._showThinking=s.show_thinking!==false; window._simplifiedToolCalling=true; + window._chatActivityDisplayMode=s.chat_activity_display_mode==='transparent_stream'?'transparent_stream':'compact_worklog'; + window._transparentStream=window._chatActivityDisplayMode==='transparent_stream'; window._terminalAutoExpandOnOutput=!!s.terminal_auto_expand_on_output; window._worklogDetailsExpandedByDefault=!!( Object.prototype.hasOwnProperty.call(s,'worklog_details_expanded_default') @@ -1903,6 +1905,8 @@ function applyBotName(){ window._whatsNewSummaryEnabled=false; window._showThinking=true; window._simplifiedToolCalling=true; + window._chatActivityDisplayMode='compact_worklog'; + window._transparentStream=false; window._terminalAutoExpandOnOutput=false; window._sessionJumpButtonsEnabled=false; window._sidebarDensity='compact'; diff --git a/static/i18n.js b/static/i18n.js index cbb3e6ed3..9836c6709 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -560,6 +560,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'When enabled, older messages load automatically as you scroll upward. When disabled, use the older-messages button.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Sidebar tabs', settings_desc_tab_visibility: 'Choose which tabs appear in the sidebar and rail. Drag chips to reorder them. Chat and Settings are always visible.', @@ -1970,6 +1976,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Se abilitato, i messaggi precedenti si caricano automaticamente scorrendo in alto. Se disabilitato, usa il pulsante messaggi precedenti.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Schede della barra laterale', settings_desc_tab_visibility: 'Scegli quali schede mostrare nella barra laterale e nel rail. Chat e Impostazioni sono sempre visibili.', @@ -3371,6 +3383,12 @@ const LOCALES = { settings_desc_session_endless_scroll: '有効にすると、上にスクロールしたとき古いメッセージを自動で読み込みます。無効の場合は古いメッセージボタンを使います。', settings_label_worklog_details_expanded_default: 'Worklog の詳細を自動的に開く', settings_desc_worklog_details_expanded_default: '有効にすると、新しい Worklog の詳細が展開された状態で始まり、ツール、Thinking、進捗カードをクリックなしで確認できます。無効の場合、Worklog の詳細はデフォルトで折りたたまれます。ターンごとの手動折りたたみ/展開は優先されます。', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'サイドバータブ', settings_desc_tab_visibility: 'サイドバーとレールに表示するタブを選択します。チャットと設定は常に表示されます。', @@ -5391,6 +5409,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Если включено, старые сообщения загружаются автоматически при прокрутке вверх. Если выключено, используйте кнопку загрузки старых сообщений.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Вкладки боковой панели', settings_desc_tab_visibility: 'Выберите, какие вкладки отображаются на боковой панели и в рейле. Чат и настройки всегда видны.', @@ -6717,6 +6741,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Si está activado, los mensajes antiguos se cargan automáticamente al desplazarte hacia arriba. Si está desactivado, usa el botón de mensajes antiguos.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Pestañas de la barra lateral', settings_desc_tab_visibility: 'Elige qué pestañas aparecen en la barra lateral y el rail. Chat y Configuración siempre están visibles.', @@ -7743,6 +7773,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Wenn aktiviert, werden ältere Nachrichten beim Hochscrollen automatisch geladen. Wenn deaktiviert, nutzt du den Button für ältere Nachrichten.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Seitenleiste-Tabs', settings_desc_tab_visibility: 'Wähle, welche Tabs in der Seitenleiste und im Rail angezeigt werden. Ziehe die Chips, um die Reihenfolge zu ändern. Chat und Einstellungen sind immer sichtbar.', @@ -9404,6 +9440,12 @@ const LOCALES = { settings_desc_session_endless_scroll: '启用后,向上滚动时会自动加载更早的消息。禁用时请使用加载更早消息按钮。', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: '侧边栏标签', settings_desc_tab_visibility: '选择在侧边栏和导航栏中显示哪些标签。聊天和设置始终可见。', @@ -10125,6 +10167,12 @@ const LOCALES = { settings_desc_session_endless_scroll: '啟用後,向上捲動時會自動載入較早訊息。停用時請使用載入較早訊息按鈕。', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: '側邊欄標籤', settings_desc_tab_visibility: '選擇在側邊欄和導覽列中顯示哪些標籤。聊天和設定始終可見。', @@ -11416,6 +11464,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Quando ativado, mensagens antigas carregam automaticamente ao rolar para cima. Quando desativado, use o botão de mensagens antigas.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Abas da barra lateral', settings_desc_tab_visibility: 'Escolha quais abas aparecem na barra lateral e no rail. Chat e Configurações estão sempre visíveis.', @@ -12718,6 +12772,12 @@ const LOCALES = { settings_desc_session_endless_scroll: '활성화하면 위로 스크롤할 때 이전 메시지를 자동으로 불러옵니다. 비활성화하면 이전 메시지 버튼을 사용합니다.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: '사이드바 탭', settings_desc_tab_visibility: '사이드바와 레일에 표시할 탭을 선택하세요. 채팅과 설정은 항상 표시됩니다.', @@ -14037,6 +14097,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Lorsqu\'ils sont activés, les anciens messages se chargent automatiquement lorsque vous faites défiler vers le haut. Lorsqu\'il est désactivé, utilisez le bouton des messages plus anciens.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Onglets de la barre latérale', settings_desc_tab_visibility: 'Choisissez quels onglets apparaissent dans la barre latérale et le rail. Chat et Paramètres sont toujours visibles.', @@ -15457,6 +15523,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Etkinleştirildiğinde, yukarı doğru kaydırdığınızda eski mesajlar otomatik olarak yüklenir. Devre dışı bırakıldığında eski mesajlar düğmesini kullanın.', settings_label_worklog_details_expanded_default: 'Open Worklog details automatically', settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Kenar çubuğu sekmeleri', settings_desc_tab_visibility: 'Kenar çubuğunda ve rayda hangi sekmelerin görüneceğini seçin. Sohbet ve Ayarlar her zaman görünür durumdadır.', @@ -16869,6 +16941,12 @@ const LOCALES = { settings_desc_session_endless_scroll: 'Gdy ta opcja jest włączona, starsze wiadomości ładują się automatycznie przy przewijaniu w górę. Gdy jest wyłączona, użyj przycisku wczytywania starszych wiadomości.', settings_label_worklog_details_expanded_default: 'Otwieraj szczegóły Worklog automatycznie', settings_desc_worklog_details_expanded_default: 'Gdy ta opcja jest włączona, nowe szczegóły Worklog zaczynają rozwinięte, dzięki czemu karty narzędzi, Thinking i postępu są widoczne bez dodatkowego kliknięcia. Gdy jest wyłączona, szczegóły Worklog pozostają domyślnie zwinięte. Ręczne decyzje o zwinięciu/rozwinięciu w danej turze mają pierwszeństwo.', + settings_label_chat_activity_display_mode: 'Activity display', + settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.', + first_token_time: 'Time to first token', + done: 'Done', + settings_option_compact_worklog: 'Compact Worklog', + settings_option_transparent_stream: 'Transparent Stream', settings_label_tab_visibility: 'Karty paska bocznego', settings_desc_tab_visibility: 'Wybierz, które karty pojawiają się na pasku bocznym i szynie. Przeciągnij elementy, aby zmienić ich kolejność. Czat i Ustawienia są zawsze widoczne.', diff --git a/static/icons.js b/static/icons.js index 6aedb4590..c29776f73 100644 --- a/static/icons.js +++ b/static/icons.js @@ -44,6 +44,7 @@ const LI_PATHS = { 'globe': '', 'play': '', 'wrench': '', + 'plug': '', 'brain': '', 'sparkles': '', 'book-open': '', diff --git a/static/index.html b/static/index.html index 373ea3427..ffbc49116 100644 --- a/static/index.html +++ b/static/index.html @@ -1004,6 +1004,22 @@
When enabled, older messages load automatically as you scroll upward. When disabled, use the older-messages button.
+
+ +
+ + +
+ +
Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.
+