feat(web-ui): add pinned sessions and live monitor in Chat (#118)

* feat: add single-page live session monitor and chat pinning

* fix: restore full test green after main merge

* fix: use Array.from instead of Set spread for ts-node compatibility

[...new Set()] requires downlevelIteration which isn't enabled in
ts-node dev mode, causing sonic-boom crash on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: ekko <fqsy1416@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Zhicheng Han
2026-04-22 02:09:58 +02:00
committed by GitHub
parent 83ad9642e2
commit 3f88553765
34 changed files with 2497 additions and 278 deletions
+15
View File
@@ -73,6 +73,17 @@ export default {
deleteSession: 'Diese Sitzung loschen?',
sessionDeleted: 'Sitzung geloscht',
rename: 'Umbenennen',
pin: 'Anheften',
unpin: 'Lösen',
pinned: 'Angeheftet',
chatMode: 'Chat',
liveMode: 'Live',
liveSessions: 'Live-Sitzungen',
recentBadge: 'Kürzlich',
linkedSessions: '{count} verknüpft',
noVisibleMessages: 'Keine für Menschen sichtbaren Nachrichten.',
monitorRoleUser: 'Benutzer',
monitorRoleAssistant: 'Assistent',
copySessionId: 'Sitzungs-ID kopieren',
renamed: 'Umbenannt',
renameFailed: 'Umbenennung fehlgeschlagen',
@@ -338,6 +349,10 @@ export default {
idleMinutes: 'Inaktivitats-Timeout',
idleMinutesHint: 'Wartezeit vor automatischer Zurucksetzung (Minuten)',
atHour: 'Geplante Zurucksetzungszeit',
humanOnly: 'Nur menschliche Sitzungen anzeigen',
humanOnlyHint: 'Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden',
liveMonitorHumanOnly: 'Live-Monitor: nur menschliche Sitzungen anzeigen',
liveMonitorHumanOnlyHint: 'Im Live-Monitor Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden',
atHourHint: 'Sitzung taglich zu dieser Stunde zurucksetzen',
},
privacy: {
+15
View File
@@ -86,6 +86,17 @@ export default {
deleteSession: 'Delete this session?',
sessionDeleted: 'Session deleted',
rename: 'Rename',
pin: 'Pin',
unpin: 'Unpin',
pinned: 'Pinned',
chatMode: 'Chat',
liveMode: 'Live',
liveSessions: 'Live Sessions',
recentBadge: 'Recent',
linkedSessions: '{count} linked',
noVisibleMessages: 'No human-visible messages.',
monitorRoleUser: 'User',
monitorRoleAssistant: 'Assistant',
copySessionId: 'Copy Session ID',
renamed: 'Renamed',
renameFailed: 'Rename failed',
@@ -369,6 +380,10 @@ export default {
idleMinutes: 'Idle Timeout',
idleMinutesHint: 'Wait time before auto-reset (minutes)',
atHour: 'Scheduled Reset Time',
humanOnly: 'Show human sessions only',
humanOnlyHint: 'Hide sub-agent/session monitor noise by default',
liveMonitorHumanOnly: 'Live monitor: show human sessions only',
liveMonitorHumanOnlyHint: 'Hide sub-agent/session monitor noise in the Live monitor by default',
atHourHint: 'Reset session at this hour daily',
},
privacy: {
+16 -1
View File
@@ -73,7 +73,18 @@ export default {
deleteSession: 'Eliminar esta sesion?',
sessionDeleted: 'Sesion eliminada',
rename: 'Renombrar',
copySessionId: 'Copiar ID de sesion',
pin: 'Fijar',
unpin: 'Desfijar',
pinned: 'Fijados',
chatMode: 'Chat',
liveMode: 'En vivo',
liveSessions: 'Sesiones en vivo',
recentBadge: 'Reciente',
linkedSessions: '{count} vinculadas',
noVisibleMessages: 'No hay mensajes visibles para humanos.',
monitorRoleUser: 'Usuario',
monitorRoleAssistant: 'Asistente',
copySessionId: 'Copiar ID de sesión',
renamed: 'Renombrada',
renameFailed: 'Error al renombrar',
renameSession: 'Renombrar sesion',
@@ -338,6 +349,10 @@ export default {
idleMinutes: 'Tiempo de inactividad',
idleMinutesHint: 'Tiempo de espera antes del reinicio automatico (minutos)',
atHour: 'Hora de reinicio programado',
humanOnly: 'Mostrar solo sesiones humanas',
humanOnlyHint: 'Oculta por defecto el ruido de subagentes y del monitor de sesiones',
liveMonitorHumanOnly: 'Monitor en vivo: mostrar solo sesiones humanas',
liveMonitorHumanOnlyHint: 'Oculta por defecto el ruido de subagentes y del monitor de sesiones en el monitor en vivo',
atHourHint: 'Reiniciar sesion a esta hora todos los dias',
},
privacy: {
+16 -1
View File
@@ -73,7 +73,18 @@ export default {
deleteSession: 'Supprimer cette session ?',
sessionDeleted: 'Session supprimee',
rename: 'Renommer',
copySessionId: 'Copier l\'ID de session',
pin: 'Épingler',
unpin: 'Désépingler',
pinned: 'Épinglés',
chatMode: 'Chat',
liveMode: 'Direct',
liveSessions: 'Sessions en direct',
recentBadge: 'Récent',
linkedSessions: '{count} sessions liées',
noVisibleMessages: 'Aucun message visible par lhumain.',
monitorRoleUser: 'Utilisateur',
monitorRoleAssistant: 'Assistant',
copySessionId: "Copier l'ID de session",
renamed: 'Renomme',
renameFailed: 'Echec du renommage',
renameSession: 'Renommer la session',
@@ -338,6 +349,10 @@ export default {
idleMinutes: 'Delai d\'inactivite',
idleMinutesHint: 'Temps d\'attente avant reinitialisation automatique (minutes)',
atHour: 'Heure de reinitialisation planifiee',
humanOnly: 'Afficher uniquement les sessions humaines',
humanOnlyHint: 'Masquer par défaut le bruit des sous-agents et du moniteur de session',
liveMonitorHumanOnly: 'Moniteur live : nafficher que les sessions humaines',
liveMonitorHumanOnlyHint: 'Masquer par défaut le bruit des sous-agents et du moniteur de session dans le moniteur live',
atHourHint: 'Reinitialiser la session a cette heure chaque jour',
},
privacy: {
+15
View File
@@ -73,6 +73,17 @@ export default {
deleteSession: 'このセッションを削除しますか?',
sessionDeleted: 'セッションを削除しました',
rename: '名前変更',
pin: 'ピン留め',
unpin: 'ピン留め解除',
pinned: 'ピン留め',
chatMode: 'チャット',
liveMode: 'ライブ',
liveSessions: 'ライブセッション',
recentBadge: '最近',
linkedSessions: '{count} 件の関連',
noVisibleMessages: '人間向けに表示できるメッセージはありません。',
monitorRoleUser: 'ユーザー',
monitorRoleAssistant: 'アシスタント',
copySessionId: 'セッション ID をコピー',
renamed: '名前を変更しました',
renameFailed: '名前の変更に失敗しました',
@@ -338,6 +349,10 @@ export default {
idleMinutes: 'アイドルタイムアウト',
idleMinutesHint: '自動リセットまでの待機時間(分)',
atHour: 'スケジュールリセット時刻',
humanOnly: '人間のセッションのみ表示',
humanOnlyHint: 'サブエージェントやセッション監視ノイズを既定で隠します',
liveMonitorHumanOnly: 'ライブモニター: 人間のセッションのみ表示',
liveMonitorHumanOnlyHint: 'ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します',
atHourHint: '毎日指定時刻にセッションをリセット',
},
privacy: {
+15
View File
@@ -73,6 +73,17 @@ export default {
deleteSession: '이 세션을 삭제하시겠습니까?',
sessionDeleted: '세션이 삭제되었습니다',
rename: '이름 변경',
pin: '고정',
unpin: '고정 해제',
pinned: '고정됨',
chatMode: '채팅',
liveMode: '라이브',
liveSessions: '라이브 세션',
recentBadge: '최근',
linkedSessions: '{count}개 연결됨',
noVisibleMessages: '사람이 볼 수 있는 메시지가 없습니다.',
monitorRoleUser: '사용자',
monitorRoleAssistant: '어시스턴트',
copySessionId: '세션 ID 복사',
renamed: '이름이 변경되었습니다',
renameFailed: '이름 변경 실패',
@@ -338,6 +349,10 @@ export default {
idleMinutes: '유휴 시간초과',
idleMinutesHint: '자동 초기화 대기 시간 (분)',
atHour: '예약 초기화 시간',
humanOnly: '사람 세션만 표시',
humanOnlyHint: '하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다',
liveMonitorHumanOnly: '라이브 모니터: 사람 세션만 표시',
liveMonitorHumanOnlyHint: '라이브 모니터에서 하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다',
atHourHint: '매일 지정한 시간에 세션 초기화',
},
privacy: {
+16 -1
View File
@@ -73,7 +73,18 @@ export default {
deleteSession: 'Excluir esta sessao?',
sessionDeleted: 'Sessao excluida',
rename: 'Renomear',
copySessionId: 'Copiar ID da sessao',
pin: 'Fixar',
unpin: 'Desafixar',
pinned: 'Fixadas',
chatMode: 'Chat',
liveMode: 'Ao vivo',
liveSessions: 'Sessões ao vivo',
recentBadge: 'Recente',
linkedSessions: '{count} vinculadas',
noVisibleMessages: 'Nenhuma mensagem visível para humanos.',
monitorRoleUser: 'Usuário',
monitorRoleAssistant: 'Assistente',
copySessionId: 'Copiar ID da sessão',
renamed: 'Renomeado',
renameFailed: 'Falha ao renomear',
renameSession: 'Renomear sessao',
@@ -338,6 +349,10 @@ export default {
idleMinutes: 'Timeout de inatividade',
idleMinutesHint: 'Tempo de espera antes da reinicializacao automatica (minutos)',
atHour: 'Horario de reinicializacao agendada',
humanOnly: 'Mostrar apenas sessões humanas',
humanOnlyHint: 'Oculta por padrão o ruído de subagentes e do monitor de sessões',
liveMonitorHumanOnly: 'Monitor ao vivo: mostrar apenas sessões humanas',
liveMonitorHumanOnlyHint: 'Oculta por padrão o ruído de subagentes e do monitor de sessões no monitor ao vivo',
atHourHint: 'Reiniciar sessao neste horario diariamente',
},
privacy: {
+15
View File
@@ -86,6 +86,17 @@ export default {
deleteSession: '确定删除此会话?',
sessionDeleted: '会话已删除',
rename: '重命名',
pin: '置顶',
unpin: '取消置顶',
pinned: '已置顶',
chatMode: '聊天',
liveMode: '实时',
liveSessions: '实时会话',
recentBadge: '最近',
linkedSessions: '关联 {count} 个会话',
noVisibleMessages: '没有人类可见消息。',
monitorRoleUser: '用户',
monitorRoleAssistant: '助手',
copySessionId: '复制会话 ID',
renamed: '已重命名',
renameFailed: '重命名失败',
@@ -361,6 +372,10 @@ export default {
idleMinutes: '空闲超时',
idleMinutesHint: '无操作后自动重置的等待时间(分钟)',
atHour: '定时重置时间',
humanOnly: '仅显示人类会话',
humanOnlyHint: '默认隐藏子代理和会话监看噪音',
liveMonitorHumanOnly: '实时监看:仅显示人类会话',
liveMonitorHumanOnlyHint: '在实时监看中默认隐藏子代理和会话监看噪音',
atHourHint: '每天在指定小时重置会话',
},
privacy: {