From ebc56a67fb4ee1cd4f1b1bb0bff11e7773a13505 Mon Sep 17 00:00:00 2001 From: seeones Date: Sat, 10 Oct 2026 17:20:42 +0800 Subject: [PATCH 1/9] feat(chat): add input streaming effects, thinking shimmer, table striping --- .../src/__tests__/global-settings.test.ts | 22 + packages/types/src/global-settings.ts | 13 + packages/types/src/vscode-extension-host.ts | 4 + src/core/config/ContextProxy.ts | 15 +- .../config/__tests__/ContextProxy.spec.ts | 23 + src/core/webview/ClineProvider.ts | 6 + .../webview/__tests__/ClineProvider.spec.ts | 22 + .../__tests__/webviewMessageHandler.spec.ts | 671 +++++++++++++++++- src/core/webview/webviewMessageHandler.ts | 316 ++++++--- src/i18n/locales/ca/common.json | 3 +- src/i18n/locales/de/common.json | 3 +- src/i18n/locales/en/common.json | 3 +- src/i18n/locales/es/common.json | 3 +- src/i18n/locales/fr/common.json | 3 +- src/i18n/locales/hi/common.json | 3 +- src/i18n/locales/id/common.json | 3 +- src/i18n/locales/it/common.json | 3 +- src/i18n/locales/ja/common.json | 3 +- src/i18n/locales/ko/common.json | 3 +- src/i18n/locales/nl/common.json | 3 +- src/i18n/locales/pl/common.json | 3 +- src/i18n/locales/pt-BR/common.json | 3 +- src/i18n/locales/ru/common.json | 3 +- src/i18n/locales/tr/common.json | 3 +- src/i18n/locales/vi/common.json | 3 +- src/i18n/locales/zh-CN/common.json | 3 +- src/i18n/locales/zh-TW/common.json | 3 +- webview-ui/playwright/gallery/stories.tsx | 13 +- .../src/components/chat/ChatTextArea.tsx | 35 +- webview-ui/src/components/chat/Markdown.tsx | 4 +- .../src/components/chat/ReasoningBlock.tsx | 12 +- .../__tests__/ChatEffects.visual.fixture.tsx | 24 + .../chat/__tests__/ChatEffects.visual.tsx | 32 + .../chat/__tests__/ChatTextArea.spec.tsx | 125 ++++ .../__tests__/ChatTextArea.visual.fixture.tsx | 11 +- .../chat/__tests__/ChatTextArea.visual.tsx | 32 + .../chat/__tests__/Markdown.spec.tsx | 28 + .../chat/__tests__/ReasoningBlock.spec.tsx | 90 +++ .../chat-composer-breathing-dark.png | Bin 0 -> 9408 bytes ...composer-breathing-high-contrast-light.png | Bin 0 -> 9809 bytes .../chat-composer-breathing-high-contrast.png | Bin 0 -> 9257 bytes .../chat-composer-breathing-light.png | Bin 0 -> 9468 bytes .../chat-composer-marquee-dark.png | Bin 0 -> 9650 bytes ...t-composer-marquee-high-contrast-light.png | Bin 0 -> 10181 bytes .../chat-composer-marquee-high-contrast.png | Bin 0 -> 9797 bytes .../chat-composer-marquee-light.png | Bin 0 -> 9840 bytes .../chat-composer-resting-dark.png | Bin 9162 -> 8968 bytes .../chat-composer-resting-high-contrast.png | Bin 9624 -> 9604 bytes .../chat-composer-resting-light.png | Bin 9326 -> 9183 bytes .../__screenshots__/chat-effects-dark.png | Bin 0 -> 12629 bytes .../chat-effects-high-contrast-light.png | Bin 0 -> 12811 bytes .../chat-effects-high-contrast.png | Bin 0 -> 11974 bytes .../__screenshots__/chat-effects-light.png | Bin 0 -> 12773 bytes .../src/components/common/MarkdownBlock.tsx | 10 +- .../common/__tests__/MarkdownBlock.spec.tsx | 14 + .../src/components/settings/SettingsView.tsx | 99 ++- .../src/components/settings/UISettings.tsx | 65 +- .../SettingsView.change-detection.spec.tsx | 25 + .../settings/__tests__/SettingsView.spec.tsx | 396 ++++++++++- .../SettingsView.unsaved-changes.spec.tsx | 2 + .../settings/__tests__/UISettings.spec.tsx | 52 ++ .../__tests__/UISettings.visual.fixture.tsx | 4 + .../__screenshots__/ui-settings-dark.png | Bin 46694 -> 56646 bytes .../ui-settings-high-contrast-light.png | Bin 47695 -> 58029 bytes .../ui-settings-high-contrast.png | Bin 47726 -> 58061 bytes .../__screenshots__/ui-settings-light.png | Bin 47301 -> 57608 bytes webview-ui/src/i18n/locales/ca/settings.json | 13 +- webview-ui/src/i18n/locales/de/settings.json | 13 +- webview-ui/src/i18n/locales/en/settings.json | 13 +- webview-ui/src/i18n/locales/es/settings.json | 13 +- webview-ui/src/i18n/locales/fr/settings.json | 13 +- webview-ui/src/i18n/locales/hi/settings.json | 13 +- webview-ui/src/i18n/locales/id/settings.json | 13 +- webview-ui/src/i18n/locales/it/settings.json | 13 +- webview-ui/src/i18n/locales/ja/settings.json | 13 +- webview-ui/src/i18n/locales/ko/settings.json | 13 +- webview-ui/src/i18n/locales/nl/settings.json | 13 +- webview-ui/src/i18n/locales/pl/settings.json | 13 +- .../src/i18n/locales/pt-BR/settings.json | 13 +- webview-ui/src/i18n/locales/ru/settings.json | 13 +- webview-ui/src/i18n/locales/tr/settings.json | 13 +- webview-ui/src/i18n/locales/vi/settings.json | 13 +- .../src/i18n/locales/zh-CN/settings.json | 13 +- .../src/i18n/locales/zh-TW/settings.json | 13 +- webview-ui/src/index.css | 105 ++- 85 files changed, 2369 insertions(+), 189 deletions(-) create mode 100644 webview-ui/src/components/chat/__tests__/ChatEffects.visual.fixture.tsx create mode 100644 webview-ui/src/components/chat/__tests__/ChatEffects.visual.tsx create mode 100644 webview-ui/src/components/chat/__tests__/Markdown.spec.tsx create mode 100644 webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-high-contrast-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-high-contrast.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-high-contrast-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-high-contrast.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-effects-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-effects-high-contrast-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-effects-high-contrast.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-effects-light.png diff --git a/packages/types/src/__tests__/global-settings.test.ts b/packages/types/src/__tests__/global-settings.test.ts index c2040383e8..b4ffaa8e77 100644 --- a/packages/types/src/__tests__/global-settings.test.ts +++ b/packages/types/src/__tests__/global-settings.test.ts @@ -5,6 +5,28 @@ import { globalSettingsSchema, } from "../global-settings.js" +describe("chat display global settings", () => { + it.each(["marquee", "breathing"])("accepts chatInputEffect %s", (chatInputEffect) => { + expect(globalSettingsSchema.parse({ chatInputEffect })).toEqual({ chatInputEffect }) + }) + + it.each([true, false])("accepts tableStriped %s", (tableStriped) => { + expect(globalSettingsSchema.parse({ tableStriped })).toEqual({ tableStriped }) + }) + + it("allows both settings to be omitted", () => { + expect(globalSettingsSchema.parse({})).toEqual({}) + }) + + it.each(["none", true, 1, null])("rejects invalid chatInputEffect %s", (chatInputEffect) => { + expect(() => globalSettingsSchema.parse({ chatInputEffect })).toThrow() + }) + + it.each(["true", "false", 0, 1, null])("rejects non-boolean tableStriped %s", (tableStriped) => { + expect(() => globalSettingsSchema.parse({ tableStriped })).toThrow() + }) +}) + describe("destructive command guard global setting", () => { it("is opt-in by default", () => { expect(DEFAULT_DESTRUCTIVE_COMMAND_GUARD_ENABLED).toBe(false) diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 16e9751974..38755e268d 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -283,6 +283,19 @@ export const globalSettingsSchema = z.object({ * @default "send" */ enterBehavior: z.enum(["send", "newline"]).optional(), + /** + * Controls the border effect on the chat input box while AI is working. + * - "marquee": A conic-gradient light beam orbits the ring (default) + * - "breathing": A pulsing glow + 1px blue border ring + * @default "marquee" + */ + chatInputEffect: z.enum(["marquee", "breathing"]).optional(), + /** + * Opt-in zebra striping (alternating background colors) for rows in + * markdown tables rendered in the chat. + * @default false + */ + tableStriped: z.boolean().optional(), profileThresholds: z.record(z.string(), z.number()).optional(), hasOpenedModeSelector: z.boolean().optional(), lastModeExportPath: z.string().optional(), diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts index c0e8509105..d79a0a49c0 100644 --- a/packages/types/src/vscode-extension-host.ts +++ b/packages/types/src/vscode-extension-host.ts @@ -29,6 +29,7 @@ import type { WorktreeIncludeStatus } from "./worktree.js" */ export interface ExtensionMessage { type: + | "settingsSaveResult" | "action" | "state" | "taskHistoryUpdated" @@ -157,6 +158,7 @@ export interface ExtensionMessage { /** Generic payload for extension messages that use `values` */ // eslint-disable-next-line @typescript-eslint/no-explicit-any values?: Record + unsavedSettings?: string[] requestId?: string themeFixture?: WebviewThemeFixture promptText?: string @@ -328,6 +330,8 @@ export type ExtensionState = Pick< | "reasoningBlockCollapsed" | "chatFontSize" | "enterBehavior" + | "chatInputEffect" + | "tableStriped" | "includeCurrentTime" | "includeCurrentCost" | "maxGitStatusFiles" diff --git a/src/core/config/ContextProxy.ts b/src/core/config/ContextProxy.ts index 97d4104afc..7426cb5cdc 100644 --- a/src/core/config/ContextProxy.ts +++ b/src/core/config/ContextProxy.ts @@ -360,13 +360,13 @@ export class ContextProxy { return value !== undefined ? value : defaultValue } - updateGlobalState(key: K, value: GlobalState[K]) { + async updateGlobalState(key: K, value: GlobalState[K]) { if (isPassThroughStateKey(key)) { return this.originalContext.globalState.update(key, value) } + await this.originalContext.globalState.update(key, value) this.stateCache[key] = value - return this.originalContext.globalState.update(key, value) } private getAllGlobalState(): GlobalState { @@ -382,14 +382,11 @@ export class ContextProxy { return this.secretCache[key] } - storeSecret(key: SecretStateKey, value?: string) { - // Update cache. - this.secretCache[key] = value - - // Write directly to context. - return value === undefined + async storeSecret(key: SecretStateKey, value?: string) { + await (value === undefined ? this.originalContext.secrets.delete(key) - : this.originalContext.secrets.store(key, value) + : this.originalContext.secrets.store(key, value)) + this.secretCache[key] = value } /** diff --git a/src/core/config/__tests__/ContextProxy.spec.ts b/src/core/config/__tests__/ContextProxy.spec.ts index 2319a6b1a5..9fc674c59d 100644 --- a/src/core/config/__tests__/ContextProxy.spec.ts +++ b/src/core/config/__tests__/ContextProxy.spec.ts @@ -157,6 +157,13 @@ describe("ContextProxy", () => { }) describe("updateGlobalState", () => { + it("retains the saved cache value when persistence fails", async () => { + await proxy.updateGlobalState("chatInputEffect", "marquee") + mockGlobalState.update.mockRejectedValueOnce(new Error("disk full")) + await expect(proxy.updateGlobalState("chatInputEffect", "breathing")).rejects.toThrow("disk full") + expect(proxy.getGlobalState("chatInputEffect")).toBe("marquee") + }) + it("should update state directly in original context", async () => { await proxy.updateGlobalState("apiProvider", "deepseek") @@ -208,6 +215,22 @@ describe("ContextProxy", () => { }) describe("storeSecret", () => { + it("retains the saved secret when deletion fails", async () => { + await proxy.storeSecret("apiKey", "saved-secret") + mockSecrets.delete.mockRejectedValueOnce(new Error("storage unavailable")) + + await expect(proxy.storeSecret("apiKey", undefined)).rejects.toThrow("storage unavailable") + expect(mockSecrets.delete).toHaveBeenCalledWith("apiKey") + expect(proxy.getSecret("apiKey")).toBe("saved-secret") + }) + + it("retains the saved secret when persistence fails", async () => { + await proxy.storeSecret("apiKey", "saved-secret") + mockSecrets.store.mockRejectedValueOnce(new Error("storage unavailable")) + await expect(proxy.storeSecret("apiKey", "unsaved-secret")).rejects.toThrow("storage unavailable") + expect(proxy.getSecret("apiKey")).toBe("saved-secret") + }) + it("should store secret directly in original context", async () => { await proxy.storeSecret("apiKey", "new-secret") diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 60a92eebaa..f8aaef7f23 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2654,6 +2654,8 @@ export class ClineProvider reasoningBlockCollapsed, chatFontSize, enterBehavior, + chatInputEffect, + tableStriped, cloudUserInfo, cloudIsAuthenticated, sharingEnabled, @@ -2833,6 +2835,8 @@ export class ClineProvider reasoningBlockCollapsed: reasoningBlockCollapsed ?? true, chatFontSize, enterBehavior: enterBehavior ?? "send", + chatInputEffect: chatInputEffect ?? "marquee", + tableStriped: tableStriped ?? false, cloudUserInfo, cloudIsAuthenticated: cloudIsAuthenticated ?? false, cloudAuthSkipModel: this.context.globalState.get("roo-auth-skip-model") ?? false, @@ -3064,6 +3068,8 @@ export class ClineProvider reasoningBlockCollapsed: stateValues.reasoningBlockCollapsed ?? true, chatFontSize: stateValues.chatFontSize, enterBehavior: stateValues.enterBehavior ?? "send", + chatInputEffect: stateValues.chatInputEffect ?? "marquee", + tableStriped: stateValues.tableStriped ?? false, cloudUserInfo, cloudIsAuthenticated, sharingEnabled, diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 7c85a6b372..eaca288275 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1977,6 +1977,28 @@ describe("ClineProvider", () => { expect(state).toHaveProperty("writeDelayMs") }) + describe.each(["getState", "getStateToPostToWebview"] as const)("%s chat appearance settings", (method) => { + test.each([ + { chatInputEffect: "breathing", tableStriped: true }, + { chatInputEffect: "marquee", tableStriped: false }, + ] as const)( + "returns saved chatInputEffect=$chatInputEffect and tableStriped=$tableStriped", + async (settings) => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("chatInputEffect", settings.chatInputEffect) + await provider.contextProxy.setValue("tableStriped", settings.tableStriped) + + expect(await provider[method]()).toMatchObject(settings) + }, + ) + + test("defaults unset chatInputEffect to marquee and tableStriped to false", async () => { + await provider.resolveWebviewView(mockWebviewView) + + expect(await provider[method]()).toMatchObject({ chatInputEffect: "marquee", tableStriped: false }) + }) + }) + test("getState and getStateToPostToWebview return the complete NanoGPT configuration", async () => { await provider.resolveWebviewView(mockWebviewView) await provider.contextProxy.setProviderSettings({ diff --git a/src/core/webview/__tests__/webviewMessageHandler.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.spec.ts index dcd70f92f1..db094a98f6 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.spec.ts @@ -69,6 +69,9 @@ vi.mock("@roo-code/telemetry", () => ({ }, })) +import { ContextProxy } from "../../config/ContextProxy" +import { makeExtensionContext } from "../../../test-utils/vscode" + import type { ModelRecord } from "@roo-code/types" import { webviewMessageHandler } from "../webviewMessageHandler" @@ -116,6 +119,7 @@ const mockClineProvider = { getValue: vi.fn(), }, log: vi.fn(), + upsertProviderProfile: vi.fn(), postStateToWebview: vi.fn(), resolveWebviewThemeFixtureProbe: vi.fn(), getCurrentTask: vi.fn(), @@ -169,7 +173,7 @@ describe("webviewMessageHandler - theme fixture probes", () => { }) }) -import { t } from "../../../i18n" +import { changeLanguage, t } from "../../../i18n" vi.mock("vscode", () => { const showInformationMessage = vi.fn() @@ -178,6 +182,7 @@ vi.mock("vscode", () => { const showTextDocument = vi.fn().mockResolvedValue(undefined) return { + ConfigurationTarget: { Global: 1 }, window: { showInformationMessage, showErrorMessage, @@ -213,6 +218,7 @@ vi.mock("../../../i18n", () => ({ } return key }), + changeLanguage: vi.fn(), })) vi.mock("fs/promises", () => { @@ -2307,3 +2313,666 @@ describe("webviewMessageHandler - telemetrySetting", () => { expect(TelemetryService.instance.updateTelemetryState).not.toHaveBeenCalled() }) }) + +describe("bulk settings save results", () => { + beforeEach(() => vi.clearAllMocks()) + + it("escapes untrusted setting names and error names in persistence failure logs", async () => { + const key = "unknown\r\nForged entry\t\u001b[31m" + // Runtime webview messages can contain keys absent from the TypeScript type. + const updatedSettings = { chatInputEffect: "breathing" as const, [key]: true } + const error = new Error("secret value") + error.name = "Error\nForged error" + vi.mocked(mockClineProvider.contextProxy.setValue).mockRejectedValueOnce(error) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "untrusted-settings", + updatedSettings, + }) + + expect(mockClineProvider.log).toHaveBeenCalledExactlyOnceWith( + `Failed to save settings: ${JSON.stringify(["chatInputEffect", key])}; error: ${JSON.stringify(error.name)}`, + ) + expect(vi.mocked(mockClineProvider.log).mock.calls[0][0]).not.toContain("\n") + expect(vi.mocked(mockClineProvider.log).mock.calls[0][0]).not.toContain("secret value") + }) + + it("persists a changed retry after a save stalled past the webview timeout", async () => { + vi.useFakeTimers() + const context = makeExtensionContext() + const persisted = new Map() + let releaseWrite!: () => void + let writeStarted!: () => void + const delayedWrite = new Promise((resolve) => { + releaseWrite = resolve + }) + const started = new Promise((resolve) => { + writeStarted = resolve + }) + const update = vi.mocked(context.globalState.update).mockImplementation(async (key, value) => { + if (key === "chatInputEffect" && value === "breathing") { + writeStarted() + await delayedWrite + } + persisted.set(key, value) + }) + const contextProxy = new ContextProxy(context) + const provider = { ...mockClineProvider, contextProxy } as ClineProvider + const first = webviewMessageHandler(provider, { + type: "updateSettings", + requestId: "timed-out-save", + updatedSettings: { chatInputEffect: "breathing", tableStriped: true }, + }) + let retry: Promise | undefined + try { + await started + // SettingsView releases its UI lock after 30 seconds without cancelling the host write. + await vi.advanceTimersByTimeAsync(30_001) + retry = webviewMessageHandler(provider, { + type: "updateSettings", + requestId: "retry", + updatedSettings: { chatInputEffect: "marquee", tableStriped: false }, + }) + await vi.advanceTimersByTimeAsync(0) + expect(update).toHaveBeenCalledExactlyOnceWith("chatInputEffect", "breathing") + expect(provider.postMessageToWebview).not.toHaveBeenCalled() + } finally { + releaseWrite() + await Promise.all([first, retry]) + vi.useRealTimers() + } + expect(contextProxy.getValue("chatInputEffect")).toBe("marquee") + expect(contextProxy.getValue("tableStriped")).toBe(false) + expect(persisted.get("chatInputEffect")).toBe("marquee") + expect(persisted.get("tableStriped")).toBe(false) + expect(provider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "retry", + success: true, + unsavedSettings: [], + }) + }) + + it("acknowledges unset experiments and customSupportPrompts without persisting them", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "skipped-settings", + updatedSettings: { experiments: undefined, customSupportPrompts: undefined }, + }) + + expect(mockClineProvider.contextProxy.setValue).not.toHaveBeenCalled() + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledExactlyOnceWith({ + type: "settingsSaveResult", + requestId: "skipped-settings", + success: true, + unsavedSettings: [], + }) + }) + + it("excludes skipped experiments and customSupportPrompts when a later write fails", async () => { + const setValue = vi.mocked(mockClineProvider.contextProxy.setValue) + setValue.mockRejectedValueOnce(new Error("storage unavailable")) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "skipped-settings-with-failure", + updatedSettings: { experiments: undefined, customSupportPrompts: undefined, tableStriped: true }, + }) + + expect(setValue).toHaveBeenCalledExactlyOnceWith("tableStriped", true) + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledExactlyOnceWith({ + type: "settingsSaveResult", + requestId: "skipped-settings-with-failure", + success: false, + unsavedSettings: ["tableStriped"], + }) + }) + + it("shows the unsaved keys when a write fails without a request ID", async () => { + const setValue = vi.mocked(mockClineProvider.contextProxy.setValue) + setValue.mockResolvedValueOnce(undefined).mockRejectedValueOnce(new Error("storage unavailable")) + const errorMessage = "Could not save settings: chatInputEffect, tableStriped" + vi.mocked(t).mockReturnValueOnce(errorMessage) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { soundEnabled: true, chatInputEffect: "breathing", tableStriped: true }, + }) + + expect(setValue).toHaveBeenCalledTimes(2) + expect(mockClineProvider.log).toHaveBeenCalledExactlyOnceWith( + 'Failed to save settings: ["chatInputEffect","tableStriped"]; error: "Error"', + ) + expect(t).toHaveBeenCalledWith("common:errors.settingsSaveFailed", { + keys: "chatInputEffect, tableStriped", + }) + expect(vscode.window.showErrorMessage).toHaveBeenCalledExactlyOnceWith(errorMessage) + expect(mockClineProvider.postMessageToWebview).not.toHaveBeenCalledWith( + expect.objectContaining({ type: "settingsSaveResult" }), + ) + }) + + it("reports the failed and unattempted keys, then permits a successful retry", async () => { + const setValue = vi.mocked(mockClineProvider.contextProxy.setValue) + setValue.mockResolvedValueOnce(undefined).mockRejectedValueOnce(new Error("storage unavailable")) + const updatedSettings = { soundEnabled: true, chatInputEffect: "breathing" as const, tableStriped: true } + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "failed-save", + updatedSettings, + }) + expect(setValue).toHaveBeenCalledTimes(2) + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledWith({ + type: "settingsSaveResult", + requestId: "failed-save", + success: false, + unsavedSettings: ["chatInputEffect", "tableStriped"], + }) + setValue.mockResolvedValue(undefined) + await webviewMessageHandler(mockClineProvider, { type: "updateSettings", requestId: "retry", updatedSettings }) + expect(setValue).toHaveBeenLastCalledWith("tableStriped", true) + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledWith({ + type: "settingsSaveResult", + requestId: "retry", + success: true, + unsavedSettings: [], + }) + }) + + it("reports all keys when the first write fails", async () => { + vi.mocked(mockClineProvider.contextProxy.setValue).mockRejectedValueOnce(new Error("disk full")) + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "first-failure", + updatedSettings: { chatInputEffect: "breathing", tableStriped: true }, + }) + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledWith({ + type: "settingsSaveResult", + requestId: "first-failure", + success: false, + unsavedSettings: ["chatInputEffect", "tableStriped"], + }) + }) +}) + +describe("individual settings save acknowledgments", () => { + beforeEach(() => vi.clearAllMocks()) + + it.each(["upsertApiConfiguration", "telemetrySetting", "debugSetting"] as const)( + "acknowledges %s only after persistence completes, and reports failures", + async (type) => { + const write = vi.fn<() => Promise>() + if (type === "upsertApiConfiguration") { + vi.mocked(mockClineProvider.upsertProviderProfile).mockImplementation(write) + } else if (type === "telemetrySetting") { + vi.mocked(mockClineProvider.contextProxy.setValue).mockImplementation(async () => { + await write() + }) + } else { + vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({ update: write } as never) + } + let resolveWrite!: (value: string) => void + write.mockReturnValueOnce( + new Promise((resolve) => { + resolveWrite = resolve + }), + ) + const message = { type, requestId: "save", text: "enabled", bool: true, apiConfiguration: {} } + const saving = webviewMessageHandler(mockClineProvider, message) + await vi.waitFor(() => expect(write).toHaveBeenCalledOnce()) + expect(mockClineProvider.postMessageToWebview).not.toHaveBeenCalled() + resolveWrite("profile-id") + await saving + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "save", + success: true, + unsavedSettings: [], + }) + write.mockRejectedValueOnce(new TypeError("secret error text")) + await webviewMessageHandler(mockClineProvider, message) + const key = + type === "upsertApiConfiguration" ? "apiConfiguration" : type === "debugSetting" ? "debug" : type + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "save", + success: false, + unsavedSettings: [key], + }) + expect(mockClineProvider.log).toHaveBeenLastCalledWith( + `Failed to save settings: ${JSON.stringify([key])}; error: "TypeError"`, + ) + write.mockResolvedValue("profile-id") + await webviewMessageHandler(mockClineProvider, message) + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "save", + success: true, + unsavedSettings: [], + }) + }, + ) + + it("reports profile persistence failures returned as undefined", async () => { + vi.mocked(mockClineProvider.upsertProviderProfile).mockResolvedValueOnce(undefined) + await webviewMessageHandler(mockClineProvider, { + type: "upsertApiConfiguration", + requestId: "save", + text: "default", + apiConfiguration: {}, + }) + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "save", + success: false, + unsavedSettings: ["apiConfiguration"], + }) + }) + + it("rejects an upsertApiConfiguration save that arrives without a profile payload", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "upsertApiConfiguration", + requestId: "save", + }) + // The handler must fail fast instead of silently succeeding when the webview forgot the payload. + expect(mockClineProvider.upsertProviderProfile).not.toHaveBeenCalled() + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "save", + success: false, + unsavedSettings: ["apiConfiguration"], + }) + }) + + it("ignores an upsertApiConfiguration message without a payload when no requestId is supplied", async () => { + // Legacy callers omit the profile payload and the requestId; the handler must stay a no-op. + await webviewMessageHandler(mockClineProvider, { type: "upsertApiConfiguration" }) + expect(mockClineProvider.upsertProviderProfile).not.toHaveBeenCalled() + expect(mockClineProvider.postMessageToWebview).not.toHaveBeenCalled() + }) + + it("defaults the debug setting to false when the value is omitted", async () => { + const update = vi.fn().mockResolvedValue(undefined) + vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({ update } as never) + await webviewMessageHandler(mockClineProvider, { type: "debugSetting" }) + expect(update).toHaveBeenCalledWith("debug", false, 1) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalled() + }) +}) + +describe("webviewMessageHandler - updateSettings branch handling", () => { + let updateConfig: ReturnType + let setValue: ReturnType + + beforeEach(() => { + vi.clearAllMocks() + updateConfig = vi.fn().mockResolvedValue(undefined) + setValue = vi.mocked(mockClineProvider.contextProxy.setValue) + setValue.mockResolvedValue(undefined as never) + vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({ get: vi.fn(), update: updateConfig } as never) + ;(mockClineProvider as unknown as { getMcpHub: ReturnType }).getMcpHub = vi + .fn() + .mockReturnValue(undefined) + Terminal.setTerminalProfile(undefined) + }) + + afterEach(() => { + Terminal.setTerminalProfile(undefined) + }) + + it("applies command and file allow/deny lists, dropping blank entries", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "lists", + updatedSettings: { + allowedCommands: ["a", "", " ", "b"], + deniedCommands: ["x", ""], + allowedReadFiles: ["src/**", " "], + allowedWriteFiles: [], + }, + }) + + expect(updateConfig).toHaveBeenCalledWith("allowedCommands", ["a", "b"], 1) + expect(updateConfig).toHaveBeenCalledWith("deniedCommands", ["x"], 1) + expect(setValue).toHaveBeenCalledWith("allowedReadFiles", ["src/**"]) + expect(setValue).toHaveBeenCalledWith("allowedWriteFiles", []) + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "lists", + success: true, + unsavedSettings: [], + }) + }) + + it("applies the language, TTS and generic default branches", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "misc", + updatedSettings: { + language: "fr", + ttsEnabled: false, + ttsSpeed: 2.5, + soundEnabled: true, + }, + }) + + expect(vi.mocked(changeLanguage)).toHaveBeenCalledWith("fr") + expect(setValue).toHaveBeenCalledWith("language", "fr") + expect(setValue).toHaveBeenCalledWith("ttsEnabled", false) + expect(setValue).toHaveBeenCalledWith("ttsSpeed", 2.5) + expect(setValue).toHaveBeenCalledWith("soundEnabled", true) + }) + + it("applies every terminal setting branch, including the profile reset that closes idle terminals", async () => { + const closeIdleTerminalsSpy = vi.spyOn(TerminalRegistry, "closeIdleTerminals").mockImplementation(() => {}) + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "terminal", + updatedSettings: { + terminalShellIntegrationTimeout: 30, + terminalShellIntegrationDisabled: true, + terminalCommandDelay: 75, + terminalPowershellCounter: true, + terminalZshClearEolMark: true, + terminalZshOhMy: true, + terminalZshP10k: true, + terminalZdotdir: true, + terminalProfile: "Git Bash", + execaShellPath: "/bin/bash", + }, + }) + + expect(Terminal.getShellIntegrationTimeout()).toBe(30) + expect(Terminal.getCommandDelay()).toBe(75) + expect(Terminal.getTerminalProfile()).toBe("Git Bash") + expect(closeIdleTerminalsSpy).toHaveBeenCalled() + expect(setValue).toHaveBeenCalledWith("terminalProfile", "Git Bash") + expect(setValue).toHaveBeenCalledWith("execaShellPath", "/bin/bash") + }) + + it("notifies the MCP hub when mcpEnabled changes", async () => { + const handleMcpEnabledChange = vi.fn().mockResolvedValue(undefined) + ;(mockClineProvider as unknown as { getMcpHub: ReturnType }).getMcpHub = vi + .fn() + .mockReturnValue({ handleMcpEnabledChange }) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "mcp", + updatedSettings: { mcpEnabled: false }, + }) + + expect(handleMcpEnabledChange).toHaveBeenCalledWith(false) + expect(setValue).toHaveBeenCalledWith("mcpEnabled", false) + }) + + it("acknowledges unset experiments and customSupportPrompts without persisting them", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "unset", + updatedSettings: { experiments: undefined, customSupportPrompts: undefined }, + }) + + expect(setValue).not.toHaveBeenCalledWith("experiments", expect.anything()) + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "unset", + success: true, + unsavedSettings: [], + }) + }) + + it("reports a failed bulk save with requestId and permits a later retry", async () => { + setValue.mockRejectedValueOnce(new Error("storage unavailable")).mockResolvedValue(undefined as never) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "bulk-fail", + updatedSettings: { soundEnabled: true, chatInputEffect: "breathing" }, + }) + + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledWith({ + type: "settingsSaveResult", + requestId: "bulk-fail", + success: false, + unsavedSettings: ["soundEnabled", "chatInputEffect"], + }) + expect(vi.mocked(vscode.window.showErrorMessage)).not.toHaveBeenCalled() + }) + + it("surfaces a legacy bulk save failure without a requestId via showErrorMessage", async () => { + setValue.mockRejectedValueOnce(new Error("disk full")) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { soundEnabled: true, chatInputEffect: "breathing" }, + }) + + expect(vi.mocked(vscode.window.showErrorMessage)).toHaveBeenCalledWith("common:errors.settingsSaveFailed") + expect(mockClineProvider.postMessageToWebview).not.toHaveBeenCalledWith( + expect.objectContaining({ type: "settingsSaveResult" }), + ) + }) + + it("defaults a null language to en and applies the tts fallbacks", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "defaults", + updatedSettings: { language: undefined, ttsEnabled: undefined, ttsSpeed: undefined }, + }) + + expect(vi.mocked(changeLanguage)).toHaveBeenCalledWith("en") + expect(setValue).toHaveBeenCalledWith("language", "en") + expect(setValue).toHaveBeenCalledWith("ttsEnabled", true) + expect(setValue).toHaveBeenCalledWith("ttsSpeed", 1.0) + }) + + it("drops a non-array command list and a non-array file pattern list", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "non-array", + updatedSettings: { + allowedCommands: "rm -rf /" as unknown as string[], + deniedCommands: "rm -rf /" as unknown as string[], + allowedReadFiles: "src/**" as unknown as string[], + allowedWriteFiles: "src/**" as unknown as string[], + }, + }) + + expect(updateConfig).toHaveBeenCalledWith("allowedCommands", [], 1) + expect(updateConfig).toHaveBeenCalledWith("deniedCommands", [], 1) + expect(setValue).toHaveBeenCalledWith("allowedReadFiles", []) + expect(setValue).toHaveBeenCalledWith("allowedWriteFiles", []) + }) + + it("tolerates a missing command or file list by treating it as empty", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "missing-lists", + updatedSettings: { + allowedCommands: undefined, + deniedCommands: undefined, + allowedReadFiles: undefined, + allowedWriteFiles: undefined, + }, + }) + + expect(updateConfig).toHaveBeenCalledWith("allowedCommands", [], 1) + expect(updateConfig).toHaveBeenCalledWith("deniedCommands", [], 1) + expect(setValue).toHaveBeenCalledWith("allowedReadFiles", []) + expect(setValue).toHaveBeenCalledWith("allowedWriteFiles", []) + }) + + it("leaves terminal settings untouched when their values are undefined", async () => { + const closeIdleTerminalsSpy = vi.spyOn(TerminalRegistry, "closeIdleTerminals").mockImplementation(() => {}) + Terminal.setTerminalProfile(undefined) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "terminal-undefined", + updatedSettings: { + terminalShellIntegrationTimeout: undefined, + terminalShellIntegrationDisabled: undefined, + terminalCommandDelay: undefined, + terminalPowershellCounter: undefined, + terminalZshClearEolMark: undefined, + terminalZshOhMy: undefined, + terminalZshP10k: undefined, + terminalZdotdir: undefined, + }, + }) + + // Every terminal branch guards on `value !== undefined`, so the profile-change + // side effect must not fire and the values are stored as-is. + expect(closeIdleTerminalsSpy).not.toHaveBeenCalled() + expect(setValue).toHaveBeenCalledWith("terminalShellIntegrationTimeout", undefined) + }) + + it("treats a non-string terminalProfile as unset and does not close terminal state", async () => { + const closeIdleTerminalsSpy = vi.spyOn(TerminalRegistry, "closeIdleTerminals").mockImplementation(() => {}) + Terminal.setTerminalProfile(undefined) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "terminal-nonstring", + updatedSettings: { terminalProfile: 123 as unknown as string }, + }) + + expect(Terminal.getTerminalProfile()).toBeUndefined() + expect(closeIdleTerminalsSpy).not.toHaveBeenCalled() + }) + + it("does not touch the MCP hub when none is available", async () => { + ;(mockClineProvider as unknown as { getMcpHub: ReturnType }).getMcpHub = vi + .fn() + .mockReturnValue(undefined) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "mcp-missing", + updatedSettings: { mcpEnabled: true }, + }) + + expect(setValue).toHaveBeenCalledWith("mcpEnabled", true) + }) + + it("defaults mcpEnabled to true when the value is unset", async () => { + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "mcp-default", + updatedSettings: { mcpEnabled: undefined }, + }) + + expect(setValue).toHaveBeenCalledWith("mcpEnabled", true) + }) + + it("merges a truthy experiments payload over the stored values or the defaults", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockImplementation((key: string) => + key === "experiments" ? { customTools: true } : undefined, + ) + setValue.mockClear() + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "experiments-on", + updatedSettings: { experiments: { runSlashCommand: true } }, + }) + expect(setValue).toHaveBeenCalledWith( + "experiments", + expect.objectContaining({ customTools: true, runSlashCommand: true }), + ) + + // With no stored value the default experiment set is used as the base. + vi.mocked(mockClineProvider.contextProxy.getValue).mockReturnValue(undefined) + setValue.mockClear() + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "experiments-default", + updatedSettings: { experiments: { parallelToolExecution: true } }, + }) + expect(setValue).toHaveBeenCalledWith("experiments", expect.objectContaining({ parallelToolExecution: true })) + }) + + it("persists a truthy customSupportPrompts payload as-is", async () => { + setValue.mockClear() + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "prompts-on", + updatedSettings: { customSupportPrompts: { review: "Review this" } }, + }) + + expect(setValue).toHaveBeenCalledWith("customSupportPrompts", { review: "Review this" }) + }) + + it("logs Unknown when a bulk save fails with a non-Error value", async () => { + setValue.mockRejectedValueOnce("boom") + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "bulk-nonerror", + updatedSettings: { soundEnabled: true, chatInputEffect: "breathing" }, + }) + + expect(mockClineProvider.log).toHaveBeenCalledWith(expect.stringContaining('"Unknown"')) + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledWith({ + type: "settingsSaveResult", + requestId: "bulk-nonerror", + success: false, + unsavedSettings: ["soundEnabled", "chatInputEffect"], + }) + }) + + it("logs Unknown when an individual save throws a non-Error value", async () => { + vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({ + get: vi.fn(), + update: vi.fn().mockRejectedValue("no-permission"), + } as never) + + await webviewMessageHandler(mockClineProvider, { + type: "debugSetting", + requestId: "debug-nonerror", + bool: true, + }) + + expect(mockClineProvider.log).toHaveBeenCalledWith(expect.stringContaining('"Unknown"')) + expect(mockClineProvider.postMessageToWebview).toHaveBeenCalledWith({ + type: "settingsSaveResult", + requestId: "debug-nonerror", + success: false, + unsavedSettings: ["debug"], + }) + }) +}) + +describe("webviewMessageHandler - serialized settings saves", () => { + it("keeps processing later saves after an earlier save throws", async () => { + ;(mockClineProvider as unknown as { getMcpHub: () => undefined }).getMcpHub = () => undefined + // debugSetting without a requestId rethrows its write failure, which is what + // exercises the queue's failure swallow. + vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({ + get: vi.fn(), + update: vi.fn().mockRejectedValue(new Error("storage unavailable")), + } as never) + + await expect(webviewMessageHandler(mockClineProvider, { type: "debugSetting", bool: true })).rejects.toThrow( + "storage unavailable", + ) + + // The queue stored the guarded version, so a following save still runs to completion. + vi.mocked(mockClineProvider.contextProxy.setValue).mockResolvedValue(undefined as never) + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + requestId: "after-failure", + updatedSettings: { soundVolume: 0.3 }, + }) + + expect(mockClineProvider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "settingsSaveResult", + requestId: "after-failure", + success: true, + unsavedSettings: [], + }) + }) +}) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 193540455b..f3c1b42f71 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -119,16 +119,67 @@ import { handleCheckoutBranch, } from "./worktree" +// A webview timeout does not cancel host writes. Keep every SettingsView save message +// in arrival order, including retries and messages from views sharing the same context. +const settingsSaveQueues = new WeakMap>() +const settingsSaveMessageTypes = new Set([ + "updateSettings", + "upsertApiConfiguration", + "telemetrySetting", + "debugSetting", +]) + export const webviewMessageHandler = async ( provider: ClineProvider, message: WebviewMessage, marketplaceManager?: MarketplaceManager, +): Promise => { + if (!settingsSaveMessageTypes.has(message.type)) { + return handleWebviewMessage(provider, message, marketplaceManager) + } + + const previous = settingsSaveQueues.get(provider.contextProxy) ?? Promise.resolve() + const save = previous.then(() => handleWebviewMessage(provider, message, marketplaceManager)) + // Preserve the caller's error while allowing subsequent saves after a failure. + settingsSaveQueues.set( + provider.contextProxy, + save.catch(() => undefined), + ) + return save +} + +const handleWebviewMessage = async ( + provider: ClineProvider, + message: WebviewMessage, + marketplaceManager?: MarketplaceManager, ) => { // Utility functions provided for concise get/update of global state via contextProxy API. const getGlobalState = (key: K) => provider.contextProxy.getValue(key) const updateGlobalState = async (key: K, value: GlobalState[K]) => await provider.contextProxy.setValue(key, value) + // SettingsView correlates each write separately before marking the whole save complete. + const saveSetting = async (key: string, write: () => Promise) => { + let success = false + try { + await write() + success = true + } catch (error) { + if (!message.requestId) throw error + provider.log( + `Failed to save settings: ${JSON.stringify([key])}; error: ${JSON.stringify(error instanceof Error ? error.name : "Unknown")}`, + ) + } + if (message.requestId) { + await provider.postMessageToWebview({ + type: "settingsSaveResult", + requestId: message.requestId, + success, + unsavedSettings: success ? [] : [key], + }) + } + } + const getCurrentCwd = () => { return provider.getCurrentTask()?.cwd || provider.cwd } @@ -746,117 +797,142 @@ export const webviewMessageHandler = async ( } } - for (const [key, value] of Object.entries(message.updatedSettings)) { - let newValue = value - - if (key === "language") { - newValue = value ?? "en" - changeLanguage(newValue as Language) - } else if (key === "allowedCommands") { - const commands = value ?? [] - - newValue = Array.isArray(commands) - ? commands.filter((cmd) => typeof cmd === "string" && cmd.trim().length > 0) - : [] - - await vscode.workspace - .getConfiguration(Package.name) - .update("allowedCommands", newValue, vscode.ConfigurationTarget.Global) - } else if (key === "deniedCommands") { - const commands = value ?? [] - - newValue = Array.isArray(commands) - ? commands.filter((cmd) => typeof cmd === "string" && cmd.trim().length > 0) - : [] - - await vscode.workspace - .getConfiguration(Package.name) - .update("deniedCommands", newValue, vscode.ConfigurationTarget.Global) - } else if (key === "allowedReadFiles" || key === "allowedWriteFiles") { - const patterns = value ?? [] - - // Blank lines, which the textarea editor produces freely, - // name no file and are dropped here. Patterns are - // otherwise not `.trim()`ed: leading whitespace is - // significant in gitignore syntax, and trailing - // whitespace has to be escaped by the user to be kept. - newValue = Array.isArray(patterns) - ? patterns.filter((pattern) => typeof pattern === "string" && pattern.trim().length > 0) - : [] - } else if (key === "ttsEnabled") { - newValue = value ?? true - setTtsEnabled(newValue as boolean) - } else if (key === "ttsSpeed") { - newValue = value ?? 1.0 - setTtsSpeed(newValue as number) - } else if (key === "terminalShellIntegrationTimeout") { - if (value !== undefined) { - Terminal.setShellIntegrationTimeout(value as number) - } - } else if (key === "terminalShellIntegrationDisabled") { - if (value !== undefined) { - Terminal.setShellIntegrationDisabled(value as boolean) - } - } else if (key === "terminalCommandDelay") { - if (value !== undefined) { - Terminal.setCommandDelay(value as number) - } - } else if (key === "terminalPowershellCounter") { - if (value !== undefined) { - Terminal.setPowershellCounter(value as boolean) - } - } else if (key === "terminalZshClearEolMark") { - if (value !== undefined) { - Terminal.setTerminalZshClearEolMark(value as boolean) - } - } else if (key === "terminalZshOhMy") { - if (value !== undefined) { - Terminal.setTerminalZshOhMy(value as boolean) - } - } else if (key === "terminalZshP10k") { - if (value !== undefined) { - Terminal.setTerminalZshP10k(value as boolean) - } - } else if (key === "terminalZdotdir") { - if (value !== undefined) { - Terminal.setTerminalZdotdir(value as boolean) - } - } else if (key === "terminalProfile") { - const previousProfile = Terminal.getTerminalProfile() - Terminal.setTerminalProfile(typeof value === "string" ? value : undefined) - newValue = Terminal.getTerminalProfile() - - if (newValue !== previousProfile) { - // Discard idle terminals so the next command gets a fresh - // terminal using the new profile's shell instead of reusing - // a stale one from the previous profile. - TerminalRegistry.closeIdleTerminals() - } - } else if (key === "execaShellPath") { - Terminal.setExecaShellPath(value as string | undefined) - } else if (key === "mcpEnabled") { - newValue = value ?? true - const mcpHub = provider.getMcpHub() - - if (mcpHub) { - await mcpHub.handleMcpEnabledChange(newValue as boolean) - } - } else if (key === "experiments") { - if (!value) { - continue - } + const pendingSettings = new Set(Object.keys(message.updatedSettings)) + try { + for (const [key, value] of Object.entries(message.updatedSettings)) { + let newValue = value - newValue = { - ...(getGlobalState("experiments") ?? experimentDefault), - ...(value as Record), - } - } else if (key === "customSupportPrompts") { - if (!value) { - continue + if (key === "language") { + newValue = value ?? "en" + changeLanguage(newValue as Language) + } else if (key === "allowedCommands") { + const commands = value ?? [] + + newValue = Array.isArray(commands) + ? commands.filter((cmd) => typeof cmd === "string" && cmd.trim().length > 0) + : [] + + await vscode.workspace + .getConfiguration(Package.name) + .update("allowedCommands", newValue, vscode.ConfigurationTarget.Global) + } else if (key === "deniedCommands") { + const commands = value ?? [] + + newValue = Array.isArray(commands) + ? commands.filter((cmd) => typeof cmd === "string" && cmd.trim().length > 0) + : [] + + await vscode.workspace + .getConfiguration(Package.name) + .update("deniedCommands", newValue, vscode.ConfigurationTarget.Global) + } else if (key === "allowedReadFiles" || key === "allowedWriteFiles") { + const patterns = value ?? [] + + // Blank lines, which the textarea editor produces freely, + // name no file and are dropped here. Patterns are + // otherwise not `.trim()`ed: leading whitespace is + // significant in gitignore syntax, and trailing + // whitespace has to be escaped by the user to be kept. + newValue = Array.isArray(patterns) + ? patterns.filter((pattern) => typeof pattern === "string" && pattern.trim().length > 0) + : [] + } else if (key === "ttsEnabled") { + newValue = value ?? true + setTtsEnabled(newValue as boolean) + } else if (key === "ttsSpeed") { + newValue = value ?? 1.0 + setTtsSpeed(newValue as number) + } else if (key === "terminalShellIntegrationTimeout") { + if (value !== undefined) { + Terminal.setShellIntegrationTimeout(value as number) + } + } else if (key === "terminalShellIntegrationDisabled") { + if (value !== undefined) { + Terminal.setShellIntegrationDisabled(value as boolean) + } + } else if (key === "terminalCommandDelay") { + if (value !== undefined) { + Terminal.setCommandDelay(value as number) + } + } else if (key === "terminalPowershellCounter") { + if (value !== undefined) { + Terminal.setPowershellCounter(value as boolean) + } + } else if (key === "terminalZshClearEolMark") { + if (value !== undefined) { + Terminal.setTerminalZshClearEolMark(value as boolean) + } + } else if (key === "terminalZshOhMy") { + if (value !== undefined) { + Terminal.setTerminalZshOhMy(value as boolean) + } + } else if (key === "terminalZshP10k") { + if (value !== undefined) { + Terminal.setTerminalZshP10k(value as boolean) + } + } else if (key === "terminalZdotdir") { + if (value !== undefined) { + Terminal.setTerminalZdotdir(value as boolean) + } + } else if (key === "terminalProfile") { + const previousProfile = Terminal.getTerminalProfile() + Terminal.setTerminalProfile(typeof value === "string" ? value : undefined) + newValue = Terminal.getTerminalProfile() + + if (newValue !== previousProfile) { + // Discard idle terminals so the next command gets a fresh + // terminal using the new profile's shell instead of reusing + // a stale one from the previous profile. + TerminalRegistry.closeIdleTerminals() + } + } else if (key === "execaShellPath") { + Terminal.setExecaShellPath(value as string | undefined) + } else if (key === "mcpEnabled") { + newValue = value ?? true + const mcpHub = provider.getMcpHub() + + if (mcpHub) { + await mcpHub.handleMcpEnabledChange(newValue as boolean) + } + } else if (key === "experiments") { + if (!value) { + pendingSettings.delete(key) + continue + } + + newValue = { + ...(getGlobalState("experiments") ?? experimentDefault), + ...(value as Record), + } + } else if (key === "customSupportPrompts") { + if (!value) { + pendingSettings.delete(key) + continue + } } - } - await provider.contextProxy.setValue(key as keyof RooCodeSettings, newValue) + await provider.contextProxy.setValue(key as keyof RooCodeSettings, newValue) + pendingSettings.delete(key) + } + } catch (error) { + // Earlier entries may already be saved. Keep the remaining keys retryable. + // Escape untrusted keys and error names; values and error text may contain secrets. + provider.log( + `Failed to save settings: ${JSON.stringify([...pendingSettings])}; error: ${JSON.stringify(error instanceof Error ? error.name : "Unknown")}`, + ) + if (!message.requestId) { + void vscode.window.showErrorMessage( + t("common:errors.settingsSaveFailed", { keys: [...pendingSettings].join(", ") }), + ) + } + } + if (message.requestId) { + await provider.postMessageToWebview({ + type: "settingsSaveResult", + requestId: message.requestId, + success: pendingSettings.size === 0, + unsavedSettings: [...pendingSettings], + }) } await provider.postStateToWebview() @@ -2303,9 +2379,15 @@ export const webviewMessageHandler = async ( } break case "upsertApiConfiguration": - if (message.text && message.apiConfiguration) { - await provider.upsertProviderProfile(message.text, message.apiConfiguration) - } + await saveSetting("apiConfiguration", async () => { + if (message.text && message.apiConfiguration) { + const id = await provider.upsertProviderProfile(message.text, message.apiConfiguration) + // The provider returns undefined when persistence fails. + if (message.requestId && id === undefined) throw new Error() + } else if (message.requestId) { + throw new Error() + } + }) break case "renameApiConfiguration": if (message.values && message.apiConfiguration) { @@ -2783,14 +2865,16 @@ export const webviewMessageHandler = async ( }) telemetrySettingQueue = thisUpdate - await thisUpdate + await saveSetting("telemetrySetting", () => thisUpdate) break } case "debugSetting": { - await vscode.workspace - .getConfiguration(Package.name) - .update("debug", message.bool ?? false, vscode.ConfigurationTarget.Global) - await provider.postStateToWebview() + await saveSetting("debug", async () => { + await vscode.workspace + .getConfiguration(Package.name) + .update("debug", message.bool ?? false, vscode.ConfigurationTarget.Global) + await provider.postStateToWebview() + }) break } case "rooCloudSignIn": { diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index a85c19cec4..e1a71a1165 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -151,7 +151,8 @@ "manual_url_auth_failed": "Autenticació manual per URL ha fallat", "manual_url_auth_error": "Autenticació fallida", "mode_import_failed": "Ha fallat la importació del mode: {{error}}", - "rooHistoryImport": "No s'ha pogut importar l'historial de Roo Code: {{error}}" + "rooHistoryImport": "No s'ha pogut importar l'historial de Roo Code: {{error}}", + "settingsSaveFailed": "No s’han pogut desar alguns paràmetres. Seleccioneu Desa per tornar-ho a provar. {{keys}}" }, "warnings": { "no_terminal_content": "No s'ha seleccionat contingut de terminal", diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 9f2b6d2056..5a5cdcfb2b 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -147,7 +147,8 @@ "manual_url_missing_params": "Ungültige Callback-URL: erforderliche Parameter (code und state) fehlen", "manual_url_auth_failed": "Manuelle URL-Authentifizierung fehlgeschlagen", "manual_url_auth_error": "Authentifizierung fehlgeschlagen", - "rooHistoryImport": "Fehler beim Importieren des Roo Code-Verlaufs: {{error}}" + "rooHistoryImport": "Fehler beim Importieren des Roo Code-Verlaufs: {{error}}", + "settingsSaveFailed": "Einige Einstellungen konnten nicht gespeichert werden. Wählen Sie Speichern, um es erneut zu versuchen. {{keys}}" }, "warnings": { "no_terminal_content": "Kein Terminal-Inhalt ausgewählt", diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 507780366a..61d7bcbbd3 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -147,7 +147,8 @@ "manual_url_no_query": "Invalid callback URL: missing query parameters", "manual_url_missing_params": "Invalid callback URL: missing required parameters (code and state)", "manual_url_auth_failed": "Manual URL authentication failed", - "manual_url_auth_error": "Authentication failed" + "manual_url_auth_error": "Authentication failed", + "settingsSaveFailed": "Some settings could not be saved. Select Save to retry. {{keys}}" }, "warnings": { "no_terminal_content": "No terminal content selected", diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index f646f5c4f3..3d94e79eb9 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Error al importar el historial de Roo Code: {{error}}" + "rooHistoryImport": "Error al importar el historial de Roo Code: {{error}}", + "settingsSaveFailed": "No se pudieron guardar algunos ajustes. Selecciona Guardar para volver a intentarlo. {{keys}}" }, "warnings": { "no_terminal_content": "No hay contenido de terminal seleccionado", diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index 0e5f59ca1e..dd49f789fa 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Échec de l'importation de l'historique Roo Code : {{error}}" + "rooHistoryImport": "Échec de l'importation de l'historique Roo Code : {{error}}", + "settingsSaveFailed": "Certains paramètres n’ont pas pu être enregistrés. Sélectionnez Enregistrer pour réessayer. {{keys}}" }, "warnings": { "no_terminal_content": "Aucun contenu de terminal sélectionné", diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index 59cf0f0657..2527ab845d 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Roo Code इतिहास आयात करने में विफल: {{error}}" + "rooHistoryImport": "Roo Code इतिहास आयात करने में विफल: {{error}}", + "settingsSaveFailed": "कुछ सेटिंग्स सहेजी नहीं जा सकीं। फिर से प्रयास करने के लिए सहेजें चुनें। {{keys}}" }, "warnings": { "no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं", diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json index 87ce78d209..67c7a76af6 100644 --- a/src/i18n/locales/id/common.json +++ b/src/i18n/locales/id/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Gagal mengimpor riwayat Roo Code: {{error}}" + "rooHistoryImport": "Gagal mengimpor riwayat Roo Code: {{error}}", + "settingsSaveFailed": "Beberapa pengaturan tidak dapat disimpan. Pilih Simpan untuk mencoba lagi. {{keys}}" }, "warnings": { "no_terminal_content": "Tidak ada konten terminal yang dipilih", diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index ce7ffce090..d426bc4812 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Impossibile importare la cronologia di Roo Code: {{error}}" + "rooHistoryImport": "Impossibile importare la cronologia di Roo Code: {{error}}", + "settingsSaveFailed": "Impossibile salvare alcune impostazioni. Seleziona Salva per riprovare. {{keys}}" }, "warnings": { "no_terminal_content": "Nessun contenuto del terminale selezionato", diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index d412e8f8e0..21b54d6fde 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Roo Codeの履歴のインポートに失敗しました: {{error}}" + "rooHistoryImport": "Roo Codeの履歴のインポートに失敗しました: {{error}}", + "settingsSaveFailed": "一部の設定を保存できませんでした。「保存」を選択して再試行してください。 {{keys}}" }, "warnings": { "no_terminal_content": "選択されたターミナルコンテンツがありません", diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index ff2fcb10d9..64126639ea 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Roo Code 기록 가져오기 실패: {{error}}" + "rooHistoryImport": "Roo Code 기록 가져오기 실패: {{error}}", + "settingsSaveFailed": "일부 설정을 저장하지 못했습니다. 저장을 선택하여 다시 시도하세요. {{keys}}" }, "warnings": { "no_terminal_content": "선택된 터미널 내용이 없습니다", diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json index e8b639af5d..596f3129a1 100644 --- a/src/i18n/locales/nl/common.json +++ b/src/i18n/locales/nl/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Importeren van Roo Code-geschiedenis mislukt: {{error}}" + "rooHistoryImport": "Importeren van Roo Code-geschiedenis mislukt: {{error}}", + "settingsSaveFailed": "Sommige instellingen konden niet worden opgeslagen. Selecteer Opslaan om het opnieuw te proberen. {{keys}}" }, "warnings": { "no_terminal_content": "Geen terminalinhoud geselecteerd", diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index 73e2293a10..3ba460414a 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Nie udało się zaimportować historii Roo Code: {{error}}" + "rooHistoryImport": "Nie udało się zaimportować historii Roo Code: {{error}}", + "settingsSaveFailed": "Nie udało się zapisać niektórych ustawień. Wybierz Zapisz, aby spróbować ponownie. {{keys}}" }, "warnings": { "no_terminal_content": "Nie wybrano zawartości terminala", diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 82654929b4..eda473ef8e 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -151,7 +151,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Falha ao importar o histórico do Roo Code: {{error}}" + "rooHistoryImport": "Falha ao importar o histórico do Roo Code: {{error}}", + "settingsSaveFailed": "Não foi possível salvar algumas configurações. Selecione Salvar para tentar novamente. {{keys}}" }, "warnings": { "no_terminal_content": "Nenhum conteúdo do terminal selecionado", diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json index 5857b1290f..36ce745840 100644 --- a/src/i18n/locales/ru/common.json +++ b/src/i18n/locales/ru/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Ошибка импорта истории Roo Code: {{error}}" + "rooHistoryImport": "Ошибка импорта истории Roo Code: {{error}}", + "settingsSaveFailed": "Не удалось сохранить некоторые настройки. Нажмите «Сохранить», чтобы повторить попытку. {{keys}}" }, "warnings": { "no_terminal_content": "Не выбрано содержимое терминала", diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index 48faf7d03c..e221883bcc 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Roo Code geçmişi içe aktarılamadı: {{error}}" + "rooHistoryImport": "Roo Code geçmişi içe aktarılamadı: {{error}}", + "settingsSaveFailed": "Bazı ayarlar kaydedilemedi. Tekrar denemek için Kaydet’i seçin. {{keys}}" }, "warnings": { "no_terminal_content": "Seçili terminal içeriği yok", diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index 5651e0eb3b..276c8c91a7 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "Không thể nhập lịch sử Roo Code: {{error}}" + "rooHistoryImport": "Không thể nhập lịch sử Roo Code: {{error}}", + "settingsSaveFailed": "Không thể lưu một số cài đặt. Chọn Lưu để thử lại. {{keys}}" }, "warnings": { "no_terminal_content": "Không có nội dung terminal được chọn", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index e5ecf86da2..f5ef2880d7 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -152,7 +152,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "导入 Roo Code 历史记录失败:{{error}}" + "rooHistoryImport": "导入 Roo Code 历史记录失败:{{error}}", + "settingsSaveFailed": "部分设置未能保存。请选择“保存”重试。 {{keys}}" }, "warnings": { "no_terminal_content": "没有选择终端内容", diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index e70c464da0..05f02b237c 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -147,7 +147,8 @@ "unexpectedStreamError": "Unexpected error processing response stream", "completionError": "OpenAI Codex completion error: {{message}}" }, - "rooHistoryImport": "匯入 Roo Code 歷史記錄失敗:{{error}}" + "rooHistoryImport": "匯入 Roo Code 歷史記錄失敗:{{error}}", + "settingsSaveFailed": "部分設定無法儲存。請選擇「儲存」重試。 {{keys}}" }, "warnings": { "no_terminal_content": "沒有選擇終端機內容", diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 17c53f40d4..098f6325da 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -124,9 +124,18 @@ export const stories: Record = { await import("@/components/settings/__tests__/AutoApproveSettings.visual.fixture") return }, - "chat-text-area": async () => { + "chat-text-area": async ({ isStreaming, chatInputEffect }) => { const { ChatTextAreaStory } = await import("@/components/chat/__tests__/ChatTextArea.visual.fixture") - return + return ( + + ) + }, + "chat-effects": async () => { + const { ChatEffectsStory } = await import("@/components/chat/__tests__/ChatEffects.visual.fixture") + return }, "history-empty": async () => { const [{ AppProviders }, { default: HistoryView }] = await Promise.all([ diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index a78f3f0f8e..88f8cffe50 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -103,6 +103,7 @@ export const ChatTextArea = forwardRef( clineMessages, commands, enterBehavior, + chatInputEffect, lockApiConfigAcrossModes, } = useExtensionState() @@ -1028,6 +1029,36 @@ export const ChatTextArea = forwardRef( "overflow-hidden", "rounded-lg", )}> + {/* Streaming border effect — marquee (conic-gradient light beam) or breathing (pulsing glow + 1px ring). + Selected via Settings → UI → chatInputEffect. Only shown while AI is executing. */} + {!isDraggingOver && isStreaming && (chatInputEffect ?? "marquee") === "marquee" && ( +
+
+
+ )} + {/* Breathing border effect — pulsing glow + 1px blue ring. No overflow-hidden needed (box-shadow would be clipped). */} + {!isDraggingOver && isStreaming && chatInputEffect === "breathing" && ( +
+
+
+
+ )}
( ? "border border-vscode-focusBorder outline outline-vscode-focusBorder" : isDraggingOver ? "border-2 border-dashed border-vscode-focusBorder" - : "border border-transparent", + : "border border-vscode-input-border", "pl-2", "py-2", isEditMode ? "pr-20" : "pr-9", @@ -1110,7 +1141,7 @@ export const ChatTextArea = forwardRef( ? "border border-vscode-focusBorder outline outline-vscode-focusBorder" : isDraggingOver ? "border-2 border-dashed border-vscode-focusBorder" - : "border border-transparent", + : "border border-vscode-input-border", isDraggingOver ? "bg-[color-mix(in_srgb,var(--vscode-input-background)_95%,var(--vscode-focusBorder))]" : "bg-vscode-input-background", diff --git a/webview-ui/src/components/chat/Markdown.tsx b/webview-ui/src/components/chat/Markdown.tsx index 87780d5df8..5edf0433e1 100644 --- a/webview-ui/src/components/chat/Markdown.tsx +++ b/webview-ui/src/components/chat/Markdown.tsx @@ -2,11 +2,13 @@ import { memo, useState } from "react" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import { useCopyToClipboard } from "@src/utils/clipboard" +import { useExtensionState } from "@src/context/ExtensionStateContext" import { StandardTooltip } from "@src/components/ui" import MarkdownBlock from "../common/MarkdownBlock" export const Markdown = memo(({ markdown, partial }: { markdown?: string; partial?: boolean }) => { + const { tableStriped } = useExtensionState() const [isHovering, setIsHovering] = useState(false) // Shorter feedback duration for copy button flash. @@ -22,7 +24,7 @@ export const Markdown = memo(({ markdown, partial }: { markdown?: string; partia onMouseLeave={() => setIsHovering(false)} style={{ position: "relative" }}>
- +
{markdown && !partial && isHovering && (
{ const { t } = useTranslation() - const { reasoningBlockCollapsed } = useExtensionState() + const { reasoningBlockCollapsed, tableStriped } = useExtensionState() const [isCollapsed, setIsCollapsed] = useState(reasoningBlockCollapsed) @@ -51,7 +51,13 @@ export const ReasoningBlock = ({ content, isStreaming, isLast }: ReasoningBlockP onClick={handleToggle}>
- {t("chat:reasoning.thinking")} + + {t("chat:reasoning.thinking")} + {elapsed > 0 && ( {secondsLabel} )} @@ -69,7 +75,7 @@ export const ReasoningBlock = ({ content, isStreaming, isLast }: ReasoningBlockP
- +
)}
diff --git a/webview-ui/src/components/chat/__tests__/ChatEffects.visual.fixture.tsx b/webview-ui/src/components/chat/__tests__/ChatEffects.visual.fixture.tsx new file mode 100644 index 0000000000..be1e23f935 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ChatEffects.visual.fixture.tsx @@ -0,0 +1,24 @@ +import React from "react" +import { AppProviders } from "../../../../playwright/AppProviders" +import MarkdownBlock from "../../common/MarkdownBlock" +import { ReasoningBlock } from "../ReasoningBlock" + +const table = `| File | Status | +| --- | --- | +| Composer | Updated | +| Reasoning | Streaming | +| Markdown | Striped | +| Settings | Saved |` + +export function ChatEffectsStory() { + return ( + +
+ + +
+
+ ) +} diff --git a/webview-ui/src/components/chat/__tests__/ChatEffects.visual.tsx b/webview-ui/src/components/chat/__tests__/ChatEffects.visual.tsx new file mode 100644 index 0000000000..8860a4bab5 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ChatEffects.visual.tsx @@ -0,0 +1,32 @@ +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(`streaming reasoning and striped markdown in ${theme.name}`, async ({ mount, page }) => { + await page.clock.setFixedTime(new Date("2026-01-01T00:00:00Z")) + const component = mountedStory(await mount("chat-effects")) + await applyVisualTheme(page, theme) + const story = component.getByTestId("chat-effects-story") + const label = story.locator(".animate-thinking-shine") + await expect(label).toHaveCSS("animation-name", "thinking-shine") + await label.evaluate((element) => { + for (const animation of element.getAnimations()) { + animation.pause() + // At 500 ms the highlight band crosses the middle of the label. + animation.currentTime = 500 + } + }) + await expect(story.getByRole("table")).toBeVisible() + const rows = story.locator("tbody tr") + const firstBackground = await rows.nth(0).evaluate((element) => getComputedStyle(element).backgroundColor) + await expect(rows.nth(1)).not.toHaveCSS("background-color", firstBackground) + await expect(story).toHaveScreenshot(`chat-effects-${theme.name}.png`, { animations: "allow" }) + + await page.emulateMedia({ reducedMotion: "reduce" }) + await expect(label).toHaveCSS("animation-name", "none") + await expect(label).toHaveCSS("background-image", "none") + const foreground = await story.evaluate((element) => getComputedStyle(element).color) + await expect(label).toHaveCSS("-webkit-text-fill-color", foreground) + }) +} diff --git a/webview-ui/src/components/chat/__tests__/ChatTextArea.spec.tsx b/webview-ui/src/components/chat/__tests__/ChatTextArea.spec.tsx index 5cced6a92f..c86df835e7 100644 --- a/webview-ui/src/components/chat/__tests__/ChatTextArea.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatTextArea.spec.tsx @@ -1529,4 +1529,129 @@ describe("ChatTextArea", () => { expect(defaultProps.setInputValue).toHaveBeenCalledWith("abc/some/path def") }) }) + + describe("streaming border animation", () => { + it.each(["marquee", "breathing"] as const)( + "hides the %s overlay during drag-over and restores it when dragging ends", + (chatInputEffect) => { + ;(useExtensionState as ReturnType).mockReturnValue({ + filePaths: [], + openedTabs: [], + apiConfiguration: { apiProvider: providerIdentifiers.anthropic }, + taskHistory: [], + cwd: "/test/workspace", + chatInputEffect, + }) + render() + const textarea = screen.getByRole("textbox") + expect(screen.getByTestId("streaming-border")).toBeInTheDocument() + + // JSDOM has no DragEvent; MouseEvent preserves the modifier and pointer coordinates. + fireEvent( + textarea, + Object.assign(new MouseEvent("dragover", { bubbles: true, cancelable: true, shiftKey: true }), { + dataTransfer: { dropEffect: "none" }, + }), + ) + expect(screen.queryByTestId("streaming-border")).not.toBeInTheDocument() + + fireEvent(textarea, new MouseEvent("dragleave", { bubbles: true, clientX: 0, clientY: 0 })) + expect(screen.getByTestId("streaming-border")).toBeInTheDocument() + }, + ) + + it("renders marquee border overlay only when AI is streaming", () => { + const { container } = render() + + const borderDiv = container.querySelector('[data-testid="streaming-border"]') + expect(borderDiv).toBeInTheDocument() + // Marquee effect renders a border-spin ring + expect(borderDiv!.querySelector('[class*="border-spin"]')).toBeInTheDocument() + }) + + it("does not render border overlay when AI is not streaming", () => { + const { container } = render() + + const borderDiv = container.querySelector('[data-testid="streaming-border"]') + expect(borderDiv).not.toBeInTheDocument() + }) + + it("does not render the breathing border overlay while idle", () => { + vi.mocked(useExtensionState).mockReturnValue({ + ...useExtensionState(), + chatInputEffect: "breathing", + }) + render() + + expect(screen.queryByTestId("streaming-border")).not.toBeInTheDocument() + }) + + it("renders marquee border overlay while streaming even when focused", () => { + const { container } = render() + + const textarea = container.querySelector("textarea")! + fireEvent.focus(textarea) + + const borderDiv = container.querySelector('[data-testid="streaming-border"]') + expect(borderDiv).toBeInTheDocument() + }) + + it("renders breathing border overlay when chatInputEffect is breathing", () => { + ;(useExtensionState as ReturnType).mockReturnValue({ + filePaths: [], + openedTabs: [], + apiConfiguration: { + apiProvider: providerIdentifiers.anthropic, + }, + taskHistory: [], + cwd: "/test/workspace", + chatInputEffect: "breathing", + }) + const { container } = render() + + const borderDiv = container.querySelector('[data-testid="streaming-border"]') + expect(borderDiv).toBeInTheDocument() + // Breathing effect renders streaming-glow + border-breathe classes + expect(borderDiv!.querySelector('[class*="streaming-glow"]')).toBeInTheDocument() + expect(borderDiv!.querySelector('[class*="border-breathe"]')).toBeInTheDocument() + }) + + it("does not render breathing border when chatInputEffect is marquee", () => { + ;(useExtensionState as ReturnType).mockReturnValue({ + filePaths: [], + openedTabs: [], + apiConfiguration: { + apiProvider: providerIdentifiers.anthropic, + }, + taskHistory: [], + cwd: "/test/workspace", + chatInputEffect: "marquee", + }) + const { container } = render() + + const borderDiv = container.querySelector('[data-testid="streaming-border"]') + expect(borderDiv).toBeInTheDocument() + // Marquee effect should NOT have breathing classes + expect(borderDiv!.querySelector('[class*="streaming-glow"]')).not.toBeInTheDocument() + expect(borderDiv!.querySelector('[class*="border-breathe"]')).not.toBeInTheDocument() + }) + }) + + describe("input border state", () => { + it("keeps a shallow border on the textarea when it is not focused (not transparent)", () => { + const { container } = render() + + const textarea = container.querySelector("textarea")! + expect(textarea).toHaveClass("border-vscode-input-border") + expect(textarea).not.toHaveClass("border-transparent") + }) + + it("shows the focus border on the textarea when it is focused", () => { + const { container } = render() + + const textarea = container.querySelector("textarea")! + fireEvent.focus(textarea) + expect(textarea).toHaveClass("border-vscode-focusBorder") + }) + }) }) diff --git a/webview-ui/src/components/chat/__tests__/ChatTextArea.visual.fixture.tsx b/webview-ui/src/components/chat/__tests__/ChatTextArea.visual.fixture.tsx index 7585881f14..7f1295b218 100644 --- a/webview-ui/src/components/chat/__tests__/ChatTextArea.visual.fixture.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatTextArea.visual.fixture.tsx @@ -4,17 +4,24 @@ import { defaultModeSlug, type Mode } from "@roo/modes" import { AppProviders } from "../../../../playwright/AppProviders" import { ChatTextArea } from "../ChatTextArea" -export function ChatTextAreaStory() { +export function ChatTextAreaStory({ + isStreaming = false, + chatInputEffect = "marquee", +}: { + isStreaming?: boolean + chatInputEffect?: "marquee" | "breathing" +}) { const [inputValue, setInputValue] = useState("Audit contrast across the Zoo Code webview") const [selectedImages, setSelectedImages] = useState([]) const [mode, setMode] = useState(defaultModeSlug) return ( - +
(document.activeElement as HTMLElement | null)?.blur()) @@ -30,3 +32,33 @@ for (const theme of visualThemes) { }) }) } + +for (const theme of visualThemes) { + for (const chatInputEffect of ["marquee", "breathing"] as const) { + test(`streaming composer ${chatInputEffect} in ${theme.name}`, async ({ mount, page }) => { + const component = mountedStory(await mount("chat-text-area", { isStreaming: true, chatInputEffect })) + await applyVisualTheme(page, theme) + const story = component.getByTestId("chat-text-area-story") + await story.getByRole("textbox").blur() + const effects = story.getByTestId("streaming-border").locator(":scope > div") + await expect(effects.first()).toHaveCSS( + "animation-name", + chatInputEffect === "marquee" ? "border-spin" : "streaming-glow", + ) + // Preserve a visible, deterministic point in each production animation. + await effects.evaluateAll((elements) => { + for (const element of elements) { + for (const animation of element.getAnimations()) { + animation.pause() + animation.currentTime = 1000 + } + } + }) + await expect(story).toHaveScreenshot(`chat-composer-${chatInputEffect}-${theme.name}.png`, { + animations: "allow", + }) + await page.emulateMedia({ reducedMotion: "reduce" }) + for (const effect of await effects.all()) await expect(effect).toHaveCSS("animation-name", "none") + }) + } +} diff --git a/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx b/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx new file mode 100644 index 0000000000..276647dbb8 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx @@ -0,0 +1,28 @@ +import { renderWithExtensionState } from "@/utils/test-utils" + +import MarkdownBlock from "../../common/MarkdownBlock" +import { Markdown } from "../Markdown" + +vi.mock("../../common/MarkdownBlock", () => ({ + default: vi.fn(() => null), +})) + +describe("Markdown table striping", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it.each([ + { tableStriped: true, expectedStriped: true }, + { tableStriped: false, expectedStriped: false }, + { tableStriped: undefined, expectedStriped: false }, + ])( + "passes striped=$expectedStriped when extension state tableStriped=$tableStriped", + ({ tableStriped, expectedStriped }) => { + const markdown = "| Name | Value |\n| --- | --- |\n| Setting | Saved |" + renderWithExtensionState(, { state: { tableStriped } }) + + expect(vi.mocked(MarkdownBlock).mock.lastCall?.[0]).toMatchObject({ markdown, striped: expectedStriped }) + }, + ) +}) diff --git a/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx b/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx new file mode 100644 index 0000000000..6f90a137dc --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx @@ -0,0 +1,90 @@ +import React from "react" +import { renderWithExtensionState, screen } from "@/utils/test-utils" + +import MarkdownBlock from "../../common/MarkdownBlock" +import { ReasoningBlock } from "../ReasoningBlock" + +// Isolate the label behavior and the props passed to the markdown renderer. +vi.mock("../../common/MarkdownBlock", () => ({ + default: vi.fn(({ markdown }: { markdown: string; striped?: boolean }) => ( +
{markdown}
+ )), +})) + +vi.mock("react-i18next", () => ({ + useTranslation: () => ({ + t: (key: string, options?: { count?: number }) => { + if (key === "chat:reasoning.thinking") { + return "Thinking..." + } + if (key === "chat:reasoning.seconds" && options?.count !== undefined) { + return `${options.count}s` + } + return key + }, + }), +})) + +const renderReasoningBlock = (props: Partial> = {}) => { + return renderWithExtensionState( + , + { state: { reasoningBlockCollapsed: false } }, + ) +} + +describe("ReasoningBlock thinking shimmer", () => { + it("applies the shimmer animation to the latest streaming block", () => { + renderReasoningBlock({ isStreaming: true, isLast: true }) + + const label = screen.getByText("Thinking...") + expect(label).toHaveClass("animate-thinking-shine") + expect(label).not.toHaveClass("text-vscode-foreground") + }) + + it("keeps historical reasoning blocks static while another block is streaming", () => { + renderReasoningBlock({ isStreaming: true, isLast: false }) + + const label = screen.getByText("Thinking...") + expect(label).not.toHaveClass("animate-thinking-shine") + expect(label).toHaveClass("text-vscode-foreground") + }) + + it("keeps completed reasoning blocks static once streaming has finished", () => { + renderReasoningBlock({ isStreaming: false, isLast: true }) + + const label = screen.getByText("Thinking...") + expect(label).not.toHaveClass("animate-thinking-shine") + expect(label).toHaveClass("text-vscode-foreground") + }) + + it("always keeps the bold styling on the thinking label", () => { + renderReasoningBlock({ isStreaming: true, isLast: true }) + + expect(screen.getByText("Thinking...")).toHaveClass("font-bold") + }) +}) + +describe("ReasoningBlock table striping", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it.each([ + { tableStriped: true, expectedStriped: true }, + { tableStriped: false, expectedStriped: false }, + { tableStriped: undefined, expectedStriped: false }, + ])( + "passes striped=$expectedStriped when extension state tableStriped=$tableStriped", + ({ tableStriped, expectedStriped }) => { + const content = "| Name | Value |\n| --- | --- |\n| Setting | Saved |" + renderWithExtensionState(, { + state: { reasoningBlockCollapsed: false, tableStriped }, + }) + + expect(vi.mocked(MarkdownBlock).mock.lastCall?.[0]).toMatchObject({ + markdown: content, + striped: expectedStriped, + }) + }, + ) +}) diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..214d7bb8e2bd2bc3ad728e4ef7599c3bceafbd79 GIT binary patch literal 9408 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

5KHaiXZ{RQNdD4T#YXIwI;>f-3YiZ#wUJZRE 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 ATL1t6 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-high-contrast.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-breathing-high-contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..96d5162b46f77efd1827091b2f670ca1ebbe855e GIT binary patch literal 9257 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d6262d85bfe696fff8f2215a896556fc257c6438 GIT binary patch literal 9650 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-high-contrast.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-marquee-high-contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..50508855a1d557a4602055b1eb302295d8b86513 GIT binary patch literal 9797 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-resting-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-resting-dark.png index fad9aa30b923ada5cbd0e6c1f1a5df83319b1d39..e3adfecc06e1e7b0452f23439d261a218a5ba150 100644 GIT binary patch literal 8968 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 DQB`ls literal 9162 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 CivmCZ diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-resting-high-contrast.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-resting-high-contrast.png index 465ffc0263d816e953f37275f9ceb514223f33bf..46328c8802ab45b323ccb8ecaef408f621e11cd0 100644 GIT binary patch literal 9604 zcmbW7RZtvJyRHfD8l0fP-62?T3+@mc26qcC!5sp@o#5{77TkloYX*0AlfO>YsXFIk z?|nlJ-80>*KYyQIVT$sSD2N1z5D*Y3(o$l|5D@PUfX^xLkicInKEVhG2y_T(F=5qj z=_eTonrd@PgSe1%JY?|WFgzQYq|rRHiL-2s?DQiori*iXtx%&SI|&Kf5T zP40e-U9>82-GEDn+rY&^?pLp!By8(e`tRi*RyZ#P!4q`C=+ND?ye)<<`-OTY6pVu7 zQB5~O>gSnrrHOAhNKaEDG%~xk-Co-SD}k5ivjpli5P%Dg%jwCxZvSOUJgP^OQ{c}5 zz6xEqZ`1?!DDUBaN^AJ!b`tyV_nEUz$$on_{3ZAIBR_nBUoyROj560yep{3*Sq~$8 zz=lz%JyHN^6CU}>+v(tt8tUt%y5p-p^UiG0+!G{Sb1S_tdSJM$p|G&Jwx#yd)By}h zVc&_mYp-69?(fw+L(M`TERbEAkjwe>#EX}e+7d4%e1M_@_~sJLe7;3JugiZ1$LIB^ zD&Kob90q0>bwRwT*!w%z<`~7J?{r}~u+ApdE`EWOhOj8_b;bie!-m47+r?hbQ*c|o zuF*<||ClKGd0eA9LV$hm#r83U_O*BR&DdDNhpKk_KX%ICK}vHTnWJ?HJlB&wyz+@-EuYHiS1dzfp*!a zd6W(M=~pGE^mcCxQVezzQM*M_Y#6xd(JhW|<-ezf56DKINKw70Y9C#?MdEq0Rd`5< zq?DA@YKzP2$_fLBhK^1~S~@HuVq{`MBU-%Uf(bsrz&|@XTgR?_u6?J{EAJ#HC&%C4 ze|R&rAF#Z^J73>dl|p%&#hQMZ%(K;2IA~}hKG!e2KOL)@bQ*1=BEaXqudOE`Ubm}m z%$-kcgi}*f%x!-m3Axw3F4tdQ+)P#IG%B8^WtoeQHy&iG;0kOwtrx2FeV^5IDMHXl zm>ym^tZx3`4nN+Uwi*vc(`!_mthGNj?`P6)E7>g7bu+5D`lZfR>aTlbzJr4ONJ&Y% zDUqxEOC~5N$eP1;r77zj*XRWcjtpY{LZj{QCjZ^WcgbiX!>baj{X`AD`^^xN1jAg> z?+J3nN_hi)VOVo6_Ro|H-;eD|e=_Q{JSQm#-kTgw|B{R$R`U&WJzesCeZF08w6mKl z!Tv!s^SATmntAuifR+D#=Z8!anZkSF+fQX56ctxPJxN{fMkftRBR_I&~mo-Ec{&6V^^|EbVDK0K6886p}K zd^pJa4vV5)3qrXkc4}TS#jBUvBeZddO)2P&YK-bq_$7csw zFV!7hP6!RURcm6+Txwg>6SxDhMC3Rl$9?`9cg)P!=6Av?*~oZziXc7;s+M*K1Eie)7PI)faU zLSe1V-D#DchnY}MPw(|4^WApLgTy5FS?8-ydxY`2`+mmJ zTq&VW%rdvj(d<|nw=cLKS1yfcx+``_TB?;8l3@lYeM7(>prb4^kGLcSA^?uWQ zQ=*JjHg0>}_w~7Yka#9+fenR#V{#c850-^6GJL7tDld~~NaB)+(iDQ-NTWIs?vUA+e3vkF(M`h;=0k*M>L8Rf90Jsl}=7Wc1gN|);kR}SbCy)y47gJ|g z)bcC@NQj6uPRH}*>88p4;t@D;{+P**U~C#3Pppa5xX6uMT6irGi0TkTnLHmpjqZKH zVximO95zh`?y2wb&8P^xPuOIM}VJuR>+k?lt2h8zf$dZN1!R8A<4d~G=Fd4rd<6fT>82UUh z`~1V_m)VEWfRQ9-`tEC9`;E^TpIp4WycQIL4^#Zz*S&A6bA}Nbr*yW2&WQ7^L#`nQ zqX>ZrY@f=L#Jc*-ca<%Efd>oZov{w#NRhIa7k~F6yV-bbC~C#mX2*-2-LU>O|8_x52)(v(ZB=#9 z#Q7i9ke@7F{hUDet9X4Rbik&OWX2WZ6aBwI>W=Gsh1D_O7Cih4cJS8XN zwMVs)2LQ%C%n=Q#+DqtW0vUC^-?g8mqoYGSeq3pGA|oTyEHLRJHo?U(B!F)AJ#W8_ z45HxZw=xR1&|zh51A2T*FPZcx%0grvW;K6#=ZmPHfd zS0rdLS|M6kfBbd2+<%AZiU_gFBL~n2^oqf!=~$!=3G~BrP|}l)~X9IH(~;BpMc9V}&p9sv^g~q*P-N5+Zqwz=uSO!2H|M z>^01)JxGJ}%DST@p{j%5M^8^bvcS`qP)`wX6!n4c=PMig4TC(Nzry^e>YQfGvZiB#lzV!73yyHF|+*Wjyc0cT!fcv8tr>tqa8NtQLUF%JU5K#1w+*S2p;_(m9^ z%whQl$Sp)43D+BD_asEGVU1m;^QDakB2)O>n2aom>adXS9v_W^Hr=*`lT_bxQOI*h z;N#%COcHa{LSB@!ADDC67?RgPz&RaO_Zi=6 zGjSW} zA^!) z*rKDunL>mN+FlMna>A_md?M3Oqv~&;^X2hpNm~7r!%`ka_*gt#NV;wcZLXsz(nSu^ z5sf)EW+tDdltje+J;%J)?YcNJ?)-~I4_SyT9oX5T3UJW9x(Ir>$P%QHlgPs5@>}^J zL-N9Fj77+U7Lq~YIVTK`TU1yVT;7mq<&yn>kEeLHnv=By#Sqw7%&VQi4m=Tw1Y3L* z_);as_oH0$+}y}kNLa|5qy(}Fu0ye8gV7&Ekz&R7$ZVnrWG5%6%~_s9JuxX26co&M zD4N829XRa;SyGfrd7buRZErYOB|eQ^{Ov`<;x;(^GN@Md5cX* zKGY#&8I!>%8}^hm%cyL5IU95Vx}t#Lq~NH@!xX9MH;EwmAibGc4xXQ_Y&`F-aLyQH z39jnut^Ux7qV>5J5P)W|ZzHbJwv>2+Rv>Xiu71S57x&W73Uv=CrRk6&ZNj;Fmzz3_ zJ~&hQHL`VUF}$@3wQDNkhq}QbNjrNzPPHFP7rqkCWi75TQKHzQ+>C=~3ZWAHjB^2; zNx)DT9m=o?4O?95uk9gr#WC_uylrS@DKQ*b#&_%}x9h5E&4JM$_-e8(aTHjBkn8*` z4B)1yCkN(I1Y3=&sS2oT7Ssz!C*jHIiYs6uP;@M<*oi~$w$+m72Dki?2_p$=Y4mD|>wi5czNtL=fJ39mOn~13Bj~_qS+1L`G;uOOG zeP|jQ7#I>#>i~=a{Sml!D@}2yfRe$UTdOu61Ue&zZS7r{@xP^4`4twL{h*RtYOv8M zl>acx%gD&c%v>p(!~_gBkzrxH9#`hAuBVEBi;8IA(w1fZJvBL_cAYse{*-*c$3NWO z7L|FyuG{`UETB}qJmC9x6=h}gD_{_gd)N91$O}L>y-8KgjV^zv&Zi3`qZ#{4I4}Qw$#e$y)>bNUOTEsMuI^RZn2Vudc2J=2%7shLsvq zS@+_G_(B;#JIe%QbLH5mrcn;Jd*0?QNwlWf*x8+*oSfw5lJDC0Z2{h)i35$L<}5wl zo(nl2#1^lPRR9xroyCkqBAk)K+oE9S&L(quyT8L38yS5$wFM^pwRTT#%h^yA)6ii0 zL2?|x<^eE~CGB?Wf;MgxlMAaSEnfE*!6<~|Swae<9|Z;Vc!{dtf@2g61`F4tkqDNl z>CiV#)ll7Jq^1rJZV$$ofk1R26mP2CASFGWNTqeznz`FnP5z%*l7D1oMk|K|1yy_R z48?7g=yv?aS`hS)qbckUBWJ_E|KqGtpz-8!(__V<)Dhgq63O{EnZTob-o+izeh|;^j?A0LDY&00ir5YN$f&bQTI$xm+XzEoio27%8u&^+df-m@=oDT}* z(pb8188lhE?*97uLG0RpR3(42Zhn6L%F2rL4=O{4v{M-=DR@LgAi-vnS&f5{@oS6+ zQFlN8OJte+qN1XF-9)-){OX~JiHYC8m7>M}g*O`@^wmmK@%dcK4r~1Y8HLYc@EI5o zk&uwgMw6?J`om{uRd+T2U4@}{cxSQJEUF|b8jXPCpkdi|WN1jU!|NUxNZHxh)!a${ z+1VM8uW~Xn%JRYgECzFfrzjuh z<)r-It55)J3A(>u^Ldd$hu#b>Ox1^oFS3q04SKv-%=ZJ8C%zGw7~e~-B<1+T^6Fne@M?mi;sSC(M0b(C%$X=oHNa?ar^Y`}0 zBqBkRz(S3B<2?CRR0& zPdpp6TkH3da7%r(UtBdCsz4mV!NF;8cEOU2_>=*?1JE{5kdQ#+8W|h=vH^#IfP8H1 zd>-rV?NCrn3Oo%;8?q3&qEf5o!LO&?iT0FPI#x|eN3U;oH+hY};fiUaCbP`LtUx=C zVo1O}u!VkFnHClBapxjKEh;_r!FP3@)0rhdUJI@1{3VPHSJ8gyH^}X7-RS^qyXVT z$Zc!gK+np`%E{?+d$vkTOM9gKxqi9cs?qsSnciLTuN}Z>&RWlbb_r*ugxYu0bGo~2 z=G|WE%6S_JkboYM-B0%7YxS~T54p3lt{)e1Ws5E4gUclJnCA(#>_6i51LAfKfJhxL z566JO*9X`IL|tnupVHx5DJs*t1P}{=rxwDo=~0RKrCxxVr99H73e=cZmpQH)pkKj} zc-b%3n8Ee@Xo)e+UQPzlRN=nKXmBq!yw}fS81qvWg@!l{aAOe#^ zgEQH)k!4m(HJAgx0e#cMp=Ortcbn-5jv8oaB~LOYitqz&pmVIfXH%&sA7{nsHkLBQ zsey?6YnPK1+TOgmVxI70gRQMCm|EeC&*5bj2I*2wN@}PVfOdcqc%OI^UyiHq<*-y| zQ9uja^a5y6DR`Q3JPuodbWo~PG&Dt#DYB-sMM^I(FIQybMgXJ8o6#H%wqSAC5-aYFs8+0H8*l({;Pbp;kcsLagD`xq(y9ez z@VQYDx?$xtF~GpW!WyaIpp`4CW(j&PXg1n@n6jz;v|{2n6zK?$`mkqmJ$$q|ua)7g zQ2JDs_Pio`^gfV#wDLG*zD_xPFeq7KErnT9-A-+y=NL-q6pr{?w%hsIugm~a4e8dO z3|hIvuv^yygmyH9{!rK?BopMY(>DMf%xlJ}6&Dlx=I(CDlTflWoK3r9w*5mvuo-}z ziKn0IV*(iZ9j@W?Ie)W92 zPAxTEtU{ejK2xY*HsF0!TzL0wvnL3c=zhFoWHR>0Q|@QiC{_+?P7m|Pcn02?U<-wd z0!%3(&py^3m#(p=q+`zeX&Fux;mT3r3#}#Q0%?(6ls@YIY~}HKlh0>okr!{nHNDI| zxali)&}diL3<(JUT7lkWqyQ)dDhGhA0S8zwOV(uTkWw}T4`Y&B?i7L1piHF@)q&<& zY7%I(nhMD*hLFp{_CMCVZ&&R)?m>V=Did!5Xx-3pPY_aK)Izho5hM6OPw#v3rnsiZ0Js z&vS-=Cs*Se9Bxd$;D*xo0>gw<)l5w8o*jdTILu?g#g)`qUh%GPV_`b4(;NHPlJHxs z{tky$uziWlGom4>0xBi{q?-4!DgB2<41ehCVY<~3iR7`Um;fXm6Rksk3)dy8@5$5 zbu$5@FO^&>%lgG@MeCU|Ea6ITFBGSc?+ZVD=jhK!1yKKfrYEW|ViXlxe7MLayow{x z6Que+Hw=Cj?>SIl@JOEXM@M|ecG3zs$T0<;RTo7E&4P-(WGuXy$-lT?bE&klL*_1M za`<9*BvEc^Nf&1h_6%kQ(}7T+c8d=4%WSK;!ZSx=HMm(*I~hrG_?ifme;4F52T=Uy zr^|^r$1@Dk+;525U-(9|gnWTgkA%a}RYDGR8;vnCDN>nen3|9Jg)G@%CkGs7tfCO) zW9rIK%TvEAWX8HiK*>XYweWC#tnW)qffK|hAdvBGD1^i(v|fycih`n-0ji+=#Ut9- zKA~S%^*vTn)AL64mzV%!jY|bneXXjKTVrZvrrn~e+5CXfgvgU8`sO{!Ri_DoQ9I}~ zdxg5VU&x4|sq1d*-V3&Mq&j5%xv#xPUaVlAJhsGU?unH+z+Y(OC#)T_zjt z^ao(tVW1$PIvKikTDP+MrGMf~&7|sCipj3$nMG*NIxTy1FfRXXpZVz$0eSp&4Rlxp z4<)8#HD4y(dnm5+-1ZUn&t`9kOGCL%Bi(lf%Mf_%hC3H3vD!&LHZi5DDi(w&eIHZX zjZT}qfr1V4?69EMeoeR;{-ODyI0}dT+tcMiHu%f%Lp`_0*T7hdKEhbwf_4&O57lja0j*@aG<{aK#i&x4$3D{O_SQb;_N(8@J& zM9~CfDSq~M9k|3C6~7bdHJo9;92yV4oJ-$q4bpZ0${x%`gPuH)jWjZ*RtheBfM1_l zM31UrCN#1&<}=nORB3TJ4sI7$jQ&eSk^&o=L&o#Xcz~Zq*@17>hv%xk0(o~ethrrB zeKo~?E;%`Mne=3jO!BllK5YzZBqvz^0N|wtcI9^qE-&9taID^+0&(QZ92xTjJg!LlK&dG{ zDkX8Aa>@PmQQ))qY_ zt?B@z?zUE|KTPRDTLyi+tVlH|_Urd|Kqq%T2kP_L>cC;MYMp&r!A9MoT8JZ zl(*s+hK!~rp7xQ2I}YaQFNK4p-g_x#33Esq!P#Ur(VAFpI$6!w;LEpBg*|n7er)29RN1&Zv|PdozFo;m;CsC-t8kwqDOJl89t*e{AI+j>9!|PwISjxb9plN%lZdK`hg*(5Gkf^@)5X367>MxG+8L4ArT z+Rtuu^9X$TOnzRA>3m@PQ%}Ul0kLFhwE=^iTye_d^>L$NFDzWA*YBI2jEu~^-EAxI zFWFYi%R3b&cn#-WqcDA|I>+D9gQc#tYUSD^8f)w>8E=DsTvhN@vHvHRBWO6dv{O^* z@9_04u7CfsOlwIEJ}}XOL;|682BM$IuVt6TiQ^vx4%W-+{~gN&cEl)e8`1qDTH2qXQGDA_Bd>5eAZ&(u z>fm%+#&2}`k`l)V0EmE%75>Jbbhk5!5?Y zn(UeCD*-nax!*k9UuUUP0elMwVv2gOPF1(DXCDh(UG*7azt#?^vDX@#(0^OwuH^jv zEU=#^LDbXDi?eoUM=(v`GK} literal 9624 zcmbW7Wl&u~x28jaL(t$30fM``yK``YySux42oNAZaCf)h5Ind$1b27N-6Y?gnW~u| zx8~2OQ@wjj_g=l$`#!xR6y+t}!{frgdGqGIl%%Ngn>P@9!2eX(x4^Fz4}a8~Hz;qU zM1@q{(~mM>+*LsjUZ;-o_(ke@y%$_!jbQz{fmFaGcW%4^PLSF`7PeD%|Pr#zwQ#N%QUxuc6zY zr(U+Eyoor3Y*u3L@n*7YMD3#*_yfA6Q6PnixND}y(z)tRrvr4C+V6iB5w9hlm~z7t zaW<_DpW1w9+V{SgU*Mwif8BwvQy**;#Jsp@!1wsf`$9zy8%WGa9yUvRdUJP)pGQg2 zggW=KbU~2$-n3|SMv-*W0T(fJFB8JSjP;fLcQi<$CiYHV-K4YKa!ihboQNRVd;JdoI`s0Y!stkf+c-y>gE7U7jH+sU7jEdhzwd%IIHerLGb_HmB z2Rp#er^%l^BZB7V=Ydd;4LYo7J*o72F0G+qvz&I{2*H{L*|dE4evd+WJ-^?f;$CdVbvXM^_L` zVP4*+4XwcAmd#Cp#>4OIHlAsyNVFG>SVQo6s@kYtD+spwibTMjS6G?0Y%uL4JO?p6Wweeb`B}`{X*5NR=;B_;RiK$=tw4$Mx;)>)Q@+hFRf)2j�T)Xjeo%zI=0Jw}Nu$swu0L3TL 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 L@}d>O`houi$=aJZ diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-resting-light.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-composer-resting-light.png index 1f238a4619657763f15f05e20656ec0f08a03eb9..32d26d8f2ace3fc569f64dd751e83a432b0e70b7 100644 GIT binary patch literal 9183 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 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-effects-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-effects-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdc7e6c5802e4c6e65ca91b8b3e4e77164f1dec GIT binary patch literal 12629 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 JnV3=F{{mu{ivE%h;HJrWD`z=oZ$!b>nb4z= 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 E0KT8rp8x;= literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 02f696553f..3eb8c44f60 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -32,6 +32,8 @@ const ALERT_LABELS: Record = { interface MarkdownBlockProps { markdown?: string + /** Opt-in zebra striping for markdown tables (Settings → UI → tableStriped). */ + striped?: boolean } const StyledMarkdown = styled.div` @@ -213,7 +215,9 @@ const StyledMarkdown = styled.div` color: var(--vscode-foreground); } - tr:nth-child(even) { + /* Opt-in zebra striping (Settings → UI). The ampersand keeps the class on + this element; without it styled-components would require a descendant class. */ + &.table-striped tr:nth-child(even) { background-color: var(--vscode-editor-inactiveSelectionBackground); } @@ -273,7 +277,7 @@ const StyledMarkdown = styled.div` } ` -const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { +const MarkdownBlock = memo(({ markdown, striped = false }: MarkdownBlockProps) => { const components = useMemo( () => ({ table: ({ children, ...props }: any) => { @@ -395,7 +399,7 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { ) return ( - + { expect(screen.getByText("Third level ordered")).toBeInTheDocument() expect(screen.getByText("Back to first level")).toBeInTheDocument() }) + + it("should not apply table striping by default", () => { + const { container } = render() + + const root = container.firstElementChild as HTMLElement + expect(root).not.toHaveClass("table-striped") + }) + + it("should apply table striping when the striped prop is enabled", () => { + const { container } = render() + + const root = container.firstElementChild as HTMLElement + expect(root).toHaveClass("table-striped") + }) }) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 61ba954dd5..2c3a4e7925 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -32,6 +32,7 @@ import { } from "lucide-react" import { + type ExtensionMessage, type ProviderSettings, type ExperimentId, type TelemetrySetting, @@ -152,6 +153,50 @@ const SettingsView = forwardRef(({ onDone, t const confirmDialogHandler = useRef<() => void>() const [cachedState, setCachedState] = useState(() => extensionState) + const pendingSave = useRef<{ + requests: Map + unsavedSettings: string[] + state: ExtensionStateContextType + timeoutId: ReturnType + }>() + const [saveError, setSaveError] = useState() + const [isSaving, setIsSaving] = useState(false) + + useEffect(() => { + return () => { + if (pendingSave.current) { + clearTimeout(pendingSave.current.timeoutId) + pendingSave.current = undefined + } + } + }, []) + + useEffect(() => { + const handleSaveResult = (event: MessageEvent) => { + const message = event.data + const pending = pendingSave.current + if (message.type !== "settingsSaveResult" || !pending || !message.requestId) return + const setting = pending.requests.get(message.requestId) + if (!setting) return + pending.requests.delete(message.requestId) + if (!message.success) { + pending.unsavedSettings.push(...(message.unsavedSettings?.length ? message.unsavedSettings : [setting])) + } + if (pending.requests.size > 0) return + clearTimeout(pending.timeoutId) + pendingSave.current = undefined + setIsSaving(false) + if (pending.unsavedSettings.length === 0) { + setSaveError(undefined) + if (cachedState === pending.state) setChangeDetected(false) + } else { + setSaveError(pending.unsavedSettings) + setChangeDetected(true) + } + } + window.addEventListener("message", handleSaveResult) + return () => window.removeEventListener("message", handleSaveResult) + }, [cachedState]) const { alwaysAllowReadOnly, @@ -214,6 +259,8 @@ const SettingsView = forwardRef(({ onDone, t reasoningBlockCollapsed, chatFontSize, enterBehavior, + chatInputEffect, + tableStriped, includeCurrentTime, includeCurrentCost, maxGitStatusFiles, @@ -380,9 +427,34 @@ const SettingsView = forwardRef(({ onDone, t const isSettingValid = !errorMessage const handleSubmit = () => { - if (isSettingValid) { + if (isSettingValid && !pendingSave.current) { + const requestId = crypto.randomUUID() + const apiRequestId = crypto.randomUUID() + const telemetryRequestId = crypto.randomUUID() + const debugRequestId = crypto.randomUUID() + pendingSave.current = { + requests: new Map([ + [requestId, "updateSettings"], + [apiRequestId, "apiConfiguration"], + [telemetryRequestId, "telemetrySetting"], + [debugRequestId, "debug"], + ]), + unsavedSettings: [], + state: cachedState, + timeoutId: setTimeout(() => { + const pending = pendingSave.current + if (!pending) return + pendingSave.current = undefined + setIsSaving(false) + setSaveError([...pending.unsavedSettings, ...pending.requests.values()]) + setChangeDetected(true) + }, 30_000), + } + setIsSaving(true) + setSaveError(undefined) vscode.postMessage({ type: "updateSettings", + requestId, updatedSettings: { language, alwaysAllowReadOnly: alwaysAllowReadOnly ?? undefined, @@ -441,6 +513,8 @@ const SettingsView = forwardRef(({ onDone, t reasoningBlockCollapsed: reasoningBlockCollapsed ?? true, chatFontSize: chatFontSize ?? null, enterBehavior: enterBehavior ?? "send", + chatInputEffect: chatInputEffect ?? "marquee", + tableStriped: tableStriped ?? false, includeCurrentTime: includeCurrentTime ?? true, includeCurrentCost: includeCurrentCost ?? true, maxGitStatusFiles: maxGitStatusFiles ?? 0, @@ -459,11 +533,14 @@ const SettingsView = forwardRef(({ onDone, t // These have more complex logic so they aren't (yet) handled // by the `updateSettings` message. - vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration }) - vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting }) - vscode.postMessage({ type: "debugSetting", bool: cachedState.debug }) - - setChangeDetected(false) + vscode.postMessage({ + type: "upsertApiConfiguration", + requestId: apiRequestId, + text: currentApiConfigName, + apiConfiguration, + }) + vscode.postMessage({ type: "telemetrySetting", requestId: telemetryRequestId, text: telemetrySetting }) + vscode.postMessage({ type: "debugSetting", requestId: debugRequestId, bool: cachedState.debug }) } } @@ -694,7 +771,7 @@ const SettingsView = forwardRef(({ onDone, t variant={isSettingValid ? "primary" : "secondary"} className={!isSettingValid ? "!border-vscode-errorForeground" : ""} onClick={handleSubmit} - disabled={!isChangeDetected || !isSettingValid} + disabled={isSaving || !isChangeDetected || !isSettingValid} data-testid="save-button"> {t("settings:common.save")} @@ -702,6 +779,12 @@ const SettingsView = forwardRef(({ onDone, t

+ {saveError && ( +
+ {t("settings:common.saveFailed")} {saveError.join(", ")} +
+ )} + {/* Vertical tabs layout */}
{/* Tab sidebar */} @@ -940,7 +1023,9 @@ const SettingsView = forwardRef(({ onDone, t { reasoningBlockCollapsed: boolean enterBehavior: "send" | "newline" + chatInputEffect: "marquee" | "breathing" chatFontSize?: number + tableStriped?: boolean autoCloseZooOpenedFiles?: boolean autoCloseZooOpenedFilesAfterUserEdited?: boolean autoCloseZooOpenedNewFiles?: boolean @@ -32,7 +34,9 @@ interface UISettingsProps extends HTMLAttributes { export const UISettings = ({ reasoningBlockCollapsed, enterBehavior, + chatInputEffect, chatFontSize, + tableStriped, autoCloseZooOpenedFiles, autoCloseZooOpenedFilesAfterUserEdited, autoCloseZooOpenedNewFiles, @@ -82,6 +86,25 @@ export const UISettings = ({ telemetryClient.capture("ui_settings_chat_font_size_reset") } + // VSCodeDropdown's onChange is typed as an intersection of a native Event + // handler and a FormEventHandler, so we accept `unknown` (assignable to both) + // and narrow to the actual ) => onChange?.(e)} + {...props}> + {children} + + ), + VSCodeOption: ({ children, value, ...props }: ComponentProps<"option">) => ( + + ), })) vi.mock("../../../components/common/Tab", () => ({ @@ -190,8 +212,13 @@ vi.mock("@/components/ui", () => ({ data-testid={dataTestId} /> ), - Button: ({ children, onClick, variant, className, "data-testid": dataTestId }: any) => ( - ), @@ -334,7 +361,7 @@ const renderSettingsView = (initialState: any = {}) => { // Helper to get elements within the settings content (not the indexing container) const getSettingsContent = () => screen.getByTestId("settings-content") - return { onDone, activateTab, getSettingsContent } + return { onDone, activateTab, getSettingsContent, unmount: result.unmount } } describe("SettingsView - Sound Settings", () => { @@ -447,6 +474,16 @@ describe("SettingsView - Sound Settings", () => { }), ) + for (const [request] of vi.mocked(vscode.postMessage).mock.calls.slice(-4)) { + act(() => + window.dispatchEvent( + new MessageEvent("message", { + data: { type: "settingsSaveResult", requestId: request.requestId, success: true }, + }), + ), + ) + } + // Reset clears the override; it is persisted as null (not undefined). fireEvent.click(within(getSettingsContent()).getByTestId("chat-font-size-reset")) fireEvent.click(screen.getByTestId("save-button")) @@ -1008,3 +1045,352 @@ describe("SettingsView - openAiStrictToolSchemas save round trip", () => { expect(posted()?.apiConfiguration?.openAiStrictToolSchemas).toBeUndefined() }) }) + +describe("SettingsView - Chat Appearance Save Payload", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("saves the selected chat input effect and table striping", () => { + renderWithExtensionState(, { + state: makeExtensionState({ chatInputEffect: "marquee", tableStriped: false }), + }) + const content = within(screen.getByTestId("settings-content")) + + fireEvent.change(content.getByTestId("chat-input-effect-dropdown"), { target: { value: "breathing" } }) + fireEvent.click(content.getByTestId("table-striped-checkbox")) + + 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({ chatInputEffect: "breathing", tableStriped: true }), + }), + ) + }) + + it("saves false when table striping is turned off", () => { + renderWithExtensionState(, { + state: makeExtensionState({ tableStriped: true }), + }) + const content = within(screen.getByTestId("settings-content")) + + fireEvent.click(content.getByTestId("table-striped-checkbox")) + fireEvent.click(screen.getByTestId("save-button")) + + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ tableStriped: false }), + }), + ) + }) + + it("saves marquee and unstriped tables when the settings are unset", () => { + renderWithExtensionState(, { + state: makeExtensionState({ chatInputEffect: undefined, tableStriped: undefined }), + }) + const content = within(screen.getByTestId("settings-content")) + + // Make an unrelated edit so Save is enabled while both appearance settings remain unset. + fireEvent.change(content.getByTestId("chat-font-size-slider"), { target: { value: "18" } }) + fireEvent.click(screen.getByTestId("save-button")) + + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ chatInputEffect: "marquee", tableStriped: false }), + }), + ) + }) +}) + +describe("settings save acknowledgment", () => { + function beginSave() { + const view = renderSettingsView() + view.activateTab("notifications") + const checkbox = within(view.getSettingsContent()).getByTestId("tts-enabled-checkbox") + fireEvent.click(checkbox) + const save = screen.getByTestId("save-button") + fireEvent.click(save) + const request = vi + .mocked(vscode.postMessage) + .mock.calls.filter(([message]) => message.type === "updateSettings") + .at(-1)?.[0] + expect(request?.requestId).toBeDefined() + return { save, checkbox, requestId: request?.requestId, onDone: view.onDone, unmount: view.unmount } + } + + function respond(requestId: string | undefined, success: boolean) { + act(() => + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "settingsSaveResult", + requestId, + success, + unsavedSettings: success ? [] : ["chatInputEffect", "tableStriped"], + }, + }), + ), + ) + } + + function respondToOtherWrites() { + for (const [request] of vi.mocked(vscode.postMessage).mock.calls.slice(-3)) { + respond(request.requestId, true) + } + } + + it.each(["updateSettings", "upsertApiConfiguration", "telemetrySetting", "debugSetting"])( + "waits for every write and retains dirty state when %s fails", + (failedType) => { + const { save } = beginSave() + const requests = vi + .mocked(vscode.postMessage) + .mock.calls.slice(-4) + .map(([message]) => message) + expect(new Set(requests.map((request) => request.requestId)).size).toBe(4) + const failed = requests.find((request) => request.type === failedType)! + // Complete in reverse order, leaving the failure until last. + for (const request of [...requests].reverse().filter((request) => request !== failed)) { + respond(request.requestId, true) + expect(save).toBeDisabled() + respond(request.requestId, true) // Duplicate acknowledgements cannot complete a save. + expect(save).toBeDisabled() + } + respond(failed.requestId, false) + expect(save).toBeEnabled() + expect(screen.getByRole("alert")).toBeInTheDocument() + }, + ) + + it("clears dirty state only after all four writes succeed", () => { + const { save, requestId, onDone } = beginSave() + respond(requestId, true) + expect(save).toBeDisabled() + respondToOtherWrites() + expect(save).toBeDisabled() + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + fireEvent.click(screen.getByRole("button", { name: "settings:common.done" })) + expect(onDone).toHaveBeenCalledTimes(1) + }) + + it("retains dirty edits on partial failure and clears them only after a successful retry", () => { + const { save, checkbox, requestId } = beginSave() + expect(save).toBeDisabled() + respond("unrelated", true) + expect(save).toBeDisabled() + respond(requestId, false) + respondToOtherWrites() + expect(screen.getByRole("alert")).toHaveTextContent("chatInputEffect, tableStriped") + expect(checkbox).toBeChecked() + expect(save).toBeEnabled() + fireEvent.click(save) + const retry = vi + .mocked(vscode.postMessage) + .mock.calls.filter(([message]) => message.type === "updateSettings") + .at(-1)?.[0] + expect(retry?.requestId).not.toBe(requestId) + respond(requestId, false) + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + respond(retry?.requestId, true) + respondToOtherWrites() + expect(save).toBeDisabled() + }) + + it("keeps newer edits dirty when an earlier save succeeds", () => { + const { save, checkbox, requestId } = beginSave() + fireEvent.click(checkbox) + respond(requestId, true) + respondToOtherWrites() + expect(checkbox).not.toBeChecked() + expect(save).toBeEnabled() + }) + + describe("save timeout", () => { + beforeEach(() => { + vi.clearAllMocks() + vi.useFakeTimers() + }) + + afterEach(() => { + cleanup() + vi.useRealTimers() + vi.restoreAllMocks() + }) + + it("reports missing results after 30 seconds and ignores late results during a retry", () => { + const { save, checkbox } = beginSave() + const expiredRequests = vi + .mocked(vscode.postMessage) + .mock.calls.slice(-4) + .map(([message]) => message) + act(() => vi.advanceTimersByTime(29_999)) + expect(save).toBeDisabled() + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + act(() => vi.advanceTimersByTime(1)) + expect(screen.getByRole("alert")).toHaveTextContent( + "updateSettings, apiConfiguration, telemetrySetting, debug", + ) + expect(checkbox).toBeChecked() + expect(save).toBeEnabled() + + fireEvent.click(save) + for (const request of expiredRequests) respond(request.requestId, true) + expect(save).toBeDisabled() + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + for (const [request] of vi.mocked(vscode.postMessage).mock.calls.slice(-4)) respond(request.requestId, true) + act(() => vi.advanceTimersByTime(30_000)) + expect(save).toBeDisabled() + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + }) + + it("preserves failures and reports only outstanding requests even after another edit", () => { + const { save, checkbox, requestId } = beginSave() + respond(requestId, false) + const requests = vi + .mocked(vscode.postMessage) + .mock.calls.slice(-4) + .map(([message]) => message) + for (const request of requests.slice(2)) respond(request.requestId, true) + fireEvent.click(checkbox) + act(() => vi.advanceTimersByTime(30_000)) + expect(screen.getByRole("alert")).toHaveTextContent("chatInputEffect, tableStriped, apiConfiguration") + expect(screen.getByRole("alert")).not.toHaveTextContent("telemetrySetting") + expect(screen.getByRole("alert")).not.toHaveTextContent("debug") + expect(save).toBeEnabled() + }) + + it.each([true, false])("clears the timeout when all results arrive (success: %s)", (success) => { + const clearTimeoutSpy = vi.spyOn(globalThis, "clearTimeout") + const { save, requestId } = beginSave() + clearTimeoutSpy.mockClear() + respond(requestId, success) + respondToOtherWrites() + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1) + act(() => vi.advanceTimersByTime(30_000)) + if (success) { + expect(save).toBeDisabled() + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + } else { + expect(save).toBeEnabled() + expect(screen.getByRole("alert")).toHaveTextContent("chatInputEffect, tableStriped") + } + }) + + it("clears the timeout on unmount", () => { + const setTimeoutSpy = vi.spyOn(globalThis, "setTimeout") + const clearTimeoutSpy = vi.spyOn(globalThis, "clearTimeout") + const addEventListenerSpy = vi.spyOn(window, "addEventListener") + const removeEventListenerSpy = vi.spyOn(window, "removeEventListener") + const { unmount, requestId } = beginSave() + const handleSaveResult = addEventListenerSpy.mock.calls + .filter( + ([type, listener]) => + type === "message" && typeof listener === "function" && listener.name === "handleSaveResult", + ) + .at(-1)?.[1] + expect(handleSaveResult).toBeDefined() + const timerIndex = setTimeoutSpy.mock.calls.findIndex(([, delay]) => delay === 30_000) + expect(timerIndex).toBeGreaterThanOrEqual(0) + const timeoutId = setTimeoutSpy.mock.results[timerIndex].value + clearTimeoutSpy.mockClear() + removeEventListenerSpy.mockClear() + unmount() + expect(clearTimeoutSpy).toHaveBeenCalledWith(timeoutId) + expect(removeEventListenerSpy).toHaveBeenCalledWith("message", handleSaveResult) + respond(requestId, true) + act(() => vi.advanceTimersByTime(30_000)) + }) + + it("ignores a stale timeout callback once a later save completes", () => { + const { save, requestId } = beginSave() + respond(requestId, true) + respondToOtherWrites() + // Completing the save clears pendingSave, so the leaked timeout must be a no-op. + act(() => vi.advanceTimersByTime(30_000)) + expect(screen.queryByRole("alert")).not.toBeInTheDocument() + expect(save).toBeDisabled() + }) + }) + + it("falls back to the tracked setting name when a failed result omits its unsaved keys", () => { + const { save, requestId } = beginSave() + act(() => + window.dispatchEvent( + new MessageEvent("message", { + data: { type: "settingsSaveResult", requestId, success: false, unsavedSettings: [] }, + }), + ), + ) + respondToOtherWrites() + expect(save).toBeEnabled() + expect(screen.getByRole("alert")).toHaveTextContent("updateSettings") + }) + + describe("save button gating", () => { + it("stays disabled until an edit is made, then re-disables while a save is in flight", () => { + vi.mocked(vscode.postMessage).mockClear() + const view = renderSettingsView() + view.activateTab("notifications") + const save = screen.getByTestId("save-button") + // No edits yet: nothing to save. + expect(save).toBeDisabled() + fireEvent.click(within(view.getSettingsContent()).getByTestId("tts-enabled-checkbox")) + expect(save).toBeEnabled() + fireEvent.click(save) + // A second click while the save is pending is a no-op and leaves it disabled. + expect(save).toBeDisabled() + fireEvent.click(save) + const updateRequests = vi + .mocked(vscode.postMessage) + .mock.calls.filter(([message]) => message.type === "updateSettings") + expect(updateRequests).toHaveLength(1) + }) + }) +}) + +describe("SettingsView - save payload fallbacks", () => { + it("persists unset command and file lists as empty arrays", () => { + vi.mocked(vscode.postMessage).mockClear() + const view = renderSettingsView({ + allowedCommands: undefined, + deniedCommands: undefined, + allowedReadFiles: undefined, + allowedWriteFiles: undefined, + }) + view.activateTab("autoApprove") + fireEvent.click(within(view.getSettingsContent()).getByTestId("always-allow-execute-toggle")) + fireEvent.click(screen.getByTestId("save-button")) + + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ + allowedCommands: [], + deniedCommands: [], + allowedReadFiles: [], + allowedWriteFiles: [], + }), + }), + ) + }) + + it("unmounting without a pending save is a no-op", () => { + const addEventListenerSpy = vi.spyOn(window, "addEventListener") + const removeEventListenerSpy = vi.spyOn(window, "removeEventListener") + const view = renderSettingsView() + const handleSaveResult = addEventListenerSpy.mock.calls + .filter( + ([type, listener]) => + type === "message" && typeof listener === "function" && listener.name === "handleSaveResult", + ) + .at(-1)?.[1] + // No save has been started, so pendingSave.current is undefined on unmount. + view.unmount() + expect(removeEventListenerSpy).toHaveBeenCalledWith("message", handleSaveResult) + }) +}) diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx index 575da5a833..440b075aa3 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx @@ -674,6 +674,7 @@ describe("SettingsView - Unsaved Changes Detection", () => { expect(postMessage).toHaveBeenCalledWith({ type: "upsertApiConfiguration", + requestId: expect.any(String), text: "default", apiConfiguration: { apiProvider: providerIdentifiers.nanogpt, @@ -726,6 +727,7 @@ describe("SettingsView - Unsaved Changes Detection", () => { fireEvent.click(screen.getByTestId("save-button")) expect(postMessage).toHaveBeenCalledWith({ type: "upsertApiConfiguration", + requestId: expect.any(String), text: "default", apiConfiguration: { ...configuration, diff --git a/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx b/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx index 4e61f0fcff..5801635aef 100644 --- a/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx @@ -11,6 +11,7 @@ describe("UISettings", () => { const defaultProps = { reasoningBlockCollapsed: false, enterBehavior: "send" as const, + chatInputEffect: "marquee" as const, setCachedStateField: vi.fn(), } @@ -176,4 +177,55 @@ describe("UISettings", () => { }) }) }) + + describe("chat input effect", () => { + it("renders the chat input effect dropdown", () => { + const { getByTestId } = render() + const dropdown = getByTestId("chat-input-effect-dropdown") as HTMLSelectElement + expect(dropdown).toBeTruthy() + expect(dropdown.value).toBe("marquee") + }) + + it("calls setCachedStateField when chat input effect is changed", async () => { + const setCachedStateField = vi.fn() + const { getByTestId } = render() + + const dropdown = getByTestId("chat-input-effect-dropdown") + fireEvent.change(dropdown, { target: { value: "breathing" } }) + + await waitFor(() => { + expect(setCachedStateField).toHaveBeenCalledWith("chatInputEffect", "breathing") + }) + }) + + it("ignores an empty chat input effect value", () => { + const setCachedStateField = vi.fn() + const { getByTestId } = render() + + const dropdown = getByTestId("chat-input-effect-dropdown") + fireEvent.change(dropdown, { target: { value: "" } }) + + expect(setCachedStateField).not.toHaveBeenCalledWith("chatInputEffect", expect.anything()) + }) + }) + + describe("table striping", () => { + it("renders the table striping checkbox unchecked by default", () => { + const { getByTestId } = render() + const checkbox = getByTestId("table-striped-checkbox") as HTMLInputElement + expect(checkbox).toBeTruthy() + expect(checkbox.checked).toBe(false) + }) + + it("calls setCachedStateField when the table striping checkbox is toggled", async () => { + const setCachedStateField = vi.fn() + const { getByTestId } = render() + + fireEvent.click(getByTestId("table-striped-checkbox")) + + await waitFor(() => { + expect(setCachedStateField).toHaveBeenCalledWith("tableStriped", true) + }) + }) + }) }) diff --git a/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx b/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx index 09481ce498..76f0437bb4 100644 --- a/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx +++ b/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx @@ -8,6 +8,7 @@ import { AppProviders } from "../../../../playwright/AppProviders" interface UIState { reasoningBlockCollapsed: boolean enterBehavior: "send" | "newline" + chatInputEffect: "marquee" | "breathing" chatFontSize?: number autoCloseZooOpenedFiles?: boolean autoCloseZooOpenedFilesAfterUserEdited?: boolean @@ -18,6 +19,7 @@ export function UISettingsStory() { const [state, setState] = useState({ reasoningBlockCollapsed: true, enterBehavior: "send", + chatInputEffect: "marquee", chatFontSize: 14, autoCloseZooOpenedFiles: true, autoCloseZooOpenedFilesAfterUserEdited: true, @@ -33,6 +35,8 @@ export function UISettingsStory() { return { ...current, [field]: Boolean(value) } case "enterBehavior": return { ...current, enterBehavior: value === "newline" ? "newline" : "send" } + case "chatInputEffect": + return { ...current, chatInputEffect: value === "breathing" ? "breathing" : "marquee" } case "chatFontSize": return { ...current, chatFontSize: typeof value === "number" ? value : undefined } default: diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/ui-settings-dark.png b/webview-ui/src/components/settings/__tests__/__screenshots__/ui-settings-dark.png index 2773ec6614b4d2a8a245de2835683c7428d1a3d2..4f15277345459e2b081c2b3cf6ad6cb31d869da0 100644 GIT binary patch literal 56646 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 knv^raW1- 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 literal 46694 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%0AlmjsmEMM_?N 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 E0L(3R=Kufz literal 47695 zcmdSBRa}-`*Dngv2vX8WgHqCnfFK>x-6;(M0us_Cjihvl(p`ddBhoFPG$J7_4SVo? zzjq()wbwdWC*Rrg$Q{?bt~tl}*SN!!6{WE;$uJQR5U^!sBvcU)5H}DI?!=(qfq!9Q z8KOr(z(tUi5LI_i-)?qoBI>@l5pnrK{qyHo#>YC}E4pm47br_0}dvq{>93T^36SK7-d@!#C^G3CgjxIr9B zJ@+x{D1?ZeU{O!UTFUC??F-G2TelSDm=D6UWl z`WN`WUfd&i_eoLPuE=cG(#5 zM?x!c`}?c8(R!Tma5(;<(rfA4`}is-z!8Uxr@;5-dP?y3P{zg4xYF@)@LghN^@0kg z6{*{2S5H%h|9`Z2y8A(batV*VI4sot^4MDxJ=z%kuZM_`Lp>ix@KD(2^0f0E&Y+<0 z<-YX6>bL**ZyLp#&2RxYBA0uo`zu@1<-?iJ-p*8*%&Wr{iXlj-(Hm6L6vxB)LCj*$ zvx$|5n;A}6>rufm|oR1$gLM@N(HeYaaBUw3N<2dQd zKKodiT&W@Gay`vqszhhJ`Rz#}ix#6&W|LGDneWZj7ff$u~4b*xomHM%~Srd4aBLFi&J zoY@S=gaJKA)atrOLQSM~Q%g3HH0SYxrn9ihQfDF4+~lI`V;ZGQp{Ksrm!#YlFNZTT zMACR|>pYJ)9|*oN_Jd1!JN8LdKVLqj3ceZxpWad7u0bc}^-7EgrI5Ryzka2u`;T|awg1jHaGQ382BP8Q$;2*?D~Tv1v64P1H)!PZI9N4keB%_a zj?WCWPx@qFmxDLQ zIEELxbUKx$C^`(k>2+Iuyo(BqT76D-7c39@V(H$MCFxXKsIXOvFulJY&_VQbtnAy%t={Ue8fO(0w* z)lV`*(V`k3*o_Py);KP845V;FaWIrVy*gQ7*Quh1TR2x|Pj@4SE0&~OS5FtBRT^G| zJUW@0w>fOVY=TvLm~OLS=K6h4F_Ae@)BZW44tnmaKKG~5zlP18Im*YIlj8jPW*a}M zABs1>`0yCMmy+L+Iy@W8X;o4^acTCGY&`ti>uUSCI+;yBL?m3%BRpd4s_0G0P+UYK zh533Xj71hga&%;}D|qCzM9J3kqNCTBhf0sNpH-x@Yn9DIx%0#2VAC<8=kO3`ucv(G z$>XtT+MmEga$E`rWIRuyH~N86masz4d!epo_z!ek-uH|OWVS-`4(Qm$@yr@U8v$zX zp(<8y=8vK8{d8MUAyilVGxm9|*7n`R*C~XLJrU~sPjaPW6xERh-TqP>D*UK2S7}S; zG^?{34M-z+sQ8H=c2uch^Eqsz7YUE>+?nfU&Em|MI_2(;e(ICi%MpKtFfEtT%e6snw(t)lN1c zw6gzs$NF-#Efz@=vRMK5t9>oI`FfRw-qExDUMlV)JTg|bzuEVeI^RiWh7+^5yxGx} zf3b>l_ip8i>oN`DfB+%F+2QYAOEL9ihvc5Re00rUO&%*G)#!CidWK~^v^f_ z{J`KQJ#|zH90gk*2lE%biE@C*-78nDbR8it;!k2rUaI16lHyZDS`TT71 zP(wkuhwSa|h#R|eG$8?1etVp#9NhB&i zdc8Fu9!D>Ggd)ZH9mP9J|3D!6-Y0@JE+k?W&4F6f5l=g>NTY*q@@;oe)KcB{x$J*6 zrOd|>xFpFY6oy{z5jpSduk<>v50JuMODA~PJu%(Ku)jDY7LkHg5usvfYdl3&!&+2& zGcmZyV$ISb5JDZKAZApbnDevyU9nusWH{Y*KxL8S>1nFNSF(M(MTRznn(HRy%EPsl zzY~Q7-}MsiT$x(O_*=AmWCy%c9ChA-n(Xe?u?ck*m25e*A-t=AI=}|`nCXxprE8gz z*Jc80=HDAaeFmAQR6n$bEC-VD*sC!y6Yk~{EZcJLWbpbq>GmQl_0UCXnf(0f%0D8T zY9pFK^~^IU`|z=kiSBA~d5f5{(_;1~QMqn1zryaOJl6{6Flq9i+8b*5inXW~apGPn zLN0`OrCE1$opwl?KAVlmvWTK{2jvyh$FFJO6Td2~Ov}Ox5!I`Pb$I_7&&5MMGD(B9;i6brY209gu)9kW=IbPI$cX;w$ zVanyS9-fOQUx*(sUKtmb8Q!Z`=6ok|wn{+3I7_^ZCQPFG(rc|ih|*BxU=_2P`fIDz zC~cXFp%=APr7bpf!fAb>*C$-(w6nMx=+}V}VZ(ua6q5yn1Wdgb5-*}ixupaN?kII9 zJzKWiZ%1+F^C7gqt0v-QN8fb)+KTNi<6-(!=Y)MpiJQ$%Uh6Hr76H^|8Q(o>B$Cs* z$V&Bt8(VczcaNaF?yDU=#2pP&6t{;|AGCA0dmLX~1N1!2*hi{Ze)X&AX&?~}>bd!a z@n=z;Q}iBFs(fTR()^0E>Zf@@T;~0_e%<^n>e~_$hZ%0a+Woq}c8yJo_)|X>ZlTe3 zN0N#DGVwjg>mVml;;e4{A&I%@8WY*{1S(h16QnO8m?TY;GsiMC@yJ7Hd5@NzrV!$y zXjk61dqi1yU+jEY#Vr@edUK}L_y=!X@5?I_Ub-Lk+bVDLAD!;&kfS7rvpG(O&B5 zYHxV;tmaC-yZ7KoKpa;r($R_e-`AFch=coBW<=F|_8rL`0^AS!TO3i%ygtTQA>Iqe zBIQbsMvr8d7t&lfcY8qga(`nqw`7BKhuMz9ZiZtD(@SsM_oI%NUZ+`c0D6mYiOhIT ziPr=yDJpBCt?8Q>@(S^iTF3%MQf~T4-l>ATa#7V zOcp`Q8JC@*mV9k>wY^mAr|ES}l}9Dq{MECj@2QcRV|H-H5cMT-s9vF4@}3h~B0p+f zTC&5iy1hs{K8g0Oan+wJ25pnjRLXxGcRZiG?86oQtMX8uc_tBhq=sm(4qF-T`;oRc zOqUr9V1G>R@Fik>^9RB5eL!tj=f{V~M*s%V za409HjlA}Qcm5=ZF(iKfj~2kBHdSV@b-oOZ12F3}0@4M|%-Yx`Kpr1CV*a0vZXy6j zq2L3U%!`c2_BmT4J}&VRe&`eTw$kPA{ExhR_0+ALnd`H|VG;YNSLT2f?h-$qZ}M

5XX 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 N?x55Z%H_;L{sZ9#pXC4m diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/ui-settings-high-contrast.png b/webview-ui/src/components/settings/__tests__/__screenshots__/ui-settings-high-contrast.png index 2eb48a95dc8a7aa1aaf84db09cf9390c90f1a4f0..2dfc24889bb31379c669702b64d694176366d1be 100644 GIT binary patch literal 58061 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

SD^ixT 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

Qpja<-Y-R~b4y#Q}C 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%0AgF9MPZ*e%*7UD2c; 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

!rcwv<7Rx!bt17~dQ4?mFS$N)P0(R{ZCzaK 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

_p$camGEAj!3xswGk$G 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 literal 47301 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 diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index b1445d0ec4..f7c383aa70 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -7,7 +7,8 @@ "reset": "Restablir", "select": "Seleccionar", "add": "Afegir capçalera", - "remove": "Eliminar" + "remove": "Eliminar", + "saveFailed": "No s’han pogut desar alguns paràmetres. Seleccioneu Desar per tornar-ho a provar." }, "search": { "placeholder": "Cercar configuració...", @@ -1133,6 +1134,12 @@ "label": "Requereix {{primaryMod}}+Intro per enviar missatges", "description": "Quan estigui activat, has de prémer {{primaryMod}}+Intro per enviar missatges en lloc de només Intro" }, + "chatInputEffect": { + "label": "Efecte de la caixa d'entrada mentre l'IA treballa", + "marquee": "Efecte marquesina (vora giratòria)", + "breathing": "Efecte de respiració (brillantor pulsant)", + "description": "Tria l'efecte d'animació de la vora de la caixa d'entrada mentre l'IA treballa" + }, "chatFontSize": { "label": "Mida de lletra del xat", "description": "Defineix la mida de la lletra (en píxels) del xat de Zoo Code. Deixa-ho al valor per defecte per coincidir amb la mida de lletra del VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Tanca automaticament els fitxers nous creats", "description": "Quan esta activat, les pestanyes dels fitxers que Zoo ha creat (en lloc de modificar) tambe es tanquen automaticament despres d'acceptar el canvi." + }, + "tableStriped": { + "label": "Files de taula ratllades", + "description": "Aplica colors de fons alterns a les files de les taules de markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index ae27940b9e..5582e17fba 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -7,7 +7,8 @@ "reset": "Zurücksetzen", "select": "Auswählen", "add": "Header hinzufügen", - "remove": "Entfernen" + "remove": "Entfernen", + "saveFailed": "Einige Einstellungen konnten nicht gespeichert werden. Wählen Sie Speichern, um es erneut zu versuchen." }, "search": { "placeholder": "Einstellungen durchsuchen...", @@ -1133,6 +1134,12 @@ "label": "{{primaryMod}}+Enter zum Senden erfordern", "description": "Wenn aktiviert, musst du {{primaryMod}}+Enter drücken, um Nachrichten zu senden, anstatt nur Enter" }, + "chatInputEffect": { + "label": "Effekt für das Eingabefeld, während die KI arbeitet", + "marquee": "Laufschrift (rotierender Rand)", + "breathing": "Atmung (pulsierendes Leuchten)", + "description": "Wähle den Rahmenanimationseffekt für das Eingabefeld, während die KI arbeitet" + }, "chatFontSize": { "label": "Chat-Schriftgröße", "description": "Lege die Schriftgröße (in Pixeln) für den Zoo Code-Chat fest. Belasse den Standardwert, um die Schriftgröße von VS Code zu übernehmen.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Neu erstellte Dateien automatisch schließen", "description": "Wenn aktiviert, werden Tabs für Dateien, die Zoo neu erstellt hat (anstatt sie zu bearbeiten), nach dem Akzeptieren der Änderung ebenfalls automatisch geschlossen." + }, + "tableStriped": { + "label": "Gestreifte Tabellenzeilen", + "description": "Abwechselnde Hintergrundfarben auf Zeilen in Markdown-Tabellen anwenden" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index b1e2740353..7f1863f339 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -7,7 +7,8 @@ "reset": "Reset", "select": "Select", "add": "Add Header", - "remove": "Remove" + "remove": "Remove", + "saveFailed": "Some settings could not be saved. Select Save to retry." }, "header": { "title": "Settings", @@ -226,6 +227,12 @@ "label": "Require {{primaryMod}}+Enter to send messages", "description": "When enabled, you must press {{primaryMod}}+Enter to send messages instead of just Enter" }, + "chatInputEffect": { + "label": "AI Working Input Box Effect", + "marquee": "Marquee (rotating border)", + "breathing": "Breathing (pulsing glow)", + "description": "Choose the border animation effect on the chat input box while AI is working" + }, "chatFontSize": { "label": "Chat font size", "description": "Set the font size (in pixels) for the Zoo Code chat. Leave at the default to match VS Code's font size.", @@ -242,6 +249,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Auto-close newly created files", "description": "When enabled, tabs for files that Zoo created (rather than modified) will also be closed automatically after the edit is accepted." + }, + "tableStriped": { + "label": "Striped table rows", + "description": "Apply alternating background colors to rows in markdown tables" } }, "prompts": { diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 7b4bfbe6fc..aa66551826 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -7,7 +7,8 @@ "reset": "Restablecer", "select": "Seleccionar", "add": "Añadir encabezado", - "remove": "Eliminar" + "remove": "Eliminar", + "saveFailed": "No se pudieron guardar algunos ajustes. Selecciona Guardar para volver a intentarlo." }, "search": { "placeholder": "Buscar configuración...", @@ -1133,6 +1134,12 @@ "label": "Requerir {{primaryMod}}+Enter para enviar mensajes", "description": "Cuando está activado, debes presionar {{primaryMod}}+Enter para enviar mensajes en lugar de solo Enter" }, + "chatInputEffect": { + "label": "Efecto de la caja de entrada mientras la IA trabaja", + "marquee": "Cinta (borde giratorio)", + "breathing": "Respiración (brillo pulsante)", + "description": "Elige el efecto de animación del borde de la caja de entrada mientras la IA trabaja" + }, "chatFontSize": { "label": "Tamaño de fuente del chat", "description": "Establece el tamaño de fuente (en píxeles) del chat de Zoo Code. Déjalo en el valor predeterminado para que coincida con el tamaño de fuente de VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Cerrar automaticamente los archivos nuevos creados", "description": "Cuando esta opcion esta activada, las pestanas de archivos que Zoo ha creado (en lugar de modificar) tambien se cierran automaticamente despues de aceptar la modificacion." + }, + "tableStriped": { + "label": "Filas de tabla con rayas", + "description": "Aplica colores de fondo alternos a las filas de las tablas de markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index c8083be95c..a621c78462 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -7,7 +7,8 @@ "reset": "Réinitialiser", "select": "Sélectionner", "add": "Ajouter un en-tête", - "remove": "Supprimer" + "remove": "Supprimer", + "saveFailed": "Certains paramètres n’ont pas pu être enregistrés. Sélectionnez Enregistrer pour réessayer." }, "search": { "placeholder": "Rechercher les paramètres...", @@ -1133,6 +1134,12 @@ "label": "Exiger {{primaryMod}}+Entrée pour envoyer les messages", "description": "Lorsqu'activé, tu dois appuyer sur {{primaryMod}}+Entrée pour envoyer des messages au lieu de simplement Entrée" }, + "chatInputEffect": { + "label": "Effet de la zone de saisie pendant le travail de l'IA", + "marquee": "Défilement (bordure rotative)", + "breathing": "Respiration (lueur pulsante)", + "description": "Choisissez l'effet d'animation de la bordure de la zone de saisie pendant que l'IA travaille" + }, "chatFontSize": { "label": "Taille de police du chat", "description": "Définissez la taille de police (en pixels) du chat Zoo Code. Laissez la valeur par défaut pour correspondre à la taille de police de VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Fermer automatiquement les nouveaux fichiers créés", "description": "Quand cette option est activée, les onglets des fichiers que Zoo a créés (plutôt que modifiés) sont également fermés automatiquement après l'acceptation de la modification." + }, + "tableStriped": { + "label": "Lignes de tableau alternées", + "description": "Appliquer des couleurs d'arrière-plan alternées aux lignes des tableaux markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 60f7c3a596..51bdfac448 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -7,7 +7,8 @@ "reset": "रीसेट करें", "select": "चुनें", "add": "हेडर जोड़ें", - "remove": "हटाएं" + "remove": "हटाएं", + "saveFailed": "कुछ सेटिंग्स सहेजी नहीं जा सकीं। फिर से प्रयास करने के लिए सहेजें चुनें।" }, "search": { "placeholder": "सेटिंग्स खोजें...", @@ -1133,6 +1134,12 @@ "label": "संदेश भेजने के लिए {{primaryMod}}+Enter की आवश्यकता है", "description": "जब सक्षम हो, तो आपको केवल Enter के बजाय संदेश भेजने के लिए {{primaryMod}}+Enter दबाना होगा" }, + "chatInputEffect": { + "label": "AI कार्य करते समय इनपुट बॉक्स प्रभाव", + "marquee": "मार्की (घूमती हुई सीमा)", + "breathing": "साँस (स्पंदित चमक)", + "description": "AI कार्य करते समय चैट इनपुट बॉक्स पर बॉर्डर एनीमेशन प्रभाव चुनें" + }, "chatFontSize": { "label": "चैट फ़ॉन्ट आकार", "description": "Zoo Code चैट के लिए फ़ॉन्ट आकार (पिक्सेल में) सेट करें। VS Code के फ़ॉन्ट आकार से मेल खाने के लिए डिफ़ॉल्ट पर छोड़ दें।", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Nai banayi gayi files ko svachalit band karo", "description": "Saksham hone par, Zoo dvara banaayi gayi (sanshodhit nahin) files ki tabs ko bhi parivartan svikaar hone ke baad svachalit roop se band kar diya jaata hai." + }, + "tableStriped": { + "label": "धारीदार तालिका पंक्तियाँ", + "description": "मार्कडाउन तालिकाओं की पंक्तियों पर वैकल्पिक पृष्ठभूमि रंग लागू करें" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 8754981a6e..4024024cad 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -7,7 +7,8 @@ "reset": "Reset", "select": "Pilih", "add": "Tambah Header", - "remove": "Hapus" + "remove": "Hapus", + "saveFailed": "Beberapa pengaturan tidak dapat disimpan. Pilih Simpan untuk mencoba lagi." }, "search": { "placeholder": "Cari pengaturan...", @@ -1133,6 +1134,12 @@ "label": "Memerlukan {{primaryMod}}+Enter untuk mengirim pesan", "description": "Ketika diaktifkan, kamu harus menekan {{primaryMod}}+Enter untuk mengirim pesan alih-alih hanya Enter" }, + "chatInputEffect": { + "label": "Efek kotak input saat AI bekerja", + "marquee": "Marquee (batas berputar)", + "breathing": "Bernapas (cahaya berdenyut)", + "description": "Pilih efek animasi batas pada kotak input chat saat AI bekerja" + }, "chatFontSize": { "label": "Ukuran font obrolan", "description": "Atur ukuran font (dalam piksel) untuk obrolan Zoo Code. Biarkan pada nilai default agar sesuai dengan ukuran font VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Tutup otomatis file baru yang dibuat", "description": "Saat diaktifkan, tab untuk file yang dibuat Zoo (bukan dimodifikasi) juga ditutup secara otomatis setelah perubahan diterima." + }, + "tableStriped": { + "label": "Baris tabel bergaris", + "description": "Terapkan warna latar belakang bergantian pada baris di tabel markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index e14e9532fd..96b1f730f1 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -7,7 +7,8 @@ "reset": "Ripristina", "select": "Seleziona", "add": "Aggiungi intestazione", - "remove": "Rimuovi" + "remove": "Rimuovi", + "saveFailed": "Impossibile salvare alcune impostazioni. Seleziona Salva per riprovare." }, "search": { "placeholder": "Cerca impostazioni...", @@ -1133,6 +1134,12 @@ "label": "Richiedi {{primaryMod}}+Invio per inviare messaggi", "description": "Quando abilitato, devi premere {{primaryMod}}+Invio per inviare messaggi invece di solo Invio" }, + "chatInputEffect": { + "label": "Effetto della casella di input mentre l'IA lavora", + "marquee": "Scorrimento (bordo rotante)", + "breathing": "Respirazione (bagliore pulsante)", + "description": "Scegli l'effetto di animazione del bordo sulla casella di input della chat mentre l'IA lavora" + }, "chatFontSize": { "label": "Dimensione carattere della chat", "description": "Imposta la dimensione del carattere (in pixel) per la chat di Zoo Code. Lascia il valore predefinito per adattarsi alla dimensione del carattere di VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Chiudi automaticamente i nuovi file creati", "description": "Quando abilitata, le schede dei file che Zoo ha creato (invece di modificare) vengono chiuse automaticamente dopo l'accettazione della modifica." + }, + "tableStriped": { + "label": "Righe della tabella a strisce", + "description": "Applica colori di sfondo alternati alle righe delle tabelle markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 808d575a04..073a54e06a 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -7,7 +7,8 @@ "reset": "リセット", "select": "選択", "add": "ヘッダーを追加", - "remove": "削除" + "remove": "削除", + "saveFailed": "一部の設定を保存できませんでした。「保存」を選択して再試行してください。" }, "search": { "placeholder": "設定を検索...", @@ -1133,6 +1134,12 @@ "label": "メッセージを送信するには{{primaryMod}}+Enterが必要", "description": "有効にすると、Enterだけでなく{{primaryMod}}+Enterを押してメッセージを送信する必要があります" }, + "chatInputEffect": { + "label": "AI作業中の入力ボックスエフェクト", + "marquee": "マーキー(回転する枠線)", + "breathing": "ブリージング(脈動する光)", + "description": "AI作業中にチャット入力ボックスの枠線アニメーション効果を選択" + }, "chatFontSize": { "label": "チャットのフォントサイズ", "description": "Zoo Code チャットのフォントサイズ(ピクセル単位)を設定します。VS Code のフォントサイズに合わせるには既定値のままにしてください。", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "新しく作成されたファイルを自動的に閉じる", "description": "有効にすると、Zooが作成した(変更ではなく)ファイルのタブも、変更を承認した後に自動的に閉じられます。" + }, + "tableStriped": { + "label": "表の行を縞模様にする", + "description": "Markdown テーブルの行に交互の背景色を適用します" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 12faca92c8..317bc186f5 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -7,7 +7,8 @@ "reset": "초기화", "select": "선택", "add": "헤더 추가", - "remove": "삭제" + "remove": "삭제", + "saveFailed": "일부 설정을 저장하지 못했습니다. 저장을 선택하여 다시 시도하세요." }, "search": { "placeholder": "설정 검색...", @@ -1133,6 +1134,12 @@ "label": "메시지를 보내려면 {{primaryMod}}+Enter가 필요", "description": "활성화하면 Enter만으로는 안 되고 {{primaryMod}}+Enter를 눌러야 메시지를 보낼 수 있습니다" }, + "chatInputEffect": { + "label": "AI 작업 중 입력 상자 효과", + "marquee": "마퀴 (회전 테두리)", + "breathing": "호흡 (맥동하는 광채)", + "description": "AI가 작업하는 동안 채팅 입력 상자에 표시할 테두리 애니메이션 효과를 선택하세요" + }, "chatFontSize": { "label": "채팅 글꼴 크기", "description": "Zoo Code 채팅의 글꼴 크기(픽셀)를 설정합니다. VS Code 글꼴 크기에 맞추려면 기본값으로 두세요.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "새로 만든 파일 자동 닫기", "description": "활성화 시, Zoo가 수정한 것이 아니라 새로 만든 파일의 탭도 변경 사항을 승인한 후 자동으로 닫힙니다." + }, + "tableStriped": { + "label": "표 행 줄무늬", + "description": "마크다운 표의 행에 교차 배경색을 적용합니다" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 914e9b85f6..01efc253dd 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -7,7 +7,8 @@ "reset": "Resetten", "select": "Selecteren", "add": "Header toevoegen", - "remove": "Verwijderen" + "remove": "Verwijderen", + "saveFailed": "Sommige instellingen konden niet worden opgeslagen. Selecteer Opslaan om het opnieuw te proberen." }, "search": { "placeholder": "Instellingen zoeken...", @@ -1133,6 +1134,12 @@ "label": "Vereist {{primaryMod}}+Enter om berichten te versturen", "description": "Wanneer ingeschakeld, moet je {{primaryMod}}+Enter indrukken om berichten te versturen in plaats van alleen Enter" }, + "chatInputEffect": { + "label": "Invoervak-effect terwijl AI werkt", + "marquee": "Marquee (draaiende rand)", + "breathing": "Ademen (pulserende gloed)", + "description": "Kies het randanimatie-effect op het chat-invoervak terwijl AI werkt" + }, "chatFontSize": { "label": "Lettergrootte van chat", "description": "Stel de lettergrootte (in pixels) in voor de Zoo Code-chat. Laat op de standaardwaarde staan om overeen te komen met de lettergrootte van VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Automatisch sluiten van nieuw gemaakte bestanden", "description": "Wanneer ingeschakeld, worden tabbladen van bestanden die Zoo heeft aangemaakt (in plaats van gewijzigd) ook automatisch gesloten nadat de wijziging is geaccepteerd." + }, + "tableStriped": { + "label": "Gestreepte tabelrijen", + "description": "Pas afwisselende achtergrondkleuren toe op rijen in markdown-tabellen" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 26b4551454..9b7030c154 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -7,7 +7,8 @@ "reset": "Resetuj", "select": "Wybierz", "add": "Dodaj nagłówek", - "remove": "Usuń" + "remove": "Usuń", + "saveFailed": "Nie udało się zapisać niektórych ustawień. Wybierz Zapisz, aby spróbować ponownie." }, "search": { "placeholder": "Szukaj ustawień...", @@ -1133,6 +1134,12 @@ "label": "Wymagaj {{primaryMod}}+Enter do wysyłania wiadomości", "description": "Po włączeniu musisz nacisnąć {{primaryMod}}+Enter, aby wysłać wiadomości, zamiast tylko Enter" }, + "chatInputEffect": { + "label": "Efekt pola wprowadzania podczas pracy AI", + "marquee": "Marquee (obracająca się ramka)", + "breathing": "Oddychanie (pulsująca poświata)", + "description": "Wybierz efekt animacji ramki pola wprowadzania czatu podczas pracy AI" + }, "chatFontSize": { "label": "Rozmiar czcionki czatu", "description": "Ustaw rozmiar czcionki (w pikselach) dla czatu Zoo Code. Pozostaw wartość domyślną, aby dopasować ją do rozmiaru czcionki VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Automatycznie zamykaj nowo utworzone pliki", "description": "Gdy wlaczone, karty plikow, ktore Zoo utworzylo (zamiast zmodyfikowalo), sa rowniez automatycznie zamykane po zaakceptowaniu zmiany." + }, + "tableStriped": { + "label": "Pasiaste wiersze tabeli", + "description": "Zastosuj naprzemienne kolory tła do wierszy w tabelach markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index ed426e52de..d0e7c8fb39 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -7,7 +7,8 @@ "reset": "Redefinir", "select": "Selecionar", "add": "Adicionar cabeçalho", - "remove": "Remover" + "remove": "Remover", + "saveFailed": "Não foi possível salvar algumas configurações. Selecione Salvar para tentar novamente." }, "search": { "placeholder": "Pesquisar configurações...", @@ -1133,6 +1134,12 @@ "label": "Requer {{primaryMod}}+Enter para enviar mensagens", "description": "Quando ativado, você deve pressionar {{primaryMod}}+Enter para enviar mensagens em vez de apenas Enter" }, + "chatInputEffect": { + "label": "Efeito da caixa de entrada enquanto a IA trabalha", + "marquee": "Marquee (borda giratória)", + "breathing": "Respiração (brilho pulsante)", + "description": "Escolha o efeito de animação da borda na caixa de entrada do chat enquanto a IA trabalha" + }, "chatFontSize": { "label": "Tamanho da fonte do chat", "description": "Defina o tamanho da fonte (em pixels) do chat do Zoo Code. Deixe no padrão para corresponder ao tamanho da fonte do VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Fechar automaticamente novos arquivos criados", "description": "Quando ativada, as abas de arquivos que o Zoo criou (em vez de modificar) tambem sao fechadas automaticamente apos aceitar a modificacao." + }, + "tableStriped": { + "label": "Linhas de tabela listradas", + "description": "Aplica cores de fundo alternadas às linhas em tabelas markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index b810dea6b9..ba2d98511b 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -7,7 +7,8 @@ "reset": "Сбросить", "select": "Выбрать", "add": "Добавить заголовок", - "remove": "Удалить" + "remove": "Удалить", + "saveFailed": "Не удалось сохранить некоторые настройки. Нажмите «Сохранить», чтобы повторить попытку." }, "search": { "placeholder": "Поиск параметров...", @@ -1133,6 +1134,12 @@ "label": "Требовать {{primaryMod}}+Enter для отправки сообщений", "description": "Если включено, необходимо нажать {{primaryMod}}+Enter для отправки сообщений вместо простого Enter" }, + "chatInputEffect": { + "label": "Эффект поля ввода во время работы ИИ", + "marquee": "Бегущая строка (вращающаяся рамка)", + "breathing": "Дыхание (пульсирующее свечение)", + "description": "Выберите эффект анимации рамки поля ввода чата во время работы ИИ" + }, "chatFontSize": { "label": "Размер шрифта чата", "description": "Задайте размер шрифта (в пикселях) для чата Zoo Code. Оставьте значение по умолчанию, чтобы соответствовать размеру шрифта VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Автоматически закрывать новые созданные файлы", "description": "Если включено, вкладки файлов, которые Zoo создал (а не изменил), также автоматически закрываются после принятия изменения." + }, + "tableStriped": { + "label": "Полосатые строки таблицы", + "description": "Применять чередующиеся цвета фона к строкам таблиц markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 74a38fe1c0..869ffd0503 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -7,7 +7,8 @@ "reset": "Sıfırla", "select": "Seç", "add": "Başlık Ekle", - "remove": "Kaldır" + "remove": "Kaldır", + "saveFailed": "Bazı ayarlar kaydedilemedi. Tekrar denemek için Kaydet’i seçin." }, "search": { "placeholder": "Ayarları ara...", @@ -1133,6 +1134,12 @@ "label": "Mesaj göndermek için {{primaryMod}}+Enter gerekli", "description": "Etkinleştirildiğinde, sadece Enter yerine mesaj göndermek için {{primaryMod}}+Enter'a basmalısınız" }, + "chatInputEffect": { + "label": "AI çalışırken giriş kutusu efekti", + "marquee": "Kayan yazı (dönen kenarlık)", + "breathing": "Nefes alma (nabız gibi parlayan)", + "description": "AI çalışırken sohbet giriş kutusundaki kenarlık animasyon efektini seçin" + }, "chatFontSize": { "label": "Sohbet yazı tipi boyutu", "description": "Zoo Code sohbeti için yazı tipi boyutunu (piksel cinsinden) ayarlayın. VS Code yazı tipi boyutuyla eşleşmesi için varsayılan değerde bırakın.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Yeni olusturulan dosyalari otomatik kapat", "description": "Etkinlestirildiginde, Zoo'nun olusturdugu (degistirmedigi) dosyalarin sekmeleri de degisiklik kabul edildikten sonra otomatik olarak kapatilir." + }, + "tableStriped": { + "label": "Çizgili tablo satırları", + "description": "Markdown tablolarındaki satırlara alternatif arka plan renkleri uygula" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 8b79b0fd4f..addf610454 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -7,7 +7,8 @@ "reset": "Đặt lại", "select": "Chọn", "add": "Thêm tiêu đề", - "remove": "Xóa" + "remove": "Xóa", + "saveFailed": "Không thể lưu một số cài đặt. Chọn Lưu để thử lại." }, "search": { "placeholder": "Tìm kiếm cài đặt...", @@ -1133,6 +1134,12 @@ "label": "Yêu cầu {{primaryMod}}+Enter để gửi tin nhắn", "description": "Khi được bật, bạn phải nhấn {{primaryMod}}+Enter để gửi tin nhắn thay vì chỉ nhấn Enter" }, + "chatInputEffect": { + "label": "Hiệu ứng ô nhập khi AI đang làm việc", + "marquee": "Marquee (viền xoay)", + "breathing": "Thở (ánh sáng nhấp nháy)", + "description": "Chọn hiệu ứng hoạt hình viền trên ô nhập chat khi AI đang làm việc" + }, "chatFontSize": { "label": "Cỡ chữ trò chuyện", "description": "Đặt cỡ chữ (tính bằng pixel) cho cuộc trò chuyện Zoo Code. Để ở giá trị mặc định để khớp với cỡ chữ của VS Code.", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "Tự động đóng các tệp mới tạo", "description": "Khi bật, các tab của các tệp mà Zoo đã tạo (thay vì chỉnh sửa) cũng sẽ tự động đóng sau khi chấp nhận thay đổi." + }, + "tableStriped": { + "label": "Hàng bảng sọc", + "description": "Áp dụng màu nền xen kẽ cho các hàng trong bảng markdown" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 581687216f..1ba20255c9 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -7,7 +7,8 @@ "reset": "恢复默认设置", "select": "选择", "add": "添加标头", - "remove": "移除" + "remove": "移除", + "saveFailed": "部分设置未能保存。请选择“保存”重试。" }, "search": { "placeholder": "搜索设置...", @@ -1133,6 +1134,12 @@ "label": "需要 {{primaryMod}}+Enter 发送消息", "description": "启用后,必须按 {{primaryMod}}+Enter 发送消息,而不仅仅是 Enter" }, + "chatInputEffect": { + "label": "AI工作时输入框动效", + "marquee": "走马灯效果(旋转光晕)", + "breathing": "呼吸效果(脉冲光晕)", + "description": "选择 AI 工作时输入框的边框动画效果" + }, "chatFontSize": { "label": "聊天字体大小", "description": "设置 Zoo Code 聊天的字体大小(以像素为单位)。保留默认值以匹配 VS Code 的字体大小。", @@ -1149,6 +1156,10 @@ "autoCloseZooOpenedNewFiles": { "label": "自动关闭新建的文件", "description": "启用后,Zoo 新建(而非修改)的文件标签页在接受更改后也会自动关闭。" + }, + "tableStriped": { + "label": "表格隔行着色", + "description": "为 Markdown 表格的行应用交替背景色" } }, "skills": { diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 54d4dae1b9..781f8a97fb 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -7,7 +7,8 @@ "reset": "重設", "select": "選擇", "add": "新增標頭", - "remove": "移除" + "remove": "移除", + "saveFailed": "部分設定無法儲存。請選擇「儲存」重試。" }, "header": { "title": "設定", @@ -173,6 +174,12 @@ "label": "需要 {{primaryMod}}+Enter 傳送訊息", "description": "啟用後,必須按 {{primaryMod}}+Enter 傳送訊息,而不只是 Enter" }, + "chatInputEffect": { + "label": "AI 工作時的輸入框動效", + "marquee": "跑馬燈效果(旋轉光暈)", + "breathing": "呼吸效果(脈動光暈)", + "description": "選擇 AI 工作時聊天輸入框的邊框動畫效果" + }, "chatFontSize": { "label": "聊天字型大小", "description": "設定 Zoo Code 聊天的字型大小(以像素為單位)。保留預設值以符合 VS Code 的字型大小。", @@ -189,6 +196,10 @@ "autoCloseZooOpenedNewFiles": { "label": "自動關閉新建立的檔案", "description": "啟用後,Zoo 新建(而非修改)的檔案分頁在接受變更後也會自動關閉。" + }, + "tableStriped": { + "label": "表格隔行著色", + "description": "為 Markdown 表格的列套用交替背景色" } }, "prompts": { diff --git a/webview-ui/src/index.css b/webview-ui/src/index.css index bccbdf7031..9705b2952a 100644 --- a/webview-ui/src/index.css +++ b/webview-ui/src/index.css @@ -472,7 +472,7 @@ input[cmdk-input]:focus { } /* - * Use geometric precision for codicons to avoid blurriness + * Use geometric precision for codicons to avoid blurriness */ .codicon[class*="codicon-"] { @@ -603,3 +603,106 @@ input[cmdk-input]:focus { padding: 8px; margin: -8px; } + +/* ChatTextArea marquee border — conic-gradient light beam orbits the ring. + mask clips center (content-box) away → text never blocked. + 1px ring, dark blue beam. Shown only while AI is executing. */ +@property --angle { + syntax: ""; + initial-value: 0deg; + inherits: false; +} + +@keyframes border-spin { + from { + --angle: 0deg; + } + to { + --angle: 360deg; + } +} + +/* ChatTextArea breathing border — pulsing glow + 1px ring. + Shown only while AI is executing (isStreaming gate in ChatTextArea) + when chatInputEffect is set to "breathing". */ +@keyframes streaming-glow { + 0%, + 100% { + box-shadow: 0 0 2px color-mix(in srgb, var(--vscode-focusBorder, #03638f) 8%, transparent); + } + 50% { + box-shadow: + 0 0 12px color-mix(in srgb, var(--vscode-focusBorder, #04567b) 45%, transparent), + 0 0 24px color-mix(in srgb, var(--vscode-focusBorder, #012434) 25%, transparent); + } +} + +.animate-streaming-glow { + animation: streaming-glow 2s ease-in-out infinite; +} + +/* Breathing border ring — 1px blue ring with pulsing opacity */ +@keyframes border-breathe { + 0%, + 100% { + opacity: 0.15; + } + 50% { + opacity: 1; + } +} + +/* "Thinking..." shimmer — VS Code chat progress style, continuous narrow band. + Ported from workbench chat's chat-thinking-shimmer: a light band sweeps + continuously across the text on a 2s loop. The workbench-only variable + --vscode-chat-thinkingShimmer is not available inside the webview, so the + highlight band is synthesized from the foreground color instead. */ +@keyframes thinking-shine { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} + +.animate-thinking-shine { + background-image: linear-gradient( + 90deg, + color-mix(in srgb, var(--vscode-descriptionForeground) 45%, transparent) 0%, + color-mix(in srgb, var(--vscode-descriptionForeground) 45%, transparent) 30%, + color-mix(in srgb, var(--vscode-foreground) 100%, #ffffff 40%) 50%, + color-mix(in srgb, var(--vscode-descriptionForeground) 45%, transparent) 70%, + color-mix(in srgb, var(--vscode-descriptionForeground) 45%, transparent) 100% + ); + background-size: 400% auto; + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; + animation: thinking-shine 2s linear infinite; + will-change: background-position; +} + +/* Respect the user's reduced-motion preference for the chat input effects. + Disables the streaming glow, breathing ring, spinning border, and the + "Thinking..." shimmer. For the shimmer we also drop the animated gradient + background and restore the text fill/colour to the VS Code foreground so the + label stays legible without motion. */ +@media (prefers-reduced-motion: reduce) { + .animate-streaming-glow, + .animate-thinking-shine, + .animate-\[border-spin_3s_linear_infinite\], + .animate-\[border-breathe_2s_ease-in-out_infinite\] { + animation: none !important; + } + + .animate-thinking-shine { + background-image: none; + background-clip: border-box; + -webkit-background-clip: border-box; + -webkit-text-fill-color: var(--vscode-foreground); + color: var(--vscode-foreground); + will-change: auto; + } +} From 8544f3b02b07087b7be07d7c6be9abfc6db2ba3d Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 14:34:38 +0000 Subject: [PATCH 2/9] fix(settings): cancel saves on webview disposal while preserving shared write ordering --- src/core/webview/ClineProvider.ts | 37 ++++++-- .../webview/__tests__/ClineProvider.spec.ts | 87 ++++++++++++++++++- .../__tests__/settingsSaveQueue.spec.ts | 47 ++++++++++ .../__tests__/webviewMessageHandler.spec.ts | 46 ++++++++++ src/core/webview/settingsSaveQueue.ts | 52 +++++++++++ src/core/webview/webviewMessageHandler.ts | 38 +++++--- 6 files changed, 288 insertions(+), 19 deletions(-) create mode 100644 src/core/webview/__tests__/settingsSaveQueue.spec.ts create mode 100644 src/core/webview/settingsSaveQueue.ts diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index f8aaef7f23..dccb3df3fa 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -230,6 +230,11 @@ export class ClineProvider private taskEventListeners: WeakMap void>> = new WeakMap() private currentWorkspacePath: string | undefined private _disposed = false + private settingsSaveController = new AbortController() + + public get settingsSaveSignal(): AbortSignal { + return this.settingsSaveController.signal + } private readonly _postStateToWebviewThrottled = debounce( async () => { try { @@ -814,6 +819,7 @@ export class ClineProvider - https://github.com/microsoft/vscode-extension-samples/blob/main/webview-sample/src/extension.ts */ private clearWebviewResources() { + this.settingsSaveController.abort() this.rejectPendingThemeFixtureProbes(new Error("Webview was disposed before the theme fixture probe completed")) while (this.webviewDisposables.length) { const x = this.webviewDisposables.pop() @@ -840,6 +846,7 @@ export class ClineProvider } this._disposed = true + this.settingsSaveController.abort() this._postStateToWebviewThrottled.cancel() this.log("Disposing ClineProvider...") @@ -1016,6 +1023,10 @@ export class ClineProvider } async resolveWebviewView(webviewView: vscode.WebviewView | vscode.WebviewPanel) { + if (this._disposed) return + if (this.settingsSaveController.signal.aborted) { + this.settingsSaveController = new AbortController() + } this.view = webviewView const inTabMode = "onDidChangeViewState" in webviewView @@ -1699,8 +1710,14 @@ export class ClineProvider * @param webview A reference to the extension webview */ private setWebviewMessageListener(webview: vscode.Webview) { - const onReceiveMessage = async (message: WebviewMessage) => - webviewMessageHandler(this, message, this.marketplaceManager) + const onReceiveMessage = async (message: WebviewMessage) => { + const signal = this.settingsSaveSignal + try { + await webviewMessageHandler(this, message, this.marketplaceManager) + } catch (error) { + if (!signal.aborted || error !== signal.reason) throw error + } + } const messageDisposable = webview.onDidReceiveMessage(onReceiveMessage) this.webviewDisposables.push(messageDisposable) @@ -1876,9 +1893,12 @@ export class ClineProvider name: string, providerSettings: ProviderSettings, activate: boolean = true, + saveSignal?: AbortSignal, ): Promise { try { - return await this.enqueueProviderProfileMutation(async (signal) => { + return await this.enqueueProviderProfileMutation(async (mutationSignal) => { + const signal = saveSignal ? AbortSignal.any([mutationSignal, saveSignal]) : mutationSignal + signal.throwIfAborted() // TODO: Do we need to be calling `activateProfile`? It's not // clear to me what the source of truth should be; in some cases // we rely on the `ContextProxy`'s data store and in other cases @@ -1890,6 +1910,8 @@ export class ClineProvider if (activate) { const { mode } = await this.getState() + const listApiConfigMeta = await this.providerSettingsManager.listConfig() + signal.throwIfAborted() // These promises do the following: // 1. Adds or updates the list of provider profiles. @@ -1902,12 +1924,13 @@ export class ClineProvider // We should probably switch to that and verify that it works. // I left the original implementation in just to be safe. await Promise.all([ - this.updateGlobalState("listApiConfigMeta", await this.providerSettingsManager.listConfig()), + this.updateGlobalState("listApiConfigMeta", listApiConfigMeta), this.updateGlobalState("currentApiConfigName", name), this.providerSettingsManager.setModeConfig(mode, id), this.contextProxy.setProviderSettings(providerSettings), ]) + signal.throwIfAborted() // Change the provider for the current task. // TODO: We should rename `buildApiHandler` for clarity (e.g. `getProviderClient`). this.updateTaskApiHandlerIfNeeded(providerSettings, { forceRebuild: true }) @@ -1915,13 +1938,17 @@ export class ClineProvider // Keep the current task's sticky provider profile in sync with the newly-activated profile. await this.persistStickyProviderProfileToCurrentTask(name) } else { - await this.updateGlobalState("listApiConfigMeta", await this.providerSettingsManager.listConfig()) + const listApiConfigMeta = await this.providerSettingsManager.listConfig() + signal.throwIfAborted() + await this.updateGlobalState("listApiConfigMeta", listApiConfigMeta) } + signal.throwIfAborted() await this.postStateToWebview() return id }) } catch (error) { + saveSignal?.throwIfAborted() this.log( `Error create new api configuration: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`, ) diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index eaca288275..562e939477 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -34,6 +34,7 @@ import { safeWriteJson } from "../../../utils/safeWriteJson" import { ClineProvider } from "../ClineProvider" import { webviewMessageHandler } from "../webviewMessageHandler" +import { enqueueSettingsSave } from "../settingsSaveQueue" import { Terminal } from "../../../integrations/terminal/Terminal" import { MessageManager } from "../../message-manager" import { forceFullModelDetailsLoad, hasLoadedFullDetails } from "../../../api/providers/fetchers/lmstudio" @@ -536,10 +537,7 @@ describe("ClineProvider", () => { cspSource: "vscode-webview://test-csp-source", }, visible: true, - onDidDispose: vi.fn().mockImplementation((callback) => { - callback() - return { dispose: vi.fn() } - }), + onDidDispose: vi.fn().mockReturnValue({ dispose: vi.fn() }), onDidChangeVisibility: vi.fn().mockImplementation(() => { return { dispose: vi.fn() } }), @@ -671,6 +669,87 @@ describe("ClineProvider", () => { await target?.handleCodeAction("addToContext", "ADD_TO_CONTEXT", { selectedText: "selected code" }) } + test.each(["provider", "sidebar"] as const)( + "cancels saves immediately on %s disposal and stops a blocked batch", + async (target) => { + let release!: () => void + const blocked = new Promise((resolve) => { + release = resolve + }) + const write = vi.spyOn(provider.contextProxy, "setValue").mockImplementationOnce(() => blocked) + const saving = webviewMessageHandler(provider, { + type: "updateSettings", + updatedSettings: { soundVolume: 0.2, tableStriped: true }, + }) + const queued = webviewMessageHandler(provider, { + type: "updateSettings", + updatedSettings: { soundVolume: 0.8 }, + }) + const cancelled = Promise.all([ + expect(saving).rejects.toMatchObject({ name: "AbortError" }), + expect(queued).rejects.toMatchObject({ name: "AbortError" }), + ]) + if (target === "provider") { + await provider.dispose() + } else { + sidebar.disposed.fire() + } + await cancelled + await expect( + webviewMessageHandler(provider, { + type: "updateSettings", + updatedSettings: { soundVolume: 0.9 }, + }), + ).rejects.toMatchObject({ name: "AbortError" }) + release() + // Another provider sharing the context is a barrier for the cancelled batch. + await enqueueSettingsSave(provider.contextProxy, new AbortController().signal, async () => {}) + expect(write).toHaveBeenCalledTimes(1) + expect(write).toHaveBeenCalledWith("soundVolume", 0.2) + write.mockRestore() + }, + ) + + test("stops an active profile save after disposal during a profile metadata read", async () => { + let release!: () => void + const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockImplementationOnce( + () => + new Promise((resolve) => { + release = () => resolve([]) + }), + ) + const write = vi.spyOn(provider.contextProxy, "setValue") + const saving = webviewMessageHandler(provider, { + type: "upsertApiConfiguration", + text: "saved-profile", + apiConfiguration: {}, + }) + await vi.waitFor(() => expect(list).toHaveBeenCalled()) + const cancelled = expect(saving).rejects.toMatchObject({ name: "AbortError" }) + sidebar.disposed.fire() + await cancelled + release() + await enqueueSettingsSave(provider.contextProxy, new AbortController().signal, async () => {}) + expect(write).not.toHaveBeenCalled() + list.mockRestore() + write.mockRestore() + }) + + test("allows settings saves when a disposed sidebar is resolved again", async () => { + const oldSignal = provider.settingsSaveSignal + sidebar.disposed.fire() + expect(oldSignal.aborted).toBe(true) + await provider.resolveWebviewView(createView().view) + expect(provider.settingsSaveSignal.aborted).toBe(false) + const write = vi.spyOn(provider.contextProxy, "setValue").mockResolvedValue(undefined) + await webviewMessageHandler(provider, { + type: "updateSettings", + updatedSettings: { tableStriped: true }, + }) + expect(write).toHaveBeenCalledWith("tableStriped", true) + write.mockRestore() + }) + test("reports current visibility independently of panel activation", () => { expect(provider.isViewVisible).toBe(true) expect(tabProvider.isViewVisible).toBe(true) diff --git a/src/core/webview/__tests__/settingsSaveQueue.spec.ts b/src/core/webview/__tests__/settingsSaveQueue.spec.ts new file mode 100644 index 0000000000..923ab8090c --- /dev/null +++ b/src/core/webview/__tests__/settingsSaveQueue.spec.ts @@ -0,0 +1,47 @@ +import { enqueueSettingsSave } from "../settingsSaveQueue" + +describe("settings save queue", () => { + it("removes cancelled callers without releasing an active write's storage lock", async () => { + const context = {} + const closedView = new AbortController() + const liveView = new AbortController() + let release!: () => void + const active = enqueueSettingsSave( + context, + closedView.signal, + () => + new Promise((resolve) => { + release = resolve + }), + ) + const cancelledWrite = vi.fn() + const pending = enqueueSettingsSave(context, closedView.signal, cancelledWrite) + const liveWrite = vi.fn().mockResolvedValue(undefined) + const next = enqueueSettingsSave(context, liveView.signal, liveWrite) + const cancellations = Promise.all([ + expect(active).rejects.toMatchObject({ name: "AbortError" }), + expect(pending).rejects.toMatchObject({ name: "AbortError" }), + ]) + closedView.abort() + await cancellations + expect(cancelledWrite).not.toHaveBeenCalled() + expect(liveWrite).not.toHaveBeenCalled() + release() + await next + expect(cancelledWrite).not.toHaveBeenCalled() + expect(liveWrite).toHaveBeenCalledOnce() + }) + + it("cleans up listeners after failure and accepts saves after the queue drains", async () => { + const context = {} + const controller = new AbortController() + const remove = vi.spyOn(controller.signal, "removeEventListener") + await expect( + enqueueSettingsSave(context, controller.signal, async () => { + throw new Error("write failed") + }), + ).rejects.toThrow("write failed") + await enqueueSettingsSave(context, controller.signal, async () => {}) + expect(remove).toHaveBeenCalledTimes(2) + }) +}) diff --git a/src/core/webview/__tests__/webviewMessageHandler.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.spec.ts index db094a98f6..1c3fb3063e 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.spec.ts @@ -75,6 +75,7 @@ import { makeExtensionContext } from "../../../test-utils/vscode" import type { ModelRecord } from "@roo-code/types" import { webviewMessageHandler } from "../webviewMessageHandler" +import { enqueueSettingsSave } from "../settingsSaveQueue" import type { ClineProvider } from "../ClineProvider" import { flushModels, getModels } from "../../../api/providers/fetchers/modelCache" import { getLMStudioModels } from "../../../api/providers/fetchers/lmstudio" @@ -99,7 +100,11 @@ const mockGetAccountId = vi.mocked(openAiCodexOAuthManager.getAccountId) const mockFetchOpenAiCodexRateLimitInfo = vi.mocked(fetchOpenAiCodexRateLimitInfo) // Mock ClineProvider +const mockSettingsSaveController = new AbortController() const mockClineProvider = { + get settingsSaveSignal() { + return mockSettingsSaveController.signal + }, getState: vi.fn(), postMessageToWebview: vi.fn(), customModesManager: { @@ -2947,6 +2952,47 @@ describe("webviewMessageHandler - updateSettings branch handling", () => { }) describe("webviewMessageHandler - serialized settings saves", () => { + it.each(["updateSettings", "upsertApiConfiguration", "telemetrySetting", "debugSetting"] as const)( + "cancels queued %s without waiting for blocked storage", + async (type) => { + const controller = new AbortController() + const provider = mockClineProvider + const signalGetter = vi.spyOn(provider, "settingsSaveSignal", "get").mockReturnValue(controller.signal) + try { + let release!: () => void + const write = vi.mocked(provider.contextProxy.setValue).mockImplementationOnce( + () => + new Promise((resolve) => { + release = resolve + }), + ) + const active = webviewMessageHandler(provider, { + type: "updateSettings", + updatedSettings: { soundVolume: 0.2 }, + }) + const pending = webviewMessageHandler(provider, { + type, + requestId: "cancelled", + updatedSettings: { soundVolume: 0.9 }, + }) + const cancellations = Promise.all([ + expect(active).rejects.toMatchObject({ name: "AbortError" }), + expect(pending).rejects.toMatchObject({ name: "AbortError" }), + ]) + controller.abort() + await cancellations + release() + await enqueueSettingsSave(provider.contextProxy, new AbortController().signal, async () => {}) + expect(write).not.toHaveBeenCalledWith("soundVolume", 0.9) + expect(provider.postMessageToWebview).not.toHaveBeenCalledWith( + expect.objectContaining({ requestId: "cancelled" }), + ) + } finally { + signalGetter.mockRestore() + } + }, + ) + it("keeps processing later saves after an earlier save throws", async () => { ;(mockClineProvider as unknown as { getMcpHub: () => undefined }).getMcpHub = () => undefined // debugSetting without a requestId rethrows its write failure, which is what diff --git a/src/core/webview/settingsSaveQueue.ts b/src/core/webview/settingsSaveQueue.ts new file mode 100644 index 0000000000..1235baf55c --- /dev/null +++ b/src/core/webview/settingsSaveQueue.ts @@ -0,0 +1,52 @@ +// Serialize writes sharing a ContextProxy, but keep waiting jobs removable on disposal. +// VS Code persistence has no cancellation API: an active write must settle before +// another view can write to the same context, even after its caller is cancelled. +type SaveJob = { run: () => Promise } +type SaveQueue = { pending: Set; running: boolean } +const queues = new WeakMap() + +export function enqueueSettingsSave(context: object, signal: AbortSignal, write: () => Promise): Promise { + signal.throwIfAborted() + let queue = queues.get(context) + if (!queue) { + queue = { pending: new Set(), running: false } + queues.set(context, queue) + } + const currentQueue = queue + return new Promise((resolve, reject) => { + const onAbort = () => { + currentQueue.pending.delete(job) + signal.removeEventListener("abort", onAbort) + reject(signal.reason) + } + const job: SaveJob = { + run: async () => { + try { + signal.throwIfAborted() + await write() + resolve() + } catch (error) { + reject(error) + } finally { + signal.removeEventListener("abort", onAbort) + } + }, + } + signal.addEventListener("abort", onAbort, { once: true }) + currentQueue.pending.add(job) + void drain(context, currentQueue) + }) +} + +async function drain(context: object, queue: SaveQueue): Promise { + if (queue.running) return + queue.running = true + try { + for (const job of queue.pending) { + queue.pending.delete(job) + await job.run() + } + } finally { + queues.delete(context) + } +} diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index f3c1b42f71..2ba809ee0b 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -119,9 +119,10 @@ import { handleCheckoutBranch, } from "./worktree" +import { enqueueSettingsSave } from "./settingsSaveQueue" + // A webview timeout does not cancel host writes. Keep every SettingsView save message // in arrival order, including retries and messages from views sharing the same context. -const settingsSaveQueues = new WeakMap>() const settingsSaveMessageTypes = new Set([ "updateSettings", "upsertApiConfiguration", @@ -138,33 +139,35 @@ export const webviewMessageHandler = async ( return handleWebviewMessage(provider, message, marketplaceManager) } - const previous = settingsSaveQueues.get(provider.contextProxy) ?? Promise.resolve() - const save = previous.then(() => handleWebviewMessage(provider, message, marketplaceManager)) - // Preserve the caller's error while allowing subsequent saves after a failure. - settingsSaveQueues.set( - provider.contextProxy, - save.catch(() => undefined), + const signal = provider.settingsSaveSignal + return enqueueSettingsSave(provider.contextProxy, signal, () => + handleWebviewMessage(provider, message, marketplaceManager, signal), ) - return save } const handleWebviewMessage = async ( provider: ClineProvider, message: WebviewMessage, marketplaceManager?: MarketplaceManager, + signal?: AbortSignal, ) => { // Utility functions provided for concise get/update of global state via contextProxy API. const getGlobalState = (key: K) => provider.contextProxy.getValue(key) - const updateGlobalState = async (key: K, value: GlobalState[K]) => + const updateGlobalState = async (key: K, value: GlobalState[K]) => { + signal?.throwIfAborted() await provider.contextProxy.setValue(key, value) + } // SettingsView correlates each write separately before marking the whole save complete. const saveSetting = async (key: string, write: () => Promise) => { let success = false try { + signal?.throwIfAborted() await write() + signal?.throwIfAborted() success = true } catch (error) { + signal?.throwIfAborted() if (!message.requestId) throw error provider.log( `Failed to save settings: ${JSON.stringify([key])}; error: ${JSON.stringify(error instanceof Error ? error.name : "Unknown")}`, @@ -782,12 +785,15 @@ const handleWebviewMessage = async ( if (message.updatedSettings.destructiveCommandGuardEnabled === true) { try { const { ensureDcgInstalled } = await import("../../services/destructive-command-guard") + signal?.throwIfAborted() const binaryPath = await ensureDcgInstalled(provider.context.globalStorageUri.fsPath) + signal?.throwIfAborted() if (!binaryPath) { message.updatedSettings.destructiveCommandGuardEnabled = false vscode.window.showErrorMessage(t("common:errors.destructiveCommandGuard.unavailable")) } } catch (error) { + signal?.throwIfAborted() message.updatedSettings.destructiveCommandGuardEnabled = false vscode.window.showErrorMessage( t("common:errors.destructiveCommandGuard.enableFailed", { @@ -800,6 +806,7 @@ const handleWebviewMessage = async ( const pendingSettings = new Set(Object.keys(message.updatedSettings)) try { for (const [key, value] of Object.entries(message.updatedSettings)) { + signal?.throwIfAborted() let newValue = value if (key === "language") { @@ -911,10 +918,13 @@ const handleWebviewMessage = async ( } } + signal?.throwIfAborted() await provider.contextProxy.setValue(key as keyof RooCodeSettings, newValue) + signal?.throwIfAborted() pendingSettings.delete(key) } } catch (error) { + signal?.throwIfAborted() // Earlier entries may already be saved. Keep the remaining keys retryable. // Escape untrusted keys and error names; values and error text may contain secrets. provider.log( @@ -2381,7 +2391,12 @@ const handleWebviewMessage = async ( case "upsertApiConfiguration": await saveSetting("apiConfiguration", async () => { if (message.text && message.apiConfiguration) { - const id = await provider.upsertProviderProfile(message.text, message.apiConfiguration) + const id = await provider.upsertProviderProfile( + message.text, + message.apiConfiguration, + true, + signal, + ) // The provider returns undefined when persistence fails. if (message.requestId && id === undefined) throw new Error() } else if (message.requestId) { @@ -2835,6 +2850,7 @@ const handleWebviewMessage = async ( const thisUpdate = telemetrySettingQueue .catch(() => undefined) .then(async () => { + signal?.throwIfAborted() const telemetrySetting = message.text as TelemetrySetting const previousSetting = getGlobalState("telemetrySetting") || "unset" const isOptedIn = isTelemetryOptedIn(telemetrySetting) @@ -2851,6 +2867,7 @@ const handleWebviewMessage = async ( // captureTelemetrySettingsChanged calls above/below still track the user's // stored preference transition on its own, independent of that live toggle. await updateGlobalState("telemetrySetting", telemetrySetting) + signal?.throwIfAborted() if (TelemetryService.hasInstance()) { TelemetryService.instance.updateTelemetryState(isOptedIn && vscode.env.isTelemetryEnabled) @@ -2873,6 +2890,7 @@ const handleWebviewMessage = async ( await vscode.workspace .getConfiguration(Package.name) .update("debug", message.bool ?? false, vscode.ConfigurationTarget.Global) + signal?.throwIfAborted() await provider.postStateToWebview() }) break From ea9c2b53e29b6fe741ae30d63191f4f4690399d6 Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 17:04:31 +0000 Subject: [PATCH 3/9] fix(settings): preserve profile save ordering across disposal and refresh metadata on webview launch --- src/core/webview/ClineProvider.ts | 144 ++++++----- .../webview/__tests__/ClineProvider.spec.ts | 243 ++++++++++++++++-- src/core/webview/webviewMessageHandler.ts | 34 ++- 3 files changed, 340 insertions(+), 81 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index dccb3df3fa..742c658898 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -263,25 +263,40 @@ export class ClineProvider return runDelegationTransition(ClineProvider.delegationTransitionLocks, parentTaskId, fn) } - private enqueueProviderProfileMutation(fn: (signal: AbortSignal) => Promise): Promise { + private enqueueProviderProfileMutation( + fn: (signal: AbortSignal) => Promise, + { allowTimeout = true }: { allowTimeout?: boolean } = {}, + ): Promise { const controller = new AbortController() - // Run fn after either outcome so a rejected mutation never poisons the queue. - const run = this.providerProfileMutationQueue.then( - () => fn(controller.signal), - () => fn(controller.signal), - ) - const callerResult = this.withProviderProfileMutationTimeout(run, () => { - controller.abort() - this.log("Provider profile mutation timed out; aborting in-flight mutation") - }) + // A caller can time out while still queued; never start its mutation afterwards. + const runMutation = () => { + controller.signal.throwIfAborted() + return fn(controller.signal) + } + const previous = this.providerProfileMutationQueue + const run = previous.then(runMutation, runMutation) + // A profile save that has started persisting must finish before another mutation runs. + const slowMutationTimer = allowTimeout + ? undefined + : setTimeout(() => { + this.log("Provider profile save is still pending; waiting for persistence to finish") + }, ClineProvider.PENDING_OPERATION_TIMEOUT_MS) + const callerResult = allowTimeout + ? this.withProviderProfileMutationTimeout(run, () => { + controller.abort() + this.log("Provider profile mutation timed out; aborting in-flight mutation") + }) + : run void run.then( () => { + clearTimeout(slowMutationTimer) if (controller.signal.aborted) { this.log("Provider profile mutation completed after cancellation") } }, (error) => { + clearTimeout(slowMutationTimer) if (controller.signal.aborted) { this.log( `Provider profile mutation errored after cancellation: ${ @@ -292,12 +307,9 @@ export class ClineProvider }, ) - // Advance from the timeout-bounded result. Each fn checks its AbortSignal before - // writing state, so advancing the queue on timeout cannot produce stale overwrites. - this.providerProfileMutationQueue = callerResult.then( - () => undefined, - () => undefined, - ) + // A queued timeout cannot release an earlier uncancellable save's lock. + // Started cancellable mutations still check their signal before writing state. + this.providerProfileMutationQueue = Promise.allSettled([previous, callerResult]).then(() => undefined) return callerResult } @@ -1896,57 +1908,61 @@ export class ClineProvider saveSignal?: AbortSignal, ): Promise { try { - return await this.enqueueProviderProfileMutation(async (mutationSignal) => { - const signal = saveSignal ? AbortSignal.any([mutationSignal, saveSignal]) : mutationSignal - signal.throwIfAborted() - // TODO: Do we need to be calling `activateProfile`? It's not - // clear to me what the source of truth should be; in some cases - // we rely on the `ContextProxy`'s data store and in other cases - // we rely on the `ProviderSettingsManager`'s data store. It might - // be simpler to unify these two. - const id = await this.providerSettingsManager.saveConfig(name, providerSettings) - - if (signal.aborted) return id - - if (activate) { - const { mode } = await this.getState() - const listApiConfigMeta = await this.providerSettingsManager.listConfig() + return await this.enqueueProviderProfileMutation( + async (mutationSignal) => { + const signal = saveSignal ? AbortSignal.any([mutationSignal, saveSignal]) : mutationSignal signal.throwIfAborted() + // TODO: Do we need to be calling `activateProfile`? It's not + // clear to me what the source of truth should be; in some cases + // we rely on the `ContextProxy`'s data store and in other cases + // we rely on the `ProviderSettingsManager`'s data store. It might + // be simpler to unify these two. + const id = await this.providerSettingsManager.saveConfig(name, providerSettings) + + // Once saveConfig starts, disposal cannot cancel the remaining persistence. + // Keep provider storage, cached metadata, and active settings synchronized; + // the settings queue retains the write lock even if its caller is cancelled. + + if (activate) { + const { mode } = await this.getState() + const listApiConfigMeta = await this.providerSettingsManager.listConfig() + + // These promises do the following: + // 1. Adds or updates the list of provider profiles. + // 2. Sets the current provider profile. + // 3. Sets the current mode's provider profile. + // 4. Copies the provider settings to the context. + // + // Note: 1, 2, and 4 can be done in one `ContextProxy` call: + // this.contextProxy.setValues({ ...providerSettings, listApiConfigMeta: ..., currentApiConfigName: ... }) + // We should probably switch to that and verify that it works. + // I left the original implementation in just to be safe. + const results = await Promise.allSettled([ + this.updateGlobalState("listApiConfigMeta", listApiConfigMeta), + this.updateGlobalState("currentApiConfigName", name), + this.providerSettingsManager.setModeConfig(mode, id), + this.contextProxy.setProviderSettings(providerSettings), + ]) + const failure = results.find((result) => result.status === "rejected") + if (failure?.status === "rejected") throw failure.reason + + // Change the provider for the current task. + // TODO: We should rename `buildApiHandler` for clarity (e.g. `getProviderClient`). + this.updateTaskApiHandlerIfNeeded(providerSettings, { forceRebuild: true }) + + // Keep the current task's sticky provider profile in sync with the newly-activated profile. + await this.persistStickyProviderProfileToCurrentTask(name) + } else { + const listApiConfigMeta = await this.providerSettingsManager.listConfig() + await this.updateGlobalState("listApiConfigMeta", listApiConfigMeta) + } - // These promises do the following: - // 1. Adds or updates the list of provider profiles. - // 2. Sets the current provider profile. - // 3. Sets the current mode's provider profile. - // 4. Copies the provider settings to the context. - // - // Note: 1, 2, and 4 can be done in one `ContextProxy` call: - // this.contextProxy.setValues({ ...providerSettings, listApiConfigMeta: ..., currentApiConfigName: ... }) - // We should probably switch to that and verify that it works. - // I left the original implementation in just to be safe. - await Promise.all([ - this.updateGlobalState("listApiConfigMeta", listApiConfigMeta), - this.updateGlobalState("currentApiConfigName", name), - this.providerSettingsManager.setModeConfig(mode, id), - this.contextProxy.setProviderSettings(providerSettings), - ]) - - signal.throwIfAborted() - // Change the provider for the current task. - // TODO: We should rename `buildApiHandler` for clarity (e.g. `getProviderClient`). - this.updateTaskApiHandlerIfNeeded(providerSettings, { forceRebuild: true }) - - // Keep the current task's sticky provider profile in sync with the newly-activated profile. - await this.persistStickyProviderProfileToCurrentTask(name) - } else { - const listApiConfigMeta = await this.providerSettingsManager.listConfig() signal.throwIfAborted() - await this.updateGlobalState("listApiConfigMeta", listApiConfigMeta) - } - - signal.throwIfAborted() - await this.postStateToWebview() - return id - }) + await this.postStateToWebview() + return id + }, + { allowTimeout: false }, + ) } catch (error) { saveSignal?.throwIfAborted() this.log( diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 562e939477..3fe2b55aa9 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -34,6 +34,7 @@ import { safeWriteJson } from "../../../utils/safeWriteJson" import { ClineProvider } from "../ClineProvider" import { webviewMessageHandler } from "../webviewMessageHandler" +import * as webviewMessages from "../webviewMessageHandler" import { enqueueSettingsSave } from "../settingsSaveQueue" import { Terminal } from "../../../integrations/terminal/Terminal" import { MessageManager } from "../../message-manager" @@ -605,6 +606,7 @@ describe("ClineProvider", () => { function createView() { const messages = makeEventEmitter() + const onDidReceiveMessage = vi.fn(messages.event) const visibility = makeEventEmitter() const disposed = makeEventEmitter() const postMessage = vi.fn<(message: ExtensionMessage) => Promise>().mockResolvedValue(true) @@ -617,13 +619,13 @@ describe("ClineProvider", () => { cspSource: "vscode-webview://test-csp-source", asWebviewUri: (uri) => uri, postMessage, - onDidReceiveMessage: messages.event, + onDidReceiveMessage, }, onDidChangeVisibility: visibility.event, onDidDispose: disposed.event, show: vi.fn(), } - return { view, messages, visibility, disposed, postMessage } + return { view, messages, visibility, disposed, postMessage, onDidReceiveMessage } } beforeEach(async () => { @@ -710,29 +712,189 @@ describe("ClineProvider", () => { }, ) - test("stops an active profile save after disposal during a profile metadata read", async () => { + test.each(["provider", "sidebar"] as const)( + "registered callback suppresses the exact save abort reason on %s disposal", + async (target) => { + let release!: () => void + const write = vi.spyOn(provider.contextProxy, "setValue").mockImplementationOnce( + () => + new Promise((resolve) => { + release = resolve + }), + ) + const callback = sidebar.onDidReceiveMessage.mock.calls[0][0] + const saving = callback({ type: "updateSettings", updatedSettings: { tableStriped: true } }) + await vi.waitFor(() => expect(write).toHaveBeenCalled()) + if (target === "provider") await provider.dispose() + else sidebar.disposed.fire() + await expect(saving).resolves.toBeUndefined() + release() + await enqueueSettingsSave(provider.contextProxy, new AbortController().signal, async () => {}) + write.mockRestore() + }, + ) + + test.each([false, true])("registered callback rethrows a save error (aborted: %s)", async (abort) => { + // Control the handler rejection to exercise the wrapper independently of the queue's abort race. + let reject!: (error: Error) => void + const handler = vi.spyOn(webviewMessages, "webviewMessageHandler").mockImplementationOnce( + () => + new Promise((_, rejectSave) => { + reject = rejectSave + }), + ) + const callback = sidebar.onDidReceiveMessage.mock.calls[0][0] + const error = new Error("save failed") + const saving = callback({ type: "updateSettings", updatedSettings: { tableStriped: true } }) + const rejected = expect(saving).rejects.toBe(error) + if (abort) sidebar.disposed.fire() + expect(error).not.toBe(provider.settingsSaveSignal.reason) + reject(error) + await rejected + handler.mockRestore() + }) + + test.each(["save", "metadata", "settings"] as const)( + "finishes profile persistence after disposal during %s and delays the next webview state", + async (stage) => { + let release!: () => void + const blocked = new Promise((resolve) => { + release = resolve + }) + const configuration: ProviderSettings = { apiProvider: providerIdentifiers.openrouter } + const metadata = [{ id: "saved-id", name: "saved-profile", ...configuration }] + const save = vi.spyOn(provider.providerSettingsManager, "saveConfig").mockImplementation(async () => { + if (stage === "save") await blocked + return "saved-id" + }) + const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockImplementation(async () => { + if (stage === "metadata") await blocked + return metadata + }) + const setMode = vi.spyOn(provider.providerSettingsManager, "setModeConfig").mockResolvedValue(undefined) + const setProviderSettings = provider.contextProxy.setProviderSettings.bind(provider.contextProxy) + const settings = vi + .spyOn(provider.contextProxy, "setProviderSettings") + .mockImplementation(async (values) => { + if (stage === "settings") await blocked + await setProviderSettings(values) + }) + const task = new Task(defaultTaskOptions) + task.updateApiConfiguration = vi.fn() + task.setTaskApiConfigName = vi.fn() + const currentTask = vi.spyOn(provider, "getCurrentTask").mockReturnValue(task) + const upsert = vi.spyOn(provider, "upsertProviderProfile") + const saving = webviewMessageHandler(provider, { + type: "upsertApiConfiguration", + text: "saved-profile", + apiConfiguration: configuration, + }) + await vi.waitFor(() => + expect(stage === "save" ? save : stage === "metadata" ? list : settings).toHaveBeenCalled(), + ) + const cancelled = expect(saving).rejects.toMatchObject({ name: "AbortError" }) + sidebar.disposed.fire() + await cancelled + await provider.resolveWebviewView(createView().view) + const post = vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + const previousReads = list.mock.calls.length + const launching = webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + await new Promise((resolve) => setImmediate(resolve)) + expect(list).toHaveBeenCalledTimes(previousReads) + expect(post).not.toHaveBeenCalled() + release() + await launching + await expect(upsert.mock.results[0].value).rejects.toMatchObject({ name: "AbortError" }) + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(metadata) + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("saved-profile") + expect(provider.contextProxy.getValue("apiProvider")).toBe(providerIdentifiers.openrouter) + expect(setMode).toHaveBeenCalledWith(defaultModeSlug, "saved-id") + expect(task.updateApiConfiguration).toHaveBeenCalledWith(configuration) + expect(task.setTaskApiConfigName).toHaveBeenCalledWith("saved-profile") + for (const spy of [save, list, setMode, settings, upsert, post, currentTask]) spy.mockRestore() + }, + ) + + test("logs slow profile writes and keeps their lock when a queued mutation times out", async () => { + let release!: () => void + const blocked = new Promise((resolve) => { + release = resolve + }) + const log = vi.spyOn(provider, "log") + vi.useFakeTimers() + try { + const saving = provider["enqueueProviderProfileMutation"](() => blocked, { allowTimeout: false }) + const timedOutWrite = vi.fn().mockResolvedValue(undefined) + const timingOut = provider["enqueueProviderProfileMutation"](timedOutWrite) + const rejected = expect(timingOut).rejects.toThrow("Provider profile mutation timed out") + const nextWrite = vi.fn().mockResolvedValue(undefined) + const queued = provider["enqueueProviderProfileMutation"](nextWrite, { allowTimeout: false }) + await vi.advanceTimersByTimeAsync(ClineProvider.PENDING_OPERATION_TIMEOUT_MS) + await rejected + expect(log).toHaveBeenCalledWith( + "Provider profile save is still pending; waiting for persistence to finish", + ) + expect(nextWrite).not.toHaveBeenCalled() + release() + await saving + await queued + expect(nextWrite).toHaveBeenCalledOnce() + expect(timedOutWrite).not.toHaveBeenCalled() + } finally { + release() + vi.useRealTimers() + log.mockRestore() + } + }) + + test("an inactive profile save finishes metadata persistence after cancellation", async () => { let release!: () => void + const metadata = [{ id: "saved-id", name: "saved-profile" }] + const save = vi.spyOn(provider.providerSettingsManager, "saveConfig").mockResolvedValue("saved-id") const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockImplementationOnce( () => new Promise((resolve) => { - release = () => resolve([]) + release = () => resolve(metadata) }), ) - const write = vi.spyOn(provider.contextProxy, "setValue") - const saving = webviewMessageHandler(provider, { - type: "upsertApiConfiguration", - text: "saved-profile", - apiConfiguration: {}, - }) - await vi.waitFor(() => expect(list).toHaveBeenCalled()) + const saving = provider.upsertProviderProfile("saved-profile", {}, false, provider.settingsSaveSignal) const cancelled = expect(saving).rejects.toMatchObject({ name: "AbortError" }) + await vi.waitFor(() => expect(list).toHaveBeenCalled()) sidebar.disposed.fire() - await cancelled release() - await enqueueSettingsSave(provider.contextProxy, new AbortController().signal, async () => {}) - expect(write).not.toHaveBeenCalled() + await cancelled + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(metadata) + expect(provider.contextProxy.getValue("currentApiConfigName")).not.toBe("saved-profile") + save.mockRestore() list.mockRestore() - write.mockRestore() + }) + + test("a partial profile failure waits for outstanding writes and remains retryable", async () => { + let release!: () => void + const metadata = [{ id: "saved-id", name: "saved-profile" }] + const save = vi.spyOn(provider.providerSettingsManager, "saveConfig").mockResolvedValue("saved-id") + const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockResolvedValue(metadata) + const setMode = vi + .spyOn(provider.providerSettingsManager, "setModeConfig") + .mockRejectedValueOnce(new Error("write failed")) + const settings = vi.spyOn(provider.contextProxy, "setProviderSettings").mockImplementationOnce( + () => + new Promise((resolve) => { + release = resolve + }), + ) + const saving = provider.upsertProviderProfile("saved-profile", {}) + const finished = vi.fn() + void saving.then(finished) + await vi.waitFor(() => expect(settings).toHaveBeenCalled()) + expect(finished).not.toHaveBeenCalled() + release() + await expect(saving).resolves.toBeUndefined() + setMode.mockResolvedValue(undefined) + await expect(provider.upsertProviderProfile("saved-profile", {})).resolves.toBe("saved-id") + expect(list).toHaveBeenCalledTimes(2) + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(metadata) + for (const spy of [save, list, setMode, settings]) spy.mockRestore() }) test("allows settings saves when a disposed sidebar is resolved again", async () => { @@ -1878,6 +2040,57 @@ describe("ClineProvider", () => { expect(mockPostMessage).toHaveBeenCalled() }) + test("launches with cached state when refreshing profile metadata fails", async () => { + await provider.resolveWebviewView(mockWebviewView) + const list = vi + .spyOn(provider.providerSettingsManager, "listConfig") + .mockRejectedValue(new Error("read failed")) + const post = vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + const log = vi.spyOn(provider, "log") + await expect(webviewMessageHandler(provider, { type: "webviewDidLaunch" })).resolves.toBeUndefined() + expect(post).toHaveBeenCalled() + expect(provider.isViewLaunched).toBe(true) + expect(log).toHaveBeenCalledWith("Failed to refresh provider profile metadata on launch") + for (const spy of [list, post, log]) spy.mockRestore() + }) + + test("bounds the launch wait without releasing the save queue, then posts refreshed state", async () => { + await provider.resolveWebviewView(mockWebviewView) + const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockResolvedValue([]) + const post = vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + let release!: () => void + const saving = enqueueSettingsSave( + provider.contextProxy, + provider.settingsSaveSignal, + () => + new Promise((resolve) => { + release = resolve + }), + ) + vi.useFakeTimers() + try { + const launching = webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + const nextWrite = vi.fn().mockResolvedValue(undefined) + const queued = enqueueSettingsSave(provider.contextProxy, provider.settingsSaveSignal, nextWrite) + await vi.advanceTimersByTimeAsync(ClineProvider.PENDING_OPERATION_TIMEOUT_MS) + await launching + expect(provider.isViewLaunched).toBe(true) + expect(post).toHaveBeenCalled() + expect(nextWrite).not.toHaveBeenCalled() + post.mockClear() + release() + await saving + await queued + expect(nextWrite).toHaveBeenCalledOnce() + expect(post).toHaveBeenCalledOnce() + } finally { + release() + vi.useRealTimers() + list.mockRestore() + post.mockRestore() + } + }) + test("logs detached workspace initialization failures", async () => { await provider.resolveWebviewView(mockWebviewView) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 2ba809ee0b..11b82f38df 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -39,7 +39,7 @@ import { type ApiMessage } from "../task-persistence/apiMessages" import { saveTaskMessages } from "../task-persistence" import { importRooTaskHistory } from "../task-persistence/importRooTaskHistory" -import { ClineProvider } from "./ClineProvider" +import type { ClineProvider } from "./ClineProvider" import { findOriginalContent } from "./stripOriginalContent" import { handleCheckpointRestoreOperation } from "./checkpointRestoreHandler" import { generateErrorDiagnostics } from "./diagnosticsHandler" @@ -634,7 +634,36 @@ const handleWebviewMessage = async ( provider.resolveWebviewThemeFixtureProbe(message.requestId, message.themeFixture) } break - case "webviewDidLaunch": + case "webviewDidLaunch": { + // A disposed view may still be completing an uncancellable profile write. + // Refresh metadata before publishing state, including after a failed save. + const launchSignal = provider.settingsSaveSignal + let refreshTimedOut = false + const refreshProfiles = enqueueSettingsSave(provider.contextProxy, launchSignal, async () => { + const metadata = await provider.providerSettingsManager.listConfig() + launchSignal.throwIfAborted() + await updateGlobalState("listApiConfigMeta", metadata) + if (refreshTimedOut) await provider.postStateToWebview() + }).catch((error) => { + if (launchSignal.aborted && error === launchSignal.reason) throw error + provider.log("Failed to refresh provider profile metadata on launch") + }) + let refreshTimeout: ReturnType | undefined + try { + await Promise.race([ + refreshProfiles, + new Promise((resolve) => { + refreshTimeout = setTimeout(() => { + // Release only the launch wait; keep the write queue serialized. + refreshTimedOut = true + provider.log("Provider profile metadata refresh timed out on launch") + resolve() + }, 30_000) + }), + ]) + } finally { + clearTimeout(refreshTimeout) + } // Load custom modes first const customModes = await provider.customModesManager.getCustomModes() await updateGlobalState("customModes", customModes) @@ -743,6 +772,7 @@ const handleWebviewMessage = async ( provider.isViewLaunched = true break + } case "newTask": // Initializing new instance of Cline will make sure that any // agentically running promises in old instance don't affect our new From c4bc4a3361775ce72b058348a9b50779326764ac Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:46:55 +0000 Subject: [PATCH 4/9] test(settings): verify table striping checkbox reflects explicit true and false props --- .../src/components/settings/__tests__/UISettings.spec.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx b/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx index 5801635aef..289a184de1 100644 --- a/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx @@ -210,6 +210,12 @@ describe("UISettings", () => { }) describe("table striping", () => { + it.each([true, false])("reflects the explicit tableStriped=%s prop", (tableStriped) => { + const { getByTestId } = render() + const checkbox = getByTestId("table-striped-checkbox") as HTMLInputElement + expect(checkbox.checked).toBe(tableStriped) + }) + it("renders the table striping checkbox unchecked by default", () => { const { getByTestId } = render() const checkbox = getByTestId("table-striped-checkbox") as HTMLInputElement From c7b975e36f78adf039aec03a67fb3531a9eec82a Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:52:46 +0000 Subject: [PATCH 5/9] fix(settings): serialize webview launch profile sync and name repair with settings saves --- .../webview/__tests__/ClineProvider.spec.ts | 69 ++++++++++++++++ src/core/webview/webviewMessageHandler.ts | 82 +++++++------------ 2 files changed, 98 insertions(+), 53 deletions(-) diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 3fe2b55aa9..bd7cdd01d8 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -2054,6 +2054,73 @@ describe("ClineProvider", () => { for (const spy of [list, post, log]) spy.mockRestore() }) + test("serializes first-run profile sync, name repair, and list posting with settings saves", async () => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("currentApiConfigName", "missing-profile") + const configuration: ProviderSettings = { apiProvider: providerIdentifiers.fakeAi } + const metadata: ProviderSettingsEntry[] = [{ id: "default-id", name: "default" }] + const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockResolvedValue(metadata) + const hasConfig = vi.spyOn(provider.providerSettingsManager, "hasConfig").mockResolvedValue(false) + const state = vi.spyOn(provider, "getState").mockResolvedValue({ + ...(await provider.getState()), + apiConfiguration: configuration, + }) + let release!: () => void + const save = vi.spyOn(provider.providerSettingsManager, "saveConfig").mockImplementation( + () => + new Promise((resolve) => { + release = () => resolve("default-id") + }), + ) + const post = vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + const message = vi.spyOn(provider, "postMessageToWebview").mockResolvedValue(undefined) + const activate = vi.spyOn(provider, "activateProviderProfile") + try { + const launching = webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + await vi.waitFor(() => expect(save).toHaveBeenCalledWith("default", configuration)) + const nextWrite = vi.fn(async () => { + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("default") + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(metadata) + expect(message).toHaveBeenCalledWith({ type: "listApiConfig", listApiConfig: metadata }) + }) + const queued = enqueueSettingsSave(provider.contextProxy, provider.settingsSaveSignal, nextWrite) + expect(nextWrite).not.toHaveBeenCalled() + expect(hasConfig).not.toHaveBeenCalled() + expect(message).not.toHaveBeenCalled() + release() + await Promise.all([launching, queued]) + expect(list).toHaveBeenCalledOnce() + expect(hasConfig).toHaveBeenCalledWith("missing-profile") + expect(metadata[0].apiProvider).toBe(providerIdentifiers.fakeAi) + expect(nextWrite).toHaveBeenCalledOnce() + expect(activate).not.toHaveBeenCalled() + } finally { + release?.() + for (const spy of [list, hasConfig, state, save, post, message, activate]) spy.mockRestore() + } + }) + + test("does not sync an unconfigured fallback into the first-run profile", async () => { + await provider.resolveWebviewView(mockWebviewView) + const metadata: ProviderSettingsEntry[] = [{ id: "default-id", name: "default" }] + const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockResolvedValue(metadata) + const state = vi.spyOn(provider, "getState").mockResolvedValue({ + ...(await provider.getState()), + apiConfiguration: { apiProvider: providerIdentifiers.anthropic }, + }) + const save = vi.spyOn(provider.providerSettingsManager, "saveConfig") + const post = vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + const message = vi.spyOn(provider, "postMessageToWebview").mockResolvedValue(undefined) + try { + await webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + expect(save).not.toHaveBeenCalled() + expect(list).toHaveBeenCalledOnce() + expect(message).toHaveBeenCalledWith({ type: "listApiConfig", listApiConfig: metadata }) + } finally { + for (const spy of [list, state, save, post, message]) spy.mockRestore() + } + }) + test("bounds the launch wait without releasing the save queue, then posts refreshed state", async () => { await provider.resolveWebviewView(mockWebviewView) const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockResolvedValue([]) @@ -2076,11 +2143,13 @@ describe("ClineProvider", () => { await launching expect(provider.isViewLaunched).toBe(true) expect(post).toHaveBeenCalled() + expect(list).not.toHaveBeenCalled() expect(nextWrite).not.toHaveBeenCalled() post.mockClear() release() await saving await queued + expect(list).toHaveBeenCalledOnce() expect(nextWrite).toHaveBeenCalledOnce() expect(post).toHaveBeenCalledOnce() } finally { diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 11b82f38df..a1f8c39ab5 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -642,7 +642,36 @@ const handleWebviewMessage = async ( const refreshProfiles = enqueueSettingsSave(provider.contextProxy, launchSignal, async () => { const metadata = await provider.providerSettingsManager.listConfig() launchSignal.throwIfAborted() + if (metadata) { + if (metadata.length === 1 && !checkExistKey(metadata[0])) { + const { apiConfiguration } = await provider.getState() + launchSignal.throwIfAborted() + + // Only sync a first-run profile when the current configuration has meaningful settings. + if (checkExistKey(apiConfiguration)) { + await provider.providerSettingsManager.saveConfig( + metadata[0].name ?? "default", + apiConfiguration, + ) + launchSignal.throwIfAborted() + metadata[0].apiProvider = apiConfiguration.apiProvider + } + } + + const currentConfigName = getGlobalState("currentApiConfigName") + if (currentConfigName) { + const hasConfig = await provider.providerSettingsManager.hasConfig(currentConfigName) + launchSignal.throwIfAborted() + if (!hasConfig) { + await updateGlobalState("currentApiConfigName", metadata[0]?.name) + } + } + } + launchSignal.throwIfAborted() await updateGlobalState("listApiConfigMeta", metadata) + launchSignal.throwIfAborted() + if (metadata) await provider.postMessageToWebview({ type: "listApiConfig", listApiConfig: metadata }) + launchSignal.throwIfAborted() if (refreshTimedOut) await provider.postStateToWebview() }).catch((error) => { if (launchSignal.aborted && error === launchSignal.reason) throw error @@ -685,59 +714,6 @@ const handleWebviewMessage = async ( await provider.postMessageToWebview({ type: "mcpServers", mcpServers: mcpHub.getAllServers() }) } - provider.providerSettingsManager - .listConfig() - .then(async (listApiConfig) => { - if (!listApiConfig) { - return - } - - if (listApiConfig.length === 1) { - // Check if first time init then sync with exist config. - if (!checkExistKey(listApiConfig[0])) { - const { apiConfiguration } = await provider.getState() - - // Only save if the current configuration has meaningful settings - // (e.g., API keys). This prevents saving a default "anthropic" - // fallback when no real config exists, which can happen during - // CLI initialization before provider settings are applied. - if (checkExistKey(apiConfiguration)) { - await provider.providerSettingsManager.saveConfig( - listApiConfig[0].name ?? "default", - apiConfiguration, - ) - - listApiConfig[0].apiProvider = apiConfiguration.apiProvider - } - } - } - - const currentConfigName = getGlobalState("currentApiConfigName") - - if (currentConfigName) { - if (!(await provider.providerSettingsManager.hasConfig(currentConfigName))) { - // Current config name not valid, get first config in list. - const name = listApiConfig[0]?.name - await updateGlobalState("currentApiConfigName", name) - - if (name) { - await provider.activateProviderProfile({ name }) - return - } - } - } - - await Promise.all([ - await updateGlobalState("listApiConfigMeta", listApiConfig), - await provider.postMessageToWebview({ type: "listApiConfig", listApiConfig }), - ]) - }) - .catch((error) => - provider.log( - `Error list api configuration: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`, - ), - ) - // Telemetry is on by disclosed default: "unset" (no choice made yet) leaves that // default in effect, same as "enabled". Only an explicit "disabled" opts out. // vscode.env.isTelemetryEnabled is ANDed in (matching extension.ts's From 9d0aa3fbe2739ef6e798507dda8d194936470633 Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:19:05 +0000 Subject: [PATCH 6/9] fix(settings): restore missing active profiles on webview launch with rollback on save failure --- src/core/config/ProviderSettingsManager.ts | 7 + src/core/webview/ClineProvider.ts | 54 ++++++++ .../webview/__tests__/ClineProvider.spec.ts | 125 ++++++++++++++++++ src/core/webview/webviewMessageHandler.ts | 8 +- 4 files changed, 191 insertions(+), 3 deletions(-) diff --git a/src/core/config/ProviderSettingsManager.ts b/src/core/config/ProviderSettingsManager.ts index 3fcc0e6e43..ce61b2026b 100644 --- a/src/core/config/ProviderSettingsManager.ts +++ b/src/core/config/ProviderSettingsManager.ts @@ -450,6 +450,7 @@ export class ProviderSettingsManager { */ public async activateProfile( params: { name: string } | { id: string }, + mode?: Mode, ): Promise { const { name, ...providerSettings } = await this.getProfile(params) @@ -457,6 +458,12 @@ export class ProviderSettingsManager { return await this.lock(async () => { const providerProfiles = await this.load() providerProfiles.currentApiConfigName = name + if (mode && providerSettings.id) { + providerProfiles.modeApiConfigs = { + ...providerProfiles.modeApiConfigs, + [mode]: providerSettings.id, + } + } await this.store(providerProfiles) return { name, ...providerSettings } }) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 742c658898..6feea60df3 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -18,6 +18,8 @@ import { type ProviderName, type ProviderSettings, type RooCodeSettings, + PROVIDER_SETTINGS_KEYS, + isSecretStateKey, type ProviderSettingsEntry, type StaticAppProperties, type DynamicAppProperties, @@ -2027,6 +2029,58 @@ export class ClineProvider } } + /** Called inside the launch settings-save queue; finish or roll back once writes begin. */ + async repairProviderProfile(name: string, metadata: ProviderSettingsEntry[], signal: AbortSignal): Promise { + await this.enqueueProviderProfileMutation( + async () => { + const { + name: profileName, + id: _id, + ...settings + } = await this.providerSettingsManager.getProfile({ name }) + const { mode } = await this.getState() + signal.throwIfAborted() + const values: RooCodeSettings = { + ...settings, + listApiConfigMeta: metadata, + currentApiConfigName: profileName, + } + const previous = this.contextProxy.getValues() + // Match setProviderSettings: clear absent global settings, retaining shared secrets. + const keys = new Set([ + ...PROVIDER_SETTINGS_KEYS.filter((key) => !isSecretStateKey(key) && previous[key] !== undefined), + ...(Object.keys(values) as (keyof RooCodeSettings)[]), + ]) + const attempted: (keyof RooCodeSettings)[] = [] + try { + // Sequential writes let rollback wait for every attempted write to settle. + for (const key of keys) { + attempted.push(key) + await this.contextProxy.setValue(key, values[key]) + } + // Commit the active name and mode mapping in one profile-store write, last. + await this.providerSettingsManager.activateProfile({ name: profileName }, mode) + } catch (error) { + const unsaved: (keyof RooCodeSettings)[] = [] + for (const key of attempted.reverse()) { + try { + await this.contextProxy.setValue(key, previous[key]) + } catch { + unsaved.push(key) + } + } + if (unsaved.length) { + this.log( + `Provider profile repair rollback failed; unsaved fields (retry required): ${unsaved.join(", ")}`, + ) + } + throw error + } + }, + { allowTimeout: false }, + ) + } + async activateProviderProfile( args: { name: string } | { id: string }, options?: { diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index bd7cdd01d8..320600256b 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -2054,6 +2054,131 @@ describe("ClineProvider", () => { for (const spy of [list, post, log]) spy.mockRestore() }) + describe("launch profile repair", () => { + const replacement: ProviderSettings = { + apiProvider: providerIdentifiers.anthropic, + apiModelId: "replacement-model", + apiKey: "synthetic-replacement-key", + } + const stale: ProviderSettings = { + apiProvider: providerIdentifiers.anthropic, + apiModelId: "deleted-model", + apiKey: "synthetic-deleted-key", + openAiBaseUrl: "https://stale.invalid", + } + const profilesKey = "roo_cline_config_api_config" + + beforeEach(async () => { + await provider.resolveWebviewView(mockWebviewView) + await provider.providerSettingsManager.saveConfig("default", replacement) + await provider.providerSettingsManager.saveConfig("second", { apiProvider: providerIdentifiers.fakeAi }) + await provider.providerSettingsManager.saveConfig("deleted", stale) + await provider.providerSettingsManager.activateProfile({ name: "deleted" }, defaultModeSlug) + await provider.providerSettingsManager.deleteConfig("deleted") + await provider.contextProxy.setProviderSettings(stale) + await provider.contextProxy.setValue("currentApiConfigName", "deleted") + vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + }) + + afterEach(() => vi.mocked(provider.postStateToWebview).mockRestore()) + + test("loads the replacement before the next settings save and persists both active names and the mode", async () => { + const launching = webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + const nextSave = enqueueSettingsSave(provider.contextProxy, provider.settingsSaveSignal, async () => { + const { currentApiConfigName, apiConfiguration } = await provider.getState() + expect(currentApiConfigName).toBe("default") + expect(apiConfiguration).toMatchObject(replacement) + expect(apiConfiguration.openAiBaseUrl).toBeUndefined() + await provider.upsertProviderProfile(currentApiConfigName!, apiConfiguration) + }) + await Promise.all([launching, nextSave]) + expect(await provider.providerSettingsManager.getProfile({ name: "default" })).toMatchObject(replacement) + const persisted = JSON.parse((await mockContext.secrets.get(profilesKey))!) + expect(persisted.currentApiConfigName).toBe("default") + expect(persisted.modeApiConfigs[defaultModeSlug]).toBe(persisted.apiConfigs.default.id) + expect(mockContext.globalState.get("currentApiConfigName")).toBe("default") + expect(mockContext.globalState.get("apiModelId")).toBe(replacement.apiModelId) + expect(await mockContext.secrets.get("apiKey")).toBe(replacement.apiKey) + }) + + test.each(["apiModelId", "apiKey", "listApiConfigMeta", "currentApiConfigName", profilesKey])( + "rolls back a failed %s write and repairs successfully on retry", + async (failedKey) => { + const previous = provider.contextProxy.getValues() + const profilesBefore = await mockContext.secrets.get(profilesKey) + const update = vi.mocked(mockContext.globalState.update).getMockImplementation()! + const store = vi.mocked(mockContext.secrets.store).getMockImplementation()! + let failed = false + const failOnce = (key: string) => { + if (key === failedKey && !failed) { + failed = true + throw new Error("synthetic persistence failure") + } + } + vi.mocked(mockContext.globalState.update).mockImplementation(async (key, value) => { + failOnce(key) + await update(key, value) + }) + vi.mocked(mockContext.secrets.store).mockImplementation(async (key, value) => { + failOnce(key) + await store(key, value) + }) + await webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + expect(failed).toBe(true) + for (const key of [ + "apiModelId", + "apiKey", + "openAiBaseUrl", + "listApiConfigMeta", + "currentApiConfigName", + ] as const) { + expect(provider.contextProxy.getValue(key)).toEqual(previous[key]) + } + expect(mockContext.globalState.get("apiModelId")).toBe(stale.apiModelId) + expect(mockContext.globalState.get("currentApiConfigName")).toBe("deleted") + expect(await mockContext.secrets.get("apiKey")).toBe(stale.apiKey) + expect(await mockContext.secrets.get(profilesKey)).toBe(profilesBefore) + await webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + expect((await provider.getState()).apiConfiguration).toMatchObject(replacement) + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("default") + }, + ) + + test("finishes an in-flight repair after cancellation before releasing the settings queue", async () => { + const controller = new AbortController() + let release!: () => void + const blocked = new Promise((resolve) => { + release = resolve + }) + const update = vi.mocked(mockContext.globalState.update).getMockImplementation()! + const writing = vi.fn() + vi.mocked(mockContext.globalState.update).mockImplementation(async (key, value) => { + if (key === "apiModelId") { + writing() + await blocked + } + await update(key, value) + }) + const metadata = await provider.providerSettingsManager.listConfig() + const repairing = enqueueSettingsSave(provider.contextProxy, controller.signal, () => + provider.repairProviderProfile("default", metadata, controller.signal), + ) + await vi.waitFor(() => expect(writing).toHaveBeenCalled()) + const cancelled = expect(repairing).rejects.toMatchObject({ name: "AbortError" }) + controller.abort() + await cancelled + const next = vi.fn(async () => { + expect((await provider.getState()).apiConfiguration).toMatchObject(replacement) + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("default") + }) + const queued = enqueueSettingsSave(provider.contextProxy, provider.settingsSaveSignal, next) + expect(next).not.toHaveBeenCalled() + release() + await queued + expect(next).toHaveBeenCalledOnce() + }) + }) + test("serializes first-run profile sync, name repair, and list posting with settings saves", async () => { await provider.resolveWebviewView(mockWebviewView) await provider.contextProxy.setValue("currentApiConfigName", "missing-profile") diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index a1f8c39ab5..94296c967a 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -641,6 +641,7 @@ const handleWebviewMessage = async ( let refreshTimedOut = false const refreshProfiles = enqueueSettingsSave(provider.contextProxy, launchSignal, async () => { const metadata = await provider.providerSettingsManager.listConfig() + let repairedProfile = false launchSignal.throwIfAborted() if (metadata) { if (metadata.length === 1 && !checkExistKey(metadata[0])) { @@ -662,13 +663,14 @@ const handleWebviewMessage = async ( if (currentConfigName) { const hasConfig = await provider.providerSettingsManager.hasConfig(currentConfigName) launchSignal.throwIfAborted() - if (!hasConfig) { - await updateGlobalState("currentApiConfigName", metadata[0]?.name) + if (!hasConfig && metadata[0]?.name) { + await provider.repairProviderProfile(metadata[0].name, metadata, launchSignal) + repairedProfile = true } } } launchSignal.throwIfAborted() - await updateGlobalState("listApiConfigMeta", metadata) + if (!repairedProfile) await updateGlobalState("listApiConfigMeta", metadata) launchSignal.throwIfAborted() if (metadata) await provider.postMessageToWebview({ type: "listApiConfig", listApiConfig: metadata }) launchSignal.throwIfAborted() From 18a6d72b141184e507997d69841ca10d291a0e18 Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:32:40 +0000 Subject: [PATCH 7/9] test(settings): cover profile repair rollback failures and queued retries --- .../webview/__tests__/ClineProvider.spec.ts | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 320600256b..f437b68c57 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -2144,6 +2144,82 @@ describe("ClineProvider", () => { }, ) + test("continues after a rollback write fails, logs the unsaved field, and lets a queued repair retry", async () => { + const previous = provider.contextProxy.getValues() + const profilesBefore = await mockContext.secrets.get(profilesKey) + const metadata = await provider.providerSettingsManager.listConfig() + const signal = provider.settingsSaveSignal + const forwardError = new Error("synthetic forward persistence failure") + const update = vi.mocked(mockContext.globalState.update).getMockImplementation()! + const store = vi.mocked(mockContext.secrets.store).getMockImplementation()! + const writes = vi.spyOn(provider.contextProxy, "setValue").mockClear() + const log = vi.spyOn(provider, "log") + let forwardFailed = false + let rollbackStarted = false + let releaseRollback!: () => void + const blockedRollback = new Promise((resolve) => { + releaseRollback = resolve + }) + vi.mocked(mockContext.globalState.update).mockImplementation(async (key, value) => { + if (key === "currentApiConfigName" && !forwardFailed) { + forwardFailed = true + throw forwardError + } + await update(key, value) + }) + vi.mocked(mockContext.secrets.store).mockImplementation(async (key, value) => { + if (key === "apiKey" && value === stale.apiKey) { + rollbackStarted = true + await blockedRollback + throw new Error("synthetic rollback persistence failure") + } + await store(key, value) + }) + const repairing = enqueueSettingsSave(provider.contextProxy, signal, () => + provider.repairProviderProfile("default", metadata, signal), + ) + const rejected = expect(repairing).rejects.toBe(forwardError) + await vi.waitFor(() => expect(rollbackStarted).toBe(true)) + const retry = vi.fn(async () => { + // Every attempted write is rolled back in reverse order, even after apiKey fails. + const forwardEnd = writes.mock.calls.findIndex(([key]) => key === "currentApiConfigName") + 1 + const forwardKeys = writes.mock.calls.slice(0, forwardEnd).map(([key]) => key) + expect(writes.mock.calls.slice(forwardEnd)).toEqual( + forwardKeys.reverse().map((key) => [key, previous[key]]), + ) + expect(log).toHaveBeenCalledWith( + "Provider profile repair rollback failed; unsaved fields (retry required): apiKey", + ) + expect(mockContext.globalState.get("apiModelId")).toBe(stale.apiModelId) + expect(mockContext.globalState.get("openAiBaseUrl")).toBe(stale.openAiBaseUrl) + expect(mockContext.globalState.get("currentApiConfigName")).toBe("deleted") + expect(await mockContext.secrets.get("apiKey")).toBe(replacement.apiKey) + expect(await mockContext.secrets.get(profilesKey)).toBe(profilesBefore) + vi.mocked(mockContext.globalState.update).mockImplementation(update) + vi.mocked(mockContext.secrets.store).mockImplementation(store) + await provider.repairProviderProfile("default", metadata, signal) + }) + const queued = enqueueSettingsSave(provider.contextProxy, signal, retry) + try { + expect(retry).not.toHaveBeenCalled() + } finally { + releaseRollback() + } + await Promise.all([rejected, queued]) + expect(retry).toHaveBeenCalledOnce() + expect((await provider.getState()).apiConfiguration).toMatchObject(replacement) + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("default") + expect(mockContext.globalState.get("currentApiConfigName")).toBe("default") + expect(mockContext.globalState.get("apiModelId")).toBe(replacement.apiModelId) + expect(mockContext.globalState.get("openAiBaseUrl")).toBeUndefined() + expect(await mockContext.secrets.get("apiKey")).toBe(replacement.apiKey) + const persisted = JSON.parse((await mockContext.secrets.get(profilesKey))!) + expect(persisted.currentApiConfigName).toBe("default") + expect(persisted.modeApiConfigs[defaultModeSlug]).toBe(persisted.apiConfigs.default.id) + writes.mockRestore() + log.mockRestore() + }) + test("finishes an in-flight repair after cancellation before releasing the settings queue", async () => { const controller = new AbortController() let release!: () => void From 3199c0ee32fe16a5714dc53705cd559f5512534d Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:48:22 +0000 Subject: [PATCH 8/9] fix(settings): refresh saved first-run profile metadata on webview launch --- .../__tests__/ProviderSettingsManager.spec.ts | 45 ++++++++++++ .../webview/__tests__/ClineProvider.spec.ts | 70 +++++++++++++++++-- src/core/webview/webviewMessageHandler.ts | 5 +- 3 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/core/config/__tests__/ProviderSettingsManager.spec.ts b/src/core/config/__tests__/ProviderSettingsManager.spec.ts index 13e1aeeb2d..f2e574f183 100644 --- a/src/core/config/__tests__/ProviderSettingsManager.spec.ts +++ b/src/core/config/__tests__/ProviderSettingsManager.spec.ts @@ -769,6 +769,51 @@ describe("ProviderSettingsManager", () => { }) describe("LoadConfig", () => { + it.each([ + { + scenario: "updates only the requested mode for an identified profile", + id: "test-id", + mode: "code", + expectedMappings: { code: "test-id", ask: "other-id" }, + }, + { + scenario: "preserves mode mappings when no mode is supplied", + id: "test-id", + mode: undefined, + expectedMappings: { code: "previous-id", ask: "other-id" }, + }, + { + scenario: "activates a profile without an ID without creating a mode mapping", + id: undefined, + mode: "architect", + expectedMappings: { code: "previous-id", ask: "other-id" }, + }, + ])("$scenario", async ({ id, mode, expectedMappings }) => { + // Finish constructor migrations before loading a valid profile without an ID. + await providerSettingsManager.initialize() + const profile = { apiProvider: providerIdentifiers.anthropic, apiKey: "test-key", id } + const existingConfig: ProviderProfiles = { + currentApiConfigName: "default", + apiConfigs: { test: profile }, + modeApiConfigs: { code: "previous-id", ask: "other-id" }, + } + mockSecrets.get.mockResolvedValue(JSON.stringify(existingConfig)) + mockSecrets.store.mockClear() + + await expect(providerSettingsManager.activateProfile({ name: "test" }, mode)).resolves.toEqual({ + name: "test", + ...profile, + }) + + expect(mockSecrets.store).toHaveBeenCalledOnce() + const storedConfig = JSON.parse(mockSecrets.store.mock.calls[0][1]) + expect(storedConfig).toEqual({ + ...existingConfig, + currentApiConfigName: "test", + modeApiConfigs: expectedMappings, + }) + }) + it("should load config and update current config name", async () => { const existingConfig: ProviderProfiles = { currentApiConfigName: "default", diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index f437b68c57..b4918fd502 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -2260,7 +2260,13 @@ describe("ClineProvider", () => { await provider.contextProxy.setValue("currentApiConfigName", "missing-profile") const configuration: ProviderSettings = { apiProvider: providerIdentifiers.fakeAi } const metadata: ProviderSettingsEntry[] = [{ id: "default-id", name: "default" }] - const list = vi.spyOn(provider.providerSettingsManager, "listConfig").mockResolvedValue(metadata) + const refreshedMetadata: ProviderSettingsEntry[] = [ + { ...metadata[0], apiProvider: providerIdentifiers.fakeAi, modelId: "saved-model" }, + ] + const list = vi + .spyOn(provider.providerSettingsManager, "listConfig") + .mockResolvedValueOnce(metadata) + .mockResolvedValue(refreshedMetadata) const hasConfig = vi.spyOn(provider.providerSettingsManager, "hasConfig").mockResolvedValue(false) const state = vi.spyOn(provider, "getState").mockResolvedValue({ ...(await provider.getState()), @@ -2281,8 +2287,8 @@ describe("ClineProvider", () => { await vi.waitFor(() => expect(save).toHaveBeenCalledWith("default", configuration)) const nextWrite = vi.fn(async () => { expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("default") - expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(metadata) - expect(message).toHaveBeenCalledWith({ type: "listApiConfig", listApiConfig: metadata }) + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(refreshedMetadata) + expect(message).toHaveBeenCalledWith({ type: "listApiConfig", listApiConfig: refreshedMetadata }) }) const queued = enqueueSettingsSave(provider.contextProxy, provider.settingsSaveSignal, nextWrite) expect(nextWrite).not.toHaveBeenCalled() @@ -2290,9 +2296,9 @@ describe("ClineProvider", () => { expect(message).not.toHaveBeenCalled() release() await Promise.all([launching, queued]) - expect(list).toHaveBeenCalledOnce() + expect(list).toHaveBeenCalledTimes(2) expect(hasConfig).toHaveBeenCalledWith("missing-profile") - expect(metadata[0].apiProvider).toBe(providerIdentifiers.fakeAi) + expect(metadata[0].apiProvider).toBeUndefined() expect(nextWrite).toHaveBeenCalledOnce() expect(activate).not.toHaveBeenCalled() } finally { @@ -2301,6 +2307,60 @@ describe("ClineProvider", () => { } }) + test.each(["missing-profile", "default"])( + "refreshes saved first-run model metadata with current profile %s and recovers from a failed refresh", + async (currentName) => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("currentApiConfigName", currentName) + const configuration: ProviderSettings = { + apiProvider: providerIdentifiers.anthropic, + apiKey: "synthetic-key", + apiModelId: "vendor/saved-model", + } + await provider.contextProxy.setProviderSettings(configuration) + const metadata = await provider.providerSettingsManager.listConfig() + await provider.contextProxy.setValue("listApiConfigMeta", metadata) + const list = vi + .spyOn(provider.providerSettingsManager, "listConfig") + .mockResolvedValueOnce(metadata) + .mockRejectedValueOnce(new Error("synthetic metadata refresh failure")) + const save = vi.spyOn(provider.providerSettingsManager, "saveConfig") + const repair = vi.spyOn(provider, "repairProviderProfile") + const post = vi.spyOn(provider, "postStateToWebview").mockResolvedValue(undefined) + const message = vi.spyOn(provider, "postMessageToWebview").mockResolvedValue(undefined) + const log = vi.spyOn(provider, "log") + try { + await webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + expect(save).toHaveBeenCalledWith("default", expect.objectContaining(configuration)) + expect(list).toHaveBeenCalledTimes(2) + expect(repair).not.toHaveBeenCalled() + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe(currentName) + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(metadata) + expect(mockContext.globalState.get("listApiConfigMeta")).toEqual(metadata) + expect(message).not.toHaveBeenCalledWith(expect.objectContaining({ type: "listApiConfig" })) + expect(log).toHaveBeenCalledWith("Failed to refresh provider profile metadata on launch") + expect(post).toHaveBeenCalled() + + // Retry against the saved profile using the real metadata reader. + await webviewMessageHandler(provider, { type: "webviewDidLaunch" }) + const refreshedMetadata = [ + { ...metadata[0], apiProvider: configuration.apiProvider, modelId: "saved-model" }, + ] + expect(provider.contextProxy.getValue("listApiConfigMeta")).toEqual(refreshedMetadata) + expect(mockContext.globalState.get("listApiConfigMeta")).toEqual(refreshedMetadata) + expect(message).toHaveBeenCalledWith({ type: "listApiConfig", listApiConfig: refreshedMetadata }) + expect(provider.contextProxy.getValue("currentApiConfigName")).toBe("default") + if (currentName === "missing-profile") { + expect(repair).toHaveBeenCalledWith("default", refreshedMetadata, provider.settingsSaveSignal) + } else { + expect(repair).not.toHaveBeenCalled() + } + } finally { + for (const spy of [list, save, repair, post, message, log]) spy.mockRestore() + } + }, + ) + test("does not sync an unconfigured fallback into the first-run profile", async () => { await provider.resolveWebviewView(mockWebviewView) const metadata: ProviderSettingsEntry[] = [{ id: "default-id", name: "default" }] diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 94296c967a..19110735dd 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -640,7 +640,7 @@ const handleWebviewMessage = async ( const launchSignal = provider.settingsSaveSignal let refreshTimedOut = false const refreshProfiles = enqueueSettingsSave(provider.contextProxy, launchSignal, async () => { - const metadata = await provider.providerSettingsManager.listConfig() + let metadata = await provider.providerSettingsManager.listConfig() let repairedProfile = false launchSignal.throwIfAborted() if (metadata) { @@ -655,7 +655,8 @@ const handleWebviewMessage = async ( apiConfiguration, ) launchSignal.throwIfAborted() - metadata[0].apiProvider = apiConfiguration.apiProvider + metadata = await provider.providerSettingsManager.listConfig() + launchSignal.throwIfAborted() } } From 50b0e0014a5035731bc3ff2ef9d9a2bebe5c7a7e Mon Sep 17 00:00:00 2001 From: seeones Date: Sun, 11 Oct 2026 09:10:00 +0800 Subject: [PATCH 9/9] fix(settings): preserve the legacy table-striped default when unset Unset tableStriped was coerced to false in the ClineProvider state projections, the SettingsView save payload, and both Markdown callers, disabling the previously striped table appearance for users with no stored setting. Preserve undefined through these paths, default MarkdownBlock.striped to true, and derive the settings checkbox from tableStriped !== false so an unset value still shows the legacy striped tables with a checked control. Explicit false remains opt-out. --- src/core/webview/ClineProvider.ts | 4 ++-- src/core/webview/__tests__/ClineProvider.spec.ts | 7 +++++-- webview-ui/src/components/chat/Markdown.tsx | 2 +- webview-ui/src/components/chat/ReasoningBlock.tsx | 2 +- .../components/chat/__tests__/Markdown.spec.tsx | 3 ++- .../chat/__tests__/ReasoningBlock.spec.tsx | 3 ++- .../src/components/common/MarkdownBlock.tsx | 7 +++++-- .../common/__tests__/MarkdownBlock.spec.tsx | 11 ++++++----- .../src/components/settings/SettingsView.tsx | 4 ++-- webview-ui/src/components/settings/UISettings.tsx | 2 +- .../settings/__tests__/SettingsView.spec.tsx | 15 ++++++++------- .../settings/__tests__/UISettings.spec.tsx | 9 ++++++--- .../__tests__/UISettings.visual.fixture.tsx | 3 +++ 13 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 6feea60df3..54dc0a4177 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2933,7 +2933,7 @@ export class ClineProvider chatFontSize, enterBehavior: enterBehavior ?? "send", chatInputEffect: chatInputEffect ?? "marquee", - tableStriped: tableStriped ?? false, + tableStriped, cloudUserInfo, cloudIsAuthenticated: cloudIsAuthenticated ?? false, cloudAuthSkipModel: this.context.globalState.get("roo-auth-skip-model") ?? false, @@ -3166,7 +3166,7 @@ export class ClineProvider chatFontSize: stateValues.chatFontSize, enterBehavior: stateValues.enterBehavior ?? "send", chatInputEffect: stateValues.chatInputEffect ?? "marquee", - tableStriped: stateValues.tableStriped ?? false, + tableStriped: stateValues.tableStriped, cloudUserInfo, cloudIsAuthenticated, sharingEnabled, diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index b4918fd502..acd4b8fd1d 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -2614,10 +2614,13 @@ describe("ClineProvider", () => { }, ) - test("defaults unset chatInputEffect to marquee and tableStriped to false", async () => { + test("defaults unset chatInputEffect to marquee and leaves tableStriped unset", async () => { await provider.resolveWebviewView(mockWebviewView) - expect(await provider[method]()).toMatchObject({ chatInputEffect: "marquee", tableStriped: false }) + const state = await provider[method]() + expect(state).toMatchObject({ chatInputEffect: "marquee" }) + // Unset tableStriped stays undefined so the legacy striped default flows to the webview. + expect(state.tableStriped).toBeUndefined() }) }) diff --git a/webview-ui/src/components/chat/Markdown.tsx b/webview-ui/src/components/chat/Markdown.tsx index 5edf0433e1..cbddb666ee 100644 --- a/webview-ui/src/components/chat/Markdown.tsx +++ b/webview-ui/src/components/chat/Markdown.tsx @@ -24,7 +24,7 @@ export const Markdown = memo(({ markdown, partial }: { markdown?: string; partia onMouseLeave={() => setIsHovering(false)} style={{ position: "relative" }}>

- +
{markdown && !partial && isHovering && (
- +
)}

diff --git a/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx b/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx index 276647dbb8..f7d18314bc 100644 --- a/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/Markdown.spec.tsx @@ -15,7 +15,8 @@ describe("Markdown table striping", () => { it.each([ { tableStriped: true, expectedStriped: true }, { tableStriped: false, expectedStriped: false }, - { tableStriped: undefined, expectedStriped: false }, + // Unset keeps the legacy striped appearance. + { tableStriped: undefined, expectedStriped: undefined }, ])( "passes striped=$expectedStriped when extension state tableStriped=$tableStriped", ({ tableStriped, expectedStriped }) => { diff --git a/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx b/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx index 6f90a137dc..e0f0ffef7f 100644 --- a/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/ReasoningBlock.spec.tsx @@ -72,7 +72,8 @@ describe("ReasoningBlock table striping", () => { it.each([ { tableStriped: true, expectedStriped: true }, { tableStriped: false, expectedStriped: false }, - { tableStriped: undefined, expectedStriped: false }, + // Unset keeps the legacy striped appearance. + { tableStriped: undefined, expectedStriped: undefined }, ])( "passes striped=$expectedStriped when extension state tableStriped=$tableStriped", ({ tableStriped, expectedStriped }) => { diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 3eb8c44f60..c12cf03f8b 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -32,7 +32,10 @@ const ALERT_LABELS: Record = { interface MarkdownBlockProps { markdown?: string - /** Opt-in zebra striping for markdown tables (Settings → UI → tableStriped). */ + /** + * Zebra striping for markdown tables (Settings → UI → tableStriped). + * Defaults to enabled so an unset setting keeps the legacy striped appearance. + */ striped?: boolean } @@ -277,7 +280,7 @@ const StyledMarkdown = styled.div` } ` -const MarkdownBlock = memo(({ markdown, striped = false }: MarkdownBlockProps) => { +const MarkdownBlock = memo(({ markdown, striped = true }: MarkdownBlockProps) => { const components = useMemo( () => ({ table: ({ children, ...props }: any) => { diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index 819962fc1d..79178650e0 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -218,17 +218,18 @@ describe("MarkdownBlock", () => { expect(screen.getByText("Back to first level")).toBeInTheDocument() }) - it("should not apply table striping by default", () => { + it("should apply table striping by default", () => { + // Unset keeps the legacy striped appearance. const { container } = render() const root = container.firstElementChild as HTMLElement - expect(root).not.toHaveClass("table-striped") + expect(root).toHaveClass("table-striped") }) - it("should apply table striping when the striped prop is enabled", () => { - const { container } = render() + it("should not apply table striping when the striped prop is disabled", () => { + const { container } = render() const root = container.firstElementChild as HTMLElement - expect(root).toHaveClass("table-striped") + expect(root).not.toHaveClass("table-striped") }) }) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 2c3a4e7925..2183ab0df1 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -514,7 +514,7 @@ const SettingsView = forwardRef(({ onDone, t chatFontSize: chatFontSize ?? null, enterBehavior: enterBehavior ?? "send", chatInputEffect: chatInputEffect ?? "marquee", - tableStriped: tableStriped ?? false, + tableStriped, includeCurrentTime: includeCurrentTime ?? true, includeCurrentCost: includeCurrentCost ?? true, maxGitStatusFiles: maxGitStatusFiles ?? 0, @@ -1025,7 +1025,7 @@ const SettingsView = forwardRef(({ onDone, t enterBehavior={enterBehavior ?? "send"} chatInputEffect={chatInputEffect ?? "marquee"} chatFontSize={chatFontSize ?? undefined} - tableStriped={tableStriped ?? false} + tableStriped={tableStriped} autoCloseZooOpenedFiles={autoCloseZooOpenedFiles} autoCloseZooOpenedFilesAfterUserEdited={autoCloseZooOpenedFilesAfterUserEdited} autoCloseZooOpenedNewFiles={autoCloseZooOpenedNewFiles} diff --git a/webview-ui/src/components/settings/UISettings.tsx b/webview-ui/src/components/settings/UISettings.tsx index be5e3b071d..445b8a6a56 100644 --- a/webview-ui/src/components/settings/UISettings.tsx +++ b/webview-ui/src/components/settings/UISettings.tsx @@ -275,7 +275,7 @@ export const UISettings = ({ label={t("settings:ui.tableStriped.label")}>
handleTableStripedChange(e.target.checked)} data-testid="table-striped-checkbox"> {t("settings:ui.tableStriped.label")} diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx index 0e85fd3c03..b64dd96db7 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx @@ -1088,7 +1088,7 @@ describe("SettingsView - Chat Appearance Save Payload", () => { ) }) - it("saves marquee and unstriped tables when the settings are unset", () => { + it("saves marquee and preserves unset table striping when the settings are unset", () => { renderWithExtensionState(, { state: makeExtensionState({ chatInputEffect: undefined, tableStriped: undefined }), }) @@ -1098,12 +1098,13 @@ describe("SettingsView - Chat Appearance Save Payload", () => { fireEvent.change(content.getByTestId("chat-font-size-slider"), { target: { value: "18" } }) fireEvent.click(screen.getByTestId("save-button")) - expect(vscode.postMessage).toHaveBeenCalledWith( - expect.objectContaining({ - type: "updateSettings", - updatedSettings: expect.objectContaining({ chatInputEffect: "marquee", tableStriped: false }), - }), - ) + const update = vi + .mocked(vscode.postMessage) + .mock.calls.map(([message]) => message) + .find((message) => message.type === "updateSettings") + expect(update?.updatedSettings).toEqual(expect.objectContaining({ chatInputEffect: "marquee" })) + // `undefined` keeps the legacy striped default instead of persisting `false`. + expect(update?.updatedSettings?.tableStriped).toBeUndefined() }) }) diff --git a/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx b/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx index 289a184de1..8e59bdf8f7 100644 --- a/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/UISettings.spec.tsx @@ -216,16 +216,19 @@ describe("UISettings", () => { expect(checkbox.checked).toBe(tableStriped) }) - it("renders the table striping checkbox unchecked by default", () => { + it("renders the table striping checkbox checked by default", () => { + // Unset keeps the legacy striped appearance, so the control reflects it as on. const { getByTestId } = render() const checkbox = getByTestId("table-striped-checkbox") as HTMLInputElement expect(checkbox).toBeTruthy() - expect(checkbox.checked).toBe(false) + expect(checkbox.checked).toBe(true) }) it("calls setCachedStateField when the table striping checkbox is toggled", async () => { const setCachedStateField = vi.fn() - const { getByTestId } = render() + const { getByTestId } = render( + , + ) fireEvent.click(getByTestId("table-striped-checkbox")) diff --git a/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx b/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx index 76f0437bb4..8f2d6cdf15 100644 --- a/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx +++ b/webview-ui/src/components/settings/__tests__/UISettings.visual.fixture.tsx @@ -10,6 +10,7 @@ interface UIState { enterBehavior: "send" | "newline" chatInputEffect: "marquee" | "breathing" chatFontSize?: number + tableStriped?: boolean autoCloseZooOpenedFiles?: boolean autoCloseZooOpenedFilesAfterUserEdited?: boolean autoCloseZooOpenedNewFiles?: boolean @@ -21,6 +22,8 @@ export function UISettingsStory() { enterBehavior: "send", chatInputEffect: "marquee", chatFontSize: 14, + // Pinned so the rendered control is deterministic regardless of the striped default. + tableStriped: false, autoCloseZooOpenedFiles: true, autoCloseZooOpenedFilesAfterUserEdited: true, autoCloseZooOpenedNewFiles: false,