diff --git a/packages/types/src/__tests__/global-settings.test.ts b/packages/types/src/__tests__/global-settings.test.ts index c2040383e8..f2b2e7e8e5 100644 --- a/packages/types/src/__tests__/global-settings.test.ts +++ b/packages/types/src/__tests__/global-settings.test.ts @@ -38,3 +38,16 @@ describe("alwaysDenyUnapprovedCommands global setting", () => { expect(() => globalSettingsSchema.parse({ alwaysDenyUnapprovedCommands: "true" })).toThrow() }) }) + +describe("collapseCommandOutputByDefault global setting", () => { + it.each([true, false, undefined])("round-trips %s through the export/import schema", (value) => { + const settings = globalSettingsSchema.parse({ collapseCommandOutputByDefault: value }) + expect(globalSettingsSchema.parse(JSON.parse(JSON.stringify(settings))).collapseCommandOutputByDefault).toBe( + value, + ) + expect(GLOBAL_SETTINGS_KEYS).toContain("collapseCommandOutputByDefault") + }) + it("rejects non-boolean values", () => { + expect(globalSettingsSchema.safeParse({ collapseCommandOutputByDefault: "true" }).success).toBe(false) + }) +}) diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 16e9751974..3253d1ecf3 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -49,6 +49,9 @@ export const DEFAULT_AUTO_CLOSE_ZOO_OPENED_NEW_FILES = false */ export const DEFAULT_DIFF_FUZZY_THRESHOLD = 1.0 +// Preserve the existing terminal-dependent output display until users opt in. +export const DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT = false + export const DEFAULT_DESTRUCTIVE_COMMAND_GUARD_ENABLED = false /** @@ -236,6 +239,7 @@ export const globalSettingsSchema = z.object({ terminalOutputPreviewSize: z.enum(["small", "medium", "large"]).optional(), terminalShellIntegrationTimeout: z.number().optional(), terminalShellIntegrationDisabled: z.boolean().optional(), + collapseCommandOutputByDefault: z.boolean().optional(), terminalCommandDelay: z.number().optional(), terminalPowershellCounter: z.boolean().optional(), terminalZshClearEolMark: z.boolean().optional(), diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts index c0e8509105..ac17ecfab4 100644 --- a/packages/types/src/vscode-extension-host.ts +++ b/packages/types/src/vscode-extension-host.ts @@ -299,6 +299,7 @@ export type ExtensionState = Pick< | "terminalOutputPreviewSize" | "terminalShellIntegrationTimeout" | "terminalShellIntegrationDisabled" + | "collapseCommandOutputByDefault" | "terminalCommandDelay" | "terminalPowershellCounter" | "terminalZshClearEolMark" diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index b2f0ea8386..bf1ff02f93 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -48,6 +48,7 @@ import { DEFAULT_DIFF_FUZZY_THRESHOLD, DEFAULT_DESTRUCTIVE_COMMAND_GUARD_ENABLED, DEFAULT_ALWAYS_DENY_UNAPPROVED_COMMANDS, + DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT, DEFAULT_AUTO_CLOSE_ZOO_OPENED_FILES, DEFAULT_AUTO_CLOSE_ZOO_OPENED_FILES_AFTER_USER_EDITED, DEFAULT_AUTO_CLOSE_ZOO_OPENED_NEW_FILES, @@ -2625,6 +2626,7 @@ export class ClineProvider diffFuzzyThreshold, terminalShellIntegrationTimeout, terminalShellIntegrationDisabled, + collapseCommandOutputByDefault, terminalCommandDelay, terminalPowershellCounter, terminalZshClearEolMark, @@ -2797,6 +2799,8 @@ export class ClineProvider diffFuzzyThreshold: diffFuzzyThreshold ?? DEFAULT_DIFF_FUZZY_THRESHOLD, terminalShellIntegrationTimeout: terminalShellIntegrationTimeout ?? Terminal.defaultShellIntegrationTimeout, terminalShellIntegrationDisabled: terminalShellIntegrationDisabled ?? true, + collapseCommandOutputByDefault: + collapseCommandOutputByDefault ?? DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT, terminalCommandDelay: terminalCommandDelay ?? 0, terminalPowershellCounter: terminalPowershellCounter ?? false, terminalZshClearEolMark: terminalZshClearEolMark ?? true, @@ -3033,6 +3037,8 @@ export class ClineProvider terminalShellIntegrationTimeout: stateValues.terminalShellIntegrationTimeout ?? Terminal.defaultShellIntegrationTimeout, terminalShellIntegrationDisabled: stateValues.terminalShellIntegrationDisabled ?? true, + collapseCommandOutputByDefault: + stateValues.collapseCommandOutputByDefault ?? DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT, terminalCommandDelay: stateValues.terminalCommandDelay ?? 0, terminalPowershellCounter: stateValues.terminalPowershellCounter ?? false, terminalZshClearEolMark: stateValues.terminalZshClearEolMark ?? true, diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 29b823cf50..a0136f2700 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -2184,6 +2184,16 @@ describe("ClineProvider", () => { expect(state.writeDelayMs).toBe(DEFAULT_WRITE_DELAY_MS) }) + test.each([true, false, undefined])( + "returns the saved output collapse preference (%s) to the webview", + async (value) => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("collapseCommandOutputByDefault", value) + expect((await provider.getState()).collapseCommandOutputByDefault).toBe(value ?? false) + expect((await provider.getStateToPostToWebview()).collapseCommandOutputByDefault).toBe(value ?? false) + }, + ) + test("getState applies fallback defaults for write, diff, and terminal settings", async () => { // Mock globalState.get to return undefined for the fallback settings // (typed reassignment — Memento.get has no mock type, same pattern as the diff --git a/src/core/webview/__tests__/webviewMessageHandler.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.spec.ts index c57e9f3ac3..2e8aa582c4 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.spec.ts @@ -2368,3 +2368,20 @@ describe("webviewMessageHandler - telemetrySetting", () => { expect(TelemetryService.instance.updateTelemetryState).not.toHaveBeenCalled() }) }) + +it.each([true, false, undefined])( + "persists the output collapse preference (%s) without changing terminal mode", + async (value) => { + vi.clearAllMocks() + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { collapseCommandOutputByDefault: value }, + }) + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("collapseCommandOutputByDefault", value) + expect(mockClineProvider.contextProxy.setValue).not.toHaveBeenCalledWith( + "terminalShellIntegrationDisabled", + expect.anything(), + ) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }, +) diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 17c53f40d4..9ce05c1b6d 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -12,6 +12,33 @@ const mermaidGantt = `gantt Ship release :active, release, after scope, 3d` export const stories: Record = { + "terminal-settings": async () => { + const [{ AppProviders }, { TerminalSettings }] = await Promise.all([ + import("../AppProviders"), + import("@/components/settings/TerminalSettings"), + ]) + function Settings() { + const [collapsed, setCollapsed] = useState(false) + return ( +
+ { + if (field === "collapseCommandOutputByDefault") setCollapsed(Boolean(value)) + }} + /> +
+ ) + } + return ( + + + + ) + }, "bedrock-output-budget": async ({ model = "anthropic.claude-opus-5" }) => { const [{ AppProviders }, { ThinkingBudget }, { bedrockModels, providerIdentifiers }] = await Promise.all([ import("../AppProviders"), diff --git a/webview-ui/src/components/chat/CommandExecution.tsx b/webview-ui/src/components/chat/CommandExecution.tsx index 4884d5a8b6..68266d0959 100644 --- a/webview-ui/src/components/chat/CommandExecution.tsx +++ b/webview-ui/src/components/chat/CommandExecution.tsx @@ -3,7 +3,12 @@ import { useEvent } from "react-use" import { t } from "i18next" import { ChevronDown, OctagonX } from "lucide-react" -import { type ExtensionMessage, type CommandExecutionStatus, commandExecutionStatusSchema } from "@roo-code/types" +import { + type ExtensionMessage, + type CommandExecutionStatus, + commandExecutionStatusSchema, + DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT, +} from "@roo-code/types" import { safeJsonParse } from "@roo/core" import { COMMAND_OUTPUT_STRING } from "@roo/combineCommandSequences" @@ -42,6 +47,7 @@ interface CommandExecutionProps { export const CommandExecution = ({ executionId, text, icon, title, isDenied = false }: CommandExecutionProps) => { const { terminalShellIntegrationDisabled = false, + collapseCommandOutputByDefault = DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT, destructiveCommandGuardEnabled = false, allowedCommands = [], deniedCommands = [], @@ -51,9 +57,8 @@ export const CommandExecution = ({ executionId, text, icon, title, isDenied = fa const { command, output: parsedOutput } = useMemo(() => parseCommandAndOutput(text), [text]) - // If we aren't opening the VSCode terminal for this command then we default - // to expanding the command execution output. - const [isExpanded, setIsExpanded] = useState(terminalShellIntegrationDisabled) + // Apply the preference on mount. Manual toggles remain in control afterwards. + const [isExpanded, setIsExpanded] = useState(!collapseCommandOutputByDefault && terminalShellIntegrationDisabled) const [streamingOutput, setStreamingOutput] = useState("") // Initialize from the module-level cache so that components mounting after // the "started" event was delivered still show the running indicator. @@ -159,7 +164,9 @@ export const CommandExecution = ({ executionId, text, icon, title, isDenied = fa // Not a terminal state -- signals a mid-execution retry // via execa after a shell integration failure. A new // "started" event will follow, so leave the cache intact. - setIsExpanded(true) + if (!collapseCommandOutputByDefault) { + setIsExpanded(true) + } break case "output": setStreamingOutput(data.output) @@ -171,7 +178,7 @@ export const CommandExecution = ({ executionId, text, icon, title, isDenied = fa } } }, - [executionId], + [executionId, collapseCommandOutputByDefault], ) useEvent("message", onMessage) diff --git a/webview-ui/src/components/chat/__tests__/CommandExecution.collapse.spec.tsx b/webview-ui/src/components/chat/__tests__/CommandExecution.collapse.spec.tsx new file mode 100644 index 0000000000..e6750fbd91 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/CommandExecution.collapse.spec.tsx @@ -0,0 +1,73 @@ +import { act, fireEvent, screen, renderWithExtensionState } from "@/utils/test-utils" +import { CommandExecution } from "../CommandExecution" + +vi.mock("@/utils/vscode", () => ({ vscode: { postMessage: vi.fn() } })) +vi.mock("../../common/CodeBlock", () => ({ + default: ({ source }: { source: string }) =>
{source}
, +})) +vi.mock("../TerminalOutput", () => ({ + TerminalOutput: ({ content }: { content: string }) =>
{content}
, +})) +vi.mock("../CommandPatternSelector", () => ({ CommandPatternSelector: () => null })) + +const sendStatus = (data: Record) => { + act(() => + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "commandExecutionStatus", + text: JSON.stringify({ executionId: "collapse-test", ...data }), + }, + }), + ), + ) +} +const setup = (collapseCommandOutputByDefault?: boolean, terminalShellIntegrationDisabled = true) => + renderWithExtensionState( + , + { + state: { collapseCommandOutputByDefault, terminalShellIntegrationDisabled }, + }, + ) +const outputContainer = () => screen.getByTestId("terminal-output").parentElement + +describe("command output collapse preference", () => { + it.each([ + [true, true, true], + [true, false, true], + [false, true, false], + [false, false, true], + [undefined, true, false], + [undefined, false, true], + ])("applies preference %s with inline mode %s", (preference, inline, collapsed) => { + setup(preference, inline) + expect(outputContainer()).toHaveClass(collapsed ? "max-h-0" : "max-h-[100%]") + }) + it("keeps streaming and completed output collapsed until manually expanded", () => { + setup(true) + sendStatus({ status: "started", pid: 123 }) + sendStatus({ status: "output", output: "Streaming output" }) + expect(screen.getByTestId("terminal-output")).toHaveTextContent("Streaming output") + expect(outputContainer()).toHaveClass("max-h-0") + fireEvent.click(screen.getAllByRole("button").at(-1)!) + expect(outputContainer()).not.toHaveClass("max-h-0") + sendStatus({ status: "output", output: "More output" }) + sendStatus({ status: "exited", exitCode: 0 }) + expect(outputContainer()).not.toHaveClass("max-h-0") + fireEvent.click(screen.getAllByRole("button").at(-1)!) + expect(outputContainer()).toHaveClass("max-h-0") + }) + + it("preserves a manual expansion through fallback and new output", () => { + setup(true, false) + fireEvent.click(screen.getAllByRole("button").at(-1)!) + sendStatus({ status: "fallback" }) + sendStatus({ status: "output", output: "Fallback output" }) + expect(outputContainer()).not.toHaveClass("max-h-0") + }) + it.each([true, false, undefined])("respects preference %s during shell integration fallback", (preference) => { + setup(preference, false) + sendStatus({ status: "fallback" }) + expect(outputContainer()).toHaveClass(preference ? "max-h-0" : "max-h-[100%]") + }) +}) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 61ba954dd5..6100a373e1 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -188,6 +188,7 @@ const SettingsView = forwardRef(({ onDone, t terminalOutputPreviewSize, terminalShellIntegrationTimeout, terminalShellIntegrationDisabled, // Added from upstream + collapseCommandOutputByDefault, terminalCommandDelay, terminalPowershellCounter, terminalZshClearEolMark, @@ -416,6 +417,7 @@ const SettingsView = forwardRef(({ onDone, t diffFuzzyThreshold, terminalShellIntegrationTimeout: terminalShellIntegrationTimeout ?? 30_000, terminalShellIntegrationDisabled, + collapseCommandOutputByDefault, terminalCommandDelay, terminalPowershellCounter, terminalZshClearEolMark, @@ -897,6 +899,7 @@ const SettingsView = forwardRef(({ onDone, t terminalOutputPreviewSize={terminalOutputPreviewSize} terminalShellIntegrationTimeout={terminalShellIntegrationTimeout} terminalShellIntegrationDisabled={terminalShellIntegrationDisabled} + collapseCommandOutputByDefault={collapseCommandOutputByDefault} terminalCommandDelay={terminalCommandDelay} terminalPowershellCounter={terminalPowershellCounter} terminalZshClearEolMark={terminalZshClearEolMark} diff --git a/webview-ui/src/components/settings/TerminalSettings.tsx b/webview-ui/src/components/settings/TerminalSettings.tsx index 3601f1876e..ac7decdb2c 100644 --- a/webview-ui/src/components/settings/TerminalSettings.tsx +++ b/webview-ui/src/components/settings/TerminalSettings.tsx @@ -7,7 +7,11 @@ import { buildDocLink } from "@src/utils/docLinks" import { useEvent, useMount } from "react-use" import { Terminal } from "lucide-react" -import { type ExtensionMessage, type TerminalOutputPreviewSize } from "@roo-code/types" +import { + type ExtensionMessage, + type TerminalOutputPreviewSize, + DEFAULT_COLLAPSE_COMMAND_OUTPUT_BY_DEFAULT, +} from "@roo-code/types" import { cn } from "@/lib/utils" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Slider, Button } from "@/components/ui" @@ -21,6 +25,7 @@ type TerminalSettingsProps = HTMLAttributes & { terminalOutputPreviewSize?: TerminalOutputPreviewSize terminalShellIntegrationTimeout?: number terminalShellIntegrationDisabled?: boolean + collapseCommandOutputByDefault?: boolean terminalCommandDelay?: number terminalPowershellCounter?: boolean terminalZshClearEolMark?: boolean @@ -33,6 +38,7 @@ type TerminalSettingsProps = HTMLAttributes & { | "terminalOutputPreviewSize" | "terminalShellIntegrationTimeout" | "terminalShellIntegrationDisabled" + | "collapseCommandOutputByDefault" | "terminalCommandDelay" | "terminalPowershellCounter" | "terminalZshClearEolMark" @@ -51,6 +57,7 @@ export const TerminalSettings = ({ terminalOutputPreviewSize, terminalShellIntegrationTimeout, terminalShellIntegrationDisabled, + collapseCommandOutputByDefault, terminalCommandDelay, terminalPowershellCounter, terminalZshClearEolMark, @@ -151,6 +158,26 @@ export const TerminalSettings = ({ + + + setCachedStateField( + "collapseCommandOutputByDefault", + (event.target as HTMLInputElement).checked, + ) + } + data-testid="terminal-collapse-command-output-checkbox"> + {t("settings:terminal.collapseCommandOutput.label")} + +
+ {t("settings:terminal.collapseCommandOutput.description")} +
+
+ {/* Advanced Settings */}
diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx index 97b390f6f4..0835f255f9 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx @@ -428,6 +428,47 @@ describe("SettingsView - Sound Settings", () => { ) }) + it.each([true, false, undefined])("buffers the output collapse preference (%s) until Save", (savedValue) => { + renderWithExtensionState(, { + state: { collapseCommandOutputByDefault: savedValue, terminalShellIntegrationDisabled: true }, + }) + const checkbox = within(screen.getByTestId("settings-content")).getByTestId( + "terminal-collapse-command-output-checkbox", + ) + expect(checkbox).toHaveProperty("checked", savedValue ?? false) + vi.mocked(vscode.postMessage).mockClear() + fireEvent.click(checkbox) + expect(checkbox).toHaveProperty("checked", !(savedValue ?? false)) + expect(vscode.postMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "updateSettings" })) + fireEvent.click(screen.getByTestId("save-button")) + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ + collapseCommandOutputByDefault: !(savedValue ?? false), + terminalShellIntegrationDisabled: true, + }), + }), + ) + }) + + it("keeps the buffered collapse preference during an unrelated live state refresh", async () => { + const { getSettingsContent, activateTab } = renderSettingsView({ settingsImportedAt: "initial-collapse-state" }) + activateTab("terminal") + const checkbox = await within(getSettingsContent()).findByTestId("terminal-collapse-command-output-checkbox") + fireEvent.click(checkbox) + act(() => + mockPostMessage({ collapseCommandOutputByDefault: false, settingsImportedAt: "initial-collapse-state" }), + ) + expect(checkbox).toHaveProperty("checked", true) + fireEvent.click(screen.getByTestId("save-button")) + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ collapseCommandOutputByDefault: true }), + }), + ) + }) it("saves the selected chat font size and persists null on reset", () => { const { activateTab, getSettingsContent } = renderSettingsView() diff --git a/webview-ui/src/components/settings/__tests__/TerminalSettings.visual.tsx b/webview-ui/src/components/settings/__tests__/TerminalSettings.visual.tsx new file mode 100644 index 0000000000..4dadb1ed26 --- /dev/null +++ b/webview-ui/src/components/settings/__tests__/TerminalSettings.visual.tsx @@ -0,0 +1,13 @@ +import { expect, test } from "../../../../playwright/coverage-fixture" +import { mountedStory } from "../../../../playwright/mounted-story" +import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" + +for (const theme of visualThemes) { + test(`renders terminal settings in the VS Code ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("terminal-settings")) + await applyVisualTheme(page, theme) + const story = component.getByTestId("terminal-settings-story") + await expect(story.getByTestId("terminal-collapse-command-output-checkbox")).toBeVisible() + await expect(story).toHaveScreenshot(`terminal-settings-${theme.name}.png`) + }) +} diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-dark.png b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-dark.png new file mode 100644 index 0000000000..986777086d Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-dark.png differ diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-high-contrast-light.png b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-high-contrast-light.png new file mode 100644 index 0000000000..209b7b5347 Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-high-contrast-light.png differ diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-high-contrast.png b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-high-contrast.png new file mode 100644 index 0000000000..a5f7237253 Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-high-contrast.png differ diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-light.png b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-light.png new file mode 100644 index 0000000000..0572a168b0 Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/terminal-settings-light.png differ diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index f599e40db9..7afa677cee 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Replega la sortida de les ordres per defecte", + "description": "Mostra replegada la sortida de les ordres, inclosa la del terminal en línia. Podeu desplegar-la manualment. Això no canvia com s’executen les ordres." + }, "basic": { "label": "Configuració del terminal: Bàsica", "description": "Configuració bàsica del terminal" diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 845c9e575f..f564e0c67c 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Befehlsausgabe standardmäßig einklappen", + "description": "Befehlsausgaben werden zunächst eingeklappt, auch im Inline-Terminal. Bei Bedarf manuell aufklappen. Die Befehlsausführung bleibt unverändert." + }, "basic": { "label": "Terminal-Einstellungen: Grundlegend", "description": "Grundlegende Terminal-Einstellungen" diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index de36f7ac3a..5101658c17 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -915,6 +915,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Collapse command output by default", + "description": "Start command output collapsed, including Inline Terminal output. Expand it manually when needed. This does not change how commands run." + }, "basic": { "label": "Terminal Settings: Basic", "description": "Basic terminal settings" diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 1e6f87d553..a4b48e2b72 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Contraer la salida de comandos por defecto", + "description": "Muestra contraída la salida de comandos, incluida la del terminal en línea. Puede expandirla manualmente. Esto no cambia cómo se ejecutan los comandos." + }, "basic": { "label": "Configuración del terminal: Básica", "description": "Configuración básica del terminal" diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index ec6ee0f692..87d71298d0 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Replier la sortie des commandes par défaut", + "description": "Replie la sortie des commandes, y compris celle du terminal intégré. Dépliez-la manuellement si nécessaire. Cela ne change pas leur exécution." + }, "basic": { "label": "Paramètres du terminal : Base", "description": "Paramètres de base du terminal" diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index fa725cd2c5..112ae409e0 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "कमांड आउटपुट डिफ़ॉल्ट रूप से संक्षिप्त करें", + "description": "इनलाइन टर्मिनल सहित कमांड आउटपुट को संक्षिप्त दिखाएँ। ज़रूरत पड़ने पर इसे मैन्युअल रूप से फैलाएँ। इससे कमांड चलाने का तरीका नहीं बदलता।" + }, "basic": { "label": "टर्मिनल सेटिंग्स: मूल", "description": "मूल टर्मिनल सेटिंग्स" diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index bd3e0fcc96..45bd88cbe7 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Ciutkan keluaran perintah secara default", + "description": "Tampilkan keluaran perintah dalam keadaan diciutkan, termasuk terminal inline. Perluas secara manual bila diperlukan. Cara perintah dijalankan tidak berubah." + }, "basic": { "label": "Pengaturan Terminal: Dasar", "description": "Pengaturan terminal dasar" diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 2b604e720f..e0e85cbbe5 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Comprimi l’output dei comandi per impostazione predefinita", + "description": "Mostra compresso l’output dei comandi, incluso quello del terminale inline. Espandilo manualmente quando necessario. L’esecuzione dei comandi non cambia." + }, "basic": { "label": "Impostazioni terminale: Base", "description": "Impostazioni base del terminale" diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 2ca3ef0396..df104d1cd1 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "コマンド出力をデフォルトで折りたたむ", + "description": "インラインターミナルを含むコマンド出力を折りたたんで表示します。必要に応じて手動で展開できます。コマンドの実行方法は変わりません。" + }, "basic": { "label": "ターミナル設定:基本", "description": "基本的なターミナル設定" diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 89dcd74c40..a6d4caba5d 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "명령 출력을 기본적으로 접기", + "description": "인라인 터미널을 포함한 명령 출력을 접어서 표시합니다. 필요할 때 수동으로 펼칠 수 있습니다. 명령 실행 방식은 변경되지 않습니다." + }, "basic": { "label": "터미널 설정: 기본", "description": "기본 터미널 설정" diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 2eeea89e92..42b157468b 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Opdrachtuitvoer standaard inklappen", + "description": "Toon opdrachtuitvoer ingeklapt, ook van de inline-terminal. Klap deze indien nodig handmatig uit. Dit verandert de uitvoering van opdrachten niet." + }, "basic": { "label": "Terminalinstellingen: Basis", "description": "Basis terminalinstellingen" diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 0de3a36c4e..7f4c7ddd8f 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Domyślnie zwijaj wyniki poleceń", + "description": "Wyniki poleceń, także z terminala wbudowanego, są początkowo zwinięte. Można je ręcznie rozwinąć. Nie zmienia to sposobu wykonywania poleceń." + }, "basic": { "label": "Ustawienia terminala: Podstawowe", "description": "Podstawowe ustawienia terminala" diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 893504febe..4266970161 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Recolher a saída dos comandos por padrão", + "description": "Mostra recolhida a saída dos comandos, incluindo a do terminal inline. Expanda manualmente quando necessário. Isso não altera a execução dos comandos." + }, "basic": { "label": "Configurações do terminal: Básicas", "description": "Configurações básicas do terminal" diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 3d55ee12d3..257a780e9e 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Сворачивать вывод команд по умолчанию", + "description": "Вывод команд, включая встроенный терминал, сначала свёрнут. При необходимости разверните его вручную. Способ выполнения команд не меняется." + }, "basic": { "label": "Настройки терминала: Основные", "description": "Основные настройки терминала" diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 5f93ec8035..375b44f7da 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Komut çıktısını varsayılan olarak daralt", + "description": "Satır içi terminal dahil komut çıktısını daraltılmış gösterir. Gerektiğinde elle genişletebilirsiniz. Komutların çalıştırılma biçimini değiştirmez." + }, "basic": { "label": "Terminal Ayarları: Temel", "description": "Temel terminal ayarları" diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 5ec6e8c105..fa95d789bb 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "Thu gọn đầu ra lệnh theo mặc định", + "description": "Hiển thị đầu ra lệnh ở trạng thái thu gọn, kể cả terminal nội tuyến. Mở rộng thủ công khi cần. Cách chạy lệnh không thay đổi." + }, "basic": { "label": "Cài đặt Terminal: Cơ bản", "description": "Cài đặt cơ bản cho terminal" diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 9e0a94d908..e025fadef6 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -835,6 +835,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "默认折叠命令输出", + "description": "默认折叠命令输出,包括内联终端输出。需要时可手动展开。此设置不会改变命令执行方式。" + }, "basic": { "label": "终端设置:基础", "description": "基础终端设置" diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index c2fd65c755..966f20f40a 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -862,6 +862,10 @@ } }, "terminal": { + "collapseCommandOutput": { + "label": "預設摺疊命令輸出", + "description": "預設摺疊命令輸出,包括內嵌終端機輸出。需要時可手動展開。此設定不會變更命令執行方式。" + }, "basic": { "label": "終端機設定:基本", "description": "基本終端機設定"