From fd5ecddf4f955064881e857bc0e36a69bac5ac61 Mon Sep 17 00:00:00 2001 From: Armando Vaquera <263793884+proyectoauraorg@users.noreply.github.com> Date: Mon, 25 May 2026 13:26:45 -0600 Subject: [PATCH 1/5] feat(chat): add compact tool UI mode for executed tool blocks (#322) Adds an opt-in global setting (compactToolUI, off by default) that collapses executed (say) tool blocks in the chat history to a single clickable line, hiding verbose descriptions and JSON payloads until the user expands them. Approval prompts (ask) are never compacted, so users always see the parameters they are approving. Toggle lives in Context Management settings; new i18n keys added across all 18 locales. Closes #322. --- packages/types/src/global-settings.ts | 1 + packages/types/src/vscode-extension-host.ts | 1 + webview-ui/src/components/chat/ChatRow.tsx | 33 +++++++++++++++++-- .../settings/ContextManagementSettings.tsx | 20 +++++++++++ .../src/components/settings/SettingsView.tsx | 2 ++ .../ContextManagementSettings.spec.tsx | 18 ++++++++++ .../src/context/ExtensionStateContext.tsx | 1 + webview-ui/src/i18n/locales/ca/chat.json | 4 +++ webview-ui/src/i18n/locales/ca/settings.json | 4 +++ webview-ui/src/i18n/locales/de/chat.json | 4 +++ webview-ui/src/i18n/locales/de/settings.json | 4 +++ webview-ui/src/i18n/locales/en/chat.json | 4 +++ webview-ui/src/i18n/locales/en/settings.json | 4 +++ webview-ui/src/i18n/locales/es/chat.json | 4 +++ webview-ui/src/i18n/locales/es/settings.json | 4 +++ webview-ui/src/i18n/locales/fr/chat.json | 4 +++ webview-ui/src/i18n/locales/fr/settings.json | 4 +++ webview-ui/src/i18n/locales/hi/chat.json | 4 +++ webview-ui/src/i18n/locales/hi/settings.json | 4 +++ webview-ui/src/i18n/locales/id/chat.json | 4 +++ webview-ui/src/i18n/locales/id/settings.json | 4 +++ webview-ui/src/i18n/locales/it/chat.json | 4 +++ webview-ui/src/i18n/locales/it/settings.json | 4 +++ webview-ui/src/i18n/locales/ja/chat.json | 4 +++ webview-ui/src/i18n/locales/ja/settings.json | 4 +++ webview-ui/src/i18n/locales/ko/chat.json | 4 +++ webview-ui/src/i18n/locales/ko/settings.json | 4 +++ webview-ui/src/i18n/locales/nl/chat.json | 4 +++ webview-ui/src/i18n/locales/nl/settings.json | 4 +++ webview-ui/src/i18n/locales/pl/chat.json | 4 +++ webview-ui/src/i18n/locales/pl/settings.json | 4 +++ webview-ui/src/i18n/locales/pt-BR/chat.json | 4 +++ .../src/i18n/locales/pt-BR/settings.json | 4 +++ webview-ui/src/i18n/locales/ru/chat.json | 4 +++ webview-ui/src/i18n/locales/ru/settings.json | 4 +++ webview-ui/src/i18n/locales/tr/chat.json | 4 +++ webview-ui/src/i18n/locales/tr/settings.json | 4 +++ webview-ui/src/i18n/locales/vi/chat.json | 4 +++ webview-ui/src/i18n/locales/vi/settings.json | 4 +++ webview-ui/src/i18n/locales/zh-CN/chat.json | 4 +++ .../src/i18n/locales/zh-CN/settings.json | 4 +++ webview-ui/src/i18n/locales/zh-TW/chat.json | 4 +++ .../src/i18n/locales/zh-TW/settings.json | 4 +++ 43 files changed, 218 insertions(+), 2 deletions(-) diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 3a5a99eb98..64941c0497 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -163,6 +163,7 @@ export const globalSettingsSchema = z.object({ maxOpenTabsContext: z.number().optional(), maxWorkspaceFiles: z.number().optional(), showRooIgnoredFiles: z.boolean().optional(), + compactToolUI: z.boolean().optional(), enableSubfolderRules: z.boolean().optional(), maxImageFileSize: z.number().optional(), maxTotalImageSize: z.number().optional(), diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts index c09f22aed7..137ddfc5d8 100644 --- a/packages/types/src/vscode-extension-host.ts +++ b/packages/types/src/vscode-extension-host.ts @@ -320,6 +320,7 @@ export type ExtensionState = Pick< maxOpenTabsContext: number // Maximum number of VSCode open tabs to include in context (0-500) maxWorkspaceFiles: number // Maximum number of files to include in current working directory details (0-500) showRooIgnoredFiles: boolean // Whether to show .rooignore'd files in listings + compactToolUI?: boolean // Whether to collapse executed tool blocks to a single expandable line (#322) enableSubfolderRules: boolean // Whether to load rules from subdirectories maxReadFileLine?: number // Maximum line limit for read_file tool (-1 for default) maxImageFileSize: number // Maximum size of image files to process in MB diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 3914751039..c68fc3332e 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -71,6 +71,7 @@ import { Split, ArrowRight, Check, + ChevronRight, } from "lucide-react" import { cn } from "@/lib/utils" import { PathTooltip } from "../ui/PathTooltip" @@ -182,8 +183,16 @@ export const ChatRowContent = ({ }: ChatRowContentProps) => { const { t, i18n } = useTranslation() - const { mcpServers, alwaysAllowMcp, currentCheckpoint, mode, apiConfiguration, clineMessages, currentTaskItem } = - useExtensionState() + const { + mcpServers, + alwaysAllowMcp, + currentCheckpoint, + mode, + apiConfiguration, + clineMessages, + currentTaskItem, + compactToolUI, + } = useExtensionState() const { info: model } = useSelectedModel(apiConfiguration) const [isEditing, setIsEditing] = useState(false) const [editedContent, setEditedContent] = useState("") @@ -1405,6 +1414,26 @@ export const ChatRowContent = ({ const sayTool = safeJsonParse(message.text) if (!sayTool) return null + // Compact mode (#322): collapse executed (history) tool blocks to a single + // clickable line, hiding verbose params/payloads until expanded. Only applies + // to `say` tool rows here — approval prompts (`ask`) are never compacted. + if (compactToolUI && !isExpanded) { + const compactLabel = sayTool.path ? `${sayTool.tool}: ${sayTool.path}` : sayTool.tool + return ( +
+ + + + {t("chat:compactTool.label", { tool: compactLabel })} + +
+ ) + } + switch (sayTool.tool) { case "runSlashCommand": { const slashCommandInfo = sayTool diff --git a/webview-ui/src/components/settings/ContextManagementSettings.tsx b/webview-ui/src/components/settings/ContextManagementSettings.tsx index 8663ea6e03..907348c3ae 100644 --- a/webview-ui/src/components/settings/ContextManagementSettings.tsx +++ b/webview-ui/src/components/settings/ContextManagementSettings.tsx @@ -32,6 +32,7 @@ type ContextManagementSettingsProps = HTMLAttributes & { maxOpenTabsContext: number maxWorkspaceFiles: number showRooIgnoredFiles?: boolean + compactToolUI?: boolean enableSubfolderRules?: boolean maxImageFileSize?: number maxTotalImageSize?: number @@ -50,6 +51,7 @@ type ContextManagementSettingsProps = HTMLAttributes & { | "maxOpenTabsContext" | "maxWorkspaceFiles" | "showRooIgnoredFiles" + | "compactToolUI" | "enableSubfolderRules" | "maxImageFileSize" | "maxTotalImageSize" @@ -70,6 +72,7 @@ export const ContextManagementSettings = ({ maxOpenTabsContext, maxWorkspaceFiles, showRooIgnoredFiles, + compactToolUI, enableSubfolderRules, setCachedStateField, maxImageFileSize, @@ -229,6 +232,23 @@ export const ContextManagementSettings = ({ + + setCachedStateField("compactToolUI", e.target.checked)} + data-testid="compact-tool-ui-checkbox"> + + +
+ {t("settings:contextManagement.compactToolUI.description")} +
+
+ (({ onDone, t terminalZdotdir, writeDelayMs, showRooIgnoredFiles, + compactToolUI, enableSubfolderRules, maxImageFileSize, maxTotalImageSize, @@ -834,6 +835,7 @@ const SettingsView = forwardRef(({ onDone, t maxOpenTabsContext={maxOpenTabsContext} maxWorkspaceFiles={maxWorkspaceFiles ?? 200} showRooIgnoredFiles={showRooIgnoredFiles} + compactToolUI={compactToolUI ?? false} enableSubfolderRules={enableSubfolderRules} maxImageFileSize={maxImageFileSize} maxTotalImageSize={maxTotalImageSize} diff --git a/webview-ui/src/components/settings/__tests__/ContextManagementSettings.spec.tsx b/webview-ui/src/components/settings/__tests__/ContextManagementSettings.spec.tsx index 2de2954c2b..4111efa93b 100644 --- a/webview-ui/src/components/settings/__tests__/ContextManagementSettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/ContextManagementSettings.spec.tsx @@ -92,6 +92,7 @@ describe("ContextManagementSettings", () => { maxOpenTabsContext: 20, maxWorkspaceFiles: 200, showRooIgnoredFiles: false, + compactToolUI: false, profileThresholds: {}, includeDiagnosticMessages: true, maxDiagnosticMessages: 50, @@ -150,6 +151,23 @@ describe("ContextManagementSettings", () => { }) }) + it("renders the compact tool UI toggle", () => { + render() + expect(screen.getByTestId("compact-tool-ui-checkbox")).toBeInTheDocument() + }) + + it("calls setCachedStateField when the compact tool UI checkbox is toggled", async () => { + const setCachedStateField = vi.fn() + render() + + const checkbox = screen.getByTestId("compact-tool-ui-checkbox").querySelector("input")! + fireEvent.click(checkbox) + + await waitFor(() => { + expect(setCachedStateField).toHaveBeenCalledWith("compactToolUI", true) + }) + }) + it("calls setCachedStateField when max diagnostic messages slider is changed", async () => { const setCachedStateField = vi.fn() render() diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 10b49e3de0..3e08929fbc 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -224,6 +224,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode cwd: "", telemetrySetting: "unset", showRooIgnoredFiles: true, // Default to showing .rooignore'd files with lock symbol (current behavior). + compactToolUI: false, // Default off — opt-in single-line collapsed tool blocks (#322). enableSubfolderRules: false, // Default to disabled - must be enabled to load rules from subdirectories renderContext: "sidebar", maxReadFileLine: -1, // Default max line limit for read_file tool (-1 for default) diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index ad5ae434e6..3982b62fa0 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -488,5 +488,9 @@ "title": "Proveïdor ja no compatible", "message": "Aquest proveïdor ja no està disponible. Selecciona un proveïdor compatible per continuar.", "openSettings": "Obrir configuració" + }, + "compactTool": { + "label": "Eina: {{tool}}", + "expandHint": "Fes clic per ampliar els detalls de l'eina" } } diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 92ecfa7e73..e1d6ab59ca 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Activa les regles dels subdirectoris", "description": "Descobreix i carrega recursivament fitxers .roo/rules i AGENTS.md des de subdirectoris. Útil per a monorepos amb regles per paquet." + }, + "compactToolUI": { + "label": "Visualització compacta d'eines", + "description": "Replega els blocs d'eines ja executades a una sola línia al xat; fes clic en una eina per veure'n els detalls. Les indicacions d'aprovació sempre es mostren completes." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index ace29cff65..584c10a53d 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -488,5 +488,9 @@ "title": "Anbieter wird nicht mehr unterstützt", "message": "Dieser Anbieter ist nicht mehr verfügbar. Wähle einen unterstützten Anbieter aus, um fortzufahren.", "openSettings": "Einstellungen öffnen" + }, + "compactTool": { + "label": "Tool: {{tool}}", + "expandHint": "Zum Einblenden der Tool-Details klicken" } } diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 5154d11039..44d6172868 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Unterordner-Regeln aktivieren", "description": "Rekursiv .roo/rules und AGENTS.md-Dateien aus Unterverzeichnissen laden. Nützlich für Monorepos mit paketspezifischen Regeln." + }, + "compactToolUI": { + "label": "Kompakte Tool-Anzeige", + "description": "Reduziert ausgeführte Tool-Blöcke im Chat auf eine einzige Zeile; klicken Sie auf ein Tool, um die Details einzublenden. Genehmigungsdialoge werden immer vollständig angezeigt." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 882432a77d..ef15c2bffb 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -476,5 +476,9 @@ "title": "Provider no longer supported", "message": "This provider is no longer available. Select a supported provider to continue.", "openSettings": "Open Settings" + }, + "compactTool": { + "label": "Tool: {{tool}}", + "expandHint": "Click to expand tool details" } } diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index a3c11be386..77b9e214f8 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -738,6 +738,10 @@ "enableSubfolderRules": { "label": "Enable subfolder rules", "description": "Recursively discover and load .roo/rules and AGENTS.md files from subdirectories. Useful for monorepos with per-package rules." + }, + "compactToolUI": { + "label": "Compact tool display", + "description": "Collapse executed tool blocks to a single line in the chat; click a tool to expand its details. Approval prompts are always shown in full." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index e5880e9b4a..91017ee7c9 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -488,5 +488,9 @@ "title": "Proveedor ya no compatible", "message": "Este proveedor ya no está disponible. Selecciona un proveedor compatible para continuar.", "openSettings": "Abrir configuración" + }, + "compactTool": { + "label": "Herramienta: {{tool}}", + "expandHint": "Clic para expandir los detalles de la herramienta" } } diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 8ec3e29338..d81d87503e 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Activar reglas de subcarpetas", "description": "Descubrir y cargar recursivamente archivos .roo/rules y AGENTS.md desde subdirectorios. Útil para monorepos con reglas por paquete." + }, + "compactToolUI": { + "label": "Visualización compacta de herramientas", + "description": "Colapsa los bloques de herramientas ya ejecutadas a una sola línea en el chat; haz clic en una herramienta para ver sus detalles. Los prompts de aprobación siempre se muestran completos." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index b4d2e125db..7a7d9a594f 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -488,5 +488,9 @@ "title": "Fournisseur plus pris en charge", "message": "Ce fournisseur n'est plus disponible. Choisis un fournisseur pris en charge pour continuer.", "openSettings": "Ouvrir les paramètres" + }, + "compactTool": { + "label": "Outil : {{tool}}", + "expandHint": "Cliquez pour développer les détails de l'outil" } } diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index d746111a0a..5cef6ae727 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Activer les règles des sous-dossiers", "description": "Découvrir et charger récursivement les fichiers .roo/rules et AGENTS.md depuis les sous-répertoires. Utile pour les monorepos avec des règles par package." + }, + "compactToolUI": { + "label": "Affichage compact des outils", + "description": "Réduit les blocs d'outils exécutés à une seule ligne dans le chat ; cliquez sur un outil pour afficher ses détails. Les invites d'approbation sont toujours affichées en entier." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 47f6a0bab2..35690328be 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -488,5 +488,9 @@ "title": "प्रदाता अब समर्थित नहीं है", "message": "यह प्रदाता अब उपलब्ध नहीं है। जारी रखने के लिए कोई समर्थित प्रदाता चुनें।", "openSettings": "सेटिंग्स खोलें" + }, + "compactTool": { + "label": "टूल: {{tool}}", + "expandHint": "टूल विवरण विस्तृत करने के लिए क्लिक करें" } } diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 9a77b69ee4..9128c16921 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "सबफ़ोल्डर नियम सक्षम करें", "description": "उपनिर्देशिकाओं से .roo/rules और AGENTS.md फ़ाइलों को पुनरावर्ती रूप से खोजें और लोड करें। प्रति-पैकेज नियमों वाले मोनोरेपो के लिए उपयोगी।" + }, + "compactToolUI": { + "label": "कॉम्पैक्ट टूल प्रदर्शन", + "description": "चैट में निष्पादित टूल ब्लॉक को एक पंक्ति में संक्षिप्त करता है; विवरण देखने के लिए किसी टूल पर क्लिक करें। अनुमोदन संकेत हमेशा पूर्ण रूप से दिखाए जाते हैं।" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index 788f28c1d5..54513b8b7a 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -494,5 +494,9 @@ "title": "Penyedia tidak lagi didukung", "message": "Penyedia ini sudah tidak tersedia. Pilih penyedia yang didukung untuk melanjutkan.", "openSettings": "Buka Pengaturan" + }, + "compactTool": { + "label": "Alat: {{tool}}", + "expandHint": "Klik untuk membuka detail alat" } } diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 41eae1b053..0950ee863d 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Aktifkan aturan subfolder", "description": "Temukan dan muat file .roo/rules dan AGENTS.md secara rekursif dari subdirektori. Berguna untuk monorepo dengan aturan per-paket." + }, + "compactToolUI": { + "label": "Tampilan alat ringkas", + "description": "Menciutkan blok alat yang sudah dijalankan menjadi satu baris di obrolan; klik alat untuk membuka detailnya. Prompt persetujuan selalu ditampilkan penuh." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index a79257c176..fb96a8c535 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -488,5 +488,9 @@ "title": "Provider non più supportato", "message": "Questo provider non è più disponibile. Seleziona un provider supportato per continuare.", "openSettings": "Apri impostazioni" + }, + "compactTool": { + "label": "Strumento: {{tool}}", + "expandHint": "Fai clic per espandere i dettagli dello strumento" } } diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 806fb44462..44c973fe13 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Abilita regole sottocartelle", "description": "Scopri e carica ricorsivamente i file .roo/rules e AGENTS.md dalle sottodirectory. Utile per i monorepo con regole per pacchetto." + }, + "compactToolUI": { + "label": "Visualizzazione compatta degli strumenti", + "description": "Comprime i blocchi degli strumenti eseguiti in una sola riga nella chat; fai clic su uno strumento per espanderne i dettagli. I prompt di approvazione sono sempre mostrati per intero." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index ea6a6fb6f6..fb57061811 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -488,5 +488,9 @@ "title": "プロバイダーのサポート終了", "message": "このプロバイダーは現在利用できません。続行するには、サポートされているプロバイダーを選択してください。", "openSettings": "設定を開く" + }, + "compactTool": { + "label": "ツール: {{tool}}", + "expandHint": "クリックしてツールの詳細を展開" } } diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b9a0976c42..2122fe997b 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "サブフォルダルールを有効化", "description": "サブディレクトリから.roo/rulesとAGENTS.mdファイルを再帰的に検出してロードします。パッケージごとのルールを持つモノレポに便利です。" + }, + "compactToolUI": { + "label": "ツールのコンパクト表示", + "description": "実行済みのツールブロックをチャット内で1行に折りたたみます。ツールをクリックすると詳細が展開されます。承認プロンプトは常に完全に表示されます。" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 8b3735a01a..d6c9e65178 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -488,5 +488,9 @@ "title": "공급자 지원 종료", "message": "이 공급자는 더 이상 사용할 수 없습니다. 계속하려면 지원되는 공급자를 선택하세요.", "openSettings": "설정 열기" + }, + "compactTool": { + "label": "도구: {{tool}}", + "expandHint": "클릭하여 도구 세부 정보 펼치기" } } diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 3a88c9fbde..1f863a8521 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "하위 폴더 규칙 활성화", "description": "하위 디렉토리에서 .roo/rules 및 AGENTS.md 파일을 재귀적으로 검색하고 로드합니다. 패키지별 규칙이 있는 모노레포에 유용합니다." + }, + "compactToolUI": { + "label": "도구 컴팩트 표시", + "description": "실행된 도구 블록을 채팅에서 한 줄로 접습니다. 도구를 클릭하면 세부 정보가 펼쳐집니다. 승인 프롬프트는 항상 전체가 표시됩니다." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 97ef10808b..98beb49bd5 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -488,5 +488,9 @@ "title": "Provider wordt niet meer ondersteund", "message": "Deze provider is niet meer beschikbaar. Selecteer een ondersteunde provider om door te gaan.", "openSettings": "Instellingen openen" + }, + "compactTool": { + "label": "Tool: {{tool}}", + "expandHint": "Klik om de tooldetails uit te vouwen" } } diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index a91bb87de5..5ed287560b 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Submap-regels inschakelen", "description": "Recursief .roo/rules en AGENTS.md-bestanden uit submappen ontdekken en laden. Handig voor monorepo's met regels per pakket." + }, + "compactToolUI": { + "label": "Compacte toolweergave", + "description": "Vouwt uitgevoerde toolblokken in de chat samen tot één regel; klik op een tool om de details uit te vouwen. Goedkeuringsprompts worden altijd volledig getoond." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 3210e14de3..ba6ef511f9 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -488,5 +488,9 @@ "title": "Dostawca nie jest już obsługiwany", "message": "Ten dostawca nie jest już dostępny. Wybierz obsługiwanego dostawcę, aby kontynuować.", "openSettings": "Otwórz ustawienia" + }, + "compactTool": { + "label": "Narzędzie: {{tool}}", + "expandHint": "Kliknij, aby rozwinąć szczegóły narzędzia" } } diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index f3751196d8..e002d4009b 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Włącz reguły podfolderów", "description": "Rekursywnie odkrywaj i ładuj pliki .roo/rules i AGENTS.md z podkatalogów. Przydatne dla monorepo z regułami dla poszczególnych pakietów." + }, + "compactToolUI": { + "label": "Kompaktowy widok narzędzi", + "description": "Zwija wykonane bloki narzędzi do jednej linii w czacie; kliknij narzędzie, aby rozwinąć szczegóły. Monity o zatwierdzenie są zawsze pokazywane w całości." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 530513371f..4737f08fa0 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -488,5 +488,9 @@ "title": "Provedor não é mais suportado", "message": "Este provedor não está mais disponível. Selecione um provedor compatível para continuar.", "openSettings": "Abrir configurações" + }, + "compactTool": { + "label": "Ferramenta: {{tool}}", + "expandHint": "Clique para expandir os detalhes da ferramenta" } } diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 05d3557f76..804ab85e3c 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Ativar regras de subpastas", "description": "Descobrir e carregar recursivamente arquivos .roo/rules e AGENTS.md de subdiretórios. Útil para monorepos com regras por pacote." + }, + "compactToolUI": { + "label": "Exibição compacta de ferramentas", + "description": "Recolhe os blocos de ferramentas executadas em uma única linha no chat; clique em uma ferramenta para expandir os detalhes. Os prompts de aprovação são sempre exibidos por completo." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index df8313f7e7..35c808e9ab 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -489,5 +489,9 @@ "title": "Провайдер больше не поддерживается", "message": "Этот провайдер больше недоступен. Выберите поддерживаемого провайдера, чтобы продолжить.", "openSettings": "Открыть настройки" + }, + "compactTool": { + "label": "Инструмент: {{tool}}", + "expandHint": "Нажмите, чтобы раскрыть детали инструмента" } } diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 1aedb8a575..6429d2f78a 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Включить правила подпапок", "description": "Рекурсивно обнаруживать и загружать файлы .roo/rules и AGENTS.md из подкаталогов. Полезно для монорепозиториев с правилами для каждого пакета." + }, + "compactToolUI": { + "label": "Компактное отображение инструментов", + "description": "Сворачивает блоки выполненных инструментов в одну строку в чате; нажмите на инструмент, чтобы раскрыть детали. Запросы на подтверждение всегда показываются полностью." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index ff734588e5..b0a9f537c0 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -489,5 +489,9 @@ "title": "Sağlayıcı artık desteklenmiyor", "message": "Bu sağlayıcı artık kullanılamıyor. Devam etmek için desteklenen bir sağlayıcı seçin.", "openSettings": "Ayarları aç" + }, + "compactTool": { + "label": "Araç: {{tool}}", + "expandHint": "Araç ayrıntılarını genişletmek için tıklayın" } } diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 22bd730488..074f494f93 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Alt klasör kurallarını etkinleştir", "description": "Alt dizinlerden .roo/rules ve AGENTS.md dosyalarını yinelemeli olarak keşfet ve yükle. Paket başına kuralları olan monorepo'lar için kullanışlı." + }, + "compactToolUI": { + "label": "Kompakt araç görünümü", + "description": "Yürütülen araç bloklarını sohbette tek satıra daraltır; ayrıntıları görmek için bir araca tıklayın. Onay istemleri her zaman tam olarak gösterilir." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 133c06e67a..1da99b411e 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -489,5 +489,9 @@ "title": "Nhà cung cấp không còn được hỗ trợ", "message": "Nhà cung cấp này không còn khả dụng. Hãy chọn một nhà cung cấp được hỗ trợ để tiếp tục.", "openSettings": "Mở cài đặt" + }, + "compactTool": { + "label": "Công cụ: {{tool}}", + "expandHint": "Nhấp để mở rộng chi tiết công cụ" } } diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 0b09ae004b..d210025618 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "Bật quy tắc thư mục con", "description": "Khám phá và tải đệ quy các tệp .roo/rules và AGENTS.md từ các thư mục con. Hữu ích cho monorepo có quy tắc theo gói." + }, + "compactToolUI": { + "label": "Hiển thị công cụ thu gọn", + "description": "Thu gọn các khối công cụ đã thực thi thành một dòng trong trò chuyện; nhấp vào một công cụ để mở rộng chi tiết. Lời nhắc phê duyệt luôn được hiển thị đầy đủ." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index a8e22cb582..386821c46c 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -489,5 +489,9 @@ "title": "供应商不再受支持", "message": "此提供商已不可用。请选择受支持的提供商以继续。", "openSettings": "打开设置" + }, + "compactTool": { + "label": "工具:{{tool}}", + "expandHint": "点击展开工具详情" } } diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index f58ea87f8c..9385733ec1 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -675,6 +675,10 @@ "enableSubfolderRules": { "label": "启用子文件夹规则", "description": "递归发现并加载子目录中的 .roo/rules 和 AGENTS.md 文件。适用于具有每包规则的 monorepo。" + }, + "compactToolUI": { + "label": "紧凑工具显示", + "description": "将聊天中已执行的工具块折叠为单行;点击工具可展开其详细信息。审批提示始终完整显示。" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 2945e0272f..d609bbab8f 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -479,5 +479,9 @@ "title": "供應商不再受支援", "message": "此供應商已不可用。請選擇受支援的供應商以繼續。", "openSettings": "開啟設定" + }, + "compactTool": { + "label": "工具:{{tool}}", + "expandHint": "點擊以展開工具詳細資訊" } } diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index e4268280de..dc9bac79fb 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -685,6 +685,10 @@ "enableSubfolderRules": { "label": "啟用子資料夾規則", "description": "遞迴發現並載入子目錄中的 .roo/rules 和 AGENTS.md 檔案。適用於具有每包規則的 monorepo。" + }, + "compactToolUI": { + "label": "精簡工具顯示", + "description": "將聊天中已執行的工具區塊摺疊為單行;點擊工具可展開其詳細資訊。核准提示一律完整顯示。" } }, "terminal": { From d356ab67b485eece8a66d91d140451665195c0e7 Mon Sep 17 00:00:00 2001 From: Armando Vaquera <263793884+proyectoauraorg@users.noreply.github.com> Date: Tue, 26 May 2026 00:29:18 -0600 Subject: [PATCH 2/5] fix(PR-327): compactToolUI persistence & a11y - Add compactToolUI to updatedSettings in handleSubmit so the preference persists when saving - Change
to ) } diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 3ea9a5e931..8a8629f05b 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -402,6 +402,7 @@ const SettingsView = forwardRef(({ onDone, t maxOpenTabsContext: Math.min(Math.max(0, maxOpenTabsContext ?? 20), 500), maxWorkspaceFiles: Math.min(Math.max(0, maxWorkspaceFiles ?? 200), 500), showRooIgnoredFiles: showRooIgnoredFiles ?? true, + compactToolUI: compactToolUI ?? false, enableSubfolderRules: enableSubfolderRules ?? false, maxImageFileSize: maxImageFileSize ?? 5, maxTotalImageSize: maxTotalImageSize ?? 20, From e9068ea838dc65d15ab0b7ee0b22df0c88dba65a Mon Sep 17 00:00:00 2001 From: Armando Vaquera <263793884+proyectoauraorg@users.noreply.github.com> Date: Wed, 27 May 2026 00:10:37 -0600 Subject: [PATCH 3/5] fix(chat): persist compactToolUI across reloads getState() read compactToolUI from storage but never returned it, so getStateToPostToWebview() never sent the persisted value to the webview and the `false` default always won on reload. Wire it through both getState() returns following the showRooIgnoredFiles pattern. Addresses PR #327 review (edelauna). --- src/core/webview/ClineProvider.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 3f5af94cae..cb8f547ebc 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2065,6 +2065,7 @@ export class ClineProvider disabledTools, telemetrySetting, showRooIgnoredFiles, + compactToolUI, enableSubfolderRules, language, maxImageFileSize, @@ -2221,6 +2222,7 @@ export class ClineProvider telemetryKey, machineId, showRooIgnoredFiles: showRooIgnoredFiles ?? false, + compactToolUI: compactToolUI ?? false, enableSubfolderRules: enableSubfolderRules ?? false, language: language ?? formatLanguage(vscode.env.language), renderContext: this.renderContext, @@ -2423,6 +2425,7 @@ export class ClineProvider disabledTools: stateValues.disabledTools, telemetrySetting: stateValues.telemetrySetting || "unset", showRooIgnoredFiles: stateValues.showRooIgnoredFiles ?? false, + compactToolUI: stateValues.compactToolUI ?? false, enableSubfolderRules: stateValues.enableSubfolderRules ?? false, maxImageFileSize: stateValues.maxImageFileSize ?? 5, maxTotalImageSize: stateValues.maxTotalImageSize ?? 20, From 8f2079e17f16699bbd96e69dff4837af4e5a7a3c Mon Sep 17 00:00:00 2001 From: Armando Vaquera <263793884+proyectoauraorg@users.noreply.github.com> Date: Thu, 28 May 2026 01:14:53 -0600 Subject: [PATCH 4/5] fix(a11y): add aria-expanded to compact tool toggle button Addresses CodeRabbit review nitpick: add aria-expanded={isExpanded} to the compact tool row button for screen reader support. Refs: PR #327 review feedback --- webview-ui/src/components/chat/ChatRow.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index ff3e7cc13c..1257f80e2c 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -1423,6 +1423,7 @@ export const ChatRowContent = ({