From 19788c031667fc1e367511fb9026607652e0f9cb Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Fri, 4 Sep 2026 10:21:22 +0800 Subject: [PATCH 01/12] feat(settings): dynamic thinking effort experimental toggle (DTE-1) --- .../types/src/__tests__/experiment.test.ts | 19 +++++ packages/types/src/experiment.ts | 2 + scripts/stryker-diff.mjs | 10 ++- scripts/stryker-diff.test.mjs | 7 +- src/shared/__tests__/experiments.spec.ts | 29 ++++++- src/shared/experiments.ts | 2 + .../__tests__/ExperimentalSettings.spec.tsx | 76 ++++++++++++++++++- webview-ui/src/i18n/locales/ca/settings.json | 4 + webview-ui/src/i18n/locales/de/settings.json | 4 + webview-ui/src/i18n/locales/en/settings.json | 4 + webview-ui/src/i18n/locales/es/settings.json | 4 + webview-ui/src/i18n/locales/fr/settings.json | 4 + webview-ui/src/i18n/locales/hi/settings.json | 4 + webview-ui/src/i18n/locales/id/settings.json | 4 + webview-ui/src/i18n/locales/it/settings.json | 4 + webview-ui/src/i18n/locales/ja/settings.json | 4 + webview-ui/src/i18n/locales/ko/settings.json | 4 + webview-ui/src/i18n/locales/nl/settings.json | 4 + webview-ui/src/i18n/locales/pl/settings.json | 4 + .../src/i18n/locales/pt-BR/settings.json | 4 + webview-ui/src/i18n/locales/ru/settings.json | 4 + webview-ui/src/i18n/locales/tr/settings.json | 4 + webview-ui/src/i18n/locales/vi/settings.json | 4 + .../src/i18n/locales/zh-CN/settings.json | 4 + .../src/i18n/locales/zh-TW/settings.json | 4 + 25 files changed, 211 insertions(+), 6 deletions(-) create mode 100644 packages/types/src/__tests__/experiment.test.ts diff --git a/packages/types/src/__tests__/experiment.test.ts b/packages/types/src/__tests__/experiment.test.ts new file mode 100644 index 0000000000..0ef4ed2e02 --- /dev/null +++ b/packages/types/src/__tests__/experiment.test.ts @@ -0,0 +1,19 @@ +import { experimentIds, experimentIdsSchema, experimentsSchema } from "../experiment.js" + +describe("dynamicThinkingEffort experiment", () => { + it("is part of the experiment id enum", () => { + expect(experimentIds).toContain("dynamicThinkingEffort") + expect(experimentIdsSchema.safeParse("dynamicThinkingEffort").success).toBe(true) + }) + + it("parses enabled and disabled states", () => { + expect(experimentsSchema.parse({ dynamicThinkingEffort: true })).toEqual({ dynamicThinkingEffort: true }) + expect(experimentsSchema.parse({ dynamicThinkingEffort: false })).toEqual({ dynamicThinkingEffort: false }) + expect(experimentsSchema.parse({})).toEqual({}) + }) + + it("rejects non-boolean values", () => { + expect(experimentsSchema.safeParse({ dynamicThinkingEffort: "yes" }).success).toBe(false) + expect(experimentIdsSchema.safeParse("dynamic-thinking-effort").success).toBe(false) + }) +}) diff --git a/packages/types/src/experiment.ts b/packages/types/src/experiment.ts index 5d511859b1..f4b3a1c0a8 100644 --- a/packages/types/src/experiment.ts +++ b/packages/types/src/experiment.ts @@ -12,6 +12,7 @@ export const experimentIds = [ "runSlashCommand", "customTools", "parallelToolExecution", + "dynamicThinkingEffort", ] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -28,6 +29,7 @@ export const experimentsSchema = z.object({ runSlashCommand: z.boolean().optional(), customTools: z.boolean().optional(), parallelToolExecution: z.boolean().optional(), + dynamicThinkingEffort: z.boolean().optional(), }) export type Experiments = z.infer diff --git a/scripts/stryker-diff.mjs b/scripts/stryker-diff.mjs index c0e8a6cd1a..e46afb22ab 100644 --- a/scripts/stryker-diff.mjs +++ b/scripts/stryker-diff.mjs @@ -51,8 +51,14 @@ export const PACKAGE_CONFIGS = [ root: "src", sourceRoot: "src/", vitestConfig: "vitest.config.ts", - vitestRelated: false, - discoverRelatedTests: true, + // Use plugin-side related-test discovery: with an explicit STRYKER_TEST_FILES + // list, stryker-js 10.0.0 plans static mutants with runtime activation + // (stryker-mutator/stryker-js#6144, #6209), which the vitest plugin can only + // apply after top-level code has run, producing false Survived results. + // Revert to vitestRelated: false / discoverRelatedTests: true once the + // upstream planner fix lands. + vitestRelated: true, + discoverRelatedTests: false, excludedPaths: ["src/esbuild.mjs", "src/eslint.config.mjs", "src/utils/vitest-verbosity.ts"], }, ] diff --git a/scripts/stryker-diff.test.mjs b/scripts/stryker-diff.test.mjs index 0f39dc507f..b86f5f3e96 100644 --- a/scripts/stryker-diff.test.mjs +++ b/scripts/stryker-diff.test.mjs @@ -129,8 +129,11 @@ describe("buildManifest", () => { assert.equal(webview.runRoot, ".") assert.equal(webview.discoverRelatedTests, true) assert.equal(webview.vitestRelated, false) - assert.equal(extension.discoverRelatedTests, true) - assert.equal(extension.vitestRelated, false) + // The extension entry uses plugin-side related discovery while stryker-js 10.0.0 + // plans static mutants with runtime activation when given explicit test files + // (stryker-mutator/stryker-js#6144, #6209); see the entry comment in stryker-diff.mjs. + assert.equal(extension.discoverRelatedTests, false) + assert.equal(extension.vitestRelated, true) }) it("returns no packages for tests, barrels, unsupported packages, and type-only changes", () => { diff --git a/src/shared/__tests__/experiments.spec.ts b/src/shared/__tests__/experiments.spec.ts index f2261a5c09..b6e8993df4 100644 --- a/src/shared/__tests__/experiments.spec.ts +++ b/src/shared/__tests__/experiments.spec.ts @@ -2,7 +2,7 @@ import type { ExperimentId } from "@roo-code/types" -import { EXPERIMENT_IDS, experimentConfigsMap, experiments as Experiments } from "../experiments" +import { EXPERIMENT_IDS, experimentConfigsMap, experimentDefault, experiments as Experiments } from "../experiments" describe("experiments", () => { describe("PREVENT_FOCUS_DISRUPTION", () => { @@ -22,6 +22,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(false) }) @@ -33,6 +34,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(true) }) @@ -44,6 +46,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(false) }) @@ -66,4 +69,28 @@ describe("experiments", () => { expect(Experiments.isEnabled({ parallelToolExecution: true }, "parallelToolExecution")).toBe(true) }) }) + + describe("DYNAMIC_THINKING_EFFORT", () => { + it("is configured correctly", () => { + expect(EXPERIMENT_IDS.DYNAMIC_THINKING_EFFORT).toBe("dynamicThinkingEffort") + expect(experimentConfigsMap.DYNAMIC_THINKING_EFFORT).toMatchObject({ + enabled: false, + }) + // Visible in the Settings panel (showInSettings defaults to true). + expect(experimentConfigsMap.DYNAMIC_THINKING_EFFORT.showInSettings).toBeUndefined() + }) + + it("is disabled by default", () => { + expect(experimentDefault.dynamicThinkingEffort).toBe(false) + expect(Experiments.isEnabled({}, "dynamicThinkingEffort")).toBe(false) + }) + + it("returns true when enabled", () => { + expect(Experiments.isEnabled({ dynamicThinkingEffort: true }, "dynamicThinkingEffort")).toBe(true) + }) + + it("returns false when explicitly disabled", () => { + expect(Experiments.isEnabled({ dynamicThinkingEffort: false }, "dynamicThinkingEffort")).toBe(false) + }) + }) }) diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index ae538b9138..c0d461a454 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -6,6 +6,7 @@ export const EXPERIMENT_IDS = { RUN_SLASH_COMMAND: "runSlashCommand", CUSTOM_TOOLS: "customTools", PARALLEL_TOOL_EXECUTION: "parallelToolExecution", + DYNAMIC_THINKING_EFFORT: "dynamicThinkingEffort", } as const satisfies Record type _AssertExperimentIds = AssertEqual>> @@ -25,6 +26,7 @@ export const experimentConfigsMap: Record = { CUSTOM_TOOLS: { enabled: false }, // TODO: add i18n keys (settings:experimental.PARALLEL_TOOL_EXECUTION.name/.description) in the same PR that sets showInSettings: true PARALLEL_TOOL_EXECUTION: { enabled: false, showInSettings: false }, + DYNAMIC_THINKING_EFFORT: { enabled: false }, } export const experimentDefault = Object.fromEntries( diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx index b31f87dc7e..3feddad1d4 100644 --- a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx @@ -1,4 +1,4 @@ -import { render, screen } from "@testing-library/react" +import { fireEvent, render, screen } from "@testing-library/react" import { experimentDefault } from "@roo/experiments" @@ -32,4 +32,78 @@ describe("ExperimentalSettings", () => { expect(screen.getByText("settings:experimental.CUSTOM_TOOLS.name")).toBeInTheDocument() expect(screen.queryByText("settings:experimental.PARALLEL_TOOL_EXECUTION.name")).not.toBeInTheDocument() }) + + it("renders the dynamic thinking effort toggle", () => { + render() + + expect(screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name")).toBeInTheDocument() + }) + + it("leaves the dynamic thinking effort toggle unchecked when the value is false or omitted", () => { + const getCheckbox = () => { + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + return label?.querySelector("input[type='checkbox']") + } + + // Explicit false + let result = render( + , + ) + expect(getCheckbox()).not.toBeNull() + expect(getCheckbox()).not.toBeChecked() + result.unmount() + + // Omitted (absent from the persisted config) + const omitted: Record = { ...experimentDefault } + delete omitted.dynamicThinkingEffort + result = render() + expect(getCheckbox()).not.toBeNull() + expect(getCheckbox()).not.toBeChecked() + result.unmount() + }) + + it("binds the dynamic thinking effort toggle to setExperimentEnabled", () => { + const setExperimentEnabled = vi.fn() + render( + , + ) + + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + const checkbox = label?.querySelector("input[type='checkbox']") + expect(checkbox).not.toBeNull() + expect(checkbox).toBeChecked() + + fireEvent.click(checkbox!) + + expect(setExperimentEnabled).toHaveBeenCalledTimes(1) + expect(setExperimentEnabled).toHaveBeenCalledWith("dynamicThinkingEffort", false) + }) + + it("toggles the dynamic thinking effort on when clicked from the unchecked state", () => { + const setExperimentEnabled = vi.fn() + render( + , + ) + + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + const checkbox = label?.querySelector("input[type='checkbox']") + expect(checkbox).not.toBeNull() + expect(checkbox).not.toBeChecked() + + fireEvent.click(checkbox!) + + expect(setExperimentEnabled).toHaveBeenCalledTimes(1) + expect(setExperimentEnabled).toHaveBeenCalledWith("dynamicThinkingEffort", true) + }) }) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 762a1290af..8d7b7ee515 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Eines actualitzades correctament", "refreshError": "Error en actualitzar les eines", "toolParameters": "Paràmetres" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esforç de pensament dinàmic", + "description": "Activa l'eina set_thinking_effort perquè el model decideixi el seu esforç de pensament per pas. El control manual al xat sempre està disponible. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index f56984bc73..cbb94b5cee 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tools erfolgreich aktualisiert", "refreshError": "Fehler beim Aktualisieren der Tools", "toolParameters": "Parameter" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamische Denkintensität", + "description": "Aktiviert das set_thinking_effort-Tool, damit das Modell die Denkintensität pro Schritt selbst bestimmt. Die manuelle Anpassung im Chat ist immer verfügbar. (experimentell)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 77f8a4f86d..9839de35d3 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -1055,6 +1055,10 @@ "refreshSuccess": "Tools refreshed successfully", "refreshError": "Failed to refresh tools", "toolParameters": "Parameters" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamic thinking effort", + "description": "Enables the set_thinking_effort tool so the model can decide its thinking effort per step. The manual in-chat control is always available. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index e730483fa0..9556372c04 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Herramientas actualizadas correctamente", "refreshError": "Error al actualizar las herramientas", "toolParameters": "Parámetros" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esfuerzo de pensamiento dinámico", + "description": "Habilita la herramienta set_thinking_effort para que el modelo decida su esfuerzo de pensamiento por paso. El control manual en el chat siempre está disponible. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 78770da21d..2914341df1 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Outils actualisés avec succès", "refreshError": "Échec de l'actualisation des outils", "toolParameters": "Paramètres" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Effort de réflexion dynamique", + "description": "Active l'outil set_thinking_effort afin que le modèle décide de son effort de réflexion à chaque étape. Le contrôle manuel dans le chat est toujours disponible. (expérimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 413d3515bc..9fb8a84a72 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "टूल्स सफलतापूर्वक रिफ्रेश हुए", "refreshError": "टूल्स रिफ्रेश करने में विफल", "toolParameters": "पैरामीटर्स" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "डायनामिक चिंतन प्रयास", + "description": "set_thinking_effort टूल सक्षम करता है ताकि मॉडल हर चरण में अपना चिंतन प्रयास स्वयं तय कर सके। चैट में मैन्युअल नियंत्रण हमेशा उपलब्ध है। (प्रयोगात्मक)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 9b9928da64..682ac9ad55 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tool berhasil direfresh", "refreshError": "Gagal merefresh tool", "toolParameters": "Parameter" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Usaha berpikir dinamis", + "description": "Mengaktifkan alat set_thinking_effort agar model dapat memutuskan usaha berpikirnya per langkah. Kontrol manual di obrolan selalu tersedia. (eksperimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 8a43ec3d35..9ae8f2a8bd 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Strumenti aggiornati con successo", "refreshError": "Impossibile aggiornare gli strumenti", "toolParameters": "Parametri" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Sforzo di pensiero dinamico", + "description": "Abilita lo strumento set_thinking_effort in modo che il modello decida lo sforzo di pensiero per ogni passaggio. Il controllo manuale nella chat è sempre disponibile. (sperimentale)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b2cfbe977e..b824141a95 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "ツールが正常に更新されました", "refreshError": "ツールの更新に失敗しました", "toolParameters": "パラメーター" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "ダイナミック思考強度", + "description": "set_thinking_effort ツールを有効にし、ステップごとにモデルが思考強度を決定できるようにします。チャット内での手動調整は常に利用可能です。(実験的機能)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 1ff9addeb4..c714cf86bf 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "도구가 성공적으로 새로고침되었습니다", "refreshError": "도구 새로고침에 실패했습니다", "toolParameters": "매개변수" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "동적 사고 노력", + "description": "set_thinking_effort 도구를 활성화하여 단계별로 모델이 사고 노력을 결정하도록 합니다. 채팅에서 수동 조정은 항상 사용 가능합니다. (실험적 기능)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 4361d091a1..dfa0c29a7f 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tools succesvol vernieuwd", "refreshError": "Fout bij vernieuwen van tools", "toolParameters": "Parameters" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamisch denkwerk", + "description": "Schakelt het set_thinking_effort-gereedschap in zodat het model per stap het denkwerk zelf kan bepalen. De handmatige aanpassing in het gesprek is altijd beschikbaar. (experimenteel)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 277bcaa470..84e06b68a6 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Narzędzia odświeżone pomyślnie", "refreshError": "Nie udało się odświeżyć narzędzi", "toolParameters": "Parametry" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamiczny wysiłek myślowy", + "description": "Włącza narzędzie set_thinking_effort, aby model samodzielnie decydował o wysiłku myślowym na każdym kroku. Ręczna regulacja w czacie jest zawsze dostępna. (eksperymentalne)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 8ce67bcd48..79e16a6298 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Ferramentas atualizadas com sucesso", "refreshError": "Falha ao atualizar ferramentas", "toolParameters": "Parâmetros" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esforço de pensamento dinâmico", + "description": "Ativa a ferramenta set_thinking_effort para que o modelo decida seu esforço de pensamento em cada etapa. O controle manual na conversa está sempre disponível. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 0ac516c190..e1131173ff 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Инструменты успешно обновлены", "refreshError": "Не удалось обновить инструменты", "toolParameters": "Параметры" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Динамическое усилие размышления", + "description": "Включает инструмент set_thinking_effort, чтобы модель самостоятельно определяла усилие размышления на каждом шаге. Ручное управление в чате всегда доступно. (экспериментальная функция)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 5d3a5cb89a..992ef00800 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Araçlar başarıyla yenilendi", "refreshError": "Araçlar yenilenemedi", "toolParameters": "Parametreler" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dinamik düşünme çabası", + "description": "set_thinking_effort aracını etkinleştirir; böylece model her adımda kendi düşünme çabasını belirler. Sohbetteki manuel kontrol her zaman kullanılabilir. (deneysel)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index adb1be64e3..990db5ebe8 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Làm mới công cụ thành công", "refreshError": "Không thể làm mới công cụ", "toolParameters": "Thông số" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Nỗ lực suy nghĩ động", + "description": "Bật công cụ set_thinking_effort để model tự quyết định nỗ lực suy nghĩ của từng bước. Điều chỉnh thủ công trong trò chuyện luôn khả dụng. (thực nghiệm)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 916f629efe..092ebfb8c3 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "工具刷新成功", "refreshError": "工具刷新失败", "toolParameters": "参数" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "动态思考强度", + "description": "启用 set_thinking_effort 工具,让模型按步骤自行决定思考强度。对话中的手动调整随时可用。 (实验性功能)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index d1f9258dcf..a057fab671 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -1002,6 +1002,10 @@ "refreshSuccess": "工具重新整理成功", "refreshError": "工具重新整理失敗", "toolParameters": "參數" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "動態思考強度", + "description": "啟用 set_thinking_effort 工具,讓模型自行決定每一步的思考強度。對話中的手動調整隨時可用。(實驗性)" } }, "promptCaching": { From 82358bdfcde3fe5c374eb0c219c35386c1bda339 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Fri, 4 Sep 2026 14:46:25 +0800 Subject: [PATCH 02/12] feat(api): per-request thinking effort override and adaptive effort envelope (DTE series 2/5) --- src/api/index.ts | 11 +++- .../dte-effective-reasoning-effort.spec.ts | 58 +++++++++++++++++++ src/api/transform/reasoning.ts | 45 ++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/api/transform/__tests__/dte-effective-reasoning-effort.spec.ts diff --git a/src/api/index.ts b/src/api/index.ts index f45412e32c..ba1f4d7e0a 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -7,6 +7,7 @@ import { retiredProviderIdentifiers, type ProviderSettings, type ModelInfo, + type ReasoningEffortExtended, } from "@roo-code/types" import { getRouterRemovalMessage } from "../core/config/routerRemoval" @@ -115,6 +116,14 @@ export interface ApiHandlerCreateMessageMetadata { * when the user clicks stop, preventing wasted API tokens/compute on the provider side. */ abortSignal?: AbortSignal + /** + * Per-request thinking effort override (DTE series 2/5). + * When defined, takes precedence over the settings-derived `reasoningEffort` + * wherever the effective effort is resolved (see `resolveEffectiveReasoningEffort`). + * Task-scoped and transient: it applies to this request only (the next request + * after being set — no mid-stream effect) and is never persisted to settings. + */ + reasoningEffort?: ReasoningEffortExtended } export interface ApiHandler { @@ -236,7 +245,7 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler { case providerIdentifiers.poe: return new PoeHandler(options) case providerIdentifiers.geminiCli: - // Intentionally falls through to the Anthropic handler pending a dedicated Gemini CLI handler implementation. + // Intentionally falls through to the Anthropic handler pending a dedicated Gemini CLI handler implementation. default: return new AnthropicHandler(options) } diff --git a/src/api/transform/__tests__/dte-effective-reasoning-effort.spec.ts b/src/api/transform/__tests__/dte-effective-reasoning-effort.spec.ts new file mode 100644 index 0000000000..f126cae97c --- /dev/null +++ b/src/api/transform/__tests__/dte-effective-reasoning-effort.spec.ts @@ -0,0 +1,58 @@ +// npx vitest run src/api/transform/__tests__/dte-effective-reasoning-effort.spec.ts + +import { ADAPTIVE_OUTPUT_CONFIG_EFFORTS, resolveEffectiveReasoningEffort } from "../reasoning" + +describe("DTE series 2/5 — resolveEffectiveReasoningEffort", () => { + const settingsEffort = "high" + const modelDefault = "medium" + + it("returns the per-request override when present (strongest precedence)", () => { + expect( + resolveEffectiveReasoningEffort({ + override: "xhigh", + settingsReasoningEffort: settingsEffort, + modelDefaultEffort: modelDefault, + }), + ).toBe("xhigh") + }) + + it("lets the override win even when it is out-of-range for the adaptive envelope", () => { + // "minimal" is a valid override value but outside the adaptive envelope set; + // resolution still returns it — envelope gating is the caller's concern. + expect( + resolveEffectiveReasoningEffort({ + override: "minimal", + settingsReasoningEffort: settingsEffort, + modelDefaultEffort: modelDefault, + }), + ).toBe("minimal") + }) + + it("falls back to the settings value when no override is present", () => { + expect( + resolveEffectiveReasoningEffort({ settingsReasoningEffort: "low", modelDefaultEffort: modelDefault }), + ).toBe("low") + }) + + it("preserves the settings 'disable' sentinel when no override is present", () => { + expect( + resolveEffectiveReasoningEffort({ settingsReasoningEffort: "disable", modelDefaultEffort: modelDefault }), + ).toBe("disable") + }) + + it("an explicit override wins over a settings 'disable' sentinel", () => { + expect(resolveEffectiveReasoningEffort({ override: "low", settingsReasoningEffort: "disable" })).toBe("low") + }) + + it("falls back to the model default when neither override nor settings is set", () => { + expect(resolveEffectiveReasoningEffort({ modelDefaultEffort: "low" })).toBe("low") + }) + + it("returns undefined when nothing is set", () => { + expect(resolveEffectiveReasoningEffort({})).toBeUndefined() + }) + + it("exposes exactly the in-range adaptive envelope efforts", () => { + expect([...ADAPTIVE_OUTPUT_CONFIG_EFFORTS]).toEqual(["low", "medium", "high", "xhigh", "max"]) + }) +}) diff --git a/src/api/transform/reasoning.ts b/src/api/transform/reasoning.ts index c51111125a..14bdaba889 100644 --- a/src/api/transform/reasoning.ts +++ b/src/api/transform/reasoning.ts @@ -22,6 +22,51 @@ export type AnthropicProviderReasoningParams = AnthropicReasoningParams | { type export type OpenAiReasoningParams = { reasoning_effort: OpenAI.Chat.ChatCompletionCreateParams["reasoning_effort"] } +/** + * DTE series 2/5 — effort levels accepted by the Claude 4.7+ adaptive-thinking + * `output_config.effort` envelope. Efforts outside this set (e.g. "none", + * "minimal", "disable") omit the envelope so the API applies its own default. + */ +export const ADAPTIVE_OUTPUT_CONFIG_EFFORTS: readonly ReasoningEffortExtended[] = [ + "low", + "medium", + "high", + "xhigh", + "max", +] + +/** + * DTE series 2/5 — resolves the effective thinking effort for a single request. + * + * Resolution order (strongest first): + * 1. `override` — the per-request task-local effort + * (`ApiHandlerCreateMessageMetadata.reasoningEffort`), + * 2. `settingsReasoningEffort` — the settings-derived value, + * 3. `modelDefaultEffort` — the model's default effort. + * + * This is the single shared resolution point for the per-request override: + * providers that resolve the effective effort through it inherit the override + * without duplicating precedence logic. The override is transient (next request + * only) and never persisted to settings. + */ +export const resolveEffectiveReasoningEffort = ({ + override, + settingsReasoningEffort, + modelDefaultEffort, +}: { + override?: ReasoningEffortExtended + settingsReasoningEffort?: ReasoningEffortExtended | "disable" + modelDefaultEffort?: ReasoningEffortExtended +}): ReasoningEffortExtended | "disable" | undefined => { + if (override !== undefined) { + return override + } + if (settingsReasoningEffort !== undefined) { + return settingsReasoningEffort + } + return modelDefaultEffort +} + // Valid Gemini thinking levels for effort-based reasoning const GEMINI_THINKING_LEVELS = ["minimal", "low", "medium", "high"] as const From 4075c8a7513b7cc05d7006eca0d18a47083e4336 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Fri, 4 Sep 2026 15:05:18 +0800 Subject: [PATCH 03/12] feat(task): task-local runtime thinking effort state with per-request override (DTE series 2/5) - Task: setRuntimeThinkingEffort/getRuntimeThinkingEffort with in-memory apiConfiguration merge/restore; per-request metadata at all four createMessage sites; profile-switch re-capture in updateApiConfiguration - Transient state only: never persisted to settings or history - Tests: 8 focused vitest cases (state machine, profile switch, metadata fragment, non-persistence) Part of #35 (DTE-v2 ship plan, unit 3/5). --- src/core/task/Task.ts | 97 +++++- .../Task.runtime-thinking-effort.test.ts | 301 ++++++++++++++++++ 2 files changed, 397 insertions(+), 1 deletion(-) create mode 100644 src/core/task/__tests__/Task.runtime-thinking-effort.test.ts diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 37281a9010..d5e4a08b79 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -22,6 +22,7 @@ import { type TaskMetadata, type TaskEvents, type ProviderSettings, + type ReasoningEffortExtended, type TokenUsage, type ToolUsage, type ToolName, @@ -318,6 +319,13 @@ export class Task extends EventEmitter implements TaskLike { // API apiConfiguration: ProviderSettings api: ApiHandler + // DTE series 2/5: task-local thinking effort override. Transient per-task state — + // never persisted to settings; cleared on dispose (see dispose()). + private runtimeThinkingEffort?: ReasoningEffortExtended + private runtimeThinkingEffortSource?: string + // Settings-derived effort captured when the override activates, so clearing + // (undefined) restores it in the in-memory apiConfiguration copy. + private preOverrideReasoningEffort?: ProviderSettings["reasoningEffort"] private rateLimitClock: RateLimitClock private autoApprovalHandler: AutoApprovalHandler @@ -1630,14 +1638,89 @@ export class Task extends EventEmitter implements TaskLike { * Updates the API configuration and rebuilds the API handler. * There is no tool-protocol switching or tool parser swapping. * + * DTE series 2/5: when a task-local thinking effort override is active + * (`setRuntimeThinkingEffort`), the incoming configuration's `reasoningEffort` + * becomes the new restore value and the override is re-applied on top of the + * fresh in-memory copy — clearing the override later restores the NEW profile's + * value, not a stale one. + * * @param newApiConfiguration - The new API configuration to use */ public updateApiConfiguration(newApiConfiguration: ProviderSettings): void { // Update the configuration and rebuild the API handler - this.apiConfiguration = newApiConfiguration + if (this.runtimeThinkingEffort !== undefined) { + // DTE series 2/5: a task-local override is active, so re-capture the + // incoming profile's value as the restore value and re-apply the + // override on top of the new in-memory copy — clearing the override + // must restore the NEW profile's value, not the stale one. + this.preOverrideReasoningEffort = newApiConfiguration.reasoningEffort + this.apiConfiguration = { ...newApiConfiguration, reasoningEffort: this.runtimeThinkingEffort } + } else { + this.apiConfiguration = newApiConfiguration + } + this.api = buildApiHandler(this.apiConfiguration) + } + + /** + * DTE series 2/5: sets — or clears with `undefined` — the task-local thinking + * effort override. + * + * Resolution order for the affected requests (strongest first): this + * task-local override → settings `reasoningEffort` → model default. The + * override applies to the NEXT API request only (no mid-stream effect): it is + * passed per request as `metadata.reasoningEffort` and, while active, is + * merged into the in-memory `apiConfiguration` copy (profile-switch / + * `updateApiConfiguration` precedent) so the rebuilt handler reflects it too. + * `undefined` clears the override and restores the settings-derived value in + * the copy. Nothing is ever written to persisted settings. + * + * @param effort - The task-local effort, or `undefined` to clear. + * @param source - Optional provenance label (UI wiring lands in a later PR). + */ + public setRuntimeThinkingEffort(effort: ReasoningEffortExtended | undefined, source?: string): void { + const wasActive = this.runtimeThinkingEffort !== undefined + this.runtimeThinkingEffort = effort + this.runtimeThinkingEffortSource = effort === undefined ? undefined : source + + if (effort !== undefined) { + // Capture the settings-derived value once so clearing can restore it. + if (!wasActive) { + this.preOverrideReasoningEffort = this.apiConfiguration.reasoningEffort + } + // Merge into the in-memory copy (never the persisted settings object). + this.apiConfiguration = { ...this.apiConfiguration, reasoningEffort: effort } + } else if (wasActive) { + // Restore the settings-derived value captured when the override activated. + this.apiConfiguration = { ...this.apiConfiguration, reasoningEffort: this.preOverrideReasoningEffort } + this.preOverrideReasoningEffort = undefined + } else { + // Already inactive: nothing to clear. + return + } + + // Rebuild the handler from the updated copy so the next request uses it. this.api = buildApiHandler(this.apiConfiguration) } + /** + * DTE series 2/5: reads the current task-local thinking effort override. + */ + public getRuntimeThinkingEffort(): { effort?: ReasoningEffortExtended; source?: string } { + return { + effort: this.runtimeThinkingEffort, + source: this.runtimeThinkingEffortSource, + } + } + + /** + * DTE series 2/5: metadata fragment carrying the active task-local effort + * override on a single request. Empty when no override is active, so the + * existing settings resolution applies unchanged. + */ + private getRuntimeThinkingEffortMetadata(): Pick { + return this.runtimeThinkingEffort !== undefined ? { reasoningEffort: this.runtimeThinkingEffort } : {} + } + public async submitUserMessage( text: string, images?: string[], @@ -1754,6 +1837,8 @@ export class Task extends EventEmitter implements TaskLike { parallelToolCalls: true, } : {}), + // DTE series 2/5: carry the active task-local effort override. + ...this.getRuntimeThinkingEffortMetadata(), } // Generate environment details to include in the condensed summary const environmentDetails = await getEnvironmentDetails(this, true) @@ -2514,6 +2599,10 @@ export class Task extends EventEmitter implements TaskLike { } } + /** + * Centralized task teardown: releases task resources and resets transient + * task-local state. + */ public dispose(): void { console.log(`[Task#dispose] disposing task ${this.taskId}.${this.instanceId}`) @@ -4177,6 +4266,8 @@ export class Task extends EventEmitter implements TaskLike { parallelToolCalls: true, } : {}), + // DTE series 2/5: carry the active task-local effort override. + ...this.getRuntimeThinkingEffortMetadata(), } try { @@ -4403,6 +4494,8 @@ export class Task extends EventEmitter implements TaskLike { parallelToolCalls: true, } : {}), + // DTE series 2/5: carry the active task-local effort override. + ...this.getRuntimeThinkingEffortMetadata(), } // Only generate environment details when context management will actually run. @@ -4568,6 +4661,8 @@ export class Task extends EventEmitter implements TaskLike { taskId: this.taskId, suppressPreviousResponseId: this.skipPrevResponseIdOnce, abortSignal, + // DTE series 2/5: carry the active task-local effort override for this request. + ...this.getRuntimeThinkingEffortMetadata(), // Include tools whenever they are present. ...(shouldIncludeTools ? { diff --git a/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts b/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts new file mode 100644 index 0000000000..0800fadbd9 --- /dev/null +++ b/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts @@ -0,0 +1,301 @@ +// npx vitest run src/core/task/__tests__/Task.runtime-thinking-effort.test.ts +// +// DTE series 2/5 — task-local thinking effort state on Task: +// setRuntimeThinkingEffort / getRuntimeThinkingEffort, the in-memory +// apiConfiguration merge + restore. + +import { ProviderSettings, type ReasoningEffortExtended } from "@roo-code/types" +import { providerIdentifiers } from "@roo-code/types/provider-identifiers" + +import { Task } from "../Task" +import { ClineProvider } from "../../webview/ClineProvider" +import { buildApiHandler } from "../../../api" + +// Mock dependencies (same lightweight set as Task.throttle.test.ts) +vi.mock("../../webview/ClineProvider") +vi.mock("../../../integrations/terminal/TerminalRegistry", () => ({ + TerminalRegistry: { + releaseTerminalsForTask: vi.fn(), + }, +})) +vi.mock("../../ignore/RooIgnoreController") +vi.mock("../../protect/RooProtectedController") +vi.mock("../../context-tracking/FileContextTracker") +vi.mock("../../../integrations/editor/DiffViewProvider") +vi.mock("../../tools/ToolRepetitionDetector") +vi.mock("../../../api", () => ({ + // Returns a fresh handler object per call so tests can assert on the exact + // configuration each rebuild received (via vi.mocked(buildApiHandler).mock.calls). + buildApiHandler: vi.fn((configuration: { apiModelId?: string }) => ({ + getModel: () => ({ info: {}, id: configuration.apiModelId ?? "test-model" }), + })), +})) + +// Mock TelemetryService +vi.mock("@roo-code/telemetry", () => ({ + TelemetryService: { + instance: { + captureTaskCreated: vi.fn(), + captureTaskRestarted: vi.fn(), + }, + }, +})) + +// Mock task persistence to avoid disk writes +vi.mock("../../task-persistence", async (importOriginal) => ({ + ...(await importOriginal()), + readApiMessages: vi.fn().mockResolvedValue([]), + saveApiMessages: vi.fn().mockResolvedValue(undefined), + readTaskMessages: vi.fn().mockResolvedValue([]), + saveTaskMessages: vi.fn().mockResolvedValue(undefined), + taskMetadata: vi.fn().mockResolvedValue({ + historyItem: { + id: "test-task-id", + number: 1, + task: "Test task", + ts: Date.now(), + totalCost: 0.01, + tokensIn: 100, + tokensOut: 50, + }, + tokenUsage: { + totalTokensIn: 100, + totalTokensOut: 50, + totalCost: 0.01, + contextTokens: 150, + totalCacheWrites: 0, + totalCacheReads: 0, + }, + }), +})) + +// Typed access to the intentionally-private DTE state, mirroring the +// getTaskTestAccess pattern in Task.spec.ts (single double assertion, documented). +type RuntimeThinkingEffortAccess = { + runtimeThinkingEffort?: ReasoningEffortExtended + runtimeThinkingEffortSource?: string + preOverrideReasoningEffort?: ProviderSettings["reasoningEffort"] + getRuntimeThinkingEffortMetadata: () => { reasoningEffort?: ReasoningEffortExtended } +} + +function getPrivateAccess(task: Task): RuntimeThinkingEffortAccess { + return task as unknown as RuntimeThinkingEffortAccess +} + +const SETTINGS_EFFORT: ReasoningEffortExtended = "low" + +describe("Task runtime thinking effort (DTE series 2/5)", () => { + let mockProvider: Record + let mockApiConfiguration: ProviderSettings + let task: Task + + beforeEach(() => { + vi.clearAllMocks() + vi.useFakeTimers() + + mockProvider = { + context: { + globalStorageUri: { fsPath: "/test/path" }, + }, + getState: vi.fn().mockResolvedValue({ mode: "code" }), + log: vi.fn(), + postStateToWebview: vi.fn().mockResolvedValue(undefined), + postStateToWebviewWithoutTaskHistory: vi.fn().mockResolvedValue(undefined), + postStateToWebviewThrottled: vi.fn().mockResolvedValue(undefined), + flushPostStateToWebviewThrottled: vi.fn().mockResolvedValue(undefined), + updateTaskHistory: vi.fn().mockResolvedValue(undefined), + } + + mockApiConfiguration = { + apiProvider: providerIdentifiers.anthropic, + apiModelId: "claude-opus-4-7", + apiKey: "test-key", + reasoningEffort: SETTINGS_EFFORT, + } as ProviderSettings + + // mockProvider is a minimal structural double (ClineProvider is auto-mocked + // by the vi.mock above); the task only touches the members supplied here. + task = new Task({ + provider: mockProvider as unknown as ClineProvider, + apiConfiguration: mockApiConfiguration, + startTask: false, + }) + }) + + afterEach(() => { + vi.useRealTimers() + if (task && !task.abort) { + task.dispose() + } + }) + + describe("setRuntimeThinkingEffort", () => { + it("stores effort + source, merges into the in-memory apiConfiguration, and rebuilds the handler", () => { + task.setRuntimeThinkingEffort("xhigh", "test-source") + + expect(task.getRuntimeThinkingEffort()).toEqual({ effort: "xhigh", source: "test-source" }) + expect(getPrivateAccess(task).runtimeThinkingEffort).toBe("xhigh") + expect(getPrivateAccess(task).runtimeThinkingEffortSource).toBe("test-source") + + // The in-memory copy carries the override... + expect(task.apiConfiguration).toEqual( + expect.objectContaining({ + apiProvider: providerIdentifiers.anthropic, + apiKey: "test-key", + reasoningEffort: "xhigh", + }), + ) + // ...without mutating the settings object the provider handed in. + expect(mockApiConfiguration).toEqual( + expect.objectContaining({ + reasoningEffort: SETTINGS_EFFORT, + }), + ) + // The handler is rebuilt from the merged copy (last build call). + const lastCall = vi.mocked(buildApiHandler).mock.calls.at(-1) + expect(lastCall?.[0]).toEqual(expect.objectContaining({ reasoningEffort: "xhigh" })) + // The merged copy is a fresh object, not the settings object. + expect(lastCall?.[0]).not.toBe(mockApiConfiguration) + }) + + it("does not re-capture the settings value when re-set while active", () => { + task.setRuntimeThinkingEffort("high", "first") + task.setRuntimeThinkingEffort("medium", "second") + + expect(task.getRuntimeThinkingEffort()).toEqual({ effort: "medium", source: "second" }) + // The settings-derived value captured at first activation is preserved. + expect(getPrivateAccess(task).preOverrideReasoningEffort).toBe(SETTINGS_EFFORT) + + // Clearing restores the original settings value, not the intermediate one. + task.setRuntimeThinkingEffort(undefined) + expect(task.apiConfiguration.reasoningEffort).toBe(SETTINGS_EFFORT) + }) + + it("restores the settings-derived effort when cleared with undefined", () => { + task.setRuntimeThinkingEffort("max") + expect(task.apiConfiguration.reasoningEffort).toBe("max") + + // A label passed on the clearing call must not survive into source. + task.setRuntimeThinkingEffort(undefined, "stale-source") + + expect(task.getRuntimeThinkingEffort()).toEqual({ effort: undefined, source: undefined }) + expect(task.apiConfiguration.reasoningEffort).toBe(SETTINGS_EFFORT) + // The rest of the configuration is preserved through the restore. + expect(task.apiConfiguration).toEqual( + expect.objectContaining({ + apiProvider: providerIdentifiers.anthropic, + apiModelId: "claude-opus-4-7", + apiKey: "test-key", + }), + ) + // The handler is rebuilt from the restored copy. + const lastCall = vi.mocked(buildApiHandler).mock.calls.at(-1) + expect(lastCall?.[0]).toEqual(expect.objectContaining({ reasoningEffort: SETTINGS_EFFORT })) + }) + + it("is a no-op when cleared while inactive (no handler rebuild)", () => { + const callsBefore = vi.mocked(buildApiHandler).mock.calls.length + + task.setRuntimeThinkingEffort(undefined) + + expect(vi.mocked(buildApiHandler).mock.calls.length).toBe(callsBefore) + expect(task.getRuntimeThinkingEffort()).toEqual({ effort: undefined, source: undefined }) + expect(task.apiConfiguration).toBe(mockApiConfiguration) + }) + + it("never writes to the provider or persisted settings", () => { + task.setRuntimeThinkingEffort("xhigh") + task.setRuntimeThinkingEffort(undefined) + + // Nothing is posted to the webview and the handed-in settings object is intact. + expect(mockProvider.postStateToWebview).not.toHaveBeenCalled() + expect(mockApiConfiguration).toEqual( + expect.objectContaining({ + apiProvider: providerIdentifiers.anthropic, + apiModelId: "claude-opus-4-7", + apiKey: "test-key", + reasoningEffort: SETTINGS_EFFORT, + }), + ) + }) + }) + + describe("updateApiConfiguration while an override is active", () => { + it("re-captures the incoming profile's effort as the restore value and keeps the override applied", () => { + task.setRuntimeThinkingEffort("xhigh", "test-source") + + // A profile switch lands a different settings-derived effort while the override is active. + const newConfig = { + apiProvider: providerIdentifiers.anthropic, + apiModelId: "claude-opus-4-8", + apiKey: "test-key-2", + reasoningEffort: "medium", + } as ProviderSettings + task.updateApiConfiguration(newConfig) + + // The override still wins in the in-memory copy... + expect(task.apiConfiguration).toEqual( + expect.objectContaining({ + apiModelId: "claude-opus-4-8", + apiKey: "test-key-2", + reasoningEffort: "xhigh", + }), + ) + // ...the override remains active... + expect(task.getRuntimeThinkingEffort()).toEqual({ effort: "xhigh", source: "test-source" }) + // ...and the NEW profile's value is now the restore target. + expect(getPrivateAccess(task).preOverrideReasoningEffort).toBe("medium") + // The handler was rebuilt from the merged new copy. + const lastCall = vi.mocked(buildApiHandler).mock.calls.at(-1) + expect(lastCall?.[0]).toEqual( + expect.objectContaining({ apiModelId: "claude-opus-4-8", reasoningEffort: "xhigh" }), + ) + expect(lastCall?.[0]).not.toBe(newConfig) + + // Clearing restores the NEW profile's effort, not the stale original one. + task.setRuntimeThinkingEffort(undefined) + expect(task.apiConfiguration.reasoningEffort).toBe("medium") + expect(task.apiConfiguration).toEqual( + expect.objectContaining({ + apiModelId: "claude-opus-4-8", + apiKey: "test-key-2", + }), + ) + const lastCallAfterClear = vi.mocked(buildApiHandler).mock.calls.at(-1) + expect(lastCallAfterClear?.[0]).toEqual(expect.objectContaining({ reasoningEffort: "medium" })) + }) + + it("replaces the configuration as usual while inactive", () => { + const newConfig = { + apiProvider: providerIdentifiers.anthropic, + apiModelId: "claude-opus-4-8", + apiKey: "test-key-2", + reasoningEffort: "medium", + } as ProviderSettings + + task.updateApiConfiguration(newConfig) + + expect(task.apiConfiguration).toBe(newConfig) + expect(task.apiConfiguration.reasoningEffort).toBe("medium") + const lastCall = vi.mocked(buildApiHandler).mock.calls.at(-1) + expect(lastCall?.[0]).toBe(newConfig) + }) + }) + + describe("request metadata fragment", () => { + it("is empty while inactive and carries the override while active", () => { + // Key absence, not toEqual({}): toEqual ignores keys whose value is undefined, + // so only an absence assertion kills the always-consequent metadata mutant. + expect(getPrivateAccess(task).getRuntimeThinkingEffortMetadata()).not.toHaveProperty("reasoningEffort") + + task.setRuntimeThinkingEffort("high") + expect(getPrivateAccess(task).getRuntimeThinkingEffortMetadata()).toEqual({ reasoningEffort: "high" }) + + task.setRuntimeThinkingEffort("low") + expect(getPrivateAccess(task).getRuntimeThinkingEffortMetadata()).toEqual({ reasoningEffort: "low" }) + + task.setRuntimeThinkingEffort(undefined) + expect(getPrivateAccess(task).getRuntimeThinkingEffortMetadata()).not.toHaveProperty("reasoningEffort") + }) + }) +}) From 710bf6134a6698a26715288151baaabb5a6732e3 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Fri, 4 Sep 2026 10:21:22 +0800 Subject: [PATCH 04/12] feat(settings): dynamic thinking effort experimental toggle (DTE-1) --- .../types/src/__tests__/experiment.test.ts | 19 +++++ packages/types/src/experiment.ts | 2 + scripts/stryker-diff.mjs | 10 ++- scripts/stryker-diff.test.mjs | 7 +- .../webview/__tests__/ClineProvider.spec.ts | 32 ++++++++ .../__tests__/webviewMessageHandler.spec.ts | 55 +++++++++++++ src/shared/__tests__/experiments.spec.ts | 29 ++++++- src/shared/experiments.ts | 2 + webview-ui/playwright/gallery/stories.tsx | 5 ++ .../__tests__/ExperimentalSettings.spec.tsx | 76 +++++++++++++++++- .../ExperimentalSettings.visual.fixture.tsx | 28 +++++++ .../__tests__/ExperimentalSettings.visual.tsx | 12 +++ .../experimental-settings-dark.png | Bin 0 -> 40449 bytes ...erimental-settings-high-contrast-light.png | Bin 0 -> 41457 bytes .../experimental-settings-high-contrast.png | Bin 0 -> 41675 bytes .../experimental-settings-light.png | Bin 0 -> 41449 bytes webview-ui/src/i18n/locales/ca/settings.json | 4 + webview-ui/src/i18n/locales/de/settings.json | 4 + webview-ui/src/i18n/locales/en/settings.json | 4 + webview-ui/src/i18n/locales/es/settings.json | 4 + webview-ui/src/i18n/locales/fr/settings.json | 4 + webview-ui/src/i18n/locales/hi/settings.json | 4 + webview-ui/src/i18n/locales/id/settings.json | 4 + webview-ui/src/i18n/locales/it/settings.json | 4 + webview-ui/src/i18n/locales/ja/settings.json | 4 + webview-ui/src/i18n/locales/ko/settings.json | 4 + webview-ui/src/i18n/locales/nl/settings.json | 4 + webview-ui/src/i18n/locales/pl/settings.json | 4 + .../src/i18n/locales/pt-BR/settings.json | 4 + webview-ui/src/i18n/locales/ru/settings.json | 4 + webview-ui/src/i18n/locales/tr/settings.json | 4 + webview-ui/src/i18n/locales/vi/settings.json | 4 + .../src/i18n/locales/zh-CN/settings.json | 4 + .../src/i18n/locales/zh-TW/settings.json | 4 + 34 files changed, 343 insertions(+), 6 deletions(-) create mode 100644 packages/types/src/__tests__/experiment.test.ts create mode 100644 webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx create mode 100644 webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-dark.png create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast-light.png create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast.png create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-light.png diff --git a/packages/types/src/__tests__/experiment.test.ts b/packages/types/src/__tests__/experiment.test.ts new file mode 100644 index 0000000000..0ef4ed2e02 --- /dev/null +++ b/packages/types/src/__tests__/experiment.test.ts @@ -0,0 +1,19 @@ +import { experimentIds, experimentIdsSchema, experimentsSchema } from "../experiment.js" + +describe("dynamicThinkingEffort experiment", () => { + it("is part of the experiment id enum", () => { + expect(experimentIds).toContain("dynamicThinkingEffort") + expect(experimentIdsSchema.safeParse("dynamicThinkingEffort").success).toBe(true) + }) + + it("parses enabled and disabled states", () => { + expect(experimentsSchema.parse({ dynamicThinkingEffort: true })).toEqual({ dynamicThinkingEffort: true }) + expect(experimentsSchema.parse({ dynamicThinkingEffort: false })).toEqual({ dynamicThinkingEffort: false }) + expect(experimentsSchema.parse({})).toEqual({}) + }) + + it("rejects non-boolean values", () => { + expect(experimentsSchema.safeParse({ dynamicThinkingEffort: "yes" }).success).toBe(false) + expect(experimentIdsSchema.safeParse("dynamic-thinking-effort").success).toBe(false) + }) +}) diff --git a/packages/types/src/experiment.ts b/packages/types/src/experiment.ts index 5d511859b1..f4b3a1c0a8 100644 --- a/packages/types/src/experiment.ts +++ b/packages/types/src/experiment.ts @@ -12,6 +12,7 @@ export const experimentIds = [ "runSlashCommand", "customTools", "parallelToolExecution", + "dynamicThinkingEffort", ] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -28,6 +29,7 @@ export const experimentsSchema = z.object({ runSlashCommand: z.boolean().optional(), customTools: z.boolean().optional(), parallelToolExecution: z.boolean().optional(), + dynamicThinkingEffort: z.boolean().optional(), }) export type Experiments = z.infer diff --git a/scripts/stryker-diff.mjs b/scripts/stryker-diff.mjs index c0e8a6cd1a..e46afb22ab 100644 --- a/scripts/stryker-diff.mjs +++ b/scripts/stryker-diff.mjs @@ -51,8 +51,14 @@ export const PACKAGE_CONFIGS = [ root: "src", sourceRoot: "src/", vitestConfig: "vitest.config.ts", - vitestRelated: false, - discoverRelatedTests: true, + // Use plugin-side related-test discovery: with an explicit STRYKER_TEST_FILES + // list, stryker-js 10.0.0 plans static mutants with runtime activation + // (stryker-mutator/stryker-js#6144, #6209), which the vitest plugin can only + // apply after top-level code has run, producing false Survived results. + // Revert to vitestRelated: false / discoverRelatedTests: true once the + // upstream planner fix lands. + vitestRelated: true, + discoverRelatedTests: false, excludedPaths: ["src/esbuild.mjs", "src/eslint.config.mjs", "src/utils/vitest-verbosity.ts"], }, ] diff --git a/scripts/stryker-diff.test.mjs b/scripts/stryker-diff.test.mjs index 0f39dc507f..b86f5f3e96 100644 --- a/scripts/stryker-diff.test.mjs +++ b/scripts/stryker-diff.test.mjs @@ -129,8 +129,11 @@ describe("buildManifest", () => { assert.equal(webview.runRoot, ".") assert.equal(webview.discoverRelatedTests, true) assert.equal(webview.vitestRelated, false) - assert.equal(extension.discoverRelatedTests, true) - assert.equal(extension.vitestRelated, false) + // The extension entry uses plugin-side related discovery while stryker-js 10.0.0 + // plans static mutants with runtime activation when given explicit test files + // (stryker-mutator/stryker-js#6144, #6209); see the entry comment in stryker-diff.mjs. + assert.equal(extension.discoverRelatedTests, false) + assert.equal(extension.vitestRelated, true) }) it("returns no packages for tests, barrels, unsupported packages, and type-only changes", () => { diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index ad6ea143a8..9249140353 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1439,6 +1439,38 @@ describe("ClineProvider", () => { expect(state.destructiveCommandGuardEnabled).toBe(false) }) + test("getStateToPostToWebview returns the saved dynamicThinkingEffort experiment when enabled", async () => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("experiments", { + ...experimentDefault, + dynamicThinkingEffort: true, + }) + + const state = await provider.getStateToPostToWebview() + + expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: true }) + }) + + test("getStateToPostToWebview returns the saved dynamicThinkingEffort experiment when explicitly disabled", async () => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("experiments", { + ...experimentDefault, + dynamicThinkingEffort: false, + }) + + const state = await provider.getStateToPostToWebview() + + expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: false }) + }) + + test("getStateToPostToWebview defaults dynamicThinkingEffort to false when experiments are unset", async () => { + await provider.resolveWebviewView(mockWebviewView) + + const state = await provider.getStateToPostToWebview() + + expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: false }) + }) + test("language is set to VSCode language", async () => { // Mock VSCode language as Spanish ;(vscode.env as any).language = "pt-BR" diff --git a/src/core/webview/__tests__/webviewMessageHandler.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.spec.ts index 4c2a301965..bbbb6852e7 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.spec.ts @@ -73,6 +73,7 @@ import type { ModelRecord } from "@roo-code/types" import { webviewMessageHandler } from "../webviewMessageHandler" import type { ClineProvider } from "../ClineProvider" +import { experimentDefault } from "../../../shared/experiments" import { flushModels, getModels } from "../../../api/providers/fetchers/modelCache" import { getLMStudioModels } from "../../../api/providers/fetchers/lmstudio" import { getCommands } from "../../../services/command/commands" @@ -2273,3 +2274,57 @@ describe("webviewMessageHandler - telemetrySetting", () => { expect(TelemetryService.instance.updateTelemetryState).not.toHaveBeenCalled() }) }) + +describe("webviewMessageHandler - experiments", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("persists dynamicThinkingEffort true merged with the saved experiments", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockImplementation((key: string) => + key === "experiments" ? { preventFocusDisruption: true } : undefined, + ) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { experiments: { dynamicThinkingEffort: true } }, + }) + + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("experiments", { + preventFocusDisruption: true, + dynamicThinkingEffort: true, + }) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }) + + it("persists dynamicThinkingEffort false over a previously enabled value", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockImplementation((key: string) => + key === "experiments" ? { dynamicThinkingEffort: true } : undefined, + ) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { experiments: { dynamicThinkingEffort: false } }, + }) + + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("experiments", { + dynamicThinkingEffort: false, + }) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }) + + it("persists the experiment defaults when no experiments are saved yet", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockReturnValue(undefined) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { experiments: {} }, + }) + + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("experiments", { + ...experimentDefault, + dynamicThinkingEffort: false, + }) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/shared/__tests__/experiments.spec.ts b/src/shared/__tests__/experiments.spec.ts index f2261a5c09..b6e8993df4 100644 --- a/src/shared/__tests__/experiments.spec.ts +++ b/src/shared/__tests__/experiments.spec.ts @@ -2,7 +2,7 @@ import type { ExperimentId } from "@roo-code/types" -import { EXPERIMENT_IDS, experimentConfigsMap, experiments as Experiments } from "../experiments" +import { EXPERIMENT_IDS, experimentConfigsMap, experimentDefault, experiments as Experiments } from "../experiments" describe("experiments", () => { describe("PREVENT_FOCUS_DISRUPTION", () => { @@ -22,6 +22,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(false) }) @@ -33,6 +34,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(true) }) @@ -44,6 +46,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(false) }) @@ -66,4 +69,28 @@ describe("experiments", () => { expect(Experiments.isEnabled({ parallelToolExecution: true }, "parallelToolExecution")).toBe(true) }) }) + + describe("DYNAMIC_THINKING_EFFORT", () => { + it("is configured correctly", () => { + expect(EXPERIMENT_IDS.DYNAMIC_THINKING_EFFORT).toBe("dynamicThinkingEffort") + expect(experimentConfigsMap.DYNAMIC_THINKING_EFFORT).toMatchObject({ + enabled: false, + }) + // Visible in the Settings panel (showInSettings defaults to true). + expect(experimentConfigsMap.DYNAMIC_THINKING_EFFORT.showInSettings).toBeUndefined() + }) + + it("is disabled by default", () => { + expect(experimentDefault.dynamicThinkingEffort).toBe(false) + expect(Experiments.isEnabled({}, "dynamicThinkingEffort")).toBe(false) + }) + + it("returns true when enabled", () => { + expect(Experiments.isEnabled({ dynamicThinkingEffort: true }, "dynamicThinkingEffort")).toBe(true) + }) + + it("returns false when explicitly disabled", () => { + expect(Experiments.isEnabled({ dynamicThinkingEffort: false }, "dynamicThinkingEffort")).toBe(false) + }) + }) }) diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index ae538b9138..c0d461a454 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -6,6 +6,7 @@ export const EXPERIMENT_IDS = { RUN_SLASH_COMMAND: "runSlashCommand", CUSTOM_TOOLS: "customTools", PARALLEL_TOOL_EXECUTION: "parallelToolExecution", + DYNAMIC_THINKING_EFFORT: "dynamicThinkingEffort", } as const satisfies Record type _AssertExperimentIds = AssertEqual>> @@ -25,6 +26,7 @@ export const experimentConfigsMap: Record = { CUSTOM_TOOLS: { enabled: false }, // TODO: add i18n keys (settings:experimental.PARALLEL_TOOL_EXECUTION.name/.description) in the same PR that sets showInSettings: true PARALLEL_TOOL_EXECUTION: { enabled: false, showInSettings: false }, + DYNAMIC_THINKING_EFFORT: { enabled: false }, } export const experimentDefault = Object.fromEntries( diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 52ec5c2ce5..e047f1c32d 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -162,6 +162,11 @@ export const stories: Record = { const { UISettingsStory } = await import("@/components/settings/__tests__/UISettings.visual.fixture") return }, + "experimental-settings": async () => { + const { ExperimentalSettingsStory } = + await import("@/components/settings/__tests__/ExperimentalSettings.visual.fixture") + return + }, "ui-settings-long-locale": async () => { const [{ UISettingsStory }, { default: i18next }] = await Promise.all([ import("@/components/settings/__tests__/UISettings.visual.fixture"), diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx index b31f87dc7e..3feddad1d4 100644 --- a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx @@ -1,4 +1,4 @@ -import { render, screen } from "@testing-library/react" +import { fireEvent, render, screen } from "@testing-library/react" import { experimentDefault } from "@roo/experiments" @@ -32,4 +32,78 @@ describe("ExperimentalSettings", () => { expect(screen.getByText("settings:experimental.CUSTOM_TOOLS.name")).toBeInTheDocument() expect(screen.queryByText("settings:experimental.PARALLEL_TOOL_EXECUTION.name")).not.toBeInTheDocument() }) + + it("renders the dynamic thinking effort toggle", () => { + render() + + expect(screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name")).toBeInTheDocument() + }) + + it("leaves the dynamic thinking effort toggle unchecked when the value is false or omitted", () => { + const getCheckbox = () => { + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + return label?.querySelector("input[type='checkbox']") + } + + // Explicit false + let result = render( + , + ) + expect(getCheckbox()).not.toBeNull() + expect(getCheckbox()).not.toBeChecked() + result.unmount() + + // Omitted (absent from the persisted config) + const omitted: Record = { ...experimentDefault } + delete omitted.dynamicThinkingEffort + result = render() + expect(getCheckbox()).not.toBeNull() + expect(getCheckbox()).not.toBeChecked() + result.unmount() + }) + + it("binds the dynamic thinking effort toggle to setExperimentEnabled", () => { + const setExperimentEnabled = vi.fn() + render( + , + ) + + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + const checkbox = label?.querySelector("input[type='checkbox']") + expect(checkbox).not.toBeNull() + expect(checkbox).toBeChecked() + + fireEvent.click(checkbox!) + + expect(setExperimentEnabled).toHaveBeenCalledTimes(1) + expect(setExperimentEnabled).toHaveBeenCalledWith("dynamicThinkingEffort", false) + }) + + it("toggles the dynamic thinking effort on when clicked from the unchecked state", () => { + const setExperimentEnabled = vi.fn() + render( + , + ) + + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + const checkbox = label?.querySelector("input[type='checkbox']") + expect(checkbox).not.toBeNull() + expect(checkbox).not.toBeChecked() + + fireEvent.click(checkbox!) + + expect(setExperimentEnabled).toHaveBeenCalledTimes(1) + expect(setExperimentEnabled).toHaveBeenCalledWith("dynamicThinkingEffort", true) + }) }) diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx new file mode 100644 index 0000000000..f28038aa6d --- /dev/null +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx @@ -0,0 +1,28 @@ +import { useState } from "react" + +import type { Experiments } from "@roo-code/types" + +import { EXPERIMENT_IDS, experimentDefault } from "@roo/experiments" + +import { ExperimentalSettings } from "../ExperimentalSettings" +import { AppProviders } from "../../../../playwright/AppProviders" + +export function ExperimentalSettingsStory() { + const [experiments, setExperiments] = useState({ + ...experimentDefault, + [EXPERIMENT_IDS.DYNAMIC_THINKING_EFFORT]: true, + }) + + return ( + +
+ setExperiments((current) => ({ ...current, [id]: enabled }))} + /> +
+
+ ) +} diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx new file mode 100644 index 0000000000..8a12ebf3ae --- /dev/null +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx @@ -0,0 +1,12 @@ +import { expect, test } from "../../../../playwright/coverage-fixture" +import { mountedStory } from "../../../../playwright/mounted-story" +import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" + +for (const theme of visualThemes) { + test(`renders the experimental settings section in the VS Code ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("experimental-settings")) + await applyVisualTheme(page, theme) + const story = component.getByTestId("experimental-settings-story") + await expect(story).toHaveScreenshot(`experimental-settings-${theme.name}.png`) + }) +} diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-dark.png b/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b15dc14b1e8258a378645b014cbc615c71c060 GIT binary patch literal 40449 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast-light.png b/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast-light.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1b090fdf1696c843ccce48957334555a0b1488 GIT binary patch literal 41457 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 GAni}se(FU4 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast.png b/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..348dab9629e4350dd494cc087b7cdf1d4b02b2d7 GIT binary patch literal 41675 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 762a1290af..8d7b7ee515 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Eines actualitzades correctament", "refreshError": "Error en actualitzar les eines", "toolParameters": "Paràmetres" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esforç de pensament dinàmic", + "description": "Activa l'eina set_thinking_effort perquè el model decideixi el seu esforç de pensament per pas. El control manual al xat sempre està disponible. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index f56984bc73..cbb94b5cee 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tools erfolgreich aktualisiert", "refreshError": "Fehler beim Aktualisieren der Tools", "toolParameters": "Parameter" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamische Denkintensität", + "description": "Aktiviert das set_thinking_effort-Tool, damit das Modell die Denkintensität pro Schritt selbst bestimmt. Die manuelle Anpassung im Chat ist immer verfügbar. (experimentell)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 77f8a4f86d..9839de35d3 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -1055,6 +1055,10 @@ "refreshSuccess": "Tools refreshed successfully", "refreshError": "Failed to refresh tools", "toolParameters": "Parameters" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamic thinking effort", + "description": "Enables the set_thinking_effort tool so the model can decide its thinking effort per step. The manual in-chat control is always available. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index e730483fa0..9556372c04 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Herramientas actualizadas correctamente", "refreshError": "Error al actualizar las herramientas", "toolParameters": "Parámetros" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esfuerzo de pensamiento dinámico", + "description": "Habilita la herramienta set_thinking_effort para que el modelo decida su esfuerzo de pensamiento por paso. El control manual en el chat siempre está disponible. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 78770da21d..2914341df1 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Outils actualisés avec succès", "refreshError": "Échec de l'actualisation des outils", "toolParameters": "Paramètres" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Effort de réflexion dynamique", + "description": "Active l'outil set_thinking_effort afin que le modèle décide de son effort de réflexion à chaque étape. Le contrôle manuel dans le chat est toujours disponible. (expérimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 413d3515bc..9fb8a84a72 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "टूल्स सफलतापूर्वक रिफ्रेश हुए", "refreshError": "टूल्स रिफ्रेश करने में विफल", "toolParameters": "पैरामीटर्स" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "डायनामिक चिंतन प्रयास", + "description": "set_thinking_effort टूल सक्षम करता है ताकि मॉडल हर चरण में अपना चिंतन प्रयास स्वयं तय कर सके। चैट में मैन्युअल नियंत्रण हमेशा उपलब्ध है। (प्रयोगात्मक)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 9b9928da64..682ac9ad55 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tool berhasil direfresh", "refreshError": "Gagal merefresh tool", "toolParameters": "Parameter" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Usaha berpikir dinamis", + "description": "Mengaktifkan alat set_thinking_effort agar model dapat memutuskan usaha berpikirnya per langkah. Kontrol manual di obrolan selalu tersedia. (eksperimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 8a43ec3d35..9ae8f2a8bd 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Strumenti aggiornati con successo", "refreshError": "Impossibile aggiornare gli strumenti", "toolParameters": "Parametri" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Sforzo di pensiero dinamico", + "description": "Abilita lo strumento set_thinking_effort in modo che il modello decida lo sforzo di pensiero per ogni passaggio. Il controllo manuale nella chat è sempre disponibile. (sperimentale)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b2cfbe977e..b824141a95 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "ツールが正常に更新されました", "refreshError": "ツールの更新に失敗しました", "toolParameters": "パラメーター" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "ダイナミック思考強度", + "description": "set_thinking_effort ツールを有効にし、ステップごとにモデルが思考強度を決定できるようにします。チャット内での手動調整は常に利用可能です。(実験的機能)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 1ff9addeb4..c714cf86bf 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "도구가 성공적으로 새로고침되었습니다", "refreshError": "도구 새로고침에 실패했습니다", "toolParameters": "매개변수" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "동적 사고 노력", + "description": "set_thinking_effort 도구를 활성화하여 단계별로 모델이 사고 노력을 결정하도록 합니다. 채팅에서 수동 조정은 항상 사용 가능합니다. (실험적 기능)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 4361d091a1..dfa0c29a7f 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tools succesvol vernieuwd", "refreshError": "Fout bij vernieuwen van tools", "toolParameters": "Parameters" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamisch denkwerk", + "description": "Schakelt het set_thinking_effort-gereedschap in zodat het model per stap het denkwerk zelf kan bepalen. De handmatige aanpassing in het gesprek is altijd beschikbaar. (experimenteel)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 277bcaa470..84e06b68a6 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Narzędzia odświeżone pomyślnie", "refreshError": "Nie udało się odświeżyć narzędzi", "toolParameters": "Parametry" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamiczny wysiłek myślowy", + "description": "Włącza narzędzie set_thinking_effort, aby model samodzielnie decydował o wysiłku myślowym na każdym kroku. Ręczna regulacja w czacie jest zawsze dostępna. (eksperymentalne)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 8ce67bcd48..79e16a6298 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Ferramentas atualizadas com sucesso", "refreshError": "Falha ao atualizar ferramentas", "toolParameters": "Parâmetros" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esforço de pensamento dinâmico", + "description": "Ativa a ferramenta set_thinking_effort para que o modelo decida seu esforço de pensamento em cada etapa. O controle manual na conversa está sempre disponível. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 0ac516c190..e1131173ff 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Инструменты успешно обновлены", "refreshError": "Не удалось обновить инструменты", "toolParameters": "Параметры" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Динамическое усилие размышления", + "description": "Включает инструмент set_thinking_effort, чтобы модель самостоятельно определяла усилие размышления на каждом шаге. Ручное управление в чате всегда доступно. (экспериментальная функция)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 5d3a5cb89a..992ef00800 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Araçlar başarıyla yenilendi", "refreshError": "Araçlar yenilenemedi", "toolParameters": "Parametreler" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dinamik düşünme çabası", + "description": "set_thinking_effort aracını etkinleştirir; böylece model her adımda kendi düşünme çabasını belirler. Sohbetteki manuel kontrol her zaman kullanılabilir. (deneysel)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index adb1be64e3..2f697a1609 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Làm mới công cụ thành công", "refreshError": "Không thể làm mới công cụ", "toolParameters": "Thông số" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Nỗ lực suy nghĩ động", + "description": "Bật công cụ set_thinking_effort để mô hình tự quyết định nỗ lực suy nghĩ của từng bước. Điều chỉnh thủ công trong trò chuyện luôn khả dụng. (thực nghiệm)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 916f629efe..092ebfb8c3 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "工具刷新成功", "refreshError": "工具刷新失败", "toolParameters": "参数" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "动态思考强度", + "description": "启用 set_thinking_effort 工具,让模型按步骤自行决定思考强度。对话中的手动调整随时可用。 (实验性功能)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index d1f9258dcf..a057fab671 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -1002,6 +1002,10 @@ "refreshSuccess": "工具重新整理成功", "refreshError": "工具重新整理失敗", "toolParameters": "參數" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "動態思考強度", + "description": "啟用 set_thinking_effort 工具,讓模型自行決定每一步的思考強度。對話中的手動調整隨時可用。(實驗性)" } }, "promptCaching": { From 521e0e6976e2700aa601e07622581f60d486d962 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Fri, 4 Sep 2026 10:21:22 +0800 Subject: [PATCH 05/12] feat(settings): dynamic thinking effort experimental toggle (DTE-1) --- .../types/src/__tests__/experiment.test.ts | 19 +++++ packages/types/src/experiment.ts | 2 + scripts/stryker-diff.mjs | 10 ++- scripts/stryker-diff.test.mjs | 7 +- .../webview/__tests__/ClineProvider.spec.ts | 32 ++++++++ .../__tests__/webviewMessageHandler.spec.ts | 55 +++++++++++++ src/shared/__tests__/experiments.spec.ts | 29 ++++++- src/shared/experiments.ts | 2 + webview-ui/playwright/gallery/stories.tsx | 5 ++ .../__tests__/ExperimentalSettings.spec.tsx | 76 +++++++++++++++++- .../ExperimentalSettings.visual.fixture.tsx | 28 +++++++ .../__tests__/ExperimentalSettings.visual.tsx | 12 +++ .../settings/__tests__/SettingsView.spec.tsx | 35 ++++++++ .../experimental-settings-dark.png | Bin 0 -> 40449 bytes ...erimental-settings-high-contrast-light.png | Bin 0 -> 41457 bytes .../experimental-settings-high-contrast.png | Bin 0 -> 41675 bytes .../experimental-settings-light.png | Bin 0 -> 41449 bytes webview-ui/src/i18n/locales/ca/settings.json | 4 + webview-ui/src/i18n/locales/de/settings.json | 4 + webview-ui/src/i18n/locales/en/settings.json | 4 + webview-ui/src/i18n/locales/es/settings.json | 4 + webview-ui/src/i18n/locales/fr/settings.json | 4 + webview-ui/src/i18n/locales/hi/settings.json | 4 + webview-ui/src/i18n/locales/id/settings.json | 4 + webview-ui/src/i18n/locales/it/settings.json | 4 + webview-ui/src/i18n/locales/ja/settings.json | 4 + webview-ui/src/i18n/locales/ko/settings.json | 4 + webview-ui/src/i18n/locales/nl/settings.json | 4 + webview-ui/src/i18n/locales/pl/settings.json | 4 + .../src/i18n/locales/pt-BR/settings.json | 4 + webview-ui/src/i18n/locales/ru/settings.json | 4 + webview-ui/src/i18n/locales/tr/settings.json | 4 + webview-ui/src/i18n/locales/vi/settings.json | 4 + .../src/i18n/locales/zh-CN/settings.json | 4 + .../src/i18n/locales/zh-TW/settings.json | 4 + 35 files changed, 378 insertions(+), 6 deletions(-) create mode 100644 packages/types/src/__tests__/experiment.test.ts create mode 100644 webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx create mode 100644 webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-dark.png create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast-light.png create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast.png create mode 100644 webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-light.png diff --git a/packages/types/src/__tests__/experiment.test.ts b/packages/types/src/__tests__/experiment.test.ts new file mode 100644 index 0000000000..0ef4ed2e02 --- /dev/null +++ b/packages/types/src/__tests__/experiment.test.ts @@ -0,0 +1,19 @@ +import { experimentIds, experimentIdsSchema, experimentsSchema } from "../experiment.js" + +describe("dynamicThinkingEffort experiment", () => { + it("is part of the experiment id enum", () => { + expect(experimentIds).toContain("dynamicThinkingEffort") + expect(experimentIdsSchema.safeParse("dynamicThinkingEffort").success).toBe(true) + }) + + it("parses enabled and disabled states", () => { + expect(experimentsSchema.parse({ dynamicThinkingEffort: true })).toEqual({ dynamicThinkingEffort: true }) + expect(experimentsSchema.parse({ dynamicThinkingEffort: false })).toEqual({ dynamicThinkingEffort: false }) + expect(experimentsSchema.parse({})).toEqual({}) + }) + + it("rejects non-boolean values", () => { + expect(experimentsSchema.safeParse({ dynamicThinkingEffort: "yes" }).success).toBe(false) + expect(experimentIdsSchema.safeParse("dynamic-thinking-effort").success).toBe(false) + }) +}) diff --git a/packages/types/src/experiment.ts b/packages/types/src/experiment.ts index 5d511859b1..f4b3a1c0a8 100644 --- a/packages/types/src/experiment.ts +++ b/packages/types/src/experiment.ts @@ -12,6 +12,7 @@ export const experimentIds = [ "runSlashCommand", "customTools", "parallelToolExecution", + "dynamicThinkingEffort", ] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -28,6 +29,7 @@ export const experimentsSchema = z.object({ runSlashCommand: z.boolean().optional(), customTools: z.boolean().optional(), parallelToolExecution: z.boolean().optional(), + dynamicThinkingEffort: z.boolean().optional(), }) export type Experiments = z.infer diff --git a/scripts/stryker-diff.mjs b/scripts/stryker-diff.mjs index c0e8a6cd1a..e46afb22ab 100644 --- a/scripts/stryker-diff.mjs +++ b/scripts/stryker-diff.mjs @@ -51,8 +51,14 @@ export const PACKAGE_CONFIGS = [ root: "src", sourceRoot: "src/", vitestConfig: "vitest.config.ts", - vitestRelated: false, - discoverRelatedTests: true, + // Use plugin-side related-test discovery: with an explicit STRYKER_TEST_FILES + // list, stryker-js 10.0.0 plans static mutants with runtime activation + // (stryker-mutator/stryker-js#6144, #6209), which the vitest plugin can only + // apply after top-level code has run, producing false Survived results. + // Revert to vitestRelated: false / discoverRelatedTests: true once the + // upstream planner fix lands. + vitestRelated: true, + discoverRelatedTests: false, excludedPaths: ["src/esbuild.mjs", "src/eslint.config.mjs", "src/utils/vitest-verbosity.ts"], }, ] diff --git a/scripts/stryker-diff.test.mjs b/scripts/stryker-diff.test.mjs index 0f39dc507f..b86f5f3e96 100644 --- a/scripts/stryker-diff.test.mjs +++ b/scripts/stryker-diff.test.mjs @@ -129,8 +129,11 @@ describe("buildManifest", () => { assert.equal(webview.runRoot, ".") assert.equal(webview.discoverRelatedTests, true) assert.equal(webview.vitestRelated, false) - assert.equal(extension.discoverRelatedTests, true) - assert.equal(extension.vitestRelated, false) + // The extension entry uses plugin-side related discovery while stryker-js 10.0.0 + // plans static mutants with runtime activation when given explicit test files + // (stryker-mutator/stryker-js#6144, #6209); see the entry comment in stryker-diff.mjs. + assert.equal(extension.discoverRelatedTests, false) + assert.equal(extension.vitestRelated, true) }) it("returns no packages for tests, barrels, unsupported packages, and type-only changes", () => { diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index ad6ea143a8..9249140353 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1439,6 +1439,38 @@ describe("ClineProvider", () => { expect(state.destructiveCommandGuardEnabled).toBe(false) }) + test("getStateToPostToWebview returns the saved dynamicThinkingEffort experiment when enabled", async () => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("experiments", { + ...experimentDefault, + dynamicThinkingEffort: true, + }) + + const state = await provider.getStateToPostToWebview() + + expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: true }) + }) + + test("getStateToPostToWebview returns the saved dynamicThinkingEffort experiment when explicitly disabled", async () => { + await provider.resolveWebviewView(mockWebviewView) + await provider.contextProxy.setValue("experiments", { + ...experimentDefault, + dynamicThinkingEffort: false, + }) + + const state = await provider.getStateToPostToWebview() + + expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: false }) + }) + + test("getStateToPostToWebview defaults dynamicThinkingEffort to false when experiments are unset", async () => { + await provider.resolveWebviewView(mockWebviewView) + + const state = await provider.getStateToPostToWebview() + + expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: false }) + }) + test("language is set to VSCode language", async () => { // Mock VSCode language as Spanish ;(vscode.env as any).language = "pt-BR" diff --git a/src/core/webview/__tests__/webviewMessageHandler.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.spec.ts index 4c2a301965..bbbb6852e7 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.spec.ts @@ -73,6 +73,7 @@ import type { ModelRecord } from "@roo-code/types" import { webviewMessageHandler } from "../webviewMessageHandler" import type { ClineProvider } from "../ClineProvider" +import { experimentDefault } from "../../../shared/experiments" import { flushModels, getModels } from "../../../api/providers/fetchers/modelCache" import { getLMStudioModels } from "../../../api/providers/fetchers/lmstudio" import { getCommands } from "../../../services/command/commands" @@ -2273,3 +2274,57 @@ describe("webviewMessageHandler - telemetrySetting", () => { expect(TelemetryService.instance.updateTelemetryState).not.toHaveBeenCalled() }) }) + +describe("webviewMessageHandler - experiments", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("persists dynamicThinkingEffort true merged with the saved experiments", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockImplementation((key: string) => + key === "experiments" ? { preventFocusDisruption: true } : undefined, + ) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { experiments: { dynamicThinkingEffort: true } }, + }) + + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("experiments", { + preventFocusDisruption: true, + dynamicThinkingEffort: true, + }) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }) + + it("persists dynamicThinkingEffort false over a previously enabled value", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockImplementation((key: string) => + key === "experiments" ? { dynamicThinkingEffort: true } : undefined, + ) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { experiments: { dynamicThinkingEffort: false } }, + }) + + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("experiments", { + dynamicThinkingEffort: false, + }) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }) + + it("persists the experiment defaults when no experiments are saved yet", async () => { + vi.mocked(mockClineProvider.contextProxy.getValue).mockReturnValue(undefined) + + await webviewMessageHandler(mockClineProvider, { + type: "updateSettings", + updatedSettings: { experiments: {} }, + }) + + expect(mockClineProvider.contextProxy.setValue).toHaveBeenCalledWith("experiments", { + ...experimentDefault, + dynamicThinkingEffort: false, + }) + expect(mockClineProvider.postStateToWebview).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/shared/__tests__/experiments.spec.ts b/src/shared/__tests__/experiments.spec.ts index f2261a5c09..b6e8993df4 100644 --- a/src/shared/__tests__/experiments.spec.ts +++ b/src/shared/__tests__/experiments.spec.ts @@ -2,7 +2,7 @@ import type { ExperimentId } from "@roo-code/types" -import { EXPERIMENT_IDS, experimentConfigsMap, experiments as Experiments } from "../experiments" +import { EXPERIMENT_IDS, experimentConfigsMap, experimentDefault, experiments as Experiments } from "../experiments" describe("experiments", () => { describe("PREVENT_FOCUS_DISRUPTION", () => { @@ -22,6 +22,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(false) }) @@ -33,6 +34,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(true) }) @@ -44,6 +46,7 @@ describe("experiments", () => { runSlashCommand: false, customTools: false, parallelToolExecution: false, + dynamicThinkingEffort: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.PREVENT_FOCUS_DISRUPTION)).toBe(false) }) @@ -66,4 +69,28 @@ describe("experiments", () => { expect(Experiments.isEnabled({ parallelToolExecution: true }, "parallelToolExecution")).toBe(true) }) }) + + describe("DYNAMIC_THINKING_EFFORT", () => { + it("is configured correctly", () => { + expect(EXPERIMENT_IDS.DYNAMIC_THINKING_EFFORT).toBe("dynamicThinkingEffort") + expect(experimentConfigsMap.DYNAMIC_THINKING_EFFORT).toMatchObject({ + enabled: false, + }) + // Visible in the Settings panel (showInSettings defaults to true). + expect(experimentConfigsMap.DYNAMIC_THINKING_EFFORT.showInSettings).toBeUndefined() + }) + + it("is disabled by default", () => { + expect(experimentDefault.dynamicThinkingEffort).toBe(false) + expect(Experiments.isEnabled({}, "dynamicThinkingEffort")).toBe(false) + }) + + it("returns true when enabled", () => { + expect(Experiments.isEnabled({ dynamicThinkingEffort: true }, "dynamicThinkingEffort")).toBe(true) + }) + + it("returns false when explicitly disabled", () => { + expect(Experiments.isEnabled({ dynamicThinkingEffort: false }, "dynamicThinkingEffort")).toBe(false) + }) + }) }) diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index ae538b9138..c0d461a454 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -6,6 +6,7 @@ export const EXPERIMENT_IDS = { RUN_SLASH_COMMAND: "runSlashCommand", CUSTOM_TOOLS: "customTools", PARALLEL_TOOL_EXECUTION: "parallelToolExecution", + DYNAMIC_THINKING_EFFORT: "dynamicThinkingEffort", } as const satisfies Record type _AssertExperimentIds = AssertEqual>> @@ -25,6 +26,7 @@ export const experimentConfigsMap: Record = { CUSTOM_TOOLS: { enabled: false }, // TODO: add i18n keys (settings:experimental.PARALLEL_TOOL_EXECUTION.name/.description) in the same PR that sets showInSettings: true PARALLEL_TOOL_EXECUTION: { enabled: false, showInSettings: false }, + DYNAMIC_THINKING_EFFORT: { enabled: false }, } export const experimentDefault = Object.fromEntries( diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 52ec5c2ce5..e047f1c32d 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -162,6 +162,11 @@ export const stories: Record = { const { UISettingsStory } = await import("@/components/settings/__tests__/UISettings.visual.fixture") return }, + "experimental-settings": async () => { + const { ExperimentalSettingsStory } = + await import("@/components/settings/__tests__/ExperimentalSettings.visual.fixture") + return + }, "ui-settings-long-locale": async () => { const [{ UISettingsStory }, { default: i18next }] = await Promise.all([ import("@/components/settings/__tests__/UISettings.visual.fixture"), diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx index b31f87dc7e..3feddad1d4 100644 --- a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.spec.tsx @@ -1,4 +1,4 @@ -import { render, screen } from "@testing-library/react" +import { fireEvent, render, screen } from "@testing-library/react" import { experimentDefault } from "@roo/experiments" @@ -32,4 +32,78 @@ describe("ExperimentalSettings", () => { expect(screen.getByText("settings:experimental.CUSTOM_TOOLS.name")).toBeInTheDocument() expect(screen.queryByText("settings:experimental.PARALLEL_TOOL_EXECUTION.name")).not.toBeInTheDocument() }) + + it("renders the dynamic thinking effort toggle", () => { + render() + + expect(screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name")).toBeInTheDocument() + }) + + it("leaves the dynamic thinking effort toggle unchecked when the value is false or omitted", () => { + const getCheckbox = () => { + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + return label?.querySelector("input[type='checkbox']") + } + + // Explicit false + let result = render( + , + ) + expect(getCheckbox()).not.toBeNull() + expect(getCheckbox()).not.toBeChecked() + result.unmount() + + // Omitted (absent from the persisted config) + const omitted: Record = { ...experimentDefault } + delete omitted.dynamicThinkingEffort + result = render() + expect(getCheckbox()).not.toBeNull() + expect(getCheckbox()).not.toBeChecked() + result.unmount() + }) + + it("binds the dynamic thinking effort toggle to setExperimentEnabled", () => { + const setExperimentEnabled = vi.fn() + render( + , + ) + + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + const checkbox = label?.querySelector("input[type='checkbox']") + expect(checkbox).not.toBeNull() + expect(checkbox).toBeChecked() + + fireEvent.click(checkbox!) + + expect(setExperimentEnabled).toHaveBeenCalledTimes(1) + expect(setExperimentEnabled).toHaveBeenCalledWith("dynamicThinkingEffort", false) + }) + + it("toggles the dynamic thinking effort on when clicked from the unchecked state", () => { + const setExperimentEnabled = vi.fn() + render( + , + ) + + const label = screen.getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label") + const checkbox = label?.querySelector("input[type='checkbox']") + expect(checkbox).not.toBeNull() + expect(checkbox).not.toBeChecked() + + fireEvent.click(checkbox!) + + expect(setExperimentEnabled).toHaveBeenCalledTimes(1) + expect(setExperimentEnabled).toHaveBeenCalledWith("dynamicThinkingEffort", true) + }) }) diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx new file mode 100644 index 0000000000..f28038aa6d --- /dev/null +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.fixture.tsx @@ -0,0 +1,28 @@ +import { useState } from "react" + +import type { Experiments } from "@roo-code/types" + +import { EXPERIMENT_IDS, experimentDefault } from "@roo/experiments" + +import { ExperimentalSettings } from "../ExperimentalSettings" +import { AppProviders } from "../../../../playwright/AppProviders" + +export function ExperimentalSettingsStory() { + const [experiments, setExperiments] = useState({ + ...experimentDefault, + [EXPERIMENT_IDS.DYNAMIC_THINKING_EFFORT]: true, + }) + + return ( + +
+ setExperiments((current) => ({ ...current, [id]: enabled }))} + /> +
+
+ ) +} diff --git a/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx new file mode 100644 index 0000000000..8a12ebf3ae --- /dev/null +++ b/webview-ui/src/components/settings/__tests__/ExperimentalSettings.visual.tsx @@ -0,0 +1,12 @@ +import { expect, test } from "../../../../playwright/coverage-fixture" +import { mountedStory } from "../../../../playwright/mounted-story" +import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" + +for (const theme of visualThemes) { + test(`renders the experimental settings section in the VS Code ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("experimental-settings")) + await applyVisualTheme(page, theme) + const story = component.getByTestId("experimental-settings-story") + await expect(story).toHaveScreenshot(`experimental-settings-${theme.name}.png`) + }) +} diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx index a3aa131902..71d0bff9f0 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx @@ -5,6 +5,7 @@ import { act } from "@testing-library/react" import { vscode } from "@/utils/vscode" import { DEFAULT_CHECKPOINT_TIMEOUT_SECONDS } from "@roo-code/types" +import { experimentDefault } from "@roo/experiments" import SettingsView from "../SettingsView" @@ -804,3 +805,37 @@ describe("SettingsView - Duplicate Commands", () => { expect(onDone).toHaveBeenCalledTimes(1) }) }) + +describe("SettingsView - Experimental Settings", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("includes the dynamic thinking effort toggle in the updateSettings payload on save", () => { + // Start from the shared contract default, where dynamicThinkingEffort is off. + const { activateTab, getSettingsContent } = renderSettingsView({ experiments: experimentDefault }) + + activateTab("experimental") + + const content = getSettingsContent() + const label = within(content).getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label")! + const checkbox = within(label).getByRole("checkbox") + expect(checkbox).not.toBeChecked() + + fireEvent.click(checkbox) + + // Click Save to save settings + const saveButton = screen.getByTestId("save-button") + fireEvent.click(saveButton) + + // The toggled experiment must reach the host inside the updateSettings payload + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ + experiments: expect.objectContaining({ dynamicThinkingEffort: true }), + }), + }), + ) + }) +}) diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-dark.png b/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b15dc14b1e8258a378645b014cbc615c71c060 GIT binary patch literal 40449 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast-light.png b/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast-light.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1b090fdf1696c843ccce48957334555a0b1488 GIT binary patch literal 41457 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 GAni}se(FU4 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast.png b/webview-ui/src/components/settings/__tests__/__screenshots__/experimental-settings-high-contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..348dab9629e4350dd494cc087b7cdf1d4b02b2d7 GIT binary patch literal 41675 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 762a1290af..8d7b7ee515 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Eines actualitzades correctament", "refreshError": "Error en actualitzar les eines", "toolParameters": "Paràmetres" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esforç de pensament dinàmic", + "description": "Activa l'eina set_thinking_effort perquè el model decideixi el seu esforç de pensament per pas. El control manual al xat sempre està disponible. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index f56984bc73..cbb94b5cee 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tools erfolgreich aktualisiert", "refreshError": "Fehler beim Aktualisieren der Tools", "toolParameters": "Parameter" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamische Denkintensität", + "description": "Aktiviert das set_thinking_effort-Tool, damit das Modell die Denkintensität pro Schritt selbst bestimmt. Die manuelle Anpassung im Chat ist immer verfügbar. (experimentell)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 77f8a4f86d..9839de35d3 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -1055,6 +1055,10 @@ "refreshSuccess": "Tools refreshed successfully", "refreshError": "Failed to refresh tools", "toolParameters": "Parameters" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamic thinking effort", + "description": "Enables the set_thinking_effort tool so the model can decide its thinking effort per step. The manual in-chat control is always available. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index e730483fa0..9556372c04 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Herramientas actualizadas correctamente", "refreshError": "Error al actualizar las herramientas", "toolParameters": "Parámetros" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esfuerzo de pensamiento dinámico", + "description": "Habilita la herramienta set_thinking_effort para que el modelo decida su esfuerzo de pensamiento por paso. El control manual en el chat siempre está disponible. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 78770da21d..2914341df1 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Outils actualisés avec succès", "refreshError": "Échec de l'actualisation des outils", "toolParameters": "Paramètres" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Effort de réflexion dynamique", + "description": "Active l'outil set_thinking_effort afin que le modèle décide de son effort de réflexion à chaque étape. Le contrôle manuel dans le chat est toujours disponible. (expérimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 413d3515bc..9fb8a84a72 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "टूल्स सफलतापूर्वक रिफ्रेश हुए", "refreshError": "टूल्स रिफ्रेश करने में विफल", "toolParameters": "पैरामीटर्स" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "डायनामिक चिंतन प्रयास", + "description": "set_thinking_effort टूल सक्षम करता है ताकि मॉडल हर चरण में अपना चिंतन प्रयास स्वयं तय कर सके। चैट में मैन्युअल नियंत्रण हमेशा उपलब्ध है। (प्रयोगात्मक)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 9b9928da64..682ac9ad55 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tool berhasil direfresh", "refreshError": "Gagal merefresh tool", "toolParameters": "Parameter" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Usaha berpikir dinamis", + "description": "Mengaktifkan alat set_thinking_effort agar model dapat memutuskan usaha berpikirnya per langkah. Kontrol manual di obrolan selalu tersedia. (eksperimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 8a43ec3d35..9ae8f2a8bd 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Strumenti aggiornati con successo", "refreshError": "Impossibile aggiornare gli strumenti", "toolParameters": "Parametri" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Sforzo di pensiero dinamico", + "description": "Abilita lo strumento set_thinking_effort in modo che il modello decida lo sforzo di pensiero per ogni passaggio. Il controllo manuale nella chat è sempre disponibile. (sperimentale)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b2cfbe977e..b824141a95 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "ツールが正常に更新されました", "refreshError": "ツールの更新に失敗しました", "toolParameters": "パラメーター" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "ダイナミック思考強度", + "description": "set_thinking_effort ツールを有効にし、ステップごとにモデルが思考強度を決定できるようにします。チャット内での手動調整は常に利用可能です。(実験的機能)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 1ff9addeb4..c714cf86bf 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "도구가 성공적으로 새로고침되었습니다", "refreshError": "도구 새로고침에 실패했습니다", "toolParameters": "매개변수" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "동적 사고 노력", + "description": "set_thinking_effort 도구를 활성화하여 단계별로 모델이 사고 노력을 결정하도록 합니다. 채팅에서 수동 조정은 항상 사용 가능합니다. (실험적 기능)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 4361d091a1..dfa0c29a7f 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Tools succesvol vernieuwd", "refreshError": "Fout bij vernieuwen van tools", "toolParameters": "Parameters" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamisch denkwerk", + "description": "Schakelt het set_thinking_effort-gereedschap in zodat het model per stap het denkwerk zelf kan bepalen. De handmatige aanpassing in het gesprek is altijd beschikbaar. (experimenteel)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 277bcaa470..84e06b68a6 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Narzędzia odświeżone pomyślnie", "refreshError": "Nie udało się odświeżyć narzędzi", "toolParameters": "Parametry" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dynamiczny wysiłek myślowy", + "description": "Włącza narzędzie set_thinking_effort, aby model samodzielnie decydował o wysiłku myślowym na każdym kroku. Ręczna regulacja w czacie jest zawsze dostępna. (eksperymentalne)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 8ce67bcd48..79e16a6298 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Ferramentas atualizadas com sucesso", "refreshError": "Falha ao atualizar ferramentas", "toolParameters": "Parâmetros" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Esforço de pensamento dinâmico", + "description": "Ativa a ferramenta set_thinking_effort para que o modelo decida seu esforço de pensamento em cada etapa. O controle manual na conversa está sempre disponível. (experimental)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 0ac516c190..e1131173ff 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Инструменты успешно обновлены", "refreshError": "Не удалось обновить инструменты", "toolParameters": "Параметры" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Динамическое усилие размышления", + "description": "Включает инструмент set_thinking_effort, чтобы модель самостоятельно определяла усилие размышления на каждом шаге. Ручное управление в чате всегда доступно. (экспериментальная функция)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 5d3a5cb89a..992ef00800 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Araçlar başarıyla yenilendi", "refreshError": "Araçlar yenilenemedi", "toolParameters": "Parametreler" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Dinamik düşünme çabası", + "description": "set_thinking_effort aracını etkinleştirir; böylece model her adımda kendi düşünme çabasını belirler. Sohbetteki manuel kontrol her zaman kullanılabilir. (deneysel)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index adb1be64e3..2f697a1609 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "Làm mới công cụ thành công", "refreshError": "Không thể làm mới công cụ", "toolParameters": "Thông số" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "Nỗ lực suy nghĩ động", + "description": "Bật công cụ set_thinking_effort để mô hình tự quyết định nỗ lực suy nghĩ của từng bước. Điều chỉnh thủ công trong trò chuyện luôn khả dụng. (thực nghiệm)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 916f629efe..092ebfb8c3 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -975,6 +975,10 @@ "refreshSuccess": "工具刷新成功", "refreshError": "工具刷新失败", "toolParameters": "参数" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "动态思考强度", + "description": "启用 set_thinking_effort 工具,让模型按步骤自行决定思考强度。对话中的手动调整随时可用。 (实验性功能)" } }, "promptCaching": { diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index d1f9258dcf..a057fab671 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -1002,6 +1002,10 @@ "refreshSuccess": "工具重新整理成功", "refreshError": "工具重新整理失敗", "toolParameters": "參數" + }, + "DYNAMIC_THINKING_EFFORT": { + "name": "動態思考強度", + "description": "啟用 set_thinking_effort 工具,讓模型自行決定每一步的思考強度。對話中的手動調整隨時可用。(實驗性)" } }, "promptCaching": { From 39762bf8162222fc6ff93a73e2f71df7acb7a187 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sat, 5 Sep 2026 01:24:54 +0800 Subject: [PATCH 06/12] test(settings): assert false and unset dynamicThinkingEffort persistence in the updateSettings payload --- .../settings/__tests__/SettingsView.spec.tsx | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx index 71d0bff9f0..656cf2e659 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx @@ -812,23 +812,14 @@ describe("SettingsView - Experimental Settings", () => { }) it("includes the dynamic thinking effort toggle in the updateSettings payload on save", () => { - // Start from the shared contract default, where dynamicThinkingEffort is off. const { activateTab, getSettingsContent } = renderSettingsView({ experiments: experimentDefault }) - activateTab("experimental") - const content = getSettingsContent() const label = within(content).getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label")! const checkbox = within(label).getByRole("checkbox") expect(checkbox).not.toBeChecked() - fireEvent.click(checkbox) - - // Click Save to save settings - const saveButton = screen.getByTestId("save-button") - fireEvent.click(saveButton) - - // The toggled experiment must reach the host inside the updateSettings payload + fireEvent.click(screen.getByTestId("save-button")) expect(vscode.postMessage).toHaveBeenCalledWith( expect.objectContaining({ type: "updateSettings", @@ -838,4 +829,26 @@ describe("SettingsView - Experimental Settings", () => { }), ) }) + + it("persists the unset representation of dynamicThinkingEffort as false on save", () => { + const experiments: Record = { ...experimentDefault } + delete experiments.dynamicThinkingEffort + const { activateTab, getSettingsContent } = renderSettingsView({ experiments }) + activateTab("experimental") + const content = getSettingsContent() + const label = within(content).getByText("settings:experimental.DYNAMIC_THINKING_EFFORT.name").closest("label")! + const checkbox = within(label).getByRole("checkbox") + expect(checkbox).not.toBeChecked() + fireEvent.click(checkbox) + fireEvent.click(checkbox) + fireEvent.click(screen.getByTestId("save-button")) + expect(vscode.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + type: "updateSettings", + updatedSettings: expect.objectContaining({ + experiments: expect.objectContaining({ dynamicThinkingEffort: false }), + }), + }), + ) + }) }) From 1edd728c49da4c7dae12f4686e3a43d336696eb4 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 6 Sep 2026 05:02:57 +0800 Subject: [PATCH 07/12] fix(task): clear DTE runtime-effort state on disposal and dispose aborted test tasks (CR 5120440807) --- src/core/task/Task.ts | 5 +++++ src/core/task/__tests__/Task.runtime-thinking-effort.test.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 297e2486f2..0c0cc01c53 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -2706,6 +2706,11 @@ export class Task extends EventEmitter implements TaskLike { console.error("Error reverting diff changes:", error) } + // Clear DTE runtime-effort override state so a retained disposed task never serves a stale override. + this.runtimeThinkingEffort = undefined + this.runtimeThinkingEffortSource = undefined + this.preOverrideReasoningEffort = undefined + await pendingCleanup await this.diffReversionPromise } diff --git a/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts b/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts index e62cbd0e24..ee2874d2da 100644 --- a/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts +++ b/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts @@ -124,7 +124,7 @@ describe("Task runtime thinking effort (DTE series 2/5)", () => { afterEach(async () => { vi.useRealTimers() - if (task && !task.abort) { + if (task) { await task.dispose().catch(() => {}) } }) From 1087fcbd4a28c5fdb16b9fa49b370c3264e1e4e0 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Sun, 6 Sep 2026 05:57:16 +0800 Subject: [PATCH 08/12] fix(task): restore API configuration when clearing the DTE effort override on disposal (CR 3942121231) --- src/core/task/Task.ts | 9 +++++---- .../__tests__/Task.runtime-thinking-effort.test.ts | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 0c0cc01c53..eb233f3d71 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -2706,10 +2706,11 @@ export class Task extends EventEmitter implements TaskLike { console.error("Error reverting diff changes:", error) } - // Clear DTE runtime-effort override state so a retained disposed task never serves a stale override. - this.runtimeThinkingEffort = undefined - this.runtimeThinkingEffortSource = undefined - this.preOverrideReasoningEffort = undefined + // Clear the DTE runtime-effort override via the standard clearing call so a + // retained disposed task never serves a stale override: the override also + // lives in apiConfiguration.reasoningEffort and the built api handler, and + // the clearing call restores both before clearing the runtime fields. + this.setRuntimeThinkingEffort(undefined) await pendingCleanup await this.diffReversionPromise diff --git a/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts b/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts index ee2874d2da..f91f00e820 100644 --- a/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts +++ b/src/core/task/__tests__/Task.runtime-thinking-effort.test.ts @@ -298,4 +298,18 @@ describe("Task runtime thinking effort (DTE series 2/5)", () => { expect(getPrivateAccess(task).getRuntimeThinkingEffortMetadata()).not.toHaveProperty("reasoningEffort") }) }) + + describe("dispose", () => { + it("clears the task-local override and restores the settings-derived API configuration at task end", async () => { + task.setRuntimeThinkingEffort("xhigh", "source") + await task.dispose() + + expect(task.getRuntimeThinkingEffort()).toEqual({ effort: undefined, source: undefined }) + const access = getPrivateAccess(task) + expect(access.runtimeThinkingEffort).toBeUndefined() + expect(access.runtimeThinkingEffortSource).toBeUndefined() + expect(access.preOverrideReasoningEffort).toBeUndefined() + expect(task.apiConfiguration.reasoningEffort).toBe(SETTINGS_EFFORT) + }) + }) }) From 8fdade52e5e6f567497e5c8a8e73cf2864fb119c Mon Sep 17 00:00:00 2001 From: easonLiangWorldedtech Date: Tue, 6 Oct 2026 14:54:19 +0800 Subject: [PATCH 09/12] test(webview): drop two explicit-any casts the merge re-introduced Main converted two mockContext.globalState.get casts to a typed reassignment, which earned a suppression reduction for this file. The conflict resolution kept the older cast form, so the file carried 198 violations against main's recorded 196 and compile failed. Restoring main's typed form brings the file back to 196 without touching eslint-suppressions.json. Counts: as-any 182 + typed any declarations 14 = 196, matching the recorded count. --- src/core/webview/__tests__/ClineProvider.spec.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index b7e1b689e1..8243f4152b 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1622,8 +1622,9 @@ describe("ClineProvider", () => { }) test("writeDelayMs defaults to 1000ms", async () => { - // Mock globalState.get to return undefined for writeDelayMs - ;(mockContext.globalState.get as any).mockImplementation((key: string) => { + // Mock globalState.get to return undefined for writeDelayMs (typed reassignment, + // same pattern as main's fallback-default test below — Memento.get has no mock type) + mockContext.globalState.get = vi.fn((key: string) => { return key === "writeDelayMs" ? undefined : null }) @@ -1632,7 +1633,7 @@ describe("ClineProvider", () => { }) test("getState applies fallback defaults for write, diff, and terminal settings", async () => { - ;(mockContext.globalState.get as any).mockImplementation((key: string) => { + mockContext.globalState.get = vi.fn((key: string) => { if ( [ "writeDelayMs", From 6aa35608f3857a7ab737a0936e20863affe6d7fd Mon Sep 17 00:00:00 2001 From: easonLiangWorldedtech Date: Tue, 6 Oct 2026 15:05:08 +0800 Subject: [PATCH 10/12] merge(upstream): redo the spec resolutions from the merge stages The first resolution pasted the conflict blocks together, which cut tests mid-body and dropped main's code-index scope refactor. Rebuilt from the three stages (base, PR head, main) so both sides survive: - ClineProvider.spec.ts keeps this unit's dynamic thinking effort round trip AND main's blanket auto-deny round trip, and follows main's rename of the instance lookup to CodeIndexManagerRegistry plus the getCurrentWorkspaceCodeIndexScope provider mock, which is what the merged handler calls. - SettingsView.spec.tsx keeps both describe blocks instead of merging them into one. Explicit-any count for ClineProvider.spec.ts is 182, matching main, so the recorded suppression count (196 with the 14 typed any declarations) holds and no count was raised. --- .../webview/__tests__/ClineProvider.spec.ts | 334 +++++++++++++++++- .../settings/__tests__/SettingsView.spec.tsx | 2 + 2 files changed, 317 insertions(+), 19 deletions(-) diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 8243f4152b..d79632be47 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1,5 +1,6 @@ // pnpm --filter roo-cline test core/webview/__tests__/ClineProvider.spec.ts +import fs from "fs" import * as path from "path" import { TaskRegistry } from "../../task/TaskRegistry" @@ -9,6 +10,7 @@ import axios from "axios" import { type ProviderSettingsEntry, + type ProviderSettings, type ClineMessage, type ExtensionMessage, type ExtensionState, @@ -18,6 +20,7 @@ import { DEFAULT_DIFF_FUZZY_THRESHOLD, DEFAULT_WRITE_DELAY_MS, providerIdentifiers, + openAiModelInfoSaneDefaults, } from "@roo-code/types" import { TelemetryService } from "@roo-code/telemetry" @@ -25,6 +28,7 @@ import { defaultModeSlug } from "../../../shared/modes" import { experimentDefault } from "../../../shared/experiments" import { setTtsEnabled } from "../../../utils/tts" import { ContextProxy } from "../../config/ContextProxy" +import { WorkspaceIndexingEnablementManager } from "../../../services/code-index/workspace-indexing-enablement-manager" import { Task, TaskOptions } from "../../task/Task" import { safeWriteJson } from "../../../utils/safeWriteJson" @@ -85,6 +89,9 @@ vi.mock("../../../utils/storage", () => ({ getSettingsDirectoryPath: vi.fn().mockResolvedValue("/test/settings/path"), getTaskDirectoryPath: vi.fn().mockResolvedValue("/test/task/path"), getGlobalStoragePath: vi.fn().mockResolvedValue("/test/storage/path"), + // Deletion resolves the tasks directory before it removes a history + // file, so the harness must provide the passthrough base path. + getStorageBasePath: vi.fn().mockImplementation((defaultPath: string) => defaultPath), })) vi.mock("@modelcontextprotocol/sdk/types.js", () => ({ @@ -559,6 +566,15 @@ describe("ClineProvider", () => { }) }) + test("exposes only the explicitly associated workspace without a fallback", () => { + provider["currentWorkspacePath"] = "/workspace-a" + expect(provider.workspacePath).toBe("/workspace-a") + provider["currentWorkspacePath"] = "/workspace-b" + expect(provider.workspacePath).toBe("/workspace-b") + provider["currentWorkspacePath"] = undefined + expect(provider.workspacePath).toBeUndefined() + }) + test("constructor initializes correctly", () => { expect(provider).toBeInstanceOf(ClineProvider) // Since getVisibleInstance returns the last instance where view.visible is true @@ -662,12 +678,14 @@ describe("ClineProvider", () => { }) test("resolveWebviewView sets up webview correctly in development mode even if local server is not running", async () => { + const developmentContext = { ...mockContext, extensionMode: vscode.ExtensionMode.Development } provider = new ClineProvider( - { ...mockContext, extensionMode: vscode.ExtensionMode.Development }, + developmentContext, mockOutputChannel, "sidebar", - new ContextProxy(mockContext), + new ContextProxy(developmentContext), ) + // The dev-server probe fails, so the HMR path falls back to the production HTML. ;(axios.get as any).mockRejectedValueOnce(new Error("Network error")) await provider.resolveWebviewView(mockWebviewView) @@ -693,6 +711,56 @@ describe("ClineProvider", () => { expect(scriptSrcMatch![0]).toContain("'wasm-unsafe-eval'") }) + test("resolveWebviewView builds HMR content against the local dev server when it is reachable", async () => { + const originalThemeFixtureProbe = process.env.ROO_CODE_THEME_FIXTURE_PROBE + delete process.env.ROO_CODE_THEME_FIXTURE_PROBE + // getHMRHtmlContent prefers an on-disk .vite-port file when one exists, so a + // stale dev leftover could silently move the probe (and the HMR URLs) to + // another port. Establish the default-port branch for this test by hiding + // exactly that file from the existence check; every other path falls + // through to the real implementation. + const realExistsSync = fs.existsSync + const existsSyncSpy = vi + .spyOn(fs, "existsSync") + .mockImplementation((target) => + path.basename(String(target)) === ".vite-port" ? false : realExistsSync(target), + ) + + try { + provider = new ClineProvider( + { ...mockContext, extensionMode: vscode.ExtensionMode.Development }, + mockOutputChannel, + "sidebar", + new ContextProxy({ ...mockContext, extensionMode: vscode.ExtensionMode.Development }), + ) + // The default axios mock resolves, so the dev-server probe succeeds and the + // HMR HTML branch (instead of the production fallback) is taken. + vi.mocked(axios.get).mockClear() + await provider.resolveWebviewView(mockWebviewView) + + // Pin the health-check URL itself: the mock resolves for any URL, so only + // this assertion keeps the probe from silently drifting back to + // `localhost` (the IPv6 resolution failure this branch fixes). + expect(axios.get).toHaveBeenCalledWith("http://127.0.0.1:5173") + + const html = mockWebviewView.webview.html + // The dev server URL must be baked into the module script tag and CSP directives. + expect(html).toContain("http://127.0.0.1:5173/src/index.tsx") + expect(html).toContain("ws://127.0.0.1:5173") + expect(html).toContain("http://127.0.0.1:5173/@react-refresh") + } finally { + existsSyncSpy.mockRestore() + // Always restore the probe flag (even when an assertion above throws), + // so later tests outside the fixture-probe describe block cannot observe + // this test's deletion. + if (originalThemeFixtureProbe !== undefined) { + process.env.ROO_CODE_THEME_FIXTURE_PROBE = originalThemeFixtureProbe + } else { + delete process.env.ROO_CODE_THEME_FIXTURE_PROBE + } + } + }) + test("postMessageToWebview sends message to webview", async () => { await provider.resolveWebviewView(mockWebviewView) @@ -1018,6 +1086,33 @@ describe("ClineProvider", () => { expect(postStateSpy).toHaveBeenCalledTimes(2) }) + // Characterization test for the semantics that made #1078's throttle a no-op in practice: + // flushing right after a leading-edge post has no pending trailing invocation to run, so it + // only cancels the trailing timer — and the next call then hits the leading edge again. + // Callers on a hot path (see Task#addToClineMessages) must therefore not flush per message. + test("flushing after every post defeats coalescing entirely", async () => { + const postStateSpy = vi.spyOn(provider, "postStateToWebviewWithoutTaskHistory").mockResolvedValue(undefined) + + for (let i = 0; i < 5; i++) { + await provider.postStateToWebviewThrottled() + await provider.flushPostStateToWebviewThrottled() + await vi.advanceTimersByTimeAsync(100) + } + + // One full-state post per call: no coalescing at all. + expect(postStateSpy).toHaveBeenCalledTimes(5) + + // The same burst without the interleaved flush coalesces into far fewer posts. + postStateSpy.mockClear() + for (let i = 0; i < 5; i++) { + await provider.postStateToWebviewThrottled() + await vi.advanceTimersByTimeAsync(100) + } + await vi.advanceTimersByTimeAsync(500) + + expect(postStateSpy.mock.calls.length).toBeLessThan(5) + }) + test("flushes a pending trailing post exactly once and waits for it", async () => { let releasePost!: () => void const pendingPost = new Promise((resolve) => { @@ -1479,6 +1574,25 @@ describe("ClineProvider", () => { expect(postedState.apiConfiguration).toMatchObject(expectedConfiguration) }) + test.each([true, false, undefined])( + "returns saved OpenAI-compatible reasoning settings to the webview when enabled is %s", + async (enableReasoningEffort) => { + await provider.resolveWebviewView(mockWebviewView) + const configuration: ProviderSettings = { + apiProvider: providerIdentifiers.openai, + openAiModelId: "custom-model", + enableReasoningEffort, + reasoningEffort: "low", + openAiCustomModelInfo: { ...openAiModelInfoSaneDefaults, reasoningEffort: "max" }, + } + await provider.contextProxy.setProviderSettings(configuration) + + expect(provider.contextProxy.getProviderSettings()).toMatchObject(configuration) + expect((await provider.getState()).apiConfiguration).toMatchObject(configuration) + expect((await provider.getStateToPostToWebview()).apiConfiguration).toMatchObject(configuration) + }, + ) + test("getState returns the saved destructive command guard setting", async () => { await provider.contextProxy.setValue("destructiveCommandGuardEnabled", true) @@ -1494,6 +1608,13 @@ describe("ClineProvider", () => { expect(state.alwaysDenyUnapprovedCommands).toBe(true) }) + + test("getState defaults blanket auto-deny to false", async () => { + const state = await provider.getState() + + expect(state.alwaysDenyUnapprovedCommands).toBe(false) + }) + test("getState returns the saved allowed read files", async () => { await provider.contextProxy.setValue("allowedReadFiles", ["notes.md"]) @@ -1603,7 +1724,6 @@ describe("ClineProvider", () => { const state = await provider.getStateToPostToWebview() expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: false }) - }) test("getStateToPostToWebview returns the saved blanket auto-deny setting", async () => { await provider.resolveWebviewView(mockWebviewView) @@ -1613,6 +1733,15 @@ describe("ClineProvider", () => { expect(state.alwaysDenyUnapprovedCommands).toBe(true) }) + + test("getStateToPostToWebview disables blanket auto-deny by default", async () => { + await provider.resolveWebviewView(mockWebviewView) + + const state = await provider.getStateToPostToWebview() + + expect(state.alwaysDenyUnapprovedCommands).toBe(false) + }) + test("language is set to VSCode language", async () => { // Mock VSCode language as Spanish ;(vscode.env as any).language = "pt-BR" @@ -1621,18 +1750,43 @@ describe("ClineProvider", () => { expect(state.language).toBe("pt-BR") }) - test("writeDelayMs defaults to 1000ms", async () => { + test("writeDelayMs defaults to DEFAULT_WRITE_DELAY_MS", async () => { // Mock globalState.get to return undefined for writeDelayMs (typed reassignment, - // same pattern as main's fallback-default test below — Memento.get has no mock type) + // same pattern as the customModePrompts test below — Memento.get has no mock type) mockContext.globalState.get = vi.fn((key: string) => { return key === "writeDelayMs" ? undefined : null }) const state = await provider.getState() - expect(state.writeDelayMs).toBe(1000) + expect(state.writeDelayMs).toBe(DEFAULT_WRITE_DELAY_MS) + }) + + test("getStateToPostToWebview returns the persisted writeDelayMs value", async () => { + await provider.resolveWebviewView(mockWebviewView) + + // Simulate the updateSettings handler storing the value. + await provider.contextProxy.setValue("writeDelayMs", 500) + + const state = await provider.getStateToPostToWebview() + + expect(state.writeDelayMs).toBe(500) + }) + + test("getStateToPostToWebview defaults writeDelayMs to DEFAULT_WRITE_DELAY_MS when unset", async () => { + await provider.resolveWebviewView(mockWebviewView) + + // Ensure the setting is not persisted. + await provider.contextProxy.setValue("writeDelayMs", undefined) + + const state = await provider.getStateToPostToWebview() + + expect(state.writeDelayMs).toBe(DEFAULT_WRITE_DELAY_MS) }) test("getState applies fallback defaults for write, diff, and terminal settings", async () => { + // Mock globalState.get to return undefined for the fallback settings + // (typed reassignment — Memento.get has no mock type, same pattern as the + // writeDelayMs default test above) mockContext.globalState.get = vi.fn((key: string) => { if ( [ @@ -2984,7 +3138,7 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { postMessageToWebview: vi.fn().mockResolvedValue(true), postStateToWebview: vi.fn().mockResolvedValue(undefined), getCurrentTask: vi.fn(), - getCurrentWorkspaceCodeIndexManager: vi.fn(), + getCurrentWorkspaceCodeIndexScope: vi.fn(), getMcpHub: vi.fn().mockReturnValue({ getMcpSettingsFilePath: vi.fn().mockResolvedValue("/test/mcp.json"), }), @@ -3040,10 +3194,11 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { startIndexing: vi.fn().mockReturnValue(indexingPromise), }) const provider = createProvider({ - getCurrentWorkspaceCodeIndexManager: vi.fn().mockReturnValue(manager), + getCurrentWorkspaceCodeIndexScope: vi.fn().mockReturnValue({ codeIndexManager: manager }), }) await expect(webviewMessageHandler(provider, { type: "startIndexing" })).resolves.toBeUndefined() + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() expect(manager.startIndexing).toHaveBeenCalledOnce() rejectIndexing(new Error("boom")) @@ -3197,14 +3352,29 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { it("covers changed indexing status, secret, and missing-manager responses", async () => { const manager = createIndexManager() - const getManager = vi.fn().mockReturnValueOnce(undefined).mockReturnValue(manager) - const provider = createProvider({ getCurrentWorkspaceCodeIndexManager: getManager }) + const getScope = vi.fn().mockReturnValueOnce(undefined).mockReturnValue({ codeIndexManager: manager }) + const provider = createProvider({ + getCurrentWorkspaceCodeIndexScope: getScope, + }) await webviewMessageHandler(provider, { type: "requestIndexingStatus" }) + expect(manager.getCurrentStatus).not.toHaveBeenCalled() + expect(provider.postMessageToWebview).toHaveBeenCalledWith({ + type: "indexingStatusUpdate", + values: expect.objectContaining({ systemStatus: "Error", message: expect.any(String) }), + }) await webviewMessageHandler(provider, { type: "requestIndexingStatus" }) + expect(getScope).toHaveBeenCalledTimes(2) + expect(manager.getCurrentStatus).toHaveBeenCalledOnce() + expect(provider.postMessageToWebview).toHaveBeenLastCalledWith({ + type: "indexingStatusUpdate", + values: manager.getCurrentStatus.mock.results[0].value, + }) await webviewMessageHandler(provider, { type: "requestCodeIndexSecretStatus" }) - getManager.mockReturnValueOnce(undefined) + getScope.mockReturnValueOnce(undefined) await webviewMessageHandler(provider, { type: "startIndexing" }) + expect(getScope).toHaveBeenCalledTimes(3) + expect(manager.setWorkspaceEnabled).not.toHaveBeenCalled() expect(provider.postMessageToWebview).toHaveBeenCalledWith( expect.objectContaining({ type: "codeIndexSecretStatus" }), @@ -3221,7 +3391,7 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { .mockRejectedValueOnce(new Error("second failure")), }) const provider = createProvider({ - getCurrentWorkspaceCodeIndexManager: vi.fn().mockReturnValue(manager), + getCurrentWorkspaceCodeIndexScope: vi.fn().mockReturnValue({ codeIndexManager: manager }), }) await webviewMessageHandler(provider, { type: "startIndexing" }) @@ -3237,10 +3407,18 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { startIndexing: vi.fn().mockRejectedValue(new Error("toggle failure")), }) const provider = createProvider({ - getCurrentWorkspaceCodeIndexManager: vi.fn().mockReturnValue(manager), + getCurrentWorkspaceCodeIndexScope: vi.fn().mockReturnValue({ + codeIndexManager: manager, + workspaceIndexingEnablementManager: new WorkspaceIndexingEnablementManager(manager), + }), }) await webviewMessageHandler(provider, { type: "stopIndexing" }) + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() + expect(provider.postMessageToWebview).toHaveBeenCalledExactlyOnceWith({ + type: "indexingStatusUpdate", + values: manager.getCurrentStatus(), + }) await webviewMessageHandler(provider, { type: "toggleWorkspaceIndexing", bool: true }) await Promise.resolve() @@ -3251,8 +3429,87 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { ) }) + it("does not toggle indexing or publish status without a workspace scope", async () => { + const provider = createProvider() + await webviewMessageHandler(provider, { type: "toggleWorkspaceIndexing", bool: true }) + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() + expect(provider.log).toHaveBeenCalledExactlyOnceWith( + "Cannot toggle workspace indexing: No workspace folder open", + ) + expect(provider.postMessageToWebview).not.toHaveBeenCalled() + }) + + it.each([ + { bool: true, expected: true }, + { bool: false, expected: false }, + { bool: undefined, expected: false }, + ])("delegates workspace enablement with bool=$bool as $expected", async ({ bool, expected }) => { + const setEnabled = vi.fn().mockResolvedValue(undefined) + const provider = createProvider({ + getCurrentWorkspaceCodeIndexScope: vi.fn().mockReturnValue({ + workspaceIndexingEnablementManager: { setEnabled }, + }), + }) + const message: WebviewMessage = { type: "toggleWorkspaceIndexing" } + if (bool !== undefined) { + message.bool = bool + } + await webviewMessageHandler(provider, message) + expect(setEnabled).toHaveBeenCalledExactlyOnceWith(expected, provider) + // Status publication belongs to the enablement manager, not the handler. + expect(provider.postMessageToWebview).not.toHaveBeenCalled() + expect(provider.log).not.toHaveBeenCalled() + }) + + it("does not stop indexing or publish status without a workspace scope", async () => { + const provider = createProvider() + await webviewMessageHandler(provider, { type: "stopIndexing" }) + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() + expect(provider.log).toHaveBeenCalledWith("Cannot stop indexing: No workspace folder open") + expect(provider.postMessageToWebview).not.toHaveBeenCalled() + }) + + it.each([true, false])("resolves the scope after saving index settings (workspace=%s)", async (hasWorkspace) => { + const handleSettingsChange = vi.fn().mockResolvedValue(undefined) + const manager = createIndexManager({ handleSettingsChange, isFeatureEnabled: false }) + const provider = createProvider({ + getCurrentWorkspaceCodeIndexScope: vi + .fn() + .mockReturnValue(hasWorkspace ? { codeIndexManager: manager } : undefined), + }) + + await webviewMessageHandler(provider, { + type: "saveCodeIndexSettingsAtomic", + codeIndexSettings: { + codebaseIndexEnabled: false, + codebaseIndexQdrantUrl: "http://localhost:6333", + codebaseIndexEmbedderProvider: providerIdentifiers.openai, + codebaseIndexEmbedderModelId: "text-embedding-3-small", + }, + }) + + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() + expect(provider.postMessageToWebview).toHaveBeenCalledWith( + expect.objectContaining({ type: "codeIndexSettingsSaved", success: true }), + ) + if (hasWorkspace) { + expect(handleSettingsChange).toHaveBeenCalledOnce() + } else { + expect(handleSettingsChange).not.toHaveBeenCalled() + expect(provider.log).toHaveBeenCalledWith("Cannot save code index settings: No workspace folder open") + } + }) + + it("does not update auto-enable defaults without a workspace scope", async () => { + const provider = createProvider() + await webviewMessageHandler(provider, { type: "setAutoEnableDefault", bool: true }) + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() + expect(provider.log).toHaveBeenCalledWith("Cannot set auto-enable default: No workspace folder open") + expect(provider.postMessageToWebview).not.toHaveBeenCalled() + }) + it("catches auto-enabled indexing failures and posts the resulting status", async () => { - const { CodeIndexManager } = await import("../../../services/code-index/manager") + const { CodeIndexManagerRegistry } = await import("../../../services/code-index/code-index-manager-registry") let workspaceEnabled = false const manager = createIndexManager({ setAutoEnableDefault: vi.fn().mockImplementation(async () => { @@ -3262,16 +3519,17 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { }) Object.defineProperty(manager, "isWorkspaceEnabled", { get: () => workspaceEnabled }) const getAllInstances = vi - .spyOn(CodeIndexManager, "getAllInstances") - .mockReturnValue([manager] as unknown as ReturnType) + .spyOn(CodeIndexManagerRegistry, "getAllInstances") + .mockReturnValue([manager] as unknown as ReturnType) const provider = createProvider({ - getCurrentWorkspaceCodeIndexManager: vi.fn().mockReturnValue(manager), + getCurrentWorkspaceCodeIndexScope: vi.fn().mockReturnValue({ codeIndexManager: manager }), }) try { await webviewMessageHandler(provider, { type: "setAutoEnableDefault", bool: true }) await Promise.resolve() + expect(provider.getCurrentWorkspaceCodeIndexScope).toHaveBeenCalledOnce() expect(manager.startIndexing).toHaveBeenCalledOnce() expect(provider.log).toHaveBeenCalledWith("Indexing error: Error: auto-enable failure") expect(provider.postMessageToWebview).toHaveBeenCalledWith( @@ -3284,14 +3542,22 @@ describe("webviewMessageHandler no-floating-promises coverage", () => { it("covers changed clear-index response paths", async () => { const manager = createIndexManager() - const getManager = vi.fn().mockReturnValueOnce(undefined).mockReturnValue(manager) - const provider = createProvider({ getCurrentWorkspaceCodeIndexManager: getManager }) + const getScope = vi.fn().mockReturnValueOnce(undefined).mockReturnValue({ codeIndexManager: manager }) + const provider = createProvider({ getCurrentWorkspaceCodeIndexScope: getScope }) await webviewMessageHandler(provider, { type: "clearIndexData" }) + expect(manager.clearIndexData).not.toHaveBeenCalled() + expect(provider.log).toHaveBeenCalledWith("Cannot clear index data: No workspace folder open") + expect(provider.postMessageToWebview).toHaveBeenCalledExactlyOnceWith({ + type: "indexCleared", + values: { success: false, error: expect.any(String) }, + }) await webviewMessageHandler(provider, { type: "clearIndexData" }) manager.clearIndexData.mockRejectedValueOnce(new Error("clear failed")) await webviewMessageHandler(provider, { type: "clearIndexData" }) + expect(getScope).toHaveBeenCalledTimes(3) + expect(manager.clearIndexData).toHaveBeenCalledTimes(2) expect(provider.postMessageToWebview).toHaveBeenCalledWith({ type: "indexCleared", values: { success: true }, @@ -4989,6 +5255,36 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => { }) describe("getTaskWithId", () => { + it("does not restore a deleted file-backed task from legacy history", async () => { + const historyItem = { + id: "deleted-task", + task: "legacy task", + ts: Date.now(), + number: 1, + tokensIn: 0, + tokensOut: 0, + totalCost: 0, + } + vi.mocked(mockContext.globalState.get).mockImplementation((key: string) => { + if (key === "taskHistory") { + return [historyItem] + } + return undefined + }) + + provider.taskHistoryStore["cache"].set(historyItem.id, historyItem) + await provider.taskHistoryStore.delete(historyItem.id) + provider["taskHistoryStoreInitialized"] = true + + await expect(provider.getTaskWithId(historyItem.id)).rejects.toThrow("Task not found") + }) + + it("rejects a missing task before file-backed history initialization", async () => { + provider["taskHistoryStoreInitialized"] = false + vi.mocked(mockContext.globalState.get).mockReturnValue(undefined) + await expect(provider.getTaskWithId("cold-start-missing-task")).rejects.toThrow("Task not found") + }) + it("returns empty apiConversationHistory when file is missing", async () => { const historyItem = { id: "missing-api-file-task", task: "test task", ts: Date.now() } vi.mocked(mockContext.globalState.get).mockImplementation((key: string) => { diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx index 8b789cc698..04ea3de09b 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.spec.tsx @@ -277,6 +277,7 @@ const mockPostMessage = (state: any) => { shouldShowAnnouncement: false, allowedCommands: [], alwaysAllowExecute: false, + alwaysDenyUnapprovedCommands: false, ttsEnabled: false, ttsSpeed: 1, soundEnabled: false, @@ -853,6 +854,7 @@ describe("SettingsView - Experimental Settings", () => { }) }) + describe("SettingsView - Blanket Auto-Deny", () => { beforeEach(() => { vi.clearAllMocks() From 72fd8691aa5f1d3da283f723ea1cff086d4fe5cc Mon Sep 17 00:00:00 2001 From: easonLiangWorldedtech Date: Tue, 6 Oct 2026 15:16:19 +0800 Subject: [PATCH 11/12] test(webview): close the test the conflict cut open The conflict boundary fell between the last assertion of the dynamicThinkingEffort-unset test and its closing brace, so keeping both sides left the test open and eslint reported a parse error at the end of the file. Restoring the brace makes the file balance; both spec files now scan to depth zero. --- src/core/webview/__tests__/ClineProvider.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index d79632be47..a77a32db3b 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -1724,6 +1724,7 @@ describe("ClineProvider", () => { const state = await provider.getStateToPostToWebview() expect(state.experiments).toEqual({ ...experimentDefault, dynamicThinkingEffort: false }) + }) test("getStateToPostToWebview returns the saved blanket auto-deny setting", async () => { await provider.resolveWebviewView(mockWebviewView) From d47e9377591f0025c6068097053a37934cd89d2c Mon Sep 17 00:00:00 2001 From: easonLiangWorldedtech Date: Wed, 7 Oct 2026 21:29:53 +0800 Subject: [PATCH 12/12] chore: re-run the e2e-mock restart scenario The e2e-mock job failed at 7c98c57fe in the [restart:verify] phase with 'Task should be present after restart'. The same phase passes at this same merge on #1521/#1522/#1528/#1311, so this re-runs the job before treating it as a real regression.