Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b522092
feat: add activity feed default expansion setting
AJV20 May 28, 2026
0f05fb5
fix: keep activity progress running-tool preference
AJV20 May 28, 2026
fa31877
fix: keep default-expanded activity open after settle
AJV20 May 28, 2026
8f9c0a7
fix: preserve activity finalize guard contract
AJV20 May 28, 2026
b8d2d02
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 28, 2026
156b33e
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 28, 2026
601687a
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 28, 2026
d0fc470
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 28, 2026
2f0d804
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 29, 2026
2813a65
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 30, 2026
d03d4fe
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 30, 2026
44dd039
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 30, 2026
c28f594
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 30, 2026
9680b08
Merge remote-tracking branch 'origin/master' into feat/activity-feed-…
AJV20 May 30, 2026
cbd3bc6
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 30, 2026
e844f62
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 30, 2026
17e1adc
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 30, 2026
2215359
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 30, 2026
e0d787a
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 30, 2026
994598b
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 31, 2026
b97be0c
Merge remote-tracking branch 'origin/master' into pr-3080-activity-de…
AJV20 May 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
### Added
- CI now runs a headless browser smoke test (`tests/browser_smoke.py`, `.github/workflows/browser-smoke.yml`) on every PR and push: it boots the real server agent-free and loads the key pages in Chromium, failing on any console error or uncaught JS exception. This catches the runtime-JS brick class (e.g. a `const` reassigned at runtime as in #3162, or a `function`/`window` name collision as in #2715/#2771) that `node --check`, ESLint, and the mocked test suite cannot see because they only manifest when a real browser executes the page. The smoke is credential-free — it strips `*_API_KEY` from the environment and drives no real model.

### Changed

- Activity disclosures now have a Settings → Appearance option to expand the activity feed by default, while still honoring per-turn manual collapse/expand choices.
- Live Activity waiting rows now explain the agent's current step instead of stopping at `Waiting on model`, including a prompt/context review hint before tools run and the latest tool-derived action while the model chooses the next step.

## [v0.51.181] — 2026-05-30 — Release FA (stage-batchA — agent-cache eviction teardown + streaming finalize race)

### Fixed
Expand Down
2 changes: 2 additions & 0 deletions api/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4822,6 +4822,7 @@ def _get_session_agent_lock(session_id: str) -> threading.Lock:
"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
"activity_feed_expanded_default": False, # expand Activity disclosures by default for new turns
"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
"inflight_state_max_messages": 24, # max recent messages kept per recovery snapshot
Expand Down Expand Up @@ -4985,6 +4986,7 @@ def load_settings() -> dict:
"api_redact_enabled",
"session_jump_buttons",
"session_endless_scroll",
"activity_feed_expanded_default",
}
# Language codes are validated as short alphanumeric BCP-47-like tags (e.g. 'en', 'zh', 'fr')
_SETTINGS_LANG_RE = __import__("re").compile(r"^[a-zA-Z]{2,10}(-[a-zA-Z0-9]{2,8})?$")
Expand Down
1 change: 1 addition & 0 deletions static/boot.js
Original file line number Diff line number Diff line change
Expand Up @@ -1562,6 +1562,7 @@ function applyBotName(){
window._whatsNewSummaryEnabled=!!s.whats_new_summary_enabled;
window._showThinking=s.show_thinking!==false;
window._simplifiedToolCalling=s.simplified_tool_calling!==false;
window._activityFeedExpandedDefault=!!s.activity_feed_expanded_default;
window._sidebarDensity=(s.sidebar_density==='detailed'?'detailed':'compact');
window._pinnedSessionsLimit=parseInt(s.pinned_sessions_limit||3,10)||3;
window._inflightStateLimits={
Expand Down
24 changes: 24 additions & 0 deletions static/i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Load older messages while scrolling up',

settings_desc_session_endless_scroll: 'When enabled, older messages load automatically as you scroll upward. When disabled, use the older-messages button.',
settings_label_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: 'Sidebar tabs',
settings_desc_tab_visibility: 'Choose which tabs appear in the sidebar and rail. Chat and Settings are always visible.',
Expand Down Expand Up @@ -1842,6 +1844,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Carica messaggi precedenti scorrendo in alto',

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_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

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.',
Expand Down Expand Up @@ -3145,6 +3149,8 @@ const LOCALES = {
settings_label_session_endless_scroll: '上スクロールで古いメッセージを読み込む',

settings_desc_session_endless_scroll: '有効にすると、上にスクロールしたとき古いメッセージを自動で読み込みます。無効の場合は古いメッセージボタンを使います。',
settings_label_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: 'サイドバータブ',
settings_desc_tab_visibility: 'サイドバーとレールに表示するタブを選択します。チャットと設定は常に表示されます。',
Expand Down Expand Up @@ -5018,6 +5024,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Загружать старые сообщения при прокрутке вверх',

settings_desc_session_endless_scroll: 'Если включено, старые сообщения загружаются автоматически при прокрутке вверх. Если выключено, используйте кнопку загрузки старых сообщений.',
settings_label_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: 'Вкладки боковой панели',
settings_desc_tab_visibility: 'Выберите, какие вкладки отображаются на боковой панели и в рейле. Чат и настройки всегда видны.',
Expand Down Expand Up @@ -6247,6 +6255,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Cargar mensajes antiguos al desplazarse hacia arriba',

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_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

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.',
Expand Down Expand Up @@ -7188,6 +7198,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Ältere Nachrichten beim Hochscrollen laden',

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_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: 'Seitenleiste-Tabs',
settings_desc_tab_visibility: 'Wähle, welche Tabs in der Seitenleiste und im Rail angezeigt werden. Chat und Einstellungen sind immer sichtbar.',
Expand Down Expand Up @@ -8737,6 +8749,8 @@ const LOCALES = {
settings_label_session_endless_scroll: '向上滚动时加载更早的消息',

settings_desc_session_endless_scroll: '启用后,向上滚动时会自动加载更早的消息。禁用时请使用加载更早消息按钮。',
settings_label_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: '侧边栏标签',
settings_desc_tab_visibility: '选择在侧边栏和导航栏中显示哪些标签。聊天和设置始终可见。',
Expand Down Expand Up @@ -9231,6 +9245,8 @@ const LOCALES = {
settings_label_session_endless_scroll: '向上捲動時載入較早訊息',

settings_desc_session_endless_scroll: '啟用後,向上捲動時會自動載入較早訊息。停用時請使用載入較早訊息按鈕。',
settings_label_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: '側邊欄標籤',
settings_desc_tab_visibility: '選擇在側邊欄和導航列中顯示哪些標籤。聊天和設定始終可見。',
Expand Down Expand Up @@ -10610,6 +10626,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Carregar mensagens antigas ao rolar para cima',

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_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

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.',
Expand Down Expand Up @@ -11816,6 +11834,8 @@ const LOCALES = {
settings_label_session_endless_scroll: '위로 스크롤할 때 이전 메시지 불러오기',

settings_desc_session_endless_scroll: '활성화하면 위로 스크롤할 때 이전 메시지를 자동으로 불러옵니다. 비활성화하면 이전 메시지 버튼을 사용합니다.',
settings_label_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

settings_label_tab_visibility: '사이드바 탭',
settings_desc_tab_visibility: '사이드바와 레일에 표시할 탭을 선택하세요. 채팅과 설정은 항상 표시됩니다.',
Expand Down Expand Up @@ -13035,6 +13055,8 @@ const LOCALES = {
settings_desc_session_jump_buttons: 'Affichez les boutons flottants de début et de fin lors de la lecture de longs historiques de session.',
settings_label_session_endless_scroll: 'Charger les anciens messages en faisant défiler vers le haut',
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_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

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.',
Expand Down Expand Up @@ -14357,6 +14379,8 @@ const LOCALES = {
settings_label_session_endless_scroll: 'Yukarı kaydırırken eski mesajları yükle',

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_activity_feed_expanded_default: 'Expand activity feed by default',
settings_desc_activity_feed_expanded_default: 'Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.',

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.',
Expand Down
7 changes: 7 additions & 0 deletions static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,13 @@ <h2 data-i18n="empty_title">What can I help with?</h2>
</label>
<div style="font-size:11px;color:var(--muted);margin-top:4px" data-i18n="settings_desc_session_endless_scroll">When enabled, older messages load automatically as you scroll upward. When disabled, use the older-messages button.</div>
</div>
<div class="settings-field" style="margin-top:8px">
<label style="display:flex;align-items:center;gap:8px;cursor:pointer">
<input type="checkbox" id="settingsActivityFeedExpandedDefault" style="width:15px;height:15px;accent-color:var(--accent)">
<span data-i18n="settings_label_activity_feed_expanded_default">Expand activity feed by default</span>
</label>
<div style="font-size:11px;color:var(--muted);margin-top:4px" data-i18n="settings_desc_activity_feed_expanded_default">Open new Activity disclosures automatically so tool and model progress is visible without an extra click. Per-turn manual collapse/expand choices still win.</div>
</div>
<div class="settings-field">
<label id="tabVisibilityLabel" data-i18n="settings_label_tab_visibility">Sidebar tabs</label>
<div id="tabVisibilityChips" class="tab-visibility-chips" role="group" aria-labelledby="tabVisibilityLabel"></div>
Expand Down
13 changes: 13 additions & 0 deletions static/panels.js
Original file line number Diff line number Diff line change
Expand Up @@ -5801,6 +5801,7 @@ function _appearancePayloadFromUi(){
font_size: ($('settingsFontSize')||{}).value || localStorage.getItem('hermes-font-size') || 'default',
session_jump_buttons: !!($('settingsSessionJumpButtons')||{}).checked,
session_endless_scroll: !!($('settingsSessionEndlessScroll')||{}).checked,
activity_feed_expanded_default: !!($('settingsActivityFeedExpandedDefault')||{}).checked,
hidden_tabs: _getHiddenTabs(),
};
}
Expand Down Expand Up @@ -5854,6 +5855,9 @@ async function _autosaveAppearanceSettings(payload){
if(typeof _applySessionNavigationPrefs==='function') _applySessionNavigationPrefs();
}
window._sessionEndlessScrollEnabled=!!(saved&&saved.session_endless_scroll);
if(saved&&Object.prototype.hasOwnProperty.call(saved,'activity_feed_expanded_default')){
window._activityFeedExpandedDefault=!!saved.activity_feed_expanded_default;
}
_setAppearanceAutosaveStatus('saved');
}catch(e){
console.warn('[settings] appearance autosave failed', e);
Expand Down Expand Up @@ -6068,6 +6072,15 @@ async function loadSettingsPanel(){
_scheduleAppearanceAutosave();
};
}
const activityExpandedCb=$('settingsActivityFeedExpandedDefault');
if(activityExpandedCb){
activityExpandedCb.checked=!!settings.activity_feed_expanded_default;
window._activityFeedExpandedDefault=activityExpandedCb.checked;
activityExpandedCb.onchange=function(){
window._activityFeedExpandedDefault=this.checked;
_scheduleAppearanceAutosave();
};
}
// Tab visibility chips (dynamically populated from DOM)
var hiddenTabs=[];
if(Array.isArray(settings.hidden_tabs)){
Expand Down
Loading
Loading