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/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, diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 3914751039..eb32c71804 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,28 @@ 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 ( + + ) + } + switch (sayTool.tool) { case "runSlashCommand": { const slashCommandInfo = sayTool diff --git a/webview-ui/src/components/chat/__tests__/ChatRow.compact-tool.spec.tsx b/webview-ui/src/components/chat/__tests__/ChatRow.compact-tool.spec.tsx new file mode 100644 index 0000000000..d713a475d4 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ChatRow.compact-tool.spec.tsx @@ -0,0 +1,108 @@ +import React from "react" +import { fireEvent, render, screen } from "@/utils/test-utils" +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" +import type { ClineMessage } from "@roo-code/types" +import { ChatRowContent } from "../ChatRow" + +const mockPostMessage = vi.fn() +const mockOnToggleExpand = vi.fn() + +vi.mock("@src/utils/vscode", () => ({ + vscode: { + postMessage: (...args: unknown[]) => mockPostMessage(...args), + }, +})) + +// Mock i18n +vi.mock("react-i18next", () => ({ + useTranslation: () => ({ + t: (key: string, opts?: Record) => { + const map: Record = { + "chat:compactTool.expandHint": "Click to expand", + "chat:compactTool.label": opts?.tool ? `tool: ${opts.tool}` : "tool", + } + return map[key] || key + }, + }), + Trans: ({ children }: { children?: React.ReactNode }) => <>{children}, + initReactI18next: { type: "3rdParty", init: () => {} }, +})) + +// Mock CodeBlock (avoid ESM/highlighter costs) +vi.mock("@src/components/common/CodeBlock", () => ({ + default: () => null, +})) + +// Mock useExtensionState to enable compactToolUI +vi.mock("@src/context/ExtensionStateContext", () => ({ + useExtensionState: () => ({ + mcpServers: [], + alwaysAllowMcp: false, + currentCheckpoint: undefined, + mode: "code", + apiConfiguration: {}, + clineMessages: [], + currentTaskItem: undefined, + compactToolUI: true, + }), + ExtensionStateContextProvider: ({ children }: { children: React.ReactNode }) => <>{children}, +})) + +const queryClient = new QueryClient() + +function createSayToolMessage(toolPayload: Record): ClineMessage { + return { + type: "say", + say: "tool" as any, + ts: Date.now(), + text: JSON.stringify(toolPayload), + } +} + +function renderChatRow(message: ClineMessage, isExpanded = false) { + return render( + + {}} + onBatchFileResponse={() => {}} + onFollowUpUnmount={() => {}} + isFollowUpAnswered={false} + /> + , + ) +} + +describe("ChatRow - compact tool UI", () => { + beforeEach(() => { + vi.clearAllMocks() + mockOnToggleExpand.mockClear() + }) + + it("renders the compact row when compactToolUI is true and not expanded", () => { + const message = createSayToolMessage({ tool: "readFile", path: "src/file.ts" }) + renderChatRow(message, false) + + expect(screen.getByTestId("compact-tool-row")).toBeInTheDocument() + }) + + it("calls onToggleExpand when the compact row is clicked", () => { + const message = createSayToolMessage({ tool: "readFile", path: "src/file.ts" }) + renderChatRow(message, false) + + fireEvent.click(screen.getByTestId("compact-tool-row")) + + expect(mockOnToggleExpand).toHaveBeenCalledWith(message.ts) + }) + + it("has aria-expanded=false on the compact button", () => { + const message = createSayToolMessage({ tool: "readFile", path: "src/file.ts" }) + renderChatRow(message, false) + + expect(screen.getByTestId("compact-tool-row")).toHaveAttribute("aria-expanded", "false") + }) +}) 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, @@ -401,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, @@ -834,6 +836,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": {