From d360089b80615e4455fd1dd9b53d360de7b1c5ff Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Mon, 9 Feb 2026 13:03:44 +0000 Subject: [PATCH] feat(ui): add Session Changes sidebar section Show session-level file changes in the right drawer with per-file +additions/-deletions and a Show changes button that appears only when diffs exist. --- .../components/instance/instance-shell2.tsx | 74 +++++++++++++++++++ .../ui/src/lib/i18n/messages/en/instance.ts | 7 ++ .../ui/src/lib/i18n/messages/es/instance.ts | 7 ++ .../ui/src/lib/i18n/messages/fr/instance.ts | 7 ++ .../ui/src/lib/i18n/messages/ja/instance.ts | 7 ++ .../ui/src/lib/i18n/messages/ru/instance.ts | 7 ++ .../src/lib/i18n/messages/zh-Hans/instance.ts | 7 ++ 7 files changed, 116 insertions(+) diff --git a/packages/ui/src/components/instance/instance-shell2.tsx b/packages/ui/src/components/instance/instance-shell2.tsx index f4349229..23005b9d 100644 --- a/packages/ui/src/components/instance/instance-shell2.tsx +++ b/packages/ui/src/components/instance/instance-shell2.tsx @@ -304,6 +304,11 @@ const InstanceShell2: Component = (props) => { return activeSessions().get(sessionId) ?? null }) + const activeSessionDiffs = createMemo(() => { + const session = activeSessionForInstance() + return session?.diff + }) + const activeSessionUsage = createMemo(() => { const sessionId = activeSessionIdForInstance() if (!sessionId) return null @@ -960,6 +965,70 @@ const InstanceShell2: Component = (props) => { ) const RightDrawerContent = () => { + const renderSessionChanges = () => { + const sessionId = activeSessionIdForInstance() + if (!sessionId || sessionId === "info") { + return

{t("instanceShell.sessionChanges.noSessionSelected")}

+ } + + const diffs = activeSessionDiffs() + if (diffs === undefined) { + return

{t("instanceShell.sessionChanges.loading")}

+ } + + if (!Array.isArray(diffs) || diffs.length === 0) { + return

{t("instanceShell.sessionChanges.empty")}

+ } + + const sorted = [...diffs].sort((a, b) => String(a.file || "").localeCompare(String(b.file || ""))) + const totals = sorted.reduce( + (acc, item) => { + acc.additions += typeof item.additions === "number" ? item.additions : 0 + acc.deletions += typeof item.deletions === "number" ? item.deletions : 0 + return acc + }, + { additions: 0, deletions: 0 }, + ) + + return ( +
+
+ {t("instanceShell.sessionChanges.filesChanged", { count: sorted.length })} + + {`+${totals.additions}`} + {`-${totals.deletions}`} + +
+ +
+
+ + {(item) => ( +
+
+ {item.file} +
+
+ {`+${item.additions}`} + {`-${item.deletions}`} +
+
+ )} +
+
+
+ + +
+ ) + } + const renderPlanSectionContent = () => { const sessionId = activeSessionIdForInstance() if (!sessionId || sessionId === "info") { @@ -1034,6 +1103,11 @@ const InstanceShell2: Component = (props) => { } const sections = [ + { + id: "session-changes", + labelKey: "instanceShell.rightPanel.sections.sessionChanges", + render: renderSessionChanges, + }, { id: "plan", labelKey: "instanceShell.rightPanel.sections.plan", diff --git a/packages/ui/src/lib/i18n/messages/en/instance.ts b/packages/ui/src/lib/i18n/messages/en/instance.ts index d45f2c56..feb970f7 100644 --- a/packages/ui/src/lib/i18n/messages/en/instance.ts +++ b/packages/ui/src/lib/i18n/messages/en/instance.ts @@ -86,12 +86,19 @@ export const instanceMessages = { "instanceShell.empty.description": "Select a session to view messages", "instanceShell.rightPanel.title": "Status Panel", + "instanceShell.rightPanel.sections.sessionChanges": "Session Changes", "instanceShell.rightPanel.sections.plan": "Plan", "instanceShell.rightPanel.sections.backgroundProcesses": "Background Shells", "instanceShell.rightPanel.sections.mcp": "MCP Servers", "instanceShell.rightPanel.sections.lsp": "LSP Servers", "instanceShell.rightPanel.sections.plugins": "Plugins", + "instanceShell.sessionChanges.noSessionSelected": "Select a session to view changes.", + "instanceShell.sessionChanges.loading": "Fetching session changes...", + "instanceShell.sessionChanges.empty": "No session changes yet.", + "instanceShell.sessionChanges.filesChanged": "{count} files changed", + "instanceShell.sessionChanges.actions.show": "Show changes", + "instanceShell.plan.noSessionSelected": "Select a session to view plan.", "instanceShell.plan.empty": "Nothing planned yet.", diff --git a/packages/ui/src/lib/i18n/messages/es/instance.ts b/packages/ui/src/lib/i18n/messages/es/instance.ts index a2252e6b..e48bcd23 100644 --- a/packages/ui/src/lib/i18n/messages/es/instance.ts +++ b/packages/ui/src/lib/i18n/messages/es/instance.ts @@ -86,12 +86,19 @@ export const instanceMessages = { "instanceShell.empty.description": "Selecciona una sesión para ver mensajes", "instanceShell.rightPanel.title": "Panel de estado", + "instanceShell.rightPanel.sections.sessionChanges": "Cambios de sesion", "instanceShell.rightPanel.sections.plan": "Plan", "instanceShell.rightPanel.sections.backgroundProcesses": "Shells en segundo plano", "instanceShell.rightPanel.sections.mcp": "Servidores MCP", "instanceShell.rightPanel.sections.lsp": "Servidores LSP", "instanceShell.rightPanel.sections.plugins": "Plugins", + "instanceShell.sessionChanges.noSessionSelected": "Selecciona una sesion para ver los cambios.", + "instanceShell.sessionChanges.loading": "Obteniendo cambios de la sesion...", + "instanceShell.sessionChanges.empty": "Aun no hay cambios.", + "instanceShell.sessionChanges.filesChanged": "{count} archivos cambiados", + "instanceShell.sessionChanges.actions.show": "Mostrar cambios", + "instanceShell.plan.noSessionSelected": "Selecciona una sesión para ver el plan.", "instanceShell.plan.empty": "Aún no hay nada planificado.", diff --git a/packages/ui/src/lib/i18n/messages/fr/instance.ts b/packages/ui/src/lib/i18n/messages/fr/instance.ts index 562f50ef..469f00ef 100644 --- a/packages/ui/src/lib/i18n/messages/fr/instance.ts +++ b/packages/ui/src/lib/i18n/messages/fr/instance.ts @@ -86,12 +86,19 @@ export const instanceMessages = { "instanceShell.empty.description": "Sélectionnez une session pour voir les messages", "instanceShell.rightPanel.title": "Panneau d'état", + "instanceShell.rightPanel.sections.sessionChanges": "Changements de session", "instanceShell.rightPanel.sections.plan": "Plan", "instanceShell.rightPanel.sections.backgroundProcesses": "Shells en arrière-plan", "instanceShell.rightPanel.sections.mcp": "Serveurs MCP", "instanceShell.rightPanel.sections.lsp": "Serveurs LSP", "instanceShell.rightPanel.sections.plugins": "Plugins", + "instanceShell.sessionChanges.noSessionSelected": "Sélectionnez une session pour voir les changements.", + "instanceShell.sessionChanges.loading": "Récupération des changements...", + "instanceShell.sessionChanges.empty": "Aucun changement pour l'instant.", + "instanceShell.sessionChanges.filesChanged": "{count} fichiers modifiés", + "instanceShell.sessionChanges.actions.show": "Afficher les changements", + "instanceShell.plan.noSessionSelected": "Sélectionnez une session pour voir le plan.", "instanceShell.plan.empty": "Aucun plan pour l'instant.", diff --git a/packages/ui/src/lib/i18n/messages/ja/instance.ts b/packages/ui/src/lib/i18n/messages/ja/instance.ts index aca0ec86..657ddd7e 100644 --- a/packages/ui/src/lib/i18n/messages/ja/instance.ts +++ b/packages/ui/src/lib/i18n/messages/ja/instance.ts @@ -86,12 +86,19 @@ export const instanceMessages = { "instanceShell.empty.description": "メッセージを表示するにはセッションを選択してください", "instanceShell.rightPanel.title": "ステータスパネル", + "instanceShell.rightPanel.sections.sessionChanges": "セッション変更", "instanceShell.rightPanel.sections.plan": "計画", "instanceShell.rightPanel.sections.backgroundProcesses": "バックグラウンドシェル", "instanceShell.rightPanel.sections.mcp": "MCP サーバー", "instanceShell.rightPanel.sections.lsp": "LSP サーバー", "instanceShell.rightPanel.sections.plugins": "プラグイン", + "instanceShell.sessionChanges.noSessionSelected": "変更を表示するにはセッションを選択してください。", + "instanceShell.sessionChanges.loading": "変更を取得中...", + "instanceShell.sessionChanges.empty": "まだ変更はありません。", + "instanceShell.sessionChanges.filesChanged": "{count} 個のファイルが変更されました", + "instanceShell.sessionChanges.actions.show": "変更を表示", + "instanceShell.plan.noSessionSelected": "計画を表示するにはセッションを選択してください。", "instanceShell.plan.empty": "まだ計画はありません。", diff --git a/packages/ui/src/lib/i18n/messages/ru/instance.ts b/packages/ui/src/lib/i18n/messages/ru/instance.ts index b6d536b0..054459e5 100644 --- a/packages/ui/src/lib/i18n/messages/ru/instance.ts +++ b/packages/ui/src/lib/i18n/messages/ru/instance.ts @@ -86,12 +86,19 @@ export const instanceMessages = { "instanceShell.empty.description": "Выберите сессию, чтобы просмотреть сообщения", "instanceShell.rightPanel.title": "Панель состояния", + "instanceShell.rightPanel.sections.sessionChanges": "Изменения сессии", "instanceShell.rightPanel.sections.plan": "План", "instanceShell.rightPanel.sections.backgroundProcesses": "Фоновые Shell", "instanceShell.rightPanel.sections.mcp": "MCP-серверы", "instanceShell.rightPanel.sections.lsp": "LSP-серверы", "instanceShell.rightPanel.sections.plugins": "Плагины", + "instanceShell.sessionChanges.noSessionSelected": "Выберите сессию, чтобы просмотреть изменения.", + "instanceShell.sessionChanges.loading": "Загрузка изменений...", + "instanceShell.sessionChanges.empty": "Пока нет изменений.", + "instanceShell.sessionChanges.filesChanged": "Изменено файлов: {count}", + "instanceShell.sessionChanges.actions.show": "Показать изменения", + "instanceShell.plan.noSessionSelected": "Выберите сессию, чтобы просмотреть план.", "instanceShell.plan.empty": "Пока ничего не запланировано.", diff --git a/packages/ui/src/lib/i18n/messages/zh-Hans/instance.ts b/packages/ui/src/lib/i18n/messages/zh-Hans/instance.ts index 247b474b..b7829724 100644 --- a/packages/ui/src/lib/i18n/messages/zh-Hans/instance.ts +++ b/packages/ui/src/lib/i18n/messages/zh-Hans/instance.ts @@ -86,12 +86,19 @@ export const instanceMessages = { "instanceShell.empty.description": "选择会话以查看消息", "instanceShell.rightPanel.title": "状态面板", + "instanceShell.rightPanel.sections.sessionChanges": "会话更改", "instanceShell.rightPanel.sections.plan": "计划", "instanceShell.rightPanel.sections.backgroundProcesses": "后台 Shell", "instanceShell.rightPanel.sections.mcp": "MCP 服务器", "instanceShell.rightPanel.sections.lsp": "LSP 服务器", "instanceShell.rightPanel.sections.plugins": "插件", + "instanceShell.sessionChanges.noSessionSelected": "选择会话以查看更改。", + "instanceShell.sessionChanges.loading": "正在获取会话更改...", + "instanceShell.sessionChanges.empty": "暂无会话更改。", + "instanceShell.sessionChanges.filesChanged": "已更改 {count} 个文件", + "instanceShell.sessionChanges.actions.show": "显示更改", + "instanceShell.plan.noSessionSelected": "选择会话以查看计划。", "instanceShell.plan.empty": "暂无计划。",