Make the workspace right pane a first-class tab host (#3287)

* feat(app): add persistent workspace side panes

Keep the common review and file-browsing workflow beside the active agent without tearing down pane contents. Workspace tabs now share one compact chip language, assistant file links route into the retained right pane, and diff/file trees share stable geometry.

* fix(app): localize pull request empty state

* test(app): update explorer pane coverage

* fix(app): preserve explorer pane workflows

* test(app): make explorer tab selection idempotent

* fix(app): persist workspace review pins

* fix(app): preserve sidebar scrim drag hook

* fix(app): restore companion pane interactions

* test(app): follow selected sidebar surface
This commit is contained in:
Mohamed Boudra
2026-08-16 18:18:32 +02:00
committed by GitHub
parent 6dcf6a4b08
commit ab274d635e
81 changed files with 2900 additions and 1051 deletions
+9
View File
@@ -129,6 +129,15 @@ describe("translation resources", () => {
expect(countMatchingEnglishStrings(zhCN)).toBeLessThan(maxFallbackStrings);
});
it("localizes the pull request empty state in every supported language", () => {
for (const resource of [ar, es, fr, ja, ko, ptBR, ru, zhCN]) {
expect(resource.panels.pullRequest.emptyTitle).not.toBe(en.panels.pullRequest.emptyTitle);
expect(resource.panels.pullRequest.emptyDescription).not.toBe(
en.panels.pullRequest.emptyDescription,
);
}
});
it("preserves interpolation placeholders in every language", () => {
expect(findInterpolationMismatches(ar)).toEqual([]);
expect(findInterpolationMismatches(es)).toEqual([]);
+15
View File
@@ -587,6 +587,7 @@ export const ar: TranslationResources = {
renameAgent: "إعادة تسمية الوكيل",
},
actions: {
newTab: "علامة تبويب جديدة",
newAgent: "وكيل جديد",
newTerminal: "محطة جديدة",
preparingTerminal: "إعداد علامة التبويب المحطة الطرفية",
@@ -595,6 +596,9 @@ export const ar: TranslationResources = {
exitFocusMode: "إنهاء وضع التركيز",
splitRight: "تقسيم الجزء الأيمن",
splitDown: "تقسيم الجزء لأسفل",
changes: "التغييرات",
files: "الملفات",
pullRequest: "طلب السحب",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "تثبيت",
@@ -1658,6 +1662,17 @@ export const ar: TranslationResources = {
reloadMessage: "ستفقد تغييراتك المحلية.",
},
},
files: {
label: "الملفات",
subtitle: "ملفات مساحة العمل",
tooltip: "تصفح ملفات مساحة العمل",
},
pullRequest: {
label: "طلب السحب",
subtitle: "تفاصيل طلب السحب",
emptyTitle: "لا يوجد طلب سحب بعد",
emptyDescription: "أنشئ طلب سحب لنسخة العمل هذه لعرض تفاصيله هنا.",
},
diff: {
changesLabel: "التغييرات",
changesSubtitle: "فروقات شجرة العمل",
+15
View File
@@ -585,6 +585,7 @@ export const en = {
renameAgent: "Rename agent",
},
actions: {
newTab: "New tab",
newAgent: "New agent",
newTerminal: "New terminal",
preparingTerminal: "Preparing terminal tab",
@@ -593,6 +594,9 @@ export const en = {
exitFocusMode: "Exit focus mode",
splitRight: "Split pane right",
splitDown: "Split pane down",
changes: "Changes",
files: "Files",
pullRequest: "Pull request",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "Pin",
@@ -1668,6 +1672,17 @@ export const en = {
reloadMessage: "Your local changes will be lost.",
},
},
files: {
label: "Files",
subtitle: "Workspace files",
tooltip: "Browse workspace files",
},
pullRequest: {
label: "Pull request",
subtitle: "Pull request details",
emptyTitle: "No pull request yet",
emptyDescription: "Create a pull request for this checkout to see its details here.",
},
diff: {
changesLabel: "Changes",
changesSubtitle: "Working tree diff",
+15
View File
@@ -592,6 +592,7 @@ export const es: TranslationResources = {
renameAgent: "Cambiar nombre del agente",
},
actions: {
newTab: "Nueva pestaña",
newAgent: "Nuevo agente",
newTerminal: "Nueva terminal",
preparingTerminal: "Preparando la pestaña del terminal",
@@ -600,6 +601,9 @@ export const es: TranslationResources = {
exitFocusMode: "Salir del modo de concentración",
splitRight: "Panel dividido a la derecha",
splitDown: "Dividir panel hacia abajo",
changes: "Cambios",
files: "Archivos",
pullRequest: "Solicitud de extracción",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "Fijar",
@@ -1701,6 +1705,17 @@ export const es: TranslationResources = {
reloadMessage: "Se perderán tus cambios locales.",
},
},
files: {
label: "Archivos",
subtitle: "Archivos del espacio de trabajo",
tooltip: "Explorar archivos del espacio de trabajo",
},
pullRequest: {
label: "Solicitud de extracción",
subtitle: "Detalles de la solicitud de extracción",
emptyTitle: "Aún no hay ninguna solicitud de extracción",
emptyDescription: "Crea una solicitud para este checkout y consulta aquí sus detalles.",
},
diff: {
changesLabel: "Cambios",
changesSubtitle: "Diferencias del árbol de trabajo",
+16
View File
@@ -592,6 +592,7 @@ export const fr: TranslationResources = {
renameAgent: "Renommer l'agent",
},
actions: {
newTab: "Nouvel onglet",
newAgent: "Nouvel agent",
newTerminal: "Nouveau terminal",
preparingTerminal: "Préparation de l'onglet du terminal",
@@ -600,6 +601,9 @@ export const fr: TranslationResources = {
exitFocusMode: "Quitter le mode concentration",
splitRight: "Volet divisé à droite",
splitDown: "Diviser le volet vers le bas",
changes: "Modifications",
files: "Fichiers",
pullRequest: "Demande de fusion",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "Épingler",
@@ -1705,6 +1709,18 @@ export const fr: TranslationResources = {
reloadMessage: "Vos modifications locales seront perdues.",
},
},
files: {
label: "Fichiers",
subtitle: "Fichiers de l’espace de travail",
tooltip: "Parcourir les fichiers de l’espace de travail",
},
pullRequest: {
label: "Demande de fusion",
subtitle: "Détails de la demande de fusion",
emptyTitle: "Aucune demande de fusion pour le moment",
emptyDescription:
"Créez une demande de fusion pour cette copie de travail afin d’afficher ses détails ici.",
},
diff: {
changesLabel: "Modifications",
changesSubtitle: "Différences de l'arbre de travail",
+16
View File
@@ -592,6 +592,7 @@ export const ja: TranslationResources = {
renameAgent: "エージェントの名前を変更",
},
actions: {
newTab: "新しいタブ",
newAgent: "新しいエージェント",
newTerminal: "新しいターミナル",
preparingTerminal: "ターミナルタブを準備中",
@@ -600,6 +601,9 @@ export const ja: TranslationResources = {
exitFocusMode: "フォーカスモードを終了",
splitRight: "右にペインを分割",
splitDown: "下にペインを分割",
changes: "変更",
files: "ファイル",
pullRequest: "プルリクエスト",
terminalProfilesMenu: "ターミナルプロファイル",
editTerminalProfiles: "プロファイルを編集…",
pinTarget: "ピン留め",
@@ -1674,6 +1678,18 @@ export const ja: TranslationResources = {
reloadMessage: "ローカルの変更は失われます。",
},
},
files: {
label: "ファイル",
subtitle: "ワークスペースのファイル",
tooltip: "ワークスペースのファイルを参照",
},
pullRequest: {
label: "プルリクエスト",
subtitle: "プルリクエストの詳細",
emptyTitle: "プルリクエストはまだありません",
emptyDescription:
"このチェックアウトのプルリクエストを作成すると、ここに詳細が表示されます。",
},
diff: {
changesLabel: "変更",
changesSubtitle: "作業ツリーの差分",
+15
View File
@@ -589,6 +589,7 @@ export const ko: TranslationResources = {
renameAgent: "에이전트 이름 변경",
},
actions: {
newTab: "새 탭",
newAgent: "새 에이전트",
newTerminal: "새 터미널",
preparingTerminal: "터미널 탭 준비 중",
@@ -597,6 +598,9 @@ export const ko: TranslationResources = {
exitFocusMode: "집중 모드 종료",
splitRight: "창을 오른쪽으로 분할",
splitDown: "창을 아래로 분할",
changes: "변경 사항",
files: "파일",
pullRequest: "풀 리퀘스트",
terminalProfilesMenu: "터미널 프로필",
editTerminalProfiles: "프로필 편집…",
pinTarget: "고정",
@@ -1668,6 +1672,17 @@ export const ko: TranslationResources = {
reloadMessage: "로컬 변경사항이 손실됩니다.",
},
},
files: {
label: "파일",
subtitle: "워크스페이스 파일",
tooltip: "워크스페이스 파일 탐색",
},
pullRequest: {
label: "풀 리퀘스트",
subtitle: "풀 리퀘스트 세부 정보",
emptyTitle: "아직 풀 리퀘스트가 없습니다",
emptyDescription: "이 체크아웃에 풀 리퀘스트를 만들면 세부 정보가 여기에 표시됩니다.",
},
diff: {
changesLabel: "변경 사항",
changesSubtitle: "작업 트리 diff",
+15
View File
@@ -591,6 +591,7 @@ export const ptBR: TranslationResources = {
renameAgent: "Renomear agente",
},
actions: {
newTab: "Nova aba",
newAgent: "Novo agente",
newTerminal: "Novo terminal",
preparingTerminal: "Preparando aba de terminal",
@@ -599,6 +600,9 @@ export const ptBR: TranslationResources = {
exitFocusMode: "Sair do modo de foco",
splitRight: "Dividir painel à direita",
splitDown: "Dividir painel abaixo",
changes: "Alterações",
files: "Arquivos",
pullRequest: "Pull request",
terminalProfilesMenu: "Perfis de terminal",
editTerminalProfiles: "Editar perfis…",
pinTarget: "Fixar",
@@ -1687,6 +1691,17 @@ export const ptBR: TranslationResources = {
reloadMessage: "Suas alterações locais serão perdidas.",
},
},
files: {
label: "Arquivos",
subtitle: "Arquivos do espaço de trabalho",
tooltip: "Explorar arquivos do espaço de trabalho",
},
pullRequest: {
label: "Pull request",
subtitle: "Detalhes do pull request",
emptyTitle: "Ainda não há pull request",
emptyDescription: "Crie um pull request para este checkout para ver os detalhes aqui.",
},
diff: {
changesLabel: "Alterações",
changesSubtitle: "Diff da árvore de trabalho",
+16
View File
@@ -591,6 +591,7 @@ export const ru: TranslationResources = {
renameAgent: "Переименовать агента",
},
actions: {
newTab: "Новая вкладка",
newAgent: "Новый агент",
newTerminal: "Новый терминал",
preparingTerminal: "Подготовка вкладки терминала",
@@ -599,6 +600,9 @@ export const ru: TranslationResources = {
exitFocusMode: "Выйти из режима фокусировки",
splitRight: "Разделить панель справа",
splitDown: "Разделить панель вниз",
changes: "Изменения",
files: "Файлы",
pullRequest: "Запрос на слияние",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "Закрепить",
@@ -1692,6 +1696,18 @@ export const ru: TranslationResources = {
reloadMessage: "Локальные изменения будут потеряны.",
},
},
files: {
label: "Файлы",
subtitle: "Файлы рабочего пространства",
tooltip: "Просмотр файлов рабочего пространства",
},
pullRequest: {
label: "Запрос на слияние",
subtitle: "Сведения о запросе на слияние",
emptyTitle: "Запроса на слияние пока нет",
emptyDescription:
"Создайте запрос на слияние для этой рабочей копии, чтобы увидеть здесь его сведения.",
},
diff: {
changesLabel: "Изменения",
changesSubtitle: "Различия рабочего дерева",
+15
View File
@@ -587,6 +587,7 @@ export const zhCN: TranslationResources = {
renameAgent: "重命名 Agent",
},
actions: {
newTab: "新建标签页",
newAgent: "新建 Agent",
newTerminal: "新建 Terminal",
preparingTerminal: "正在准备 Terminal 标签",
@@ -595,6 +596,9 @@ export const zhCN: TranslationResources = {
exitFocusMode: "退出专注模式",
splitRight: "向右拆分窗格",
splitDown: "向下拆分窗格",
changes: "更改",
files: "文件",
pullRequest: "拉取请求",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "固定",
@@ -1638,6 +1642,17 @@ export const zhCN: TranslationResources = {
reloadMessage: "本地更改将丢失。",
},
},
files: {
label: "文件",
subtitle: "工作区文件",
tooltip: "浏览工作区文件",
},
pullRequest: {
label: "拉取请求",
subtitle: "拉取请求详情",
emptyTitle: "尚无拉取请求",
emptyDescription: "为此检出创建拉取请求后,可在此处查看其详情。",
},
diff: {
changesLabel: "更改",
changesSubtitle: "工作区差异",