diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 17c53f40d4..4f412cb395 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -119,10 +119,16 @@ export const stories: Record = { ) }, - "auto-approve-settings": async () => { + "auto-approve-settings": async ({ followupAutoApproveTimeoutMs }) => { const { AutoApproveSettingsStory } = await import("@/components/settings/__tests__/AutoApproveSettings.visual.fixture") - return + return ( + + ) }, "chat-text-area": async () => { const { ChatTextAreaStory } = await import("@/components/chat/__tests__/ChatTextArea.visual.fixture") diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 4fa6f9ab1d..9125c642fc 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -59,6 +59,13 @@ export const FollowUpSuggest = ({ ? followupAutoApproveTimeoutMs : DEFAULT_FOLLOWUP_TIMEOUT_MS + // A timeout of 0 (or negative) means "never auto-select": don't start a + // countdown at all, and let the user choose an answer manually. + if (timeoutMs <= 0) { + setCountdown(null) + return () => onCancelAutoApproval?.() + } + // Convert milliseconds to seconds for the countdown setCountdown(Math.floor(timeoutMs / 1000)) diff --git a/webview-ui/src/components/chat/__tests__/FollowUpSuggest.spec.tsx b/webview-ui/src/components/chat/__tests__/FollowUpSuggest.spec.tsx index 9f437d685b..af5fcc9871 100644 --- a/webview-ui/src/components/chat/__tests__/FollowUpSuggest.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/FollowUpSuggest.spec.tsx @@ -100,6 +100,55 @@ describe("FollowUpSuggest", () => { expect(screen.getByText(/Selecting in 3s/)).toBeInTheDocument() }) + it("should not show countdown and should not auto-select when timeout is 0", () => { + const testState: TestExtensionState = { + ...defaultTestState, + followupAutoApproveTimeoutMs: 0, + } + + const { unmount } = renderWithTestProviders( + , + testState, + ) + + // A timeout of 0 means "never auto-select": no countdown should be shown. + expect(screen.queryByText(/\d+s/)).not.toBeInTheDocument() + + // Advancing time must not trigger the auto-selection callback. + act(() => { + vi.advanceTimersByTime(10000) + }) + expect(mockOnSuggestionClick).not.toHaveBeenCalled() + + // Unmounting still notifies the caller that no auto-approval is pending. + unmount() + expect(mockOnCancelAutoApproval).toHaveBeenCalled() + }) + + it("should not show countdown for negative timeout values", () => { + const testState: TestExtensionState = { + ...defaultTestState, + followupAutoApproveTimeoutMs: -1000, + } + + renderWithTestProviders( + , + testState, + ) + + expect(screen.queryByText(/\d+s/)).not.toBeInTheDocument() + }) + it("should not display countdown timer when isAnswered is true", () => { renderWithTestProviders(
{followupAutoApproveTimeoutMs / 1000}s
-
- {t("settings:autoApprove.followupQuestions.timeoutLabel")} +
+ {followupAutoApproveTimeoutMs === 0 + ? t("settings:autoApprove.followupQuestions.timeoutZeroDescription") + : t("settings:autoApprove.followupQuestions.timeoutLabel")}
diff --git a/webview-ui/src/components/settings/__tests__/AutoApproveSettings.spec.tsx b/webview-ui/src/components/settings/__tests__/AutoApproveSettings.spec.tsx index 12090b42b5..5832ee8589 100644 --- a/webview-ui/src/components/settings/__tests__/AutoApproveSettings.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/AutoApproveSettings.spec.tsx @@ -2,6 +2,8 @@ import React from "react" +import { within } from "@testing-library/react" + import { render, screen, fireEvent } from "@/utils/test-utils" import { AutoApproveSettings } from "../AutoApproveSettings" @@ -354,3 +356,39 @@ describe("AutoApproveSettings - Save/Discard contract", () => { expectNoImmediateUpdateSettings() }) }) + +// The follow-up timeout slider is exercised here rather than in the visual suite: +// behavior lives in Vitest and *.visual.tsx keeps only a focused screenshot. +describe("AutoApproveSettings - follow-up timeout slider", () => { + // The Radix Slider root carries data-testid; the element with role="slider" is + // its thumb, which owns aria-valuemin/aria-valuenow. + const getSliderThumb = (): HTMLElement => within(screen.getByTestId("followup-timeout-slider")).getByRole("slider") + + it("renders the slider with a zero minimum that allows a never-auto-select timeout", () => { + renderSettings({ alwaysAllowFollowupQuestions: true, followupAutoApproveTimeoutMs: 0 }) + + const thumb = getSliderThumb() + + expect(thumb).toHaveAttribute("aria-valuemin", "0") + expect(thumb).toHaveAttribute("aria-valuenow", "0") + }) + + it("describes a zero timeout as never auto-selecting", () => { + renderSettings({ alwaysAllowFollowupQuestions: true, followupAutoApproveTimeoutMs: 0 }) + const description = screen.getByTestId("auto-approve-followup-timeout-description") + + // The translation mock returns the key verbatim, so the zero branch is + // distinguishable from the positive branch by its key alone. + expect(description).toHaveTextContent("settings:autoApprove.followupQuestions.timeoutZeroDescription") + expect(description).not.toHaveTextContent("settings:autoApprove.followupQuestions.timeoutLabel") + }) + + it("describes a positive timeout with the wait-time label", () => { + renderSettings({ alwaysAllowFollowupQuestions: true, followupAutoApproveTimeoutMs: 60000 }) + + expect(screen.getByText("settings:autoApprove.followupQuestions.timeoutLabel")).toBeInTheDocument() + expect( + screen.queryByText("settings:autoApprove.followupQuestions.timeoutZeroDescription"), + ).not.toBeInTheDocument() + }) +}) diff --git a/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.fixture.tsx b/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.fixture.tsx index d7fa363fdc..8e85698470 100644 --- a/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.fixture.tsx +++ b/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.fixture.tsx @@ -13,6 +13,7 @@ interface AutoApproveState { alwaysAllowSubtasks: boolean alwaysAllowExecute: boolean alwaysAllowFollowupQuestions: boolean + followupAutoApproveTimeoutMs?: number destructiveCommandGuardEnabled: boolean alwaysDenyUnapprovedCommands: boolean allowedCommands: string[] @@ -23,7 +24,7 @@ interface AutoApproveState { allowedMaxCost?: number } -export function AutoApproveSettingsStory() { +export function AutoApproveSettingsStory({ followupAutoApproveTimeoutMs }: { followupAutoApproveTimeoutMs?: number }) { // The blanket auto-deny checkbox is pinned here in its operative mode: with // the destructive command guard on it is the fail-closed policy, and the // guard's hidden command-list editors would otherwise vary the snapshot. @@ -34,7 +35,8 @@ export function AutoApproveSettingsStory() { alwaysAllowModeSwitch: false, alwaysAllowSubtasks: false, alwaysAllowExecute: true, - alwaysAllowFollowupQuestions: false, + alwaysAllowFollowupQuestions: followupAutoApproveTimeoutMs !== undefined, + followupAutoApproveTimeoutMs, destructiveCommandGuardEnabled: true, alwaysDenyUnapprovedCommands: true, allowedCommands: [], @@ -62,6 +64,7 @@ export function AutoApproveSettingsStory() { return { ...current, [field]: Array.isArray(value) ? [...value] : [] } case "allowedMaxRequests": case "allowedMaxCost": + case "followupAutoApproveTimeoutMs": return { ...current, [field]: typeof value === "number" ? value : undefined } default: return current diff --git a/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.tsx b/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.tsx index 049330e4cc..9170b199f4 100644 --- a/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.tsx +++ b/webview-ui/src/components/settings/__tests__/AutoApproveSettings.visual.tsx @@ -17,4 +17,14 @@ for (const theme of visualThemes) { await expect(checkbox).toBeChecked() await expect(story).toHaveScreenshot(`auto-approve-settings-${theme.name}.png`) }) + + // Behavioral assertions for the slider (minimum, current value, and the zero-timeout + // description) live in AutoApproveSettings.spec.tsx. This visual test establishes a + // deterministic zero-timeout state and makes the focused screenshot assertion. + test(`renders the zero follow-up timeout in the VS Code ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("auto-approve-settings", { followupAutoApproveTimeoutMs: 0 })) + await applyVisualTheme(page, theme) + const story = component.getByTestId("auto-approve-settings-story") + await expect(story).toHaveScreenshot(`auto-approve-settings-followup-zero-${theme.name}.png`) + }) } diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-dark.png b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-dark.png new file mode 100644 index 0000000000..53638679af Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-dark.png differ diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-high-contrast-light.png b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-high-contrast-light.png new file mode 100644 index 0000000000..28403312db Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-high-contrast-light.png differ diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-high-contrast.png b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-high-contrast.png new file mode 100644 index 0000000000..24554d262e Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-high-contrast.png differ diff --git a/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-light.png b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-light.png new file mode 100644 index 0000000000..30d7530a0d Binary files /dev/null and b/webview-ui/src/components/settings/__tests__/__screenshots__/auto-approve-settings-followup-zero-light.png differ diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index b1445d0ec4..c01157b2bc 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Pregunta", "description": "Seleccionar automàticament la primera resposta suggerida per a preguntes de seguiment després del temps d'espera configurat", - "timeoutLabel": "Temps d'espera abans de seleccionar automàticament la primera resposta" + "timeoutLabel": "Temps d'espera abans de seleccionar automàticament la primera resposta", + "timeoutZeroDescription": "Estableix a 0 per no seleccionar mai automàticament — espera sempre que triïs una resposta manualment" }, "execute": { "label": "Executar", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index ae27940b9e..1a1cd7686a 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Frage", "description": "Automatisch die erste vorgeschlagene Antwort für Folgefragen nach der konfigurierten Zeitüberschreitung auswählen", - "timeoutLabel": "Wartezeit vor der automatischen Auswahl der ersten Antwort" + "timeoutLabel": "Wartezeit vor der automatischen Auswahl der ersten Antwort", + "timeoutZeroDescription": "Auf 0 setzen, um nie automatisch auszuwählen — warte immer, bis du manuell eine Antwort auswählst" }, "execute": { "label": "Ausführen", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index b1e2740353..cd593e8113 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -415,7 +415,8 @@ "followupQuestions": { "label": "Question", "description": "Automatically select the first suggested answer for follow-up questions after the configured timeout", - "timeoutLabel": "Time to wait before auto-selecting the first answer" + "timeoutLabel": "Time to wait before auto-selecting the first answer", + "timeoutZeroDescription": "Set to 0 to never auto-select — always wait for you to choose an answer manually" }, "execute": { "label": "Execute", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 7b4bfbe6fc..f3183441ec 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Pregunta", "description": "Seleccionar automáticamente la primera respuesta sugerida para preguntas de seguimiento después del tiempo de espera configurado", - "timeoutLabel": "Tiempo de espera antes de seleccionar automáticamente la primera respuesta" + "timeoutLabel": "Tiempo de espera antes de seleccionar automáticamente la primera respuesta", + "timeoutZeroDescription": "Establece en 0 para no seleccionar nunca automáticamente — espera siempre a que elijas una respuesta manualmente" }, "execute": { "label": "Ejecutar", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index c8083be95c..1530c9db23 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -338,7 +338,8 @@ "followupQuestions": { "label": "Question", "description": "Sélectionner automatiquement la première réponse suggérée pour les questions de suivi après le délai configuré", - "timeoutLabel": "Temps d'attente avant la sélection automatique de la première réponse" + "timeoutLabel": "Temps d'attente avant la sélection automatique de la première réponse", + "timeoutZeroDescription": "Défini sur 0 pour ne jamais sélectionner automatiquement — attends toujours que tu choisisses une réponse manuellement" }, "execute": { "label": "Exécuter", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 60f7c3a596..023a3dc8d1 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "प्रश्न", "description": "कॉन्फ़िगर किए गए टाइमआउट के बाद अनुवर्ती प्रश्नों के लिए पहले सुझाए गए उत्तर को स्वचालित रूप से चुनें", - "timeoutLabel": "पहले उत्तर को स्वचालित रूप से चुनने से पहले प्रतीक्षा करने का समय" + "timeoutLabel": "पहले उत्तर को स्वचालित रूप से चुनने से पहले प्रतीक्षा करने का समय", + "timeoutZeroDescription": "कभी भी स्वचालित रूप से चयन न करने के लिए 0 पर सेट करें — हमेशा आपके मैन्युअल रूप से उत्तर चुनने की प्रतीक्षा करें" }, "execute": { "label": "निष्पादित करें", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 8754981a6e..6f857873aa 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Pertanyaan", "description": "Secara otomatis memilih jawaban pertama yang disarankan untuk pertanyaan lanjutan setelah batas waktu yang dikonfigurasi", - "timeoutLabel": "Waktu tunggu sebelum otomatis memilih jawaban pertama" + "timeoutLabel": "Waktu tunggu sebelum otomatis memilih jawaban pertama", + "timeoutZeroDescription": "Setel ke 0 untuk tidak pernah memilih otomatis — selalu tunggu Anda memilih jawaban secara manual" }, "execute": { "label": "Eksekusi", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index e14e9532fd..17b1b88d6e 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Domanda", "description": "Seleziona automaticamente la prima risposta suggerita per le domande di follow-up dopo il timeout configurato", - "timeoutLabel": "Tempo di attesa prima di selezionare automaticamente la prima risposta" + "timeoutLabel": "Tempo di attesa prima di selezionare automaticamente la prima risposta", + "timeoutZeroDescription": "Imposta a 0 per non selezionare mai automaticamente — attendi sempre che tu scelga una risposta manualmente" }, "execute": { "label": "Esegui", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 808d575a04..917d121143 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "質問", "description": "設定された時間が経過すると、フォローアップ質問の最初の提案回答を自動的に選択します", - "timeoutLabel": "最初の回答を自動選択するまでの待機時間" + "timeoutLabel": "最初の回答を自動選択するまでの待機時間", + "timeoutZeroDescription": "0 に設定すると自動選択せず、常に手動で回答を選ぶまで待機します" }, "execute": { "label": "実行", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 12faca92c8..5c2ff8b931 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "질문", "description": "설정된 시간이 지나면 후속 질문에 대한 첫 번째 제안 답변을 자동으로 선택합니다", - "timeoutLabel": "첫 번째 답변을 자동 선택하기 전 대기 시간" + "timeoutLabel": "첫 번째 답변을 자동 선택하기 전 대기 시간", + "timeoutZeroDescription": "0으로 설정하면 자동으로 선택하지 않고 항상 직접 답변을 선택할 때까지 기다립니다" }, "execute": { "label": "실행", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 914e9b85f6..8730beee2e 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Vraag", "description": "Selecteer automatisch het eerste voorgestelde antwoord voor vervolgvragen na de geconfigureerde time-out", - "timeoutLabel": "Wachttijd voordat het eerste antwoord automatisch wordt geselecteerd" + "timeoutLabel": "Wachttijd voordat het eerste antwoord automatisch wordt geselecteerd", + "timeoutZeroDescription": "Stel in op 0 om nooit automatisch te selecteren — wacht altijd tot je handmatig een antwoord kiest" }, "execute": { "label": "Uitvoeren", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 26b4551454..ffefc978ca 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Pytanie", "description": "Automatycznie wybierz pierwszą sugerowaną odpowiedź na pytania uzupełniające po skonfigurowanym limicie czasu", - "timeoutLabel": "Czas oczekiwania przed automatycznym wybraniem pierwszej odpowiedzi" + "timeoutLabel": "Czas oczekiwania przed automatycznym wybraniem pierwszej odpowiedzi", + "timeoutZeroDescription": "Ustaw na 0, aby nigdy nie wybierać automatycznie — zawsze czekaj, aż ręcznie wybierzesz odpowiedź" }, "execute": { "label": "Wykonaj", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index ed426e52de..a2e6c86e37 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Pergunta", "description": "Selecionar automaticamente a primeira resposta sugerida para perguntas de acompanhamento após o tempo limite configurado", - "timeoutLabel": "Tempo de espera antes de selecionar automaticamente a primeira resposta" + "timeoutLabel": "Tempo de espera antes de selecionar automaticamente a primeira resposta", + "timeoutZeroDescription": "Defina como 0 para nunca selecionar automaticamente — sempre aguarde você escolher uma resposta manualmente" }, "execute": { "label": "Executar", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index b810dea6b9..8dfc771bbb 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Вопрос", "description": "Автоматически выбирать первый предложенный ответ на дополнительные вопросы после настроенного тайм-аута", - "timeoutLabel": "Время ожидания перед автоматическим выбором первого ответа" + "timeoutLabel": "Время ожидания перед автоматическим выбором первого ответа", + "timeoutZeroDescription": "Установите 0, чтобы никогда не выбирать автоматически — всегда ждите, пока вы выберете ответ вручную" }, "execute": { "label": "Выполнение", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 74a38fe1c0..d0f214fdf1 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Soru", "description": "Yapılandırılan zaman aşımından sonra takip sorularına ilişkin ilk önerilen yanıtı otomatik olarak seç", - "timeoutLabel": "İlk yanıtı otomatik olarak seçmeden önce beklenecek süre" + "timeoutLabel": "İlk yanıtı otomatik olarak seçmeden önce beklenecek süre", + "timeoutZeroDescription": "Hiçbir zaman otomatik seçim yapmaması için 0 olarak ayarlayın — her zaman yanıtı manuel olarak seçmenizi bekleyin" }, "execute": { "label": "Yürüt", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 8b79b0fd4f..b378128795 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "Câu hỏi", "description": "Tự động chọn câu trả lời đầu tiên được đề xuất cho các câu hỏi tiếp theo sau thời gian chờ đã cấu hình", - "timeoutLabel": "Thời gian chờ trước khi tự động chọn câu trả lời đầu tiên" + "timeoutLabel": "Thời gian chờ trước khi tự động chọn câu trả lời đầu tiên", + "timeoutZeroDescription": "Đặt thành 0 để không bao giờ tự động chọn — luôn chờ bạn chọn câu trả lời theo cách thủ công" }, "execute": { "label": "Thực thi", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 581687216f..71e39fc56f 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -337,7 +337,8 @@ "followupQuestions": { "label": "问题", "description": "在配置的超时时间后自动选择后续问题的第一个建议答案", - "timeoutLabel": "自动选择第一个答案前的等待时间" + "timeoutLabel": "自动选择第一个答案前的等待时间", + "timeoutZeroDescription": "设为 0 表示不自动选择,始终等待你手动选择答案" }, "execute": { "label": "执行", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 54d4dae1b9..fbff542a02 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -362,7 +362,8 @@ "followupQuestions": { "label": "後續提問", "description": "在設定的逾時時間過後,自動選擇後續問題的第一個建議答案", - "timeoutLabel": "自動選擇第一個答案前的等待時間" + "timeoutLabel": "自動選擇第一個答案前的等待時間", + "timeoutZeroDescription": "設為 0 表示不自動選擇,始終等待你手動選擇答案" }, "execute": { "label": "執行命令",