diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index bf5901b8171..355c4fca384 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -798,36 +798,44 @@ export class ClineProvider extends EventEmitter implements await this.updateGlobalState("mode", newMode) - // Load the saved API config for the new mode if it exists - const savedConfigId = await this.providerSettingsManager.getModeConfigId(newMode) - const listApiConfig = await this.providerSettingsManager.listConfig() + const stickyModesEnabled = this.getGlobalState("stickyModesEnabled") ?? true - // Update listApiConfigMeta first to ensure UI has latest data - await this.updateGlobalState("listApiConfigMeta", listApiConfig) + if (stickyModesEnabled) { + // Load the saved API config for the new mode if it exists + const savedConfigId = await this.providerSettingsManager.getModeConfigId(newMode) + const listApiConfig = await this.providerSettingsManager.listConfig() - // If this mode has a saved config, use it - if (savedConfigId) { - const config = listApiConfig?.find((c) => c.id === savedConfigId) + // Update listApiConfigMeta first to ensure UI has latest data + await this.updateGlobalState("listApiConfigMeta", listApiConfig) - if (config?.name) { - const apiConfig = await this.providerSettingsManager.loadConfig(config.name) + // If this mode has a saved config, use it + if (savedConfigId) { + const config = listApiConfig?.find((c) => c.id === savedConfigId) - await Promise.all([ - this.updateGlobalState("currentApiConfigName", config.name), - this.updateApiConfiguration(apiConfig), - ]) - } - } else { - // If no saved config for this mode, save current config as default - const currentApiConfigName = this.getGlobalState("currentApiConfigName") + if (config?.name) { + const apiConfig = await this.providerSettingsManager.loadConfig(config.name) + + await Promise.all([ + this.updateGlobalState("currentApiConfigName", config.name), + this.updateApiConfiguration(apiConfig), + ]) + } + } else { + // If no saved config for this mode, save current config as default + const currentApiConfigName = this.getGlobalState("currentApiConfigName") - if (currentApiConfigName) { - const config = listApiConfig?.find((c) => c.name === currentApiConfigName) + if (currentApiConfigName) { + const config = listApiConfig?.find((c) => c.name === currentApiConfigName) - if (config?.id) { - await this.providerSettingsManager.setModeConfig(newMode, config.id) + if (config?.id) { + await this.providerSettingsManager.setModeConfig(newMode, config.id) + } } } + } else { + // If sticky modes are disabled, ensure we don't accidentally load a stale config + const listApiConfig = await this.providerSettingsManager.listConfig() + await this.updateGlobalState("listApiConfigMeta", listApiConfig) } await this.postStateToWebview() @@ -1243,6 +1251,7 @@ export class ClineProvider extends EventEmitter implements showRooIgnoredFiles, language, maxReadFileLine, + stickyModesEnabled, terminalCompressProgressBar, } = await this.getState() @@ -1329,6 +1338,7 @@ export class ClineProvider extends EventEmitter implements settingsImportedAt: this.settingsImportedAt, terminalCompressProgressBar: terminalCompressProgressBar ?? true, hasSystemPromptOverride, + stickyModesEnabled: stickyModesEnabled ?? true, } } @@ -1417,6 +1427,7 @@ export class ClineProvider extends EventEmitter implements telemetrySetting: stateValues.telemetrySetting || "unset", showRooIgnoredFiles: stateValues.showRooIgnoredFiles ?? true, maxReadFileLine: stateValues.maxReadFileLine ?? 500, + stickyModesEnabled: stateValues.stickyModesEnabled ?? true, } } diff --git a/src/core/webview/__tests__/ClineProvider.test.ts b/src/core/webview/__tests__/ClineProvider.test.ts index 5d6067bbf56..5e14f7781f8 100644 --- a/src/core/webview/__tests__/ClineProvider.test.ts +++ b/src/core/webview/__tests__/ClineProvider.test.ts @@ -416,6 +416,7 @@ describe("ClineProvider", () => { showRooIgnoredFiles: true, renderContext: "sidebar", maxReadFileLine: 500, + stickyModesEnabled: true, } const message: ExtensionMessage = { @@ -538,6 +539,36 @@ describe("ClineProvider", () => { expect(mockPostMessage).toHaveBeenCalled() }) + test("stickyModesEnabled defaults to true when not set", async () => { + // Mock globalState.get to return undefined for stickyModesEnabled + ;(mockContext.globalState.get as jest.Mock).mockImplementation((key: string) => { + if (key === "stickyModesEnabled") { + return undefined + } + return null + }) + + const state = await provider.getState() + expect(state.stickyModesEnabled).toBe(true) + }) + + test("handles stickyModesEnabled message", async () => { + await provider.resolveWebviewView(mockWebviewView) + const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as jest.Mock).mock.calls[0][0] + + // Test setting to false + await messageHandler({ type: "stickyModesEnabled", bool: false }) + expect(updateGlobalStateSpy).toHaveBeenCalledWith("stickyModesEnabled", false) + expect(mockContext.globalState.update).toHaveBeenCalledWith("stickyModesEnabled", false) + expect(mockPostMessage).toHaveBeenCalled() + + // Test setting to true + await messageHandler({ type: "stickyModesEnabled", bool: true }) + expect(updateGlobalStateSpy).toHaveBeenCalledWith("stickyModesEnabled", true) + expect(mockContext.globalState.update).toHaveBeenCalledWith("stickyModesEnabled", true) + expect(mockPostMessage).toHaveBeenCalled() + }) + test("updates sound utility when sound setting changes", async () => { await provider.resolveWebviewView(mockWebviewView) @@ -1603,6 +1634,45 @@ describe("ClineProvider", () => { // Verify state was posted to webview expect(mockPostMessage).toHaveBeenCalledWith(expect.objectContaining({ type: "state" })) }) + + test("does NOT load/save config when stickyModesEnabled is false", async () => { + // Mock globalState to return stickyModesEnabled: false + mockContext.globalState.get = jest.fn((key: string) => { + if (key === "stickyModesEnabled") return false + if (key === "mode") return "code" // Start in some mode + return undefined + }) + + // Re-initialize provider with updated mock context + provider = new ClineProvider(mockContext, mockOutputChannel) + await provider.resolveWebviewView(mockWebviewView) + + const mockProviderSettingsManager = { + getModeConfigId: jest.fn(), + listConfig: jest.fn().mockResolvedValue([]), // Still need to list configs + loadConfig: jest.fn(), + setModeConfig: jest.fn(), + } + ;(provider as any).providerSettingsManager = mockProviderSettingsManager + + // Switch to architect mode + await provider.handleModeSwitch("architect") + + // Verify mode was updated + expect(mockContext.globalState.update).toHaveBeenCalledWith("mode", "architect") + + // Verify config loading/saving methods were NOT called + expect(mockProviderSettingsManager.getModeConfigId).not.toHaveBeenCalled() + expect(mockProviderSettingsManager.loadConfig).not.toHaveBeenCalled() + expect(mockProviderSettingsManager.setModeConfig).not.toHaveBeenCalled() + + // Verify listConfig and updateGlobalState("listApiConfigMeta", ...) were still called + expect(mockProviderSettingsManager.listConfig).toHaveBeenCalled() + expect(mockContext.globalState.update).toHaveBeenCalledWith("listApiConfigMeta", []) + + // Verify state was posted to webview + expect(mockPostMessage).toHaveBeenCalledWith(expect.objectContaining({ type: "state" })) + }) }) describe("updateCustomMode", () => { diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index a62c1d94104..32d0351e988 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -948,6 +948,10 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We await updateGlobalState("showRooIgnoredFiles", message.bool ?? true) await provider.postStateToWebview() break + case "stickyModesEnabled": + await updateGlobalState("stickyModesEnabled", message.bool ?? true) + await provider.postStateToWebview() + break case "maxReadFileLine": await updateGlobalState("maxReadFileLine", message.value) await provider.postStateToWebview() diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 894b776985c..e8e7c07d020 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -407,6 +407,7 @@ type GlobalSettings = { } | undefined enhancementApiConfigId?: string | undefined + stickyModesEnabled?: boolean | undefined } type ClineMessage = { diff --git a/src/exports/types.ts b/src/exports/types.ts index 4f394c29741..da3b1999712 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -410,6 +410,7 @@ type GlobalSettings = { } | undefined enhancementApiConfigId?: string | undefined + stickyModesEnabled?: boolean | undefined } export type { GlobalSettings } diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 2dc4d3f6a1e..14d8b07c6a8 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -581,6 +581,7 @@ export const globalSettingsSchema = z.object({ customModePrompts: customModePromptsSchema.optional(), customSupportPrompts: customSupportPromptsSchema.optional(), enhancementApiConfigId: z.string().optional(), + stickyModesEnabled: z.boolean().optional(), }) export type GlobalSettings = z.infer @@ -658,6 +659,7 @@ const globalSettingsRecord: GlobalSettingsRecord = { customSupportPrompts: undefined, enhancementApiConfigId: undefined, cachedChromeHostUrl: undefined, + stickyModesEnabled: undefined, } export const GLOBAL_SETTINGS_KEYS = Object.keys(globalSettingsRecord) as Keys[] diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index b942188345f..29305a47fc2 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -172,6 +172,7 @@ export type ExtensionState = Pick< | "customModePrompts" | "customSupportPrompts" | "enhancementApiConfigId" + | "stickyModesEnabled" > & { version: string clineMessages: ClineMessage[] diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 6b5c111f7a6..e9a91569c88 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -126,6 +126,7 @@ export interface WebviewMessage { | "maxReadFileLine" | "searchFiles" | "toggleApiConfigPin" + | "stickyModesEnabled" text?: string disabled?: boolean askResponse?: ClineAskResponse diff --git a/webview-ui/src/components/settings/MiscellaneousSettings.tsx b/webview-ui/src/components/settings/MiscellaneousSettings.tsx new file mode 100644 index 00000000000..005bf5de073 --- /dev/null +++ b/webview-ui/src/components/settings/MiscellaneousSettings.tsx @@ -0,0 +1,47 @@ +import { HTMLAttributes } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" +import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" +import { Settings } from "lucide-react" + +import { SetCachedStateField } from "./types" +import { SectionHeader } from "./SectionHeader" +import { Section } from "./Section" + +type MiscellaneousSettingsProps = HTMLAttributes & { + stickyModesEnabled?: boolean + setCachedStateField: SetCachedStateField<"stickyModesEnabled"> +} + +export const MiscellaneousSettings = ({ + stickyModesEnabled, + setCachedStateField, + className, + ...props +}: MiscellaneousSettingsProps) => { + const { t } = useAppTranslation() + + return ( +
+ +
+ +
{t("settings:sections.miscellaneous")}
+
+
+ +
+
+ setCachedStateField("stickyModesEnabled", e.target.checked)} + data-testid="sticky-modes-enabled-checkbox"> + {t("settings:miscellaneous.stickyModes.label")} + +
+ {t("settings:miscellaneous.stickyModes.description")} +
+
+
+
+ ) +} diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 7205b043707..9a74181444d 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -8,6 +8,7 @@ import { Bell, Database, SquareTerminal, + Settings as SettingsIcon, // renamed to avoid conflict with component name FlaskConical, AlertTriangle, Globe, @@ -49,6 +50,7 @@ import { CheckpointSettings } from "./CheckpointSettings" import { NotificationSettings } from "./NotificationSettings" import { ContextManagementSettings } from "./ContextManagementSettings" import { TerminalSettings } from "./TerminalSettings" +import { MiscellaneousSettings } from "./MiscellaneousSettings" import { ExperimentalSettings } from "./ExperimentalSettings" import { LanguageSettings } from "./LanguageSettings" import { About } from "./About" @@ -66,6 +68,7 @@ const sectionNames = [ "notifications", "contextManagement", "terminal", + "miscellaneous", "experimental", "language", "about", @@ -131,6 +134,7 @@ const SettingsView = forwardRef(({ onDone, t terminalZshOhMy, terminalZshP10k, terminalZdotdir, + stickyModesEnabled, writeDelayMs, showRooIgnoredFiles, remoteBrowserEnabled, @@ -245,6 +249,7 @@ const SettingsView = forwardRef(({ onDone, t vscode.postMessage({ type: "terminalZshOhMy", bool: terminalZshOhMy }) vscode.postMessage({ type: "terminalZshP10k", bool: terminalZshP10k }) vscode.postMessage({ type: "terminalZdotdir", bool: terminalZdotdir }) + vscode.postMessage({ type: "stickyModesEnabled", bool: stickyModesEnabled }) vscode.postMessage({ type: "terminalCompressProgressBar", bool: terminalCompressProgressBar }) vscode.postMessage({ type: "mcpEnabled", bool: mcpEnabled }) vscode.postMessage({ type: "alwaysApproveResubmit", bool: alwaysApproveResubmit }) @@ -290,6 +295,7 @@ const SettingsView = forwardRef(({ onDone, t const notificationsRef = useRef(null) const contextManagementRef = useRef(null) const terminalRef = useRef(null) + const miscellaneousRef = useRef(null) const experimentalRef = useRef(null) const languageRef = useRef(null) const aboutRef = useRef(null) @@ -303,6 +309,7 @@ const SettingsView = forwardRef(({ onDone, t { id: "notifications", icon: Bell, ref: notificationsRef }, { id: "contextManagement", icon: Database, ref: contextManagementRef }, { id: "terminal", icon: SquareTerminal, ref: terminalRef }, + { id: "miscellaneous", icon: SettingsIcon, ref: miscellaneousRef }, { id: "experimental", icon: FlaskConical, ref: experimentalRef }, { id: "language", icon: Globe, ref: languageRef }, { id: "about", icon: Info, ref: aboutRef }, @@ -315,6 +322,7 @@ const SettingsView = forwardRef(({ onDone, t notificationsRef, contextManagementRef, terminalRef, + miscellaneousRef, experimentalRef, ], ) @@ -497,6 +505,13 @@ const SettingsView = forwardRef(({ onDone, t /> +
+ +
+
setPinnedApiConfigs: (value: Record) => void togglePinnedApiConfig: (configName: string) => void + stickyModesEnabled: boolean + setStickyModesEnabled: (value: boolean) => void terminalCompressProgressBar?: boolean setTerminalCompressProgressBar: (value: boolean) => void } @@ -165,6 +167,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode terminalZshOhMy: false, // Default Oh My Zsh integration setting terminalZshP10k: false, // Default Powerlevel10k integration setting terminalZdotdir: false, // Default ZDOTDIR handling setting + stickyModesEnabled: true, // Default sticky modes to enabled terminalCompressProgressBar: true, // Default to compress progress bar output }) @@ -336,6 +339,8 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode return { ...prevState, pinnedApiConfigs: newPinned } }), + stickyModesEnabled: state.stickyModesEnabled ?? true, + setStickyModesEnabled: (value) => setState((prevState) => ({ ...prevState, stickyModesEnabled: value })), } return {children} diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 16f0b833b37..9b9b9ccc106 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -26,6 +26,7 @@ "notifications": "Notificacions", "contextManagement": "Gestió de context", "terminal": "Terminal", + "miscellaneous": "Diversos", "advanced": "Avançat", "experimental": "Funcions experimentals", "language": "Idioma", @@ -340,6 +341,13 @@ "description": "Quan està habilitat, estableix POWERLEVEL9K_TERM_SHELL_INTEGRATION=true per habilitar les característiques d'integració del shell Powerlevel10k. (experimental)" } }, + "miscellaneous": { + "description": "Configuracions diverses que no encaixen en altres categories.", + "stickyModes": { + "label": "Activa els modes persistents", + "description": "Quan està activat, Roo recordarà l'últim model utilitzat per a cada mode i el seleccionarà automàticament en tornar a aquest mode." + } + }, "advanced": { "diff": { "label": "Habilitar edició mitjançant diffs", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 2307eee89c7..460c40cddbd 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -26,6 +26,7 @@ "notifications": "Benachrichtigungen", "contextManagement": "Kontext-Management", "terminal": "Terminal", + "miscellaneous": "Verschiedenes", "advanced": "Erweitert", "experimental": "Experimentelle Funktionen", "language": "Sprache", @@ -340,6 +341,13 @@ "description": "Wenn aktiviert, wird POWERLEVEL9K_TERM_SHELL_INTEGRATION=true gesetzt, um die Shell-Integrationsfunktionen von Powerlevel10k zu aktivieren. (experimentell)" } }, + "miscellaneous": { + "description": "Verschiedene Einstellungen, die nicht in andere Kategorien passen.", + "stickyModes": { + "label": "Sticky Modes aktivieren", + "description": "Wenn aktiviert, merkt sich Roo das zuletzt verwendete Modell für jeden Modus und wählt es automatisch aus, wenn du zu diesem Modus zurückkehrst." + } + }, "advanced": { "diff": { "label": "Bearbeitung durch Diffs aktivieren", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 4a81e77ae99..bc81d996a82 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -26,6 +26,7 @@ "notifications": "Notifications", "contextManagement": "Context Management", "terminal": "Terminal", + "miscellaneous": "Miscellaneous", "advanced": "Advanced", "experimental": "Experimental Features", "language": "Language", @@ -340,6 +341,13 @@ "description": "When enabled, creates a temporary directory for ZDOTDIR to handle zsh shell integration properly. This ensures VSCode shell integration works correctly with zsh while preserving your zsh configuration. (experimental)" } }, + "miscellaneous": { + "description": "Various settings that don't fit into other categories.", + "stickyModes": { + "label": "Enable sticky modes", + "description": "When enabled, Roo will remember the last used model for each mode and automatically select it when switching back to that mode." + } + }, "advanced": { "diff": { "label": "Enable editing through diffs", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 9a481b4beed..0aef21c215f 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -26,6 +26,7 @@ "notifications": "Notificaciones", "contextManagement": "Gestión de contexto", "terminal": "Terminal", + "miscellaneous": "Varios", "advanced": "Avanzado", "experimental": "Funciones experimentales", "language": "Idioma", @@ -340,6 +341,13 @@ "description": "Cuando está habilitado, establece POWERLEVEL9K_TERM_SHELL_INTEGRATION=true para habilitar las características de integración del shell Powerlevel10k. (experimental)" } }, + "miscellaneous": { + "description": "Configuraciones varias que no encajan en otras categorías.", + "stickyModes": { + "label": "Habilitar modos persistentes", + "description": "Cuando está habilitado, Roo recordará el último modelo utilizado para cada modo y lo seleccionará automáticamente al volver a ese modo." + } + }, "advanced": { "diff": { "label": "Habilitar edición a través de diffs", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index b0032980ee8..8a8a775a631 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -26,6 +26,7 @@ "notifications": "Notifications", "contextManagement": "Gestion du contexte", "terminal": "Terminal", + "miscellaneous": "Divers", "advanced": "Avancé", "experimental": "Fonctionnalités expérimentales", "language": "Langue", @@ -340,6 +341,13 @@ "description": "Lorsqu'activé, définit POWERLEVEL9K_TERM_SHELL_INTEGRATION=true pour activer les fonctionnalités d'intégration du shell Powerlevel10k. (expérimental)" } }, + "miscellaneous": { + "description": "Paramètres divers qui ne rentrent pas dans d'autres catégories.", + "stickyModes": { + "label": "Activer les modes persistants", + "description": "Lorsque cette option est activée, Roo se souviendra du dernier modèle utilisé pour chaque mode et le sélectionnera automatiquement lors du retour à ce mode." + } + }, "advanced": { "diff": { "label": "Activer l'édition via des diffs", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index ba0de0c9d39..d5f0301479a 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -26,6 +26,7 @@ "notifications": "सूचनाएँ", "contextManagement": "संदर्भ प्रबंधन", "terminal": "टर्मिनल", + "miscellaneous": "विविध", "advanced": "उन्नत", "experimental": "प्रायोगिक सुविधाएँ", "language": "भाषा", @@ -340,6 +341,13 @@ "description": "सक्षम होने पर, Powerlevel10k शेल एकीकरण सुविधाओं को सक्षम करने के लिए POWERLEVEL9K_TERM_SHELL_INTEGRATION=true सेट करता है। (प्रयोगात्मक)" } }, + "miscellaneous": { + "description": "ऐसे विभिन्न सेटिंग्स जो अन्य श्रेणियों में फिट नहीं होती हैं।", + "stickyModes": { + "label": "स्टिकी मोड सक्षम करें", + "description": "सक्षम होने पर, Roo प्रत्येक मोड के लिए अंतिम उपयोग किए गए मॉडल को याद रखेगा और उस मोड पर वापस स्विच करते समय स्वचालित रूप से इसे चुनेगा।" + } + }, "advanced": { "diff": { "label": "diffs के माध्यम से संपादन सक्षम करें", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 2eb8b38655b..8eff8cfd3d6 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -26,6 +26,7 @@ "notifications": "Notifiche", "contextManagement": "Gestione del contesto", "terminal": "Terminal", + "miscellaneous": "Varie", "advanced": "Avanzate", "experimental": "Funzionalità sperimentali", "language": "Lingua", @@ -340,6 +341,13 @@ "description": "Quando abilitato, imposta POWERLEVEL9K_TERM_SHELL_INTEGRATION=true per abilitare le funzionalità di integrazione della shell Powerlevel10k. (sperimentale)" } }, + "miscellaneous": { + "description": "Impostazioni varie che non rientrano in altre categorie.", + "stickyModes": { + "label": "Abilita modalità sticky", + "description": "Quando abilitato, Roo ricorderà l'ultimo modello usato per ogni modalità e lo selezionerà automaticamente quando si torna a quella modalità." + } + }, "advanced": { "diff": { "label": "Abilita modifica tramite diff", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 2276464bbd0..25505a45919 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -26,6 +26,7 @@ "notifications": "通知", "contextManagement": "コンテキスト管理", "terminal": "ターミナル", + "miscellaneous": "その他", "advanced": "詳細設定", "experimental": "実験的機能", "language": "言語", @@ -340,6 +341,13 @@ "description": "有効にすると、POWERLEVEL9K_TERM_SHELL_INTEGRATION=true を設定して Powerlevel10k シェル統合機能を有効にします。(実験的)" } }, + "miscellaneous": { + "description": "その他のカテゴリに該当しないさまざまな設定。", + "stickyModes": { + "label": "スティッキーモードを有効にする", + "description": "有効にすると、Rooは各モードで最後に使用したモデルを記憶し、そのモードに戻ったときに自動的に選択します。" + } + }, "advanced": { "diff": { "label": "diff経由の編集を有効化", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 414dd93e437..f8f40ab003d 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -26,6 +26,7 @@ "notifications": "알림", "contextManagement": "컨텍스트 관리", "terminal": "터미널", + "miscellaneous": "기타", "advanced": "고급", "experimental": "실험적 기능", "language": "언어", @@ -340,6 +341,13 @@ "description": "활성화하면 POWERLEVEL9K_TERM_SHELL_INTEGRATION=true를 설정하여 Powerlevel10k 셸 통합 기능을 활성화합니다. (실험적)" } }, + "miscellaneous": { + "description": "다른 카테고리에 속하지 않는 다양한 설정입니다.", + "stickyModes": { + "label": "스티키 모드 활성화", + "description": "활성화하면 Roo가 각 모드에서 마지막으로 사용한 모델을 기억하고 해당 모드로 다시 전환할 때 자동으로 선택합니다." + } + }, "advanced": { "diff": { "label": "diff를 통한 편집 활성화", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 72054137924..383c389b9b5 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -26,6 +26,7 @@ "notifications": "Powiadomienia", "contextManagement": "Zarządzanie kontekstem", "terminal": "Terminal", + "miscellaneous": "Różne", "advanced": "Zaawansowane", "experimental": "Funkcje eksperymentalne", "language": "Język", @@ -340,6 +341,13 @@ "description": "Po włączeniu ustawia POWERLEVEL9K_TERM_SHELL_INTEGRATION=true, aby włączyć funkcje integracji powłoki Powerlevel10k. (eksperymentalne)" } }, + "miscellaneous": { + "description": "Różne ustawienia, które nie pasują do innych kategorii.", + "stickyModes": { + "label": "Włącz tryby przyklejone", + "description": "Po włączeniu Roo zapamięta ostatnio używany model dla każdego trybu i automatycznie go wybierze po powrocie do tego trybu." + } + }, "advanced": { "diff": { "label": "Włącz edycję przez różnice", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 974f0a7b6b3..752107966e6 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -26,6 +26,7 @@ "notifications": "Notificações", "contextManagement": "Gestão de contexto", "terminal": "Terminal", + "miscellaneous": "Diversos", "advanced": "Avançado", "experimental": "Recursos experimentais", "language": "Idioma", @@ -340,6 +341,13 @@ "description": "Quando ativado, define POWERLEVEL9K_TERM_SHELL_INTEGRATION=true para habilitar os recursos de integração do shell Powerlevel10k. (experimental)" } }, + "miscellaneous": { + "description": "Várias configurações que não se encaixam em outras categorias.", + "stickyModes": { + "label": "Ativar modos fixos", + "description": "Quando ativado, o Roo lembrará o último modelo usado para cada modo e o selecionará automaticamente ao retornar a esse modo." + } + }, "advanced": { "diff": { "label": "Ativar edição através de diffs", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 37c080bfe62..88ecdf69fb4 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -26,6 +26,7 @@ "notifications": "Уведомления", "contextManagement": "Управление контекстом", "terminal": "Терминал", + "miscellaneous": "Разное", "advanced": "Дополнительно", "experimental": "Экспериментальные функции", "language": "Язык", @@ -340,6 +341,13 @@ "description": "Если включено, создаёт временную директорию для ZDOTDIR для корректной интеграции zsh. Это обеспечивает корректную работу интеграции VSCode с zsh, сохраняя вашу конфигурацию. (экспериментально)" } }, + "miscellaneous": { + "description": "Различные настройки, которые не подходят к другим категориям.", + "stickyModes": { + "label": "Включить закрепленные режимы", + "description": "При включении Roo будет запоминать последний использованный модель для каждого режима и автоматически выбирать её при возврате к этому режиму." + } + }, "advanced": { "diff": { "label": "Включить редактирование через диффы", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index c47f4287606..fcc3e70eb9b 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -26,6 +26,7 @@ "notifications": "Bildirimler", "contextManagement": "Bağlam Yönetimi", "terminal": "Terminal", + "miscellaneous": "Diğer", "advanced": "Gelişmiş", "experimental": "Deneysel Özellikler", "language": "Dil", @@ -340,6 +341,13 @@ "description": "Etkinleştirildiğinde, Powerlevel10k kabuk entegrasyon özelliklerini etkinleştirmek için POWERLEVEL9K_TERM_SHELL_INTEGRATION=true ayarlar. (deneysel)" } }, + "miscellaneous": { + "description": "Diğer kategorilere uymayan çeşitli ayarlar.", + "stickyModes": { + "label": "Yapışkan modları etkinleştir", + "description": "Etkinleştirildiğinde, Roo her mod için en son kullanılan modeli hatırlar ve o moda geri döndüğünüzde otomatik olarak seçer." + } + }, "advanced": { "diff": { "label": "Diff'ler aracılığıyla düzenlemeyi etkinleştir", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 5bcafb666bc..d72ac48d843 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -26,6 +26,7 @@ "notifications": "Thông báo", "contextManagement": "Quản lý ngữ cảnh", "terminal": "Terminal", + "miscellaneous": "Khác", "advanced": "Nâng cao", "experimental": "Tính năng thử nghiệm", "language": "Ngôn ngữ", @@ -340,6 +341,13 @@ "description": "Khi được bật, đặt POWERLEVEL9K_TERM_SHELL_INTEGRATION=true để kích hoạt các tính năng tích hợp shell của Powerlevel10k. (thử nghiệm)" } }, + "miscellaneous": { + "description": "Các cài đặt khác không thuộc các danh mục khác.", + "stickyModes": { + "label": "Bật chế độ dính", + "description": "Khi được bật, Roo sẽ ghi nhớ mô hình được sử dụng cuối cùng cho mỗi chế độ và tự động chọn nó khi chuyển trở lại chế độ đó." + } + }, "advanced": { "diff": { "label": "Bật chỉnh sửa qua diff", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 0c40cfdf7e6..6420617b8d2 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -27,6 +27,7 @@ "notifications": "通知", "contextManagement": "上下文管理", "terminal": "终端", + "miscellaneous": "其他", "advanced": "高级", "experimental": "实验性功能", "language": "语言", @@ -340,6 +341,13 @@ "description": "启用后,设置 POWERLEVEL9K_TERM_SHELL_INTEGRATION=true 以启用 Powerlevel10k shell 集成功能。(实验性)" } }, + "miscellaneous": { + "description": "各种不适合其他类别的设置。", + "stickyModes": { + "label": "启用粘性模式", + "description": "启用后,Roo将记住每个模式最后使用的模型,并在切换回该模式时自动选择它。" + } + }, "advanced": { "diff": { "label": "启用diff更新", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 18a48eb9c57..2db43293c59 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -26,6 +26,7 @@ "notifications": "通知", "contextManagement": "上下文管理", "terminal": "終端機", + "miscellaneous": "其他", "advanced": "進階", "experimental": "實驗性功能", "language": "語言", @@ -340,6 +341,13 @@ "description": "啟用後,設定 POWERLEVEL9K_TERM_SHELL_INTEGRATION=true 以啟用 Powerlevel10k shell 整合功能。(實驗性)" } }, + "miscellaneous": { + "description": "各種不適合其他類別的設定。", + "stickyModes": { + "label": "啟用黏著模式", + "description": "啟用後,Roo 將記住每個模式最後使用的模型,並在切換回該模式時自動選擇它。" + } + }, "advanced": { "diff": { "label": "透過差異比對編輯",