New request
#3338: ux: messaging session source badge shows in sidebar but not in chat pane topbar after clicking in
We'll provision a sandbox, run an agent against the issue, and open a draft PR. You can pull the branch and iterate from there.
Issue: Messaging session source badge shows in sidebar but disappears from topbar after clicking into session
描述
侧边栏会话列表能正确显示 Telegram/WeChat 等平台来源标记,但点击进入该会话后,顶部标题栏(topbar)就不再显示平台标识了。前后信息流断裂。
复现步骤
- 在 Hermes WebUI 中,确保有来自 Telegram / WeChat 的会话显示在侧边栏
- 观察侧边栏 —— 会话条目右侧显示有平台标识("Telegram" / "WeChat" 等标签)
- 点击该会话进入聊天面板
- 顶部标题栏只显示会话标题和消息数,缺少平台来源标识
期望行为
进入会话后,顶部标题栏应在标题旁显示平台来源标签(类似侧边栏的展示方式),让用户能持续感知当前会话所处的平台上下文。
根因分析
侧边栏显示平台标识靠两重机制:
- CSS 伪元素
::after { content: attr(data-source) }在.session-item.cli-session上渲染(sessions.js:4082-4086) - 详细密度模式下通过
_getChannelLabel()写入 meta 行(sessions.js:4231-4232)
两者都检查 s.is_cli_session,在侧边栏的合并路径中,deduped_cli 来源的会话条目保留了 is_cli_session: true。
但 topbar badge(panels.js:61)的判断条件同样是:
if (S.session.is_cli_session)
sourceLabel = S.session.source_label || S.session.source_tag || S.session.raw_source || '';
对于 messaging 会话,后端的 is_cli_session_row() 在 source == "messaging" 时返回 False(agent_sessions.py:151-152),导致合并后的会话数据中 is_cli_session 为 false,topbar badge 不渲染。
topbar-source-badge 的 CSS class 已存在(style.css:1885),只是判断条件被 is_cli_session 挡住了。
修复方向建议
panels.js:61(以及 ui.js:5295)处判断是否显示 source badge 的逻辑应独立于 is_cli_session,直接检查 source_label / source_tag / raw_source 是否有值即可:
// 改为:
const sourceLabel = (S.session && (
S.session.source_label ||
S.session.source_tag ||
S.session.raw_source
)) || '';
这样无论 is_cli_session 是 true 还是 false,只要会话确实有平台来源信息,topbar 就显示 badge。
相关代码位置
- 后端:
is_cli_session_row()→agent_sessions.py:140-167 - 合并逻辑:
_merge_cli_sidebar_metadata()→routes.py:2680-2730 - 前端侧边栏渲染:
sessions.js:4082-4086、sessions.js:4231-4232 - 前端 topbar 渲染:
panels.js:61、ui.js:5295 - CSS 样式:
style.css:1885(.topbar-source-badge)、style.css:3640-3673(侧边栏 badge)
Precisely localized conditional bug where topbar source-badge logic incorrectly gates on is_cli_session instead of available source metadata fields.
- static/panels.js
- static/ui.js