diff --git a/packages/ui/src/components/session/SessionSidebar.tsx b/packages/ui/src/components/session/SessionSidebar.tsx index a35a8697..7e865b20 100644 --- a/packages/ui/src/components/session/SessionSidebar.tsx +++ b/packages/ui/src/components/session/SessionSidebar.tsx @@ -1790,10 +1790,11 @@ const SessionSidebarComponent: React.FC = ({ folderScopeKey: chatsRoot, folderScopes, draftTarget: 'chat', + emptyMessage: t('sessions.sidebar.activity.chatsEmpty'), sessions: items.map((item) => item.node), }; return renderGroupSessions(group, 'managed-chats', null, true); - }, [homeDirectory, renderGroupSessions, renderSessionNode]); + }, [homeDirectory, renderGroupSessions, renderSessionNode, t]); const topContent = React.useMemo( () => (!isVSCode && !hasSessionSearchQuery && hasActivitySectionItems) ? ( diff --git a/packages/ui/src/components/session/sidebar/DOCUMENTATION.md b/packages/ui/src/components/session/sidebar/DOCUMENTATION.md index 12c2b1ce..0e894e2d 100644 --- a/packages/ui/src/components/session/sidebar/DOCUMENTATION.md +++ b/packages/ui/src/components/session/sidebar/DOCUMENTATION.md @@ -16,6 +16,7 @@ - Root session menus can quickly create a worktree from the session directory's current branch and move the full session subtree there while idle. - Managed Chats never offer the worktree-move action in either the sidebar row menu or the active-session header menu because their directories are not project repositories. - Managed Chats use the shared Chats root as their folder scope. Their activity section renders the normal folder tree, and sessions created from a Chats folder are assigned back to that root-scoped folder after their date/session directory materializes. Per-session folder scopes created by older builds remain visible for compatibility. +- An empty Chats section says that there are no chats yet; it never reuses the project/workspace empty message. - The New session keyboard command inherits the active materialized session directory. Explicit sidebar entry points, including the top New session row and the Chats `+`, open a fresh managed Chat draft instead. - The new-worktree keyboard command is a silent no-op while a managed Chat draft is open. It must not retarget that draft to the active project or show a Git/worktree error because Chats never participate in worktrees. - Directory loading is demand-driven: the sidebar publishes one complete priority plan for all known project/worktree directories, while the sync layer owns bounded execution. diff --git a/packages/ui/src/components/session/sidebar/SessionGroupSection.tsx b/packages/ui/src/components/session/sidebar/SessionGroupSection.tsx index 9e6f2679..cfab4159 100644 --- a/packages/ui/src/components/session/sidebar/SessionGroupSection.tsx +++ b/packages/ui/src/components/session/sidebar/SessionGroupSection.tsx @@ -1056,7 +1056,7 @@ function SessionGroupSectionBase(props: Props): React.ReactNode { ) : bootstrapFailureNotice ? bootstrapFailureNotice - : t('sessions.sidebar.group.empty.noSessionsInWorkspace')} + : group.emptyMessage ?? t('sessions.sidebar.group.empty.noSessionsInWorkspace')} ) : null} {totalSessions > 0 && bootstrapFailureNotice ? ( diff --git a/packages/ui/src/components/session/sidebar/types.ts b/packages/ui/src/components/session/sidebar/types.ts index 450692b8..c3700a2a 100644 --- a/packages/ui/src/components/session/sidebar/types.ts +++ b/packages/ui/src/components/session/sidebar/types.ts @@ -30,6 +30,7 @@ export type SessionGroup = { */ folderScopes?: SessionGroupFolderScope[]; draftTarget?: 'chat' | 'project'; + emptyMessage?: string; sessions: SessionNode[]; }; diff --git a/packages/ui/src/lib/i18n/messages/de.ts b/packages/ui/src/lib/i18n/messages/de.ts index d957a7b9..673ec2fe 100644 --- a/packages/ui/src/lib/i18n/messages/de.ts +++ b/packages/ui/src/lib/i18n/messages/de.ts @@ -416,6 +416,7 @@ export const dict = { 'sessions.sidebar.empty.noMatches.description': 'Versuchen Sie einen anderen Titel, Branch, Ordner oder Pfad.', 'sessions.sidebar.activity.recentTitle': 'kürzlich', 'sessions.sidebar.activity.chatsTitle': 'Chats', + 'sessions.sidebar.activity.chatsEmpty': 'Noch keine Chats.', 'chat.chatInput.chooseProject': 'Projekt auswählen', 'sessions.switcher.openAria': 'Sitzungswechsler öffnen', 'sessions.switcher.empty': 'Keine kürzlichen Sitzungen', diff --git a/packages/ui/src/lib/i18n/messages/en.ts b/packages/ui/src/lib/i18n/messages/en.ts index 981f2b8f..d10d992a 100644 --- a/packages/ui/src/lib/i18n/messages/en.ts +++ b/packages/ui/src/lib/i18n/messages/en.ts @@ -438,6 +438,7 @@ export const dict = { 'sessions.sidebar.empty.noMatches.description': 'Try a different title, branch, folder, or path.', 'sessions.sidebar.activity.recentTitle': 'recent', 'sessions.sidebar.activity.chatsTitle': 'chats', + 'sessions.sidebar.activity.chatsEmpty': 'No chats yet.', 'chat.chatInput.chooseProject': 'Choose project', 'sessions.archivePage.allDirectories': 'All directories', 'sessions.sidebar.header.displayMode.stickyHeaders': 'Sticky project headers', diff --git a/packages/ui/src/lib/i18n/messages/es.ts b/packages/ui/src/lib/i18n/messages/es.ts index 394cc771..344c4eed 100644 --- a/packages/ui/src/lib/i18n/messages/es.ts +++ b/packages/ui/src/lib/i18n/messages/es.ts @@ -439,6 +439,7 @@ export const dict: Record = { "sessions.sidebar.empty.noMatches.description": "Inténtalo con un título, rama, carpeta o ruta diferente.", "sessions.sidebar.activity.recentTitle": "reciente", "sessions.sidebar.activity.chatsTitle": "chats", + "sessions.sidebar.activity.chatsEmpty": "Aún no hay chats.", "chat.chatInput.chooseProject": "Elegir proyecto", "sessions.archivePage.allDirectories": "Todos los directorios", "sessions.sidebar.header.displayMode.stickyHeaders": "Encabezados de proyecto fijos", diff --git a/packages/ui/src/lib/i18n/messages/fr.ts b/packages/ui/src/lib/i18n/messages/fr.ts index 1315c8f7..14973f40 100644 --- a/packages/ui/src/lib/i18n/messages/fr.ts +++ b/packages/ui/src/lib/i18n/messages/fr.ts @@ -269,6 +269,7 @@ export const dict = { 'sessions.sidebar.empty.noMatches.description': 'Essayez un autre titre, branche, dossier ou chemin.', 'sessions.sidebar.activity.recentTitle': 'récent', 'sessions.sidebar.activity.chatsTitle': 'discussions', + 'sessions.sidebar.activity.chatsEmpty': 'Aucune discussion pour le moment.', 'chat.chatInput.chooseProject': 'Choisir un projet', 'sessions.archivePage.allDirectories': 'Tous les répertoires', 'sessions.sidebar.header.displayMode.stickyHeaders': 'Épingler les en-têtes de projet', diff --git a/packages/ui/src/lib/i18n/messages/ja.ts b/packages/ui/src/lib/i18n/messages/ja.ts index 09882066..bef4e313 100644 --- a/packages/ui/src/lib/i18n/messages/ja.ts +++ b/packages/ui/src/lib/i18n/messages/ja.ts @@ -439,6 +439,7 @@ export const dict: Record = { 'sessions.sidebar.empty.noMatches.description': '別のタイトル、ブランチ、フォルダ、パスをお試しください。', 'sessions.sidebar.activity.recentTitle': '最近', 'sessions.sidebar.activity.chatsTitle': 'チャット', + 'sessions.sidebar.activity.chatsEmpty': 'まだチャットはありません。', 'chat.chatInput.chooseProject': 'プロジェクトを選択', 'sessions.archivePage.allDirectories': 'すべてのディレクトリ', 'sessions.sidebar.header.displayMode.stickyHeaders': 'プロジェクトヘッダーを固定', diff --git a/packages/ui/src/lib/i18n/messages/ko.ts b/packages/ui/src/lib/i18n/messages/ko.ts index ef0eca76..5e2ca75a 100644 --- a/packages/ui/src/lib/i18n/messages/ko.ts +++ b/packages/ui/src/lib/i18n/messages/ko.ts @@ -439,6 +439,7 @@ export const dict: Record = { 'sessions.sidebar.empty.noMatches.description': '다른 제목, 브랜치, 폴더 또는 경로로 검색해 보세요.', 'sessions.sidebar.activity.recentTitle': '최근', 'sessions.sidebar.activity.chatsTitle': '채팅', + 'sessions.sidebar.activity.chatsEmpty': '아직 채팅이 없습니다.', 'chat.chatInput.chooseProject': '프로젝트 선택', 'sessions.archivePage.allDirectories': '모든 디렉터리', 'sessions.sidebar.header.displayMode.stickyHeaders': '프로젝트 헤더 고정', diff --git a/packages/ui/src/lib/i18n/messages/pl.ts b/packages/ui/src/lib/i18n/messages/pl.ts index fbe1dc4f..73d8a952 100644 --- a/packages/ui/src/lib/i18n/messages/pl.ts +++ b/packages/ui/src/lib/i18n/messages/pl.ts @@ -250,6 +250,7 @@ export const dict: Record = { 'sessions.sidebar.empty.noMatches.description': 'Spróbuj innego tytułu, gałęzi, folderu lub ścieżki.', 'sessions.sidebar.activity.recentTitle': 'ostatnie', 'sessions.sidebar.activity.chatsTitle': 'czaty', + 'sessions.sidebar.activity.chatsEmpty': 'Nie ma jeszcze czatów.', 'chat.chatInput.chooseProject': 'Wybierz projekt', 'sessions.archivePage.allDirectories': 'Wszystkie katalogi', 'sessions.sidebar.header.displayMode.stickyHeaders': 'Przyklejone nagłówki projektów', diff --git a/packages/ui/src/lib/i18n/messages/pt-BR.ts b/packages/ui/src/lib/i18n/messages/pt-BR.ts index a467bc91..2fe14a2c 100644 --- a/packages/ui/src/lib/i18n/messages/pt-BR.ts +++ b/packages/ui/src/lib/i18n/messages/pt-BR.ts @@ -439,6 +439,7 @@ export const dict: Record = { "sessions.sidebar.empty.noMatches.description": "Tente com outro título, branch, pasta ou caminho.", "sessions.sidebar.activity.recentTitle": "recente", "sessions.sidebar.activity.chatsTitle": "conversas", + "sessions.sidebar.activity.chatsEmpty": "Ainda não há conversas.", "chat.chatInput.chooseProject": "Escolher projeto", "sessions.archivePage.allDirectories": "Todos os diretórios", "sessions.sidebar.header.displayMode.stickyHeaders": "Cabeçalhos de projeto fixos", diff --git a/packages/ui/src/lib/i18n/messages/uk.ts b/packages/ui/src/lib/i18n/messages/uk.ts index b87b7876..d7675954 100644 --- a/packages/ui/src/lib/i18n/messages/uk.ts +++ b/packages/ui/src/lib/i18n/messages/uk.ts @@ -439,6 +439,7 @@ export const dict: Record = { "sessions.sidebar.empty.noMatches.description": "Спробуйте інший заголовок, гілку, папку або шлях.", "sessions.sidebar.activity.recentTitle": "Останні", "sessions.sidebar.activity.chatsTitle": "Чати", + "sessions.sidebar.activity.chatsEmpty": "Чатів ще немає.", "chat.chatInput.chooseProject": "Вибрати проєкт", "sessions.archivePage.allDirectories": "Всі директорії", "sessions.sidebar.header.displayMode.stickyHeaders": "Липкі заголовки проектів", diff --git a/packages/ui/src/lib/i18n/messages/zh-CN.ts b/packages/ui/src/lib/i18n/messages/zh-CN.ts index e7852359..50b5164d 100644 --- a/packages/ui/src/lib/i18n/messages/zh-CN.ts +++ b/packages/ui/src/lib/i18n/messages/zh-CN.ts @@ -439,6 +439,7 @@ export const dict: Record = { 'sessions.sidebar.empty.noMatches.description': '请尝试其他标题、分支、文件夹或路径。', 'sessions.sidebar.activity.recentTitle': '最近', 'sessions.sidebar.activity.chatsTitle': '聊天', + 'sessions.sidebar.activity.chatsEmpty': '暂无聊天。', 'chat.chatInput.chooseProject': '选择项目', 'sessions.archivePage.allDirectories': '所有目录', 'sessions.sidebar.header.displayMode.stickyHeaders': '固定项目标题', diff --git a/packages/ui/src/lib/i18n/messages/zh-TW.ts b/packages/ui/src/lib/i18n/messages/zh-TW.ts index c8122b4c..644b95c1 100644 --- a/packages/ui/src/lib/i18n/messages/zh-TW.ts +++ b/packages/ui/src/lib/i18n/messages/zh-TW.ts @@ -452,6 +452,7 @@ export const dict: Record = { 'sessions.sidebar.empty.noMatches.description': '請嘗試其他標題、分支、資料夾或路徑。', 'sessions.sidebar.activity.recentTitle': '最近', 'sessions.sidebar.activity.chatsTitle': '聊天', + 'sessions.sidebar.activity.chatsEmpty': '尚無聊天。', 'chat.chatInput.chooseProject': '選擇專案', 'sessions.archivePage.allDirectories': '所有目錄', 'sessions.sidebar.header.displayMode.stickyHeaders': '固定專案標題',