diff --git a/packages/types/src/experiment.ts b/packages/types/src/experiment.ts index 37c6eecee7..a120a09b4b 100644 --- a/packages/types/src/experiment.ts +++ b/packages/types/src/experiment.ts @@ -12,6 +12,8 @@ export const experimentIds = [ "preventFocusDisruption", "imageGeneration", "runSlashCommand", + "preventTerminalDisruption", + "assistantMessageParser", ] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -28,6 +30,8 @@ export const experimentsSchema = z.object({ preventFocusDisruption: z.boolean().optional(), imageGeneration: z.boolean().optional(), runSlashCommand: z.boolean().optional(), + preventTerminalDisruption: z.boolean().optional(), + assistantMessageParser: z.boolean().optional(), }) export type Experiments = z.infer diff --git a/src/core/tools/__tests__/executeCommand.spec.ts b/src/core/tools/__tests__/executeCommand.spec.ts index 2e973a24cb..3a28cc3bbc 100644 --- a/src/core/tools/__tests__/executeCommand.spec.ts +++ b/src/core/tools/__tests__/executeCommand.spec.ts @@ -42,6 +42,7 @@ describe("executeCommand", () => { getState: vitest.fn().mockResolvedValue({ terminalOutputLineLimit: 500, terminalShellIntegrationDisabled: false, + experiments: {}, }), } @@ -50,7 +51,7 @@ describe("executeCommand", () => { cwd: "/test/project", taskId: "test-task-123", providerRef: { - deref: vitest.fn().mockResolvedValue(mockProvider), + deref: vitest.fn().mockReturnValue(mockProvider), }, say: vitest.fn().mockResolvedValue(undefined), terminalProcess: undefined, @@ -451,4 +452,126 @@ describe("executeCommand", () => { expect(mockTerminalInstance.getCurrentWorkingDirectory).toHaveBeenCalled() }) }) + + describe("PREVENT_TERMINAL_DISRUPTION experiment", () => { + it("should not call terminal.show() when PREVENT_TERMINAL_DISRUPTION is enabled", async () => { + // Setup: Enable PREVENT_TERMINAL_DISRUPTION experiment + mockProvider.getState.mockResolvedValue({ + terminalOutputLineLimit: 500, + terminalShellIntegrationDisabled: false, + experiments: { preventTerminalDisruption: true }, + }) + + // Create a mock Terminal instance + const vscodeTerminal = new Terminal(1, undefined, "/test/project") + const mockVSCodeTerminal = vscodeTerminal as any + mockVSCodeTerminal.terminal = { + show: vitest.fn(), + } + mockVSCodeTerminal.getCurrentWorkingDirectory = vitest.fn().mockReturnValue("/test/project") + mockVSCodeTerminal.runCommand = vitest + .fn() + .mockImplementation((command: string, callbacks: RooTerminalCallbacks) => { + setTimeout(() => { + callbacks.onCompleted("Command output", mockProcess) + callbacks.onShellExecutionComplete({ exitCode: 0 }, mockProcess) + }, 0) + return mockProcess + }) + ;(TerminalRegistry.getOrCreateTerminal as any).mockResolvedValue(mockVSCodeTerminal) + + const options: ExecuteCommandOptions = { + executionId: "test-123", + command: "echo test", + terminalShellIntegrationDisabled: false, + terminalOutputLineLimit: 500, + } + + // Execute + await executeCommand(mockTask, options) + + // Verify terminal.show() was NOT called + expect(mockVSCodeTerminal.terminal.show).not.toHaveBeenCalled() + }) + + it("should call terminal.show() when PREVENT_TERMINAL_DISRUPTION is disabled", async () => { + // Setup: Disable PREVENT_TERMINAL_DISRUPTION experiment + mockProvider.getState.mockResolvedValue({ + terminalOutputLineLimit: 500, + terminalShellIntegrationDisabled: false, + experiments: { preventTerminalDisruption: false }, + }) + + // Create a mock Terminal instance + const vscodeTerminal = new Terminal(1, undefined, "/test/project") + const mockVSCodeTerminal = vscodeTerminal as any + mockVSCodeTerminal.terminal = { + show: vitest.fn(), + } + mockVSCodeTerminal.getCurrentWorkingDirectory = vitest.fn().mockReturnValue("/test/project") + mockVSCodeTerminal.runCommand = vitest + .fn() + .mockImplementation((command: string, callbacks: RooTerminalCallbacks) => { + setTimeout(() => { + callbacks.onCompleted("Command output", mockProcess) + callbacks.onShellExecutionComplete({ exitCode: 0 }, mockProcess) + }, 0) + return mockProcess + }) + ;(TerminalRegistry.getOrCreateTerminal as any).mockResolvedValue(mockVSCodeTerminal) + + const options: ExecuteCommandOptions = { + executionId: "test-123", + command: "echo test", + terminalShellIntegrationDisabled: false, + terminalOutputLineLimit: 500, + } + + // Execute + await executeCommand(mockTask, options) + + // Verify terminal.show() was called + expect(mockVSCodeTerminal.terminal.show).toHaveBeenCalledWith(true) + }) + + it("should call terminal.show() when PREVENT_TERMINAL_DISRUPTION is not present in experiments", async () => { + // Setup: No PREVENT_TERMINAL_DISRUPTION in experiments + mockProvider.getState.mockResolvedValue({ + terminalOutputLineLimit: 500, + terminalShellIntegrationDisabled: false, + experiments: {}, + }) + + // Create a mock Terminal instance + const vscodeTerminal = new Terminal(1, undefined, "/test/project") + const mockVSCodeTerminal = vscodeTerminal as any + mockVSCodeTerminal.terminal = { + show: vitest.fn(), + } + mockVSCodeTerminal.getCurrentWorkingDirectory = vitest.fn().mockReturnValue("/test/project") + mockVSCodeTerminal.runCommand = vitest + .fn() + .mockImplementation((command: string, callbacks: RooTerminalCallbacks) => { + setTimeout(() => { + callbacks.onCompleted("Command output", mockProcess) + callbacks.onShellExecutionComplete({ exitCode: 0 }, mockProcess) + }, 0) + return mockProcess + }) + ;(TerminalRegistry.getOrCreateTerminal as any).mockResolvedValue(mockVSCodeTerminal) + + const options: ExecuteCommandOptions = { + executionId: "test-123", + command: "echo test", + terminalShellIntegrationDisabled: false, + terminalOutputLineLimit: 500, + } + + // Execute + await executeCommand(mockTask, options) + + // Verify terminal.show() was called + expect(mockVSCodeTerminal.terminal.show).toHaveBeenCalledWith(true) + }) + }) }) diff --git a/src/core/tools/__tests__/executeCommandTool.preventTerminalDisruption.integration.spec.ts b/src/core/tools/__tests__/executeCommandTool.preventTerminalDisruption.integration.spec.ts new file mode 100644 index 0000000000..67637d2118 --- /dev/null +++ b/src/core/tools/__tests__/executeCommandTool.preventTerminalDisruption.integration.spec.ts @@ -0,0 +1,42 @@ +// Integration test for PREVENT_TERMINAL_DISRUPTION functionality +// npx vitest run src/core/tools/__tests__/executeCommandTool.preventTerminalDisruption.integration.spec.ts + +import { EXPERIMENT_IDS, experiments } from "../../../shared/experiments" + +describe("PREVENT_TERMINAL_DISRUPTION integration", () => { + it("should have PREVENT_TERMINAL_DISRUPTION experiment defined", () => { + expect(EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION).toBe("preventTerminalDisruption") + }) + + it("should correctly check if PREVENT_TERMINAL_DISRUPTION is enabled", () => { + // Test when experiment is disabled (default) + const disabledConfig = { preventTerminalDisruption: false } + expect(experiments.isEnabled(disabledConfig, EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION)).toBe(false) + + // Test when experiment is enabled + const enabledConfig = { preventTerminalDisruption: true } + expect(experiments.isEnabled(enabledConfig, EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION)).toBe(true) + + // Test when experiment is not in config (should use default) + const emptyConfig = {} + expect(experiments.isEnabled(emptyConfig, EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION)).toBe(false) + }) + + it("should verify the executeCommandTool imports experiments correctly", async () => { + // This test verifies that the executeCommandTool module can import and use experiments + const executeCommandModule = await import("../executeCommandTool") + expect(executeCommandModule).toBeDefined() + expect(executeCommandModule.executeCommand).toBeDefined() + expect(executeCommandModule.executeCommandTool).toBeDefined() + }) + + it("should verify Terminal class structure for show method", async () => { + // This test verifies the Terminal class has the expected structure + const terminalModule = await import("../../../integrations/terminal/Terminal") + expect(terminalModule.Terminal).toBeDefined() + + // The Terminal class should have a constructor that accepts a terminal + const Terminal = terminalModule.Terminal + expect(typeof Terminal).toBe("function") + }) +}) diff --git a/src/core/tools/executeCommandTool.ts b/src/core/tools/executeCommandTool.ts index 2c7ce0d023..836189e695 100644 --- a/src/core/tools/executeCommandTool.ts +++ b/src/core/tools/executeCommandTool.ts @@ -17,6 +17,7 @@ import { TerminalRegistry } from "../../integrations/terminal/TerminalRegistry" import { Terminal } from "../../integrations/terminal/Terminal" import { Package } from "../../shared/package" import { t } from "../../i18n" +import { EXPERIMENT_IDS, experiments } from "../../shared/experiments" class ShellIntegrationError extends Error {} @@ -241,7 +242,20 @@ export async function executeCommand( const terminal = await TerminalRegistry.getOrCreateTerminal(workingDir, task.taskId, terminalProvider) if (terminal instanceof Terminal) { - terminal.terminal.show(true) + // Check if PREVENT_TERMINAL_DISRUPTION is enabled + // This experimental feature allows commands to run in the background without + // automatically switching focus to the terminal output, improving workflow continuity + const provider = task.providerRef.deref() + const state = provider ? await provider.getState() : null + const preventTerminalDisruption = experiments.isEnabled( + state?.experiments ?? {}, + EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION, + ) + + // Only show terminal if PREVENT_TERMINAL_DISRUPTION is not enabled + if (!preventTerminalDisruption) { + terminal.terminal.show(true) + } // Update the working directory in case the terminal we asked for has // a different working directory so that the model will know where the diff --git a/src/shared/__tests__/experiments-preventTerminalDisruption.spec.ts b/src/shared/__tests__/experiments-preventTerminalDisruption.spec.ts new file mode 100644 index 0000000000..074435ad64 --- /dev/null +++ b/src/shared/__tests__/experiments-preventTerminalDisruption.spec.ts @@ -0,0 +1,30 @@ +import { EXPERIMENT_IDS, experimentConfigsMap, experimentDefault, experiments } from "../experiments" + +describe("PREVENT_TERMINAL_DISRUPTION experiment", () => { + it("should include PREVENT_TERMINAL_DISRUPTION in EXPERIMENT_IDS", () => { + expect(EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION).toBe("preventTerminalDisruption") + }) + + it("should have PREVENT_TERMINAL_DISRUPTION in experimentConfigsMap", () => { + expect(experimentConfigsMap.PREVENT_TERMINAL_DISRUPTION).toBeDefined() + expect(experimentConfigsMap.PREVENT_TERMINAL_DISRUPTION.enabled).toBe(false) + }) + + it("should have PREVENT_TERMINAL_DISRUPTION in experimentDefault", () => { + expect(experimentDefault.preventTerminalDisruption).toBe(false) + }) + + it("should correctly check if PREVENT_TERMINAL_DISRUPTION is enabled", () => { + // Test when experiment is disabled (default) + const disabledConfig = { preventTerminalDisruption: false } + expect(experiments.isEnabled(disabledConfig, EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION)).toBe(false) + + // Test when experiment is enabled + const enabledConfig = { preventTerminalDisruption: true } + expect(experiments.isEnabled(enabledConfig, EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION)).toBe(true) + + // Test when experiment is not in config (should use default) + const emptyConfig = {} + expect(experiments.isEnabled(emptyConfig, EXPERIMENT_IDS.PREVENT_TERMINAL_DISRUPTION)).toBe(false) + }) +}) diff --git a/src/shared/__tests__/experiments.spec.ts b/src/shared/__tests__/experiments.spec.ts index 8a3c300441..9037536ba4 100644 --- a/src/shared/__tests__/experiments.spec.ts +++ b/src/shared/__tests__/experiments.spec.ts @@ -31,6 +31,8 @@ describe("experiments", () => { preventFocusDisruption: false, imageGeneration: false, runSlashCommand: false, + preventTerminalDisruption: false, + assistantMessageParser: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) @@ -42,6 +44,8 @@ describe("experiments", () => { preventFocusDisruption: false, imageGeneration: false, runSlashCommand: false, + preventTerminalDisruption: false, + assistantMessageParser: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(true) }) @@ -53,6 +57,8 @@ describe("experiments", () => { preventFocusDisruption: false, imageGeneration: false, runSlashCommand: false, + preventTerminalDisruption: false, + assistantMessageParser: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index 90495c56b7..f8864123cf 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -6,6 +6,8 @@ export const EXPERIMENT_IDS = { PREVENT_FOCUS_DISRUPTION: "preventFocusDisruption", IMAGE_GENERATION: "imageGeneration", RUN_SLASH_COMMAND: "runSlashCommand", + PREVENT_TERMINAL_DISRUPTION: "preventTerminalDisruption", + ASSISTANT_MESSAGE_PARSER: "assistantMessageParser", } as const satisfies Record type _AssertExperimentIds = AssertEqual>> @@ -22,6 +24,8 @@ export const experimentConfigsMap: Record = { PREVENT_FOCUS_DISRUPTION: { enabled: false }, IMAGE_GENERATION: { enabled: false }, RUN_SLASH_COMMAND: { enabled: false }, + PREVENT_TERMINAL_DISRUPTION: { enabled: false }, + ASSISTANT_MESSAGE_PARSER: { enabled: false }, } export const experimentDefault = Object.fromEntries( diff --git a/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx b/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx index 33d7dc0ec7..509df55dd4 100644 --- a/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx +++ b/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx @@ -235,6 +235,8 @@ describe("mergeExtensionState", () => { newTaskRequireTodos: false, imageGeneration: false, runSlashCommand: false, + preventTerminalDisruption: false, + assistantMessageParser: false, } as Record, } @@ -255,6 +257,8 @@ describe("mergeExtensionState", () => { newTaskRequireTodos: false, imageGeneration: false, runSlashCommand: false, + preventTerminalDisruption: false, + assistantMessageParser: false, }) }) }) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 91a02e7a1c..ddcc0673a4 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -731,6 +731,10 @@ "name": "Edició en segon pla", "description": "Quan s'activa, evita la interrupció del focus de l'editor. Les edicions de fitxers es produeixen en segon pla sense obrir la vista diff o robar el focus. Pots continuar treballant sense interrupcions mentre Roo fa canvis. Els fitxers poden obrir-se sense focus per capturar diagnòstics o romandre completament tancats." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Execució de terminal en segon pla", + "description": "Quan s'activa, evita la interrupció del focus del terminal. Les ordres s'executen en segon pla sense canviar automàticament als terminals de sortida. Pots continuar treballant al teu terminal actual mentre Roo executa ordres, mantenint el context del terminal i controlant manualment quan veure les sortides d'ordres." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Utilitza el nou analitzador de missatges", "description": "Activa l'analitzador de missatges en streaming experimental que millora el rendiment en respostes llargues processant els missatges de manera més eficient." diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index fd89eb9637..8ffe18f655 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -731,6 +731,10 @@ "name": "Hintergrundbearbeitung", "description": "Verhindert Editor-Fokus-Störungen wenn aktiviert. Dateibearbeitungen erfolgen im Hintergrund ohne Öffnung von Diff-Ansichten oder Fokus-Diebstahl. Du kannst ungestört weiterarbeiten, während Roo Änderungen vornimmt. Dateien können ohne Fokus geöffnet werden, um Diagnosen zu erfassen oder vollständig geschlossen bleiben." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Hintergrund-Terminal-Ausführung", + "description": "Verhindert Terminal-Fokus-Störungen wenn aktiviert. Befehle werden im Hintergrund ausgeführt ohne automatisches Wechseln zu Ausgabe-Terminals. Du kannst in deinem aktuellen Terminal weiterarbeiten während Roo Befehle ausführt und behältst die Kontrolle über deinen Terminal-Kontext und wann du Befehlsausgaben anzeigen möchtest." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Neuen Nachrichtenparser verwenden", "description": "Aktiviere den experimentellen Streaming-Nachrichtenparser, der lange Antworten durch effizientere Verarbeitung spürbar schneller macht." diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 50d8470abf..1b8efd0ae3 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -730,6 +730,10 @@ "name": "Background editing", "description": "Prevent editor focus disruption when enabled. File edits happen in the background without opening diff views or stealing focus. You can continue working uninterrupted while Roo makes changes. Files can be opened without focus to capture diagnostics or kept closed entirely." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Background terminal execution", + "description": "Prevent terminal focus disruption when enabled. Commands execute in the background without automatically switching to output terminals. You can continue working in your current terminal while Roo runs commands, maintaining your terminal context and manually controlling when to view command outputs." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Use new message parser", "description": "Enable the experimental streaming message parser that provides significant performance improvements for long assistant responses by processing messages more efficiently." diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 8e6968e8c2..ced5f24ee6 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -731,6 +731,10 @@ "name": "Edición en segundo plano", "description": "Previene la interrupción del foco del editor cuando está habilitado. Las ediciones de archivos ocurren en segundo plano sin abrir vistas de diferencias o robar el foco. Puedes continuar trabajando sin interrupciones mientras Roo realiza cambios. Los archivos pueden abrirse sin foco para capturar diagnósticos o mantenerse completamente cerrados." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Ejecución de terminal en segundo plano", + "description": "Previene la interrupción del foco del terminal cuando está habilitado. Los comandos se ejecutan en segundo plano sin cambiar automáticamente a terminales de salida. Puedes continuar trabajando en tu terminal actual mientras Roo ejecuta comandos, manteniendo tu contexto de terminal y controlando manualmente cuándo ver las salidas de comandos." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Usar el nuevo analizador de mensajes", "description": "Activa el analizador de mensajes en streaming experimental que mejora el rendimiento en respuestas largas procesando los mensajes de forma más eficiente." diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index fd48e1e358..f81ff0538d 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -731,6 +731,10 @@ "name": "Édition en arrière-plan", "description": "Empêche la perturbation du focus de l'éditeur lorsqu'activé. Les modifications de fichiers se font en arrière-plan sans ouvrir de vues de différences ou voler le focus. Vous pouvez continuer à travailler sans interruption pendant que Roo effectue des changements. Les fichiers peuvent être ouverts sans focus pour capturer les diagnostics ou rester complètement fermés." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Exécution de terminal en arrière-plan", + "description": "Empêche la perturbation du focus du terminal lorsqu'activé. Les commandes s'exécutent en arrière-plan sans basculer automatiquement vers les terminaux de sortie. Vous pouvez continuer à travailler dans votre terminal actuel pendant que Roo exécute des commandes, en gardant votre contexte de terminal et en contrôlant manuellement quand voir les sorties de commandes." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Utiliser le nouveau parseur de messages", "description": "Active le parseur de messages en streaming expérimental qui accélère nettement les longues réponses en traitant les messages plus efficacement." diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 1383eb8703..244a2c26a4 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -732,6 +732,10 @@ "name": "बैकग्राउंड संपादन", "description": "सक्षम होने पर एडिटर फोकस व्यवधान को रोकता है। फ़ाइल संपादन diff व्यू खोले बिना या फोकस चुराए बिना बैकग्राउंड में होता है। आप Roo के बदलाव करते समय बिना किसी बाधा के काम जारी रख सकते हैं। फ़ाइलें डायग्नोस्टिक्स कैप्चर करने के लिए बिना फोकस के खुल सकती हैं या पूरी तरह बंद रह सकती हैं।" }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "बैकग्राउंड टर्मिनल निष्पादन", + "description": "सक्षम होने पर टर्मिनल फोकस व्यवधान को रोकता है। कमांड बैकग्राउंड में चलते हैं बिना आउटपुट टर्मिनल पर स्वचालित रूप से स्विच किए। आप अपने वर्तमान टर्मिनल में काम जारी रख सकते हैं जबकि Roo कमांड चलाता है, टर्मिनल संदर्भ बनाए रखते हुए और मैन्युअल रूप से नियंत्रित करते हुए कि कब कमांड आउटपुट देखना है।" + }, "ASSISTANT_MESSAGE_PARSER": { "name": "नए मैसेज पार्सर का उपयोग करें", "description": "प्रायोगिक स्ट्रीमिंग मैसेज पार्सर सक्षम करें, जो लंबे उत्तरों के लिए संदेशों को अधिक कुशलता से प्रोसेस करके प्रदर्शन को बेहतर बनाता है।" diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index c29f6cf88c..84b37bc705 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -761,6 +761,10 @@ "name": "Pengeditan Latar Belakang", "description": "Ketika diaktifkan, mencegah gangguan fokus editor. Pengeditan file terjadi di latar belakang tanpa membuka tampilan diff atau mencuri fokus. Anda dapat terus bekerja tanpa gangguan saat Roo melakukan perubahan. File mungkin dibuka tanpa fokus untuk menangkap diagnostik atau tetap tertutup sepenuhnya." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Eksekusi Terminal Latar Belakang", + "description": "Ketika diaktifkan, mencegah gangguan fokus terminal. Perintah berjalan di latar belakang tanpa beralih otomatis ke terminal output. Anda dapat terus bekerja di terminal saat ini sementara Roo menjalankan perintah, mempertahankan konteks terminal dan mengontrol secara manual kapan melihat output perintah." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Gunakan parser pesan baru", "description": "Aktifkan parser pesan streaming eksperimental yang meningkatkan kinerja untuk respons panjang dengan memproses pesan lebih efisien." diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index a930c53a5e..28cc892975 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -732,6 +732,10 @@ "name": "Modifica in background", "description": "Previene l'interruzione del focus dell'editor quando abilitato. Le modifiche ai file avvengono in background senza aprire viste di differenze o rubare il focus. Puoi continuare a lavorare senza interruzioni mentre Roo effettua modifiche. I file possono essere aperti senza focus per catturare diagnostiche o rimanere completamente chiusi." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Esecuzione del terminale in background", + "description": "Previene l'interruzione del focus del terminal quando abilitato. I comandi vengono eseguiti in background senza passare automaticamente ai terminal di output. Puoi continuare a lavorare nel tuo terminal corrente mentre Roo esegue comandi, mantenendo il tuo contesto terminal e controllando manualmente quando visualizzare gli output dei comandi." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Usa il nuovo parser dei messaggi", "description": "Abilita il parser di messaggi in streaming sperimentale che migliora nettamente le risposte lunghe elaborando i messaggi in modo più efficiente." diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index c6b24dcd58..f79217dcfa 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -732,6 +732,10 @@ "name": "バックグラウンド編集", "description": "有効にすると、エディターのフォーカス中断を防ぎます。ファイル編集は差分ビューを開いたりフォーカスを奪ったりすることなく、バックグラウンドで行われます。Rooが変更を行っている間も中断されることなく作業を続けることができます。ファイルは診断をキャプチャするためにフォーカスなしで開くか、完全に閉じたままにできます。" }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "バックグラウンドターミナル実行", + "description": "有効にすると、ターミナルのフォーカス中断を防ぎます。コマンドはバックグラウンドで実行され、出力ターミナルに自動的に切り替わりません。Rooがコマンドを実行している間も現在のターミナルで作業を続けることができ、ターミナルコンテキストを維持し、コマンド出力を表示するタイミングを手動で制御できます。" + }, "ASSISTANT_MESSAGE_PARSER": { "name": "新しいメッセージパーサーを使う", "description": "実験的なストリーミングメッセージパーサーを有効にします。長い回答をより効率的に処理し、遅延を減らします。" diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 49ff40ebc7..fd09c9f952 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -732,6 +732,10 @@ "name": "백그라운드 편집", "description": "활성화하면 편집기 포커스 방해를 방지합니다. 파일 편집이 diff 뷰를 열거나 포커스를 빼앗지 않고 백그라운드에서 수행됩니다. Roo가 변경사항을 적용하는 동안 방해받지 않고 계속 작업할 수 있습니다. 파일은 진단을 캡처하기 위해 포커스 없이 열거나 완전히 닫힌 상태로 유지할 수 있습니다." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "백그라운드 터미널 실행", + "description": "활성화하면 터미널 포커스 방해를 방지합니다. 명령어가 출력 터미널로 자동 전환 없이 백그라운드에서 실행됩니다. Roo가 명령어를 실행하는 동안 현재 터미널에서 계속 작업할 수 있으며, 터미널 컨텍스트를 유지하고 명령어 출력을 언제 볼지 수동으로 제어할 수 있습니다." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "새 메시지 파서 사용", "description": "실험적 스트리밍 메시지 파서를 활성화합니다. 긴 응답을 더 효율적으로 처리해 지연을 줄입니다." diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 571453c4b3..793bcbf134 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -732,6 +732,10 @@ "name": "Achtergrondbewerking", "description": "Voorkomt editor focus verstoring wanneer ingeschakeld. Bestandsbewerkingen gebeuren op de achtergrond zonder diff-weergaven te openen of focus te stelen. Je kunt ononderbroken doorwerken terwijl Roo wijzigingen aanbrengt. Bestanden kunnen zonder focus worden geopend om diagnostiek vast te leggen of volledig gesloten blijven." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Achtergrond Terminal Uitvoering", + "description": "Voorkomt terminal focus verstoring wanneer ingeschakeld. Commando's worden op de achtergrond uitgevoerd zonder automatisch over te schakelen naar output terminals. Je kunt ononderbroken doorwerken in je huidige terminal terwijl Roo commando's uitvoert, waarbij de terminal context behouden blijft en je handmatig controleert wanneer je commando outputs wilt bekijken." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Nieuwe berichtparser gebruiken", "description": "Schakel de experimentele streaming-berichtparser in die lange antwoorden sneller maakt door berichten efficiënter te verwerken." diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 51a5b4c389..be1c5b36c2 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -732,6 +732,10 @@ "name": "Edycja w tle", "description": "Zapobiega zakłócaniu fokusa edytora gdy włączone. Edycje plików odbywają się w tle bez otwierania widoków różnic lub kradzieży fokusa. Możesz kontynuować pracę bez przeszkód podczas gdy Roo wprowadza zmiany. Pliki mogą być otwierane bez fokusa aby przechwycić diagnostykę lub pozostać całkowicie zamknięte." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Wykonywanie terminala w tle", + "description": "Zapobiega zakłócaniu fokusa terminala gdy włączone. Polecenia są wykonywane w tle bez automatycznego przełączania na terminale wyjściowe. Możesz kontynuować pracę w bieżącym terminalu podczas gdy Roo wykonuje polecenia, zachowując kontekst terminala i ręcznie kontrolując kiedy chcesz zobaczyć wyniki poleceń." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Użyj nowego parsera wiadomości", "description": "Włącz eksperymentalny parser wiadomości w strumieniu, który przyspiesza długie odpowiedzi dzięki bardziej wydajnemu przetwarzaniu wiadomości." diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 09320ea719..d446754b75 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -732,6 +732,10 @@ "name": "Edição em segundo plano", "description": "Previne a interrupção do foco do editor quando habilitado. As edições de arquivos acontecem em segundo plano sem abrir visualizações de diferenças ou roubar o foco. Você pode continuar trabalhando sem interrupções enquanto o Roo faz alterações. Os arquivos podem ser abertos sem foco para capturar diagnósticos ou permanecer completamente fechados." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Execução de terminal em segundo plano", + "description": "Previne a interrupção do foco do terminal quando habilitado. Os comandos são executados em segundo plano sem alternar automaticamente para terminais de saída. Você pode continuar trabalhando no seu terminal atual enquanto o Roo executa comandos, mantendo o contexto do terminal e controlando manualmente quando visualizar as saídas dos comandos." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Usar o novo parser de mensagens", "description": "Ativa o parser de mensagens em streaming experimental que acelera respostas longas ao processar as mensagens de forma mais eficiente." diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 3bed3624da..4c8a15911b 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -732,6 +732,10 @@ "name": "Фоновое редактирование", "description": "Предотвращает нарушение фокуса редактора при включении. Редактирование файлов происходит в фоновом режиме без открытия представлений различий или кражи фокуса. Вы можете продолжать работать без перерывов, пока Roo вносит изменения. Файлы могут открываться без фокуса для захвата диагностики или оставаться полностью закрытыми." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Фоновое выполнение терминала", + "description": "Предотвращает нарушение фокуса терминала при включении. Команды выполняются в фоновом режиме без автоматического переключения на выходные терминалы. Вы можете продолжать работать в текущем терминале, пока Roo выполняет команды, сохраняя контекст терминала и вручную контролируя, когда просматривать выходные данные команд." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Использовать новый парсер сообщений", "description": "Включите экспериментальный потоковый парсер сообщений, который ускоряет длинные ответы благодаря более эффективной обработке сообщений." diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 7de08d4826..354154691e 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -732,6 +732,10 @@ "name": "Arka plan düzenleme", "description": "Etkinleştirildiğinde editör odak kesintisini önler. Dosya düzenlemeleri diff görünümlerini açmadan veya odağı çalmadan arka planda gerçekleşir. Roo değişiklikler yaparken kesintisiz çalışmaya devam edebilirsiniz. Dosyalar tanılamayı yakalamak için odaksız açılabilir veya tamamen kapalı kalabilir." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Arka plan terminal yürütme", + "description": "Etkinleştirildiğinde terminal odak kesintisini önler. Komutlar çıktı terminallerine otomatik geçiş yapmadan arka planda çalışır. Roo komutları yürütürken mevcut terminalinizde çalışmaya devam edebilir, terminal bağlamını koruyabilir ve komut çıktılarını ne zaman görüntüleyeceğinizi manuel olarak kontrol edebilirsiniz." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Yeni mesaj ayrıştırıcıyı kullan", "description": "Uzun yanıtları daha verimli işleyerek hızlandıran deneysel akış mesaj ayrıştırıcısını etkinleştir." diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 46dc077d4d..98aa79cd73 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -732,6 +732,10 @@ "name": "Chỉnh sửa nền", "description": "Khi được bật, ngăn chặn gián đoạn tiêu điểm trình soạn thảo. Việc chỉnh sửa tệp diễn ra ở nền mà không mở chế độ xem diff hoặc chiếm tiêu điểm. Bạn có thể tiếp tục làm việc không bị gián đoạn trong khi Roo thực hiện thay đổi. Các tệp có thể được mở mà không có tiêu điểm để thu thập chẩn đoán hoặc giữ hoàn toàn đóng." }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "Thực thi terminal nền", + "description": "Khi được bật, ngăn chặn gián đoạn tiêu điểm terminal. Lệnh chạy ở nền mà không tự động chuyển sang terminal đầu ra. Bạn có thể tiếp tục làm việc trong terminal hiện tại trong khi Roo thực thi lệnh, duy trì ngữ cảnh terminal và kiểm soát thủ công khi nào xem đầu ra lệnh." + }, "ASSISTANT_MESSAGE_PARSER": { "name": "Dùng bộ phân tích tin nhắn mới", "description": "Bật bộ phân tích tin nhắn streaming thử nghiệm. Tính năng này tăng tốc phản hồi dài bằng cách xử lý tin nhắn hiệu quả hơn." diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index ab47a2c9e0..a5443d7709 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -732,6 +732,10 @@ "name": "后台编辑", "description": "启用后防止编辑器焦点干扰。文件编辑在后台进行,不会打开差异视图或抢夺焦点。你可以在 Roo 进行更改时继续不受干扰地工作。文件可以在不获取焦点的情况下打开以捕获诊断信息,或保持完全关闭状态。" }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "后台终端执行", + "description": "启用后防止终端焦点干扰。命令在后台执行,不会自动切换到输出终端。你可以在 Roo 执行命令时继续在当前终端中工作,保持终端上下文并手动控制何时查看命令输出。" + }, "ASSISTANT_MESSAGE_PARSER": { "name": "使用新的消息解析器", "description": "启用实验性的流式消息解析器。通过更高效地处理消息,可显著提升长回复的性能。" diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 57d647d9cf..a5c7e123cd 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -732,6 +732,10 @@ "name": "背景編輯", "description": "啟用後可防止編輯器焦點中斷。檔案編輯會在背景進行,不會開啟 diff 檢視或搶奪焦點。您可以在 Roo 進行變更時繼續不受干擾地工作。檔案可能會在不獲得焦點的情況下開啟以捕獲診斷,或保持完全關閉。" }, + "PREVENT_TERMINAL_DISRUPTION": { + "name": "背景終端執行", + "description": "啟用後可防止終端焦點中斷。指令會在背景執行,不會自動切換到輸出終端。您可以在 Roo 執行指令時繼續在目前終端中工作,保持終端內容並手動控制何時檢視指令輸出。" + }, "ASSISTANT_MESSAGE_PARSER": { "name": "使用全新訊息解析器", "description": "啟用實驗性的串流訊息解析器。透過更有效率地處理訊息,能顯著提升長回覆的效能。"