feat(sessions): show a pending-question indicator on session rows
Adds a per-session pending-question badge to sidebar rows, driven by the live directory-store question state through a dedicated per-session subscription channel so unrelated streaming never re-renders rows. Collapsed parent rows roll up pending questions of hidden descendants from their owning directory stores without bootstrapping them. Question state is cloned on session delete/archive so badges clear when sessions disappear. Adds the questionChangeCallbacks sync performance counter, i18n keys for all locales, and unit tests for the subscription channel and scope selection. Fixes #2634
This commit is contained in:
@@ -473,6 +473,8 @@ export const dict = {
|
||||
'sessions.sidebar.session.status.unread': 'Ungelesene Updates',
|
||||
'sessions.sidebar.session.status.pinned': 'Angeheftete Sitzung',
|
||||
'sessions.sidebar.session.status.permissionRequired': 'Berechtigung erforderlich',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '1 ausstehende Frage',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '{count} ausstehende Fragen',
|
||||
'sessions.sidebar.session.status.activeFor': 'Seit {duration} aktiv',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': 'Letzter Durchlauf dauerte {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': 'Untersitzungen einklappen',
|
||||
|
||||
@@ -530,6 +530,8 @@ export const dict = {
|
||||
'sessions.sidebar.session.status.pinned': 'Pinned session',
|
||||
'sessions.sidebar.session.status.movingToWorktree': 'Moving session to a new worktree',
|
||||
'sessions.sidebar.session.status.permissionRequired': 'Permission required',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '1 pending question',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '{count} pending questions',
|
||||
'sessions.sidebar.session.status.activeFor': 'Active for {duration}',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': 'Last turn took {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': 'Collapse subsessions',
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.sidebar.session.status.pinned": "Sesión anclada",
|
||||
"sessions.sidebar.session.status.movingToWorktree": "Moviendo la sesión a un worktree nuevo",
|
||||
"sessions.sidebar.session.status.permissionRequired": "Permiso requerido",
|
||||
"sessions.sidebar.session.status.questionPendingSingle": "1 pregunta pendiente",
|
||||
"sessions.sidebar.session.status.questionPendingMany": "{count} preguntas pendientes",
|
||||
"sessions.sidebar.session.status.activeFor": "Activa desde hace {duration}",
|
||||
"sessions.sidebar.session.status.lastTurnDuration": "El último turno duró {duration}",
|
||||
"sessions.sidebar.session.subsessions.collapse": "Colapsar subsesiones",
|
||||
|
||||
@@ -366,6 +366,8 @@ export const dict = {
|
||||
'sessions.sidebar.session.status.pinned': 'Session épinglée',
|
||||
'sessions.sidebar.session.status.movingToWorktree': 'Déplacement de la session vers un nouveau worktree',
|
||||
'sessions.sidebar.session.status.permissionRequired': 'Autorisation requise',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '1 question en attente',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '{count} questions en attente',
|
||||
'sessions.sidebar.session.status.activeFor': 'Active depuis {duration}',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': 'Le dernier tour a duré {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': 'Réduire les sous-sessions',
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.status.pinned': 'ピン留めされたセッション',
|
||||
'sessions.sidebar.session.status.movingToWorktree': 'セッションを新しいworktreeへ移動中',
|
||||
'sessions.sidebar.session.status.permissionRequired': '権限が必要です',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '保留中の質問が1件あります',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '保留中の質問が{count}件あります',
|
||||
'sessions.sidebar.session.status.activeFor': 'アクティブ時間 {duration}',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': '前回のターンの所要時間 {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': 'サブセッションを折りたたむ',
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.status.pinned': '고정된 세션',
|
||||
'sessions.sidebar.session.status.movingToWorktree': '세션을 새 worktree로 이동하는 중',
|
||||
'sessions.sidebar.session.status.permissionRequired': '권한 필요',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '대기 중인 질문 1개',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '대기 중인 질문 {count}개',
|
||||
'sessions.sidebar.session.status.activeFor': '{duration} 동안 활성 상태',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': '마지막 턴 소요 시간 {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': '하위 세션 접기',
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.status.pinned': 'Przypięta sesja',
|
||||
'sessions.sidebar.session.status.movingToWorktree': 'Przenoszenie sesji do nowego worktree',
|
||||
'sessions.sidebar.session.status.permissionRequired': 'Wymagane uprawnienie',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '1 oczekujące pytanie',
|
||||
'sessions.sidebar.session.status.questionPendingMany': 'Liczba oczekujących pytań: {count}',
|
||||
'sessions.sidebar.session.status.activeFor': 'Aktywna od {duration}',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': 'Ostatnia tura trwała {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': 'Zwiń pod-sesje',
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.sidebar.session.status.pinned": "Sessão fixada",
|
||||
"sessions.sidebar.session.status.movingToWorktree": "Movendo a sessão para um novo worktree",
|
||||
"sessions.sidebar.session.status.permissionRequired": "Permissão obrigatória",
|
||||
"sessions.sidebar.session.status.questionPendingSingle": "1 pergunta pendente",
|
||||
"sessions.sidebar.session.status.questionPendingMany": "{count} perguntas pendentes",
|
||||
"sessions.sidebar.session.status.activeFor": "Ativa há {duration}",
|
||||
"sessions.sidebar.session.status.lastTurnDuration": "O último turno levou {duration}",
|
||||
"sessions.sidebar.session.subsessions.collapse": "Recolher subsessões",
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.sidebar.session.status.pinned": "Закріплений сесія",
|
||||
"sessions.sidebar.session.status.movingToWorktree": "Перенесення сесії в новий worktree",
|
||||
"sessions.sidebar.session.status.permissionRequired": "Потрібен дозвіл",
|
||||
"sessions.sidebar.session.status.questionPendingSingle": "1 запитання очікує відповіді",
|
||||
"sessions.sidebar.session.status.questionPendingMany": "Кількість запитань, що очікують відповіді: {count}",
|
||||
"sessions.sidebar.session.status.activeFor": "Активна вже {duration}",
|
||||
"sessions.sidebar.session.status.lastTurnDuration": "Останній хід тривав {duration}",
|
||||
"sessions.sidebar.session.subsessions.collapse": "Згорнути підсесії",
|
||||
|
||||
@@ -531,6 +531,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.status.pinned': '已置顶会话',
|
||||
'sessions.sidebar.session.status.movingToWorktree': '正在将会话移至新工作树',
|
||||
'sessions.sidebar.session.status.permissionRequired': '需要权限',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '1 个待回答问题',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '{count} 个待回答问题',
|
||||
'sessions.sidebar.session.status.activeFor': '已活动 {duration}',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': '上一轮耗时 {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': '折叠子会话',
|
||||
|
||||
@@ -544,6 +544,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.sidebar.session.status.pinned': '已釘選會話',
|
||||
'sessions.sidebar.session.status.movingToWorktree': '正在將會話移至新工作樹',
|
||||
'sessions.sidebar.session.status.permissionRequired': '需要權限',
|
||||
'sessions.sidebar.session.status.questionPendingSingle': '1 個待回答問題',
|
||||
'sessions.sidebar.session.status.questionPendingMany': '{count} 個待回答問題',
|
||||
'sessions.sidebar.session.status.activeFor': '已活動 {duration}',
|
||||
'sessions.sidebar.session.status.lastTurnDuration': '上一輪耗時 {duration}',
|
||||
'sessions.sidebar.session.subsessions.collapse': '摺疊子會話',
|
||||
|
||||
Reference in New Issue
Block a user