From a9a2e8c2344dcba7465b373475042331343af455 Mon Sep 17 00:00:00 2001 From: NaccOll Date: Tue, 16 Sep 2025 15:30:51 +0800 Subject: [PATCH] feat: add checkpoint initialization timeout settings and warnings - Added new localization strings for checkpoint initialization timeout messages in multiple languages. - Implemented checkpoint initialization timeout feature in settings, allowing users to configure the timeout duration (10-60 seconds). - Updated the ShadowCheckpointService to handle long initialization times and provide appropriate warnings. - Enhanced the chat component to display checkpoint initialization warnings based on the new timeout settings. - Modified the CheckpointWarning component to accept custom warning messages. - Updated tests to cover new checkpoint timeout functionality and ensure proper integration. --- packages/types/src/global-settings.ts | 1 + src/__tests__/extension.spec.ts | 1 + src/core/checkpoints/index.ts | 42 ++++++++++++++++--- src/core/task/Task.ts | 4 ++ src/core/webview/ClineProvider.ts | 7 ++++ .../webview/__tests__/ClineProvider.spec.ts | 1 + src/core/webview/webviewMessageHandler.ts | 5 +++ src/i18n/locales/ca/common.json | 2 + src/i18n/locales/de/common.json | 2 + src/i18n/locales/en/common.json | 2 + src/i18n/locales/es/common.json | 2 + src/i18n/locales/fr/common.json | 2 + src/i18n/locales/hi/common.json | 2 + src/i18n/locales/id/common.json | 2 + src/i18n/locales/it/common.json | 2 + src/i18n/locales/ja/common.json | 2 + src/i18n/locales/ko/common.json | 2 + src/i18n/locales/nl/common.json | 2 + src/i18n/locales/pl/common.json | 2 + src/i18n/locales/pt-BR/common.json | 2 + src/i18n/locales/ru/common.json | 2 + src/i18n/locales/tr/common.json | 2 + src/i18n/locales/vi/common.json | 2 + src/i18n/locales/zh-CN/common.json | 2 + src/i18n/locales/zh-TW/common.json | 2 + .../checkpoints/ShadowCheckpointService.ts | 4 +- src/shared/ExtensionMessage.ts | 4 ++ src/shared/WebviewMessage.ts | 1 + webview-ui/src/components/chat/ChatView.tsx | 32 +++++--------- .../src/components/chat/CheckpointWarning.tsx | 12 +++++- .../__tests__/MarketplaceView.spec.tsx | 2 + .../settings/CheckpointSettings.tsx | 38 ++++++++++++++++- .../src/components/settings/SettingsView.tsx | 3 ++ .../src/context/ExtensionStateContext.tsx | 4 ++ .../__tests__/ExtensionStateContext.spec.tsx | 3 ++ 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 ++ 53 files changed, 239 insertions(+), 33 deletions(-) diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 7e79855f7e..205812c796 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -97,6 +97,7 @@ export const globalSettingsSchema = z.object({ cachedChromeHostUrl: z.string().optional(), enableCheckpoints: z.boolean().optional(), + checkpointTimeout: z.number().optional(), ttsEnabled: z.boolean().optional(), ttsSpeed: z.number().optional(), diff --git a/src/__tests__/extension.spec.ts b/src/__tests__/extension.spec.ts index c39854f697..6c12c473fb 100644 --- a/src/__tests__/extension.spec.ts +++ b/src/__tests__/extension.spec.ts @@ -168,6 +168,7 @@ vi.mock("../activate", () => ({ vi.mock("../i18n", () => ({ initializeI18n: vi.fn(), + t: vi.fn((key) => key), })) describe("extension.ts", () => { diff --git a/src/core/checkpoints/index.ts b/src/core/checkpoints/index.ts index bc842c9f18..04e73d5815 100644 --- a/src/core/checkpoints/index.ts +++ b/src/core/checkpoints/index.ts @@ -16,10 +16,17 @@ import { DIFF_VIEW_URI_SCHEME } from "../../integrations/editor/DiffViewProvider import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../../services/checkpoints" -export async function getCheckpointService( - task: Task, - { interval = 250, timeout = 15_000 }: { interval?: number; timeout?: number } = {}, -) { +const waitWarn = t("common:errors.wait_checkpoint_long_time") +const failWarn = t("common:errors.init_checkpoint_fail_long_time") + +function sendCheckpointInitWarn(task: Task, checkpointWarning: string) { + task.providerRef.deref()?.postMessageToWebview({ + type: "checkpointInitWarning", + checkpointWarning, + }) +} + +export async function getCheckpointService(task: Task, { interval = 250 }: { interval?: number } = {}) { if (!task.enableCheckpoints) { return undefined } @@ -30,6 +37,9 @@ export async function getCheckpointService( const provider = task.providerRef.deref() + // Get checkpoint timeout from task settings (converted to milliseconds) + const checkpointTimeoutMs = task.checkpointTimeout * 1000 + const log = (message: string) => { console.log(message) @@ -67,14 +77,28 @@ export async function getCheckpointService( } if (task.checkpointServiceInitializing) { + const checkpointInitStartTime = Date.now() + let warningShown = false + await pWaitFor( () => { - console.log("[Task#getCheckpointService] waiting for service to initialize") + const elapsed = Date.now() - checkpointInitStartTime + + // Show warning if we're past 5 seconds and haven't shown it yet + if (!warningShown && elapsed >= 5000) { + warningShown = true + sendCheckpointInitWarn(task, waitWarn) + } + + console.log( + `[Task#getCheckpointService] waiting for service to initialize (${Math.round(elapsed / 1000)}s)`, + ) return !!task.checkpointService && !!task?.checkpointService?.isInitialized }, - { interval, timeout }, + { interval, timeout: checkpointTimeoutMs }, ) if (!task?.checkpointService) { + sendCheckpointInitWarn(task, failWarn) task.enableCheckpoints = false return undefined } @@ -89,8 +113,14 @@ export async function getCheckpointService( task.checkpointServiceInitializing = true await checkGitInstallation(task, service, log, provider) task.checkpointService = service + if (task.enableCheckpoints) { + sendCheckpointInitWarn(task, "") + } return service } catch (err) { + if (err.name == "TimeoutError" && task.enableCheckpoints) { + sendCheckpointInitWarn(task, failWarn) + } log(`[Task#getCheckpointService] ${err.message}`) task.enableCheckpoints = false task.checkpointServiceInitializing = false diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index cf16df8dcc..cc4fe55dd0 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -125,6 +125,7 @@ export interface TaskOptions extends CreateTaskOptions { apiConfiguration: ProviderSettings enableDiff?: boolean enableCheckpoints?: boolean + checkpointTimeout?: number enableBridge?: boolean fuzzyMatchThreshold?: number consecutiveMistakeLimit?: number @@ -266,6 +267,7 @@ export class Task extends EventEmitter implements TaskLike { // Checkpoints enableCheckpoints: boolean + checkpointTimeout: number checkpointService?: RepoPerTaskCheckpointService checkpointServiceInitializing = false @@ -302,6 +304,7 @@ export class Task extends EventEmitter implements TaskLike { apiConfiguration, enableDiff = false, enableCheckpoints = true, + checkpointTimeout = 15, enableBridge = false, fuzzyMatchThreshold = 1.0, consecutiveMistakeLimit = DEFAULT_CONSECUTIVE_MISTAKE_LIMIT, @@ -361,6 +364,7 @@ export class Task extends EventEmitter implements TaskLike { this.globalStoragePath = provider.context.globalStorageUri.fsPath this.diffViewProvider = new DiffViewProvider(this.cwd, this) this.enableCheckpoints = enableCheckpoints + this.checkpointTimeout = checkpointTimeout this.enableBridge = enableBridge this.parentTask = parentTask diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 9abddc6d96..99a2db6171 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -864,6 +864,7 @@ export class ClineProvider apiConfiguration, diffEnabled: enableDiff, enableCheckpoints, + checkpointTimeout, fuzzyMatchThreshold, experiments, cloudUserInfo, @@ -875,6 +876,7 @@ export class ClineProvider apiConfiguration, enableDiff, enableCheckpoints, + checkpointTimeout, fuzzyMatchThreshold, consecutiveMistakeLimit: apiConfiguration.consecutiveMistakeLimit, historyItem, @@ -1717,6 +1719,7 @@ export class ClineProvider ttsSpeed, diffEnabled, enableCheckpoints, + checkpointTimeout, taskHistory, soundVolume, browserViewportSize, @@ -1829,6 +1832,7 @@ export class ClineProvider ttsSpeed: ttsSpeed ?? 1.0, diffEnabled: diffEnabled ?? true, enableCheckpoints: enableCheckpoints ?? true, + checkpointTimeout: checkpointTimeout ?? 15, shouldShowAnnouncement: telemetrySetting !== "unset" && lastShownAnnouncementId !== this.latestAnnouncementId, allowedCommands: mergedAllowedCommands, @@ -2049,6 +2053,7 @@ export class ClineProvider ttsSpeed: stateValues.ttsSpeed ?? 1.0, diffEnabled: stateValues.diffEnabled ?? true, enableCheckpoints: stateValues.enableCheckpoints ?? true, + checkpointTimeout: stateValues.checkpointTimeout ?? 15, soundVolume: stateValues.soundVolume, browserViewportSize: stateValues.browserViewportSize ?? "900x600", screenshotQuality: stateValues.screenshotQuality ?? 75, @@ -2478,6 +2483,7 @@ export class ClineProvider organizationAllowList, diffEnabled: enableDiff, enableCheckpoints, + checkpointTimeout, fuzzyMatchThreshold, experiments, cloudUserInfo, @@ -2493,6 +2499,7 @@ export class ClineProvider apiConfiguration, enableDiff, enableCheckpoints, + checkpointTimeout, fuzzyMatchThreshold, consecutiveMistakeLimit: apiConfiguration.consecutiveMistakeLimit, task: text, diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index bd4608c6eb..e362535282 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -557,6 +557,7 @@ describe("ClineProvider", () => { remoteControlEnabled: false, taskSyncEnabled: false, featureRoomoteControlEnabled: false, + checkpointTimeout: 15, } const message: ExtensionMessage = { diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index abdfae29fa..22515ccd81 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1259,6 +1259,11 @@ export const webviewMessageHandler = async ( await updateGlobalState("enableCheckpoints", enableCheckpoints) await provider.postStateToWebview() break + case "checkpointTimeout": + const checkpointTimeout = message.value ?? 15 + await updateGlobalState("checkpointTimeout", checkpointTimeout) + await provider.postStateToWebview() + break case "browserViewportSize": const browserViewportSize = message.text ?? "900x600" await updateGlobalState("browserViewportSize", browserViewportSize) diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index b71b7eb913..3eed74d7c7 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -31,6 +31,8 @@ "could_not_open_file": "No s'ha pogut obrir el fitxer: {{errorMessage}}", "could_not_open_file_generic": "No s'ha pogut obrir el fitxer!", "checkpoint_timeout": "S'ha esgotat el temps en intentar restaurar el punt de control.", + "wait_checkpoint_long_time": "La inicialització del punt de control està trigant més del previst. Això pot indicar un repositori gran o operacions Git lentes.", + "init_checkpoint_fail_long_time": "La inicialització del punt de control ha fallat després de molt de temps. Els punts de control s'han desactivat per a aquesta tasca. Pots desactivar completament els punts de control o augmentar el temps d'espera a la configuració.", "checkpoint_failed": "Ha fallat la restauració del punt de control.", "git_not_installed": "Git és necessari per a la funció de punts de control. Si us plau, instal·la Git per activar els punts de control.", "nested_git_repos_warning": "Els punts de control estan deshabilitats perquè s'ha detectat un repositori git niat a: {{path}}. Per utilitzar punts de control, si us plau elimina o reubica aquest repositori git niat.", diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 6577d460d1..67710cdcf3 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Datei konnte nicht geöffnet werden: {{errorMessage}}", "could_not_open_file_generic": "Datei konnte nicht geöffnet werden!", "checkpoint_timeout": "Zeitüberschreitung beim Versuch, den Checkpoint wiederherzustellen.", + "wait_checkpoint_long_time": "Die Initialisierung des Checkpoints dauert länger als erwartet. Das kann auf ein großes Repository oder langsame Git-Vorgänge hindeuten.", + "init_checkpoint_fail_long_time": "Die Initialisierung des Checkpoints ist nach langer Wartezeit fehlgeschlagen. Checkpoints wurden für diese Aufgabe deaktiviert. Du kannst Checkpoints komplett deaktivieren oder das Timeout in den Einstellungen erhöhen.", "checkpoint_failed": "Fehler beim Wiederherstellen des Checkpoints.", "git_not_installed": "Git ist für die Checkpoint-Funktion erforderlich. Bitte installiere Git, um Checkpoints zu aktivieren.", "nested_git_repos_warning": "Checkpoints sind deaktiviert, da ein verschachteltes Git-Repository erkannt wurde unter: {{path}}. Um Checkpoints zu verwenden, entferne oder verschiebe bitte dieses verschachtelte Git-Repository.", diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index e8c264ba68..1bc5810a5e 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -30,6 +30,8 @@ "checkpoint_failed": "Failed to restore checkpoint.", "git_not_installed": "Git is required for the checkpoints feature. Please install Git to enable checkpoints.", "nested_git_repos_warning": "Checkpoints are disabled because a nested git repository was detected at: {{path}}. To use checkpoints, please remove or relocate this nested git repository.", + "wait_checkpoint_long_time": "Checkpoint initialization is taking longer than expected. This may indicate a large repository or slow Git operations.", + "init_checkpoint_fail_long_time": "Checkpoint initialization failed after taking long time. Checkpoints have been disabled for this task. You can disable checkpoints entirely or increase the timeout in settings.", "no_workspace": "Please open a project folder first", "update_support_prompt": "Failed to update support prompt", "reset_support_prompt": "Failed to reset support prompt", diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index 5cfa3c5749..38dab107b8 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "No se pudo abrir el archivo: {{errorMessage}}", "could_not_open_file_generic": "¡No se pudo abrir el archivo!", "checkpoint_timeout": "Se agotó el tiempo al intentar restaurar el punto de control.", + "wait_checkpoint_long_time": "La inicialización del punto de control está tardando más de lo esperado. Esto puede indicar un repositorio grande o operaciones de Git lentas.", + "init_checkpoint_fail_long_time": "La inicialización del punto de control falló después de mucho tiempo. Los puntos de control se han desactivado para esta tarea. Puedes desactivar los puntos de control completamente o aumentar el tiempo de espera en la configuración.", "checkpoint_failed": "Error al restaurar el punto de control.", "git_not_installed": "Git es necesario para la función de puntos de control. Por favor, instala Git para activar los puntos de control.", "nested_git_repos_warning": "Los puntos de control están deshabilitados porque se detectó un repositorio git anidado en: {{path}}. Para usar puntos de control, por favor elimina o reubica este repositorio git anidado.", diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index 5a11c874a7..4e8de28354 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Impossible d'ouvrir le fichier : {{errorMessage}}", "could_not_open_file_generic": "Impossible d'ouvrir le fichier !", "checkpoint_timeout": "Expiration du délai lors de la tentative de rétablissement du checkpoint.", + "wait_checkpoint_long_time": "L'initialisation du checkpoint prend plus de temps que prévu. Cela peut indiquer un dépôt volumineux ou des opérations Git lentes.", + "init_checkpoint_fail_long_time": "L'initialisation du checkpoint a échoué après un long délai. Les checkpoints ont été désactivés pour cette tâche. Tu peux désactiver complètement les checkpoints ou augmenter le délai dans les paramètres.", "checkpoint_failed": "Échec du rétablissement du checkpoint.", "git_not_installed": "Git est requis pour la fonctionnalité des points de contrôle. Veuillez installer Git pour activer les points de contrôle.", "nested_git_repos_warning": "Les points de contrôle sont désactivés car un dépôt git imbriqué a été détecté à : {{path}}. Pour utiliser les points de contrôle, veuillez supprimer ou déplacer ce dépôt git imbriqué.", diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index e89c16cbd0..25d6601e88 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "फ़ाइल नहीं खोली जा सकी: {{errorMessage}}", "could_not_open_file_generic": "फ़ाइल नहीं खोली जा सकी!", "checkpoint_timeout": "चेकपॉइंट को पुनर्स्थापित करने का प्रयास करते समय टाइमआउट हो गया।", + "wait_checkpoint_long_time": "चेकपॉइंट इनिशियलाइज़ेशन अपेक्षा से अधिक समय ले रहा है। यह बड़े रिपॉजिटरी या धीमी Git ऑपरेशन्स का संकेत हो सकता है।", + "init_checkpoint_fail_long_time": "चेकपॉइंट इनिशियलाइज़ेशन लंबे समय बाद विफल हो गया। इस कार्य के लिए चेकपॉइंट्स अक्षम कर दिए गए हैं। तुम चेकपॉइंट्स पूरी तरह अक्षम कर सकते हो या सेटिंग्स में टाइमआउट बढ़ा सकते हो।", "checkpoint_failed": "चेकपॉइंट पुनर्स्थापित करने में विफल।", "git_not_installed": "चेकपॉइंट सुविधा के लिए Git आवश्यक है। कृपया चेकपॉइंट সক্ষম करने के लिए Git इंस्टॉल करें।", "nested_git_repos_warning": "चेकपॉइंट अक्षम हैं क्योंकि {{path}} पर नेस्टेड git रिपॉजिटरी का पता चला है। चेकपॉइंट का उपयोग करने के लिए, कृपया इस नेस्टेड git रिपॉजिटरी को हटाएं या स्थानांतरित करें।", diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json index ae1662eb37..17db6b0a5a 100644 --- a/src/i18n/locales/id/common.json +++ b/src/i18n/locales/id/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Tidak dapat membuka file: {{errorMessage}}", "could_not_open_file_generic": "Tidak dapat membuka file!", "checkpoint_timeout": "Timeout saat mencoba memulihkan checkpoint.", + "wait_checkpoint_long_time": "Inisialisasi checkpoint memakan waktu lebih lama dari yang diharapkan. Ini mungkin menandakan repositori besar atau operasi Git yang lambat.", + "init_checkpoint_fail_long_time": "Inisialisasi checkpoint gagal setelah waktu lama. Checkpoint telah dinonaktifkan untuk tugas ini. Kamu bisa menonaktifkan checkpoint sepenuhnya atau menambah batas waktu di pengaturan.", "checkpoint_failed": "Gagal memulihkan checkpoint.", "git_not_installed": "Git diperlukan untuk fitur checkpoint. Silakan instal Git untuk mengaktifkan checkpoint.", "nested_git_repos_warning": "Checkpoint dinonaktifkan karena repositori git bersarang terdeteksi di: {{path}}. Untuk menggunakan checkpoint, silakan hapus atau pindahkan repositori git bersarang ini.", diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index aeaec11d0d..586e9a2b0a 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Impossibile aprire il file: {{errorMessage}}", "could_not_open_file_generic": "Impossibile aprire il file!", "checkpoint_timeout": "Timeout durante il tentativo di ripristinare il checkpoint.", + "wait_checkpoint_long_time": "L'inizializzazione del checkpoint sta richiedendo più tempo del previsto. Questo può indicare un repository grande o operazioni Git lente.", + "init_checkpoint_fail_long_time": "L'inizializzazione del checkpoint è fallita dopo molto tempo. I checkpoint sono stati disabilitati per questa attività. Puoi disabilitare completamente i checkpoint o aumentare il timeout nelle impostazioni.", "checkpoint_failed": "Impossibile ripristinare il checkpoint.", "git_not_installed": "Git è richiesto per la funzione di checkpoint. Per favore, installa Git per abilitare i checkpoint.", "nested_git_repos_warning": "I checkpoint sono disabilitati perché è stato rilevato un repository git annidato in: {{path}}. Per utilizzare i checkpoint, rimuovi o sposta questo repository git annidato.", diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index a607dbffd5..0a1d0323ae 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "ファイルを開けませんでした:{{errorMessage}}", "could_not_open_file_generic": "ファイルを開けませんでした!", "checkpoint_timeout": "チェックポイントの復元を試みる際にタイムアウトしました。", + "wait_checkpoint_long_time": "チェックポイントの初期化に予想以上の時間がかかっています。これはリポジトリが大きいか、Git操作が遅い可能性があります。", + "init_checkpoint_fail_long_time": "チェックポイントの初期化が長時間かかった後に失敗しました。このタスクではチェックポイントが無効化されました。チェックポイントを完全に無効化するか、設定でタイムアウトを延長できます。", "checkpoint_failed": "チェックポイントの復元に失敗しました。", "git_not_installed": "チェックポイント機能にはGitが必要です。チェックポイントを有効にするにはGitをインストールしてください。", "nested_git_repos_warning": "{{path}} でネストされたgitリポジトリが検出されたため、チェックポイントが無効になっています。チェックポイントを使用するには、このネストされたgitリポジトリを削除または移動してください。", diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index e48b84fe20..ad5c60bced 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "파일을 열 수 없습니다: {{errorMessage}}", "could_not_open_file_generic": "파일을 열 수 없습니다!", "checkpoint_timeout": "체크포인트 복원을 시도하는 중 시간 초과되었습니다.", + "wait_checkpoint_long_time": "체크포인트 초기화가 예상보다 오래 걸리고 있어. 이는 저장소가 크거나 Git 작업이 느릴 수 있어.", + "init_checkpoint_fail_long_time": "체크포인트 초기화가 오랜 시간 후 실패했어. 이 작업에 대해 체크포인트가 비활성화됐어. 체크포인트를 완전히 끄거나 설정에서 타임아웃을 늘릴 수 있어.", "checkpoint_failed": "체크포인트 복원에 실패했습니다.", "git_not_installed": "체크포인트 기능을 사용하려면 Git이 필요합니다. 체크포인트를 활성화하려면 Git을 설치하세요.", "nested_git_repos_warning": "{{path}}에서 중첩된 git 저장소가 감지되어 체크포인트가 비활성화되었습니다. 체크포인트를 사용하려면 이 중첩된 git 저장소를 제거하거나 이동해주세요.", diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json index 0e3e2459a0..e20a7f936b 100644 --- a/src/i18n/locales/nl/common.json +++ b/src/i18n/locales/nl/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Kon bestand niet openen: {{errorMessage}}", "could_not_open_file_generic": "Kon bestand niet openen!", "checkpoint_timeout": "Time-out bij het herstellen van checkpoint.", + "wait_checkpoint_long_time": "De initialisatie van de checkpoint duurt langer dan verwacht. Dit kan wijzen op een grote repository of trage Git-bewerkingen.", + "init_checkpoint_fail_long_time": "De initialisatie van de checkpoint is na lange tijd mislukt. Checkpoints zijn uitgeschakeld voor deze taak. Je kunt checkpoints volledig uitschakelen of de timeout verhogen in de instellingen.", "checkpoint_failed": "Herstellen van checkpoint mislukt.", "git_not_installed": "Git is vereist voor de checkpoint-functie. Installeer Git om checkpoints in te schakelen.", "nested_git_repos_warning": "Checkpoints zijn uitgeschakeld omdat een geneste git-repository is gedetecteerd op: {{path}}. Om checkpoints te gebruiken, verwijder of verplaats deze geneste git-repository.", diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index 1d48b0f9cc..e039ebf2c0 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Nie można otworzyć pliku: {{errorMessage}}", "could_not_open_file_generic": "Nie można otworzyć pliku!", "checkpoint_timeout": "Upłynął limit czasu podczas próby przywrócenia punktu kontrolnego.", + "wait_checkpoint_long_time": "Inicjalizacja punktu kontrolnego trwa dłużej niż oczekiwano. Może to oznaczać dużą zawartość repozytorium lub wolne operacje Git.", + "init_checkpoint_fail_long_time": "Inicjalizacja punktu kontrolnego nie powiodła się po długim czasie. Punkty kontrolne zostały wyłączone dla tego zadania. Możesz całkowicie wyłączyć punkty kontrolne lub zwiększyć limit czasu w ustawieniach.", "checkpoint_failed": "Nie udało się przywrócić punktu kontrolnego.", "git_not_installed": "Funkcja punktów kontrolnych wymaga oprogramowania Git. Zainstaluj Git, aby włączyć punkty kontrolne.", "nested_git_repos_warning": "Punkty kontrolne są wyłączone, ponieważ wykryto zagnieżdżone repozytorium git w: {{path}}. Aby używać punktów kontrolnych, usuń lub przenieś to zagnieżdżone repozytorium git.", diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 093ef7b0bf..3e95bbe6c4 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -31,6 +31,8 @@ "could_not_open_file": "Não foi possível abrir o arquivo: {{errorMessage}}", "could_not_open_file_generic": "Não foi possível abrir o arquivo!", "checkpoint_timeout": "Tempo esgotado ao tentar restaurar o ponto de verificação.", + "wait_checkpoint_long_time": "A inicialização do checkpoint está demorando mais do que o esperado. Isso pode indicar um repositório grande ou operações Git lentas.", + "init_checkpoint_fail_long_time": "A inicialização do checkpoint falhou após muito tempo. Os checkpoints foram desativados para esta tarefa. Você pode desativar completamente os checkpoints ou aumentar o tempo limite nas configurações.", "checkpoint_failed": "Falha ao restaurar o ponto de verificação.", "git_not_installed": "O Git é necessário para o recurso de checkpoints. Por favor, instale o Git para habilitar os checkpoints.", "nested_git_repos_warning": "Os checkpoints estão desabilitados porque um repositório git aninhado foi detectado em: {{path}}. Para usar checkpoints, por favor remova ou realoque este repositório git aninhado.", diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json index 7edd656d8c..504294d20c 100644 --- a/src/i18n/locales/ru/common.json +++ b/src/i18n/locales/ru/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Не удалось открыть файл: {{errorMessage}}", "could_not_open_file_generic": "Не удалось открыть файл!", "checkpoint_timeout": "Превышено время ожидания при попытке восстановления контрольной точки.", + "wait_checkpoint_long_time": "Инициализация контрольной точки занимает больше времени, чем ожидалось. Это может указывать на большой репозиторий или медленные операции Git.", + "init_checkpoint_fail_long_time": "Инициализация контрольной точки завершилась неудачно после долгого ожидания. Контрольные точки отключены для этой задачи. Ты можешь полностью отключить контрольные точки или увеличить таймаут в настройках.", "checkpoint_failed": "Не удалось восстановить контрольную точку.", "git_not_installed": "Для функции контрольных точек требуется Git. Пожалуйста, установите Git, чтобы включить контрольные точки.", "nested_git_repos_warning": "Контрольные точки отключены, поскольку обнаружен вложенный git-репозиторий в: {{path}}. Чтобы использовать контрольные точки, пожалуйста, удалите или переместите этот вложенный git-репозиторий.", diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index 20b2824b98..bfdb538283 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Dosya açılamadı: {{errorMessage}}", "could_not_open_file_generic": "Dosya açılamadı!", "checkpoint_timeout": "Kontrol noktasını geri yüklemeye çalışırken zaman aşımına uğradı.", + "wait_checkpoint_long_time": "Kontrol noktası başlatılması beklenenden uzun sürüyor. Bu, büyük bir depo veya yavaş Git işlemleri anlamına gelebilir.", + "init_checkpoint_fail_long_time": "Kontrol noktası başlatılması uzun süre sonra başarısız oldu. Bu görev için kontrol noktaları devre dışı bırakıldı. Kontrol noktalarını tamamen devre dışı bırakabilir veya ayarlardan zaman aşımını artırabilirsin.", "checkpoint_failed": "Kontrol noktası geri yüklenemedi.", "git_not_installed": "Kontrol noktaları özelliği için Git gereklidir. Kontrol noktalarını etkinleştirmek için lütfen Git'i yükleyin.", "nested_git_repos_warning": "{{path}} konumunda iç içe git deposu tespit edildiği için kontrol noktaları devre dışı bırakıldı. Kontrol noktalarını kullanmak için lütfen bu iç içe git deposunu kaldırın veya taşıyın.", diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index f4755162fe..6bb02ea4ba 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "Không thể mở tệp: {{errorMessage}}", "could_not_open_file_generic": "Không thể mở tệp!", "checkpoint_timeout": "Đã hết thời gian khi cố gắng khôi phục điểm kiểm tra.", + "wait_checkpoint_long_time": "Khởi tạo điểm kiểm tra đang mất nhiều thời gian hơn dự kiến. Điều này có thể do kho lưu trữ lớn hoặc các thao tác Git chậm.", + "init_checkpoint_fail_long_time": "Khởi tạo điểm kiểm tra thất bại sau thời gian dài. Điểm kiểm tra đã bị vô hiệu hóa cho tác vụ này. Bạn có thể tắt hoàn toàn điểm kiểm tra hoặc tăng thời gian chờ trong cài đặt.", "checkpoint_failed": "Không thể khôi phục điểm kiểm tra.", "git_not_installed": "Yêu cầu Git cho tính năng điểm kiểm tra. Vui lòng cài đặt Git để bật điểm kiểm tra.", "nested_git_repos_warning": "Điểm kiểm tra bị vô hiệu hóa vì phát hiện kho git lồng nhau tại: {{path}}. Để sử dụng điểm kiểm tra, vui lòng xóa hoặc di chuyển kho git lồng nhau này.", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index 787c5c8ae9..add5d43628 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -32,6 +32,8 @@ "could_not_open_file": "无法打开文件:{{errorMessage}}", "could_not_open_file_generic": "无法打开文件!", "checkpoint_timeout": "尝试恢复检查点时超时。", + "wait_checkpoint_long_time": "存档点初始化耗时超出预期,可能是仓库较大或 Git 操作较慢。", + "init_checkpoint_fail_long_time": "存档点初始化长时间后失败,已为本任务禁用存档点。你可以完全禁用存档点或在设置中增加超时时间。", "checkpoint_failed": "恢复检查点失败。", "git_not_installed": "存档点功能需要 Git。请安装 Git 以启用存档点。", "nested_git_repos_warning": "存档点已禁用,因为在 {{path}} 检测到嵌套的 git 仓库。要使用存档点,请移除或重新定位此嵌套的 git 仓库。", diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index 0ae3549d3e..8e3c4f78de 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -27,6 +27,8 @@ "could_not_open_file": "無法開啟檔案:{{errorMessage}}", "could_not_open_file_generic": "無法開啟檔案!", "checkpoint_timeout": "嘗試恢復檢查點時超時。", + "wait_checkpoint_long_time": "存檔點初始化花費時間超過預期,可能是專案資料夾很大或 Git 操作較慢。", + "init_checkpoint_fail_long_time": "存檔點初始化長時間後失敗,已為此工作停用存檔點。你可以完全停用存檔點或在設定中增加逾時時間。", "checkpoint_failed": "恢復檢查點失敗。", "git_not_installed": "存檔點功能需要 Git。請安裝 Git 以啟用存檔點。", "nested_git_repos_warning": "存檔點已停用,因為在 {{path}} 偵測到巢狀的 git 儲存庫。要使用存檔點,請移除或重新配置此巢狀的 git 儲存庫。", diff --git a/src/services/checkpoints/ShadowCheckpointService.ts b/src/services/checkpoints/ShadowCheckpointService.ts index e68a7cfea1..f28070cf40 100644 --- a/src/services/checkpoints/ShadowCheckpointService.ts +++ b/src/services/checkpoints/ShadowCheckpointService.ts @@ -152,7 +152,7 @@ export abstract class ShadowCheckpointService extends EventEmitter { private async stageAll(git: SimpleGit) { try { - await git.add(".") + await git.add([".", "--ignore-errors"]) } catch (error) { this.log( `[${this.constructor.name}#stageAll] failed to add files to git: ${error instanceof Error ? error.message : String(error)}`, @@ -240,7 +240,7 @@ export abstract class ShadowCheckpointService extends EventEmitter { const startTime = Date.now() await this.stageAll(this.git) - const commitArgs = options?.allowEmpty ? { "--allow-empty": null } : undefined + const commitArgs = options?.allowEmpty ? { "--allow-empty": null, "--no-verify": null } : undefined const result = await this.git.commit(message, commitArgs) const fromHash = this._checkpoints[this._checkpoints.length - 1] ?? this.baseHash! const toHash = result.commit || fromHash diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index aaddc520cb..1a3ea0c834 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -91,6 +91,7 @@ export interface ExtensionMessage { | "checkRulesDirectoryResult" | "deleteCustomModeCheck" | "currentCheckpointUpdated" + | "checkpointInitWarning" | "showHumanRelayDialog" | "humanRelayResponse" | "humanRelayCancel" @@ -126,6 +127,8 @@ export interface ExtensionMessage { | "dismissedUpsells" text?: string payload?: any // Add a generic payload for now, can refine later + // Checkpoint warning message + checkpointWarning?: string action?: | "chatButtonClicked" | "mcpButtonClicked" @@ -298,6 +301,7 @@ export type ExtensionState = Pick< requestDelaySeconds: number enableCheckpoints: boolean + checkpointTimeout: number // Timeout for checkpoint initialization in seconds (default: 15) maxOpenTabsContext: number // Maximum number of VSCode open tabs to include in context (0-500) maxWorkspaceFiles: number // Maximum number of files to include in current working directory details (0-500) showRooIgnoredFiles: boolean // Whether to show .rooignore'd files in listings diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 93d0b9bc45..f31bf061e2 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -99,6 +99,7 @@ export interface WebviewMessage { | "soundVolume" | "diffEnabled" | "enableCheckpoints" + | "checkpointTimeout" | "browserViewportSize" | "screenshotQuality" | "remoteBrowserHost" diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index d358c68f1c..bf0ae92640 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -192,7 +192,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction("") const [wasStreaming, setWasStreaming] = useState(false) - const [showCheckpointWarning, setShowCheckpointWarning] = useState(false) + const [checkpointWarningText, setCheckpointWarningText] = useState("") const [isCondensing, setIsCondensing] = useState(false) const [showAnnouncementModal, setShowAnnouncementModal] = useState(false) const everVisibleMessagesTsRef = useRef>( @@ -829,6 +829,9 @@ const ChatViewComponent: React.ForwardRefRenderFunction { - // Only show the warning when there's a task but no visible messages yet - if (task && modifiedMessages.length === 0 && !isStreaming && !isHidden) { - const timer = setTimeout(() => { - setShowCheckpointWarning(true) - }, 5000) // 5 seconds - - return () => clearTimeout(timer) - } else { - setShowCheckpointWarning(false) + if (isHidden || !task) { + setCheckpointWarningText("") } - }, [task, modifiedMessages.length, isStreaming, isHidden]) - - // Effect to hide the checkpoint warning when messages appear - useEffect(() => { - if (modifiedMessages.length > 0 || isStreaming || isHidden) { - setShowCheckpointWarning(false) - } - }, [modifiedMessages.length, isStreaming, isHidden]) + }, [modifiedMessages.length, isStreaming, isHidden, task]) const placeholderText = task ? t("chat:typeMessage") : t("chat:typeTask") @@ -1810,9 +1800,9 @@ const ChatViewComponent: React.ForwardRefRenderFunction )} - {showCheckpointWarning && ( + {checkpointWarningText && (
- +
)} diff --git a/webview-ui/src/components/chat/CheckpointWarning.tsx b/webview-ui/src/components/chat/CheckpointWarning.tsx index 1b6977d281..1a8ff62045 100644 --- a/webview-ui/src/components/chat/CheckpointWarning.tsx +++ b/webview-ui/src/components/chat/CheckpointWarning.tsx @@ -1,13 +1,21 @@ import { Trans } from "react-i18next" import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" +import { useMemo } from "react" -export const CheckpointWarning = () => { +interface CheckpointWarningProps { + text?: string +} + +export const CheckpointWarning = ({ text }: CheckpointWarningProps) => { + const warningText = useMemo(() => { + return text || "chat:checkpoint.initializingWarning" + }, [text]) return (
{ setFollowupAutoApproveTimeoutMs: vi.fn(), profileThresholds: {}, setProfileThresholds: vi.fn(), + checkpointTimeout: 15, // ... other required context properties } }) @@ -86,6 +87,7 @@ describe("MarketplaceView", () => { mockExtensionState = { ...mockExtensionState, organizationSettingsVersion: 2, + checkpointTimeout: 15, } // Re-render with updated context diff --git a/webview-ui/src/components/settings/CheckpointSettings.tsx b/webview-ui/src/components/settings/CheckpointSettings.tsx index bc5f656bb9..2f9ee78e9e 100644 --- a/webview-ui/src/components/settings/CheckpointSettings.tsx +++ b/webview-ui/src/components/settings/CheckpointSettings.tsx @@ -4,6 +4,7 @@ import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { GitBranch } from "lucide-react" import { Trans } from "react-i18next" import { buildDocLink } from "@src/utils/docLinks" +import { Slider } from "@/components/ui" import { SetCachedStateField } from "./types" import { SectionHeader } from "./SectionHeader" @@ -11,10 +12,16 @@ import { Section } from "./Section" type CheckpointSettingsProps = HTMLAttributes & { enableCheckpoints?: boolean - setCachedStateField: SetCachedStateField<"enableCheckpoints"> + checkpointTimeout?: number + setCachedStateField: SetCachedStateField<"enableCheckpoints" | "checkpointTimeout"> } -export const CheckpointSettings = ({ enableCheckpoints, setCachedStateField, ...props }: CheckpointSettingsProps) => { +export const CheckpointSettings = ({ + enableCheckpoints, + checkpointTimeout, + setCachedStateField, + ...props +}: CheckpointSettingsProps) => { const { t } = useAppTranslation() return (
@@ -44,6 +51,33 @@ export const CheckpointSettings = ({ enableCheckpoints, setCachedStateField, ...
+ + {enableCheckpoints && ( +
+ +
+ { + if (value >= 10 && value <= 60) { + setCachedStateField("checkpointTimeout", value) + } + }} + className="flex-1" + data-testid="checkpoint-timeout-slider" + /> + {checkpointTimeout ?? 15} +
+
+ {t("settings:checkpoints.timeout.description")} +
+
+ )} ) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 66b7ff680f..423f013627 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -147,6 +147,7 @@ const SettingsView = forwardRef(({ onDone, t browserToolEnabled, browserViewportSize, enableCheckpoints, + checkpointTimeout, diffEnabled, experiments, fuzzyMatchThreshold, @@ -324,6 +325,7 @@ const SettingsView = forwardRef(({ onDone, t vscode.postMessage({ type: "soundVolume", value: soundVolume }) vscode.postMessage({ type: "diffEnabled", bool: diffEnabled }) vscode.postMessage({ type: "enableCheckpoints", bool: enableCheckpoints }) + vscode.postMessage({ type: "checkpointTimeout", value: checkpointTimeout }) vscode.postMessage({ type: "browserViewportSize", text: browserViewportSize }) vscode.postMessage({ type: "remoteBrowserHost", text: remoteBrowserHost }) vscode.postMessage({ type: "remoteBrowserEnabled", bool: remoteBrowserEnabled }) @@ -691,6 +693,7 @@ const SettingsView = forwardRef(({ onDone, t {activeTab === "checkpoints" && ( )} diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 5534686db6..4cdabdb121 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -86,6 +86,8 @@ export interface ExtensionStateContextType extends ExtensionState { setTtsSpeed: (value: number) => void setDiffEnabled: (value: boolean) => void setEnableCheckpoints: (value: boolean) => void + checkpointTimeout: number + setCheckpointTimeout: (value: number) => void setBrowserViewportSize: (value: string) => void setFuzzyMatchThreshold: (value: number) => void setWriteDelayMs: (value: number) => void @@ -194,6 +196,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode ttsSpeed: 1.0, diffEnabled: false, enableCheckpoints: true, + checkpointTimeout: 15, // Default to 15 seconds fuzzyMatchThreshold: 1.0, language: "en", // Default language code writeDelayMs: 1000, @@ -454,6 +457,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode setTtsSpeed: (value) => setState((prevState) => ({ ...prevState, ttsSpeed: value })), setDiffEnabled: (value) => setState((prevState) => ({ ...prevState, diffEnabled: value })), setEnableCheckpoints: (value) => setState((prevState) => ({ ...prevState, enableCheckpoints: value })), + setCheckpointTimeout: (value) => setState((prevState) => ({ ...prevState, checkpointTimeout: value })), setBrowserViewportSize: (value: string) => setState((prevState) => ({ ...prevState, browserViewportSize: value })), setFuzzyMatchThreshold: (value) => setState((prevState) => ({ ...prevState, fuzzyMatchThreshold: value })), diff --git a/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx b/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx index 33d7dc0ec7..efef8bfcd1 100644 --- a/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx +++ b/webview-ui/src/context/__tests__/ExtensionStateContext.spec.tsx @@ -214,12 +214,14 @@ describe("mergeExtensionState", () => { remoteControlEnabled: false, taskSyncEnabled: false, featureRoomoteControlEnabled: false, + checkpointTimeout: 15, // Add the checkpoint timeout property } const prevState: ExtensionState = { ...baseState, apiConfiguration: { modelMaxTokens: 1234, modelMaxThinkingTokens: 123 }, experiments: {} as Record, + checkpointTimeout: 10, } const newState: ExtensionState = { @@ -236,6 +238,7 @@ describe("mergeExtensionState", () => { imageGeneration: false, runSlashCommand: false, } as Record, + checkpointTimeout: 20, } const result = mergeExtensionState(prevState, newState) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 4f3e4d9924..4affe72733 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Temps d'espera per inicialitzar el punt de control (segons)", + "description": "Temps màxim d'espera per inicialitzar el servei de punts de control. El valor per defecte és 15 segons. Rang: 10-60 segons." + }, "enable": { "label": "Habilitar punts de control automàtics", "description": "Quan està habilitat, Roo crearà automàticament punts de control durant l'execució de tasques, facilitant la revisió de canvis o la reversió a estats anteriors. <0>Més informació" diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 4e75f6af2a..437b75c6dd 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Timeout für Checkpoint-Initialisierung (Sekunden)", + "description": "Maximale Wartezeit für die Initialisierung des Checkpoint-Dienstes. Standard ist 15 Sekunden. Bereich: 10-60 Sekunden." + }, "enable": { "label": "Automatische Kontrollpunkte aktivieren", "description": "Wenn aktiviert, erstellt Roo automatisch Kontrollpunkte während der Aufgabenausführung, was die Überprüfung von Änderungen oder die Rückkehr zu früheren Zuständen erleichtert. <0>Mehr erfahren" diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 1be824b37e..bcaaf1a599 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -505,6 +505,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Checkpoint initialization timeout (seconds)", + "description": "Maximum time to wait for checkpoint service initialization. Default is 15 seconds. Range: 10-60 seconds." + }, "enable": { "label": "Enable automatic checkpoints", "description": "When enabled, Roo will automatically create checkpoints during task execution, making it easy to review changes or revert to earlier states. <0>Learn more" diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index deb2bc7a22..16525325c6 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Tiempo de espera para inicializar el punto de control (segundos)", + "description": "Tiempo máximo de espera para inicializar el servicio de puntos de control. El valor por defecto es 15 segundos. Rango: 10-60 segundos." + }, "enable": { "label": "Habilitar puntos de control automáticos", "description": "Cuando está habilitado, Roo creará automáticamente puntos de control durante la ejecución de tareas, facilitando la revisión de cambios o la reversión a estados anteriores. <0>Más información" diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index ccb8e61d7a..025176ce94 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Délai d'initialisation du point de contrôle (secondes)", + "description": "Temps d'attente maximum pour l'initialisation du service de points de contrôle. Par défaut : 15 secondes. Plage : 10-60 secondes." + }, "enable": { "label": "Activer les points de contrôle automatiques", "description": "Lorsque cette option est activée, Roo créera automatiquement des points de contrôle pendant l'exécution des tâches, facilitant la révision des modifications ou le retour à des états antérieurs. <0>En savoir plus" diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 3d879e2ca7..5d9ae1cc8f 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "चेकपॉइंट इनिशियलाइज़ेशन टाइमआउट (सेकंड)", + "description": "चेकपॉइंट सेवा इनिशियलाइज़ करने के लिए अधिकतम प्रतीक्षा समय। डिफ़ॉल्ट 15 सेकंड है। सीमा: 10-60 सेकंड।" + }, "enable": { "label": "स्वचालित चेकपॉइंट सक्षम करें", "description": "जब सक्षम होता है, तो Roo कार्य निष्पादन के दौरान स्वचालित रूप से चेकपॉइंट बनाएगा, जिससे परिवर्तनों की समीक्षा करना या पहले की स्थितियों पर वापस जाना आसान हो जाएगा। <0>अधिक जानें" diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 8138726c33..e643e36268 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -510,6 +510,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Batas waktu inisialisasi checkpoint (detik)", + "description": "Waktu maksimum menunggu inisialisasi layanan checkpoint. Default 15 detik. Rentang: 10-60 detik." + }, "enable": { "label": "Aktifkan checkpoint otomatis", "description": "Ketika diaktifkan, Roo akan secara otomatis membuat checkpoint selama eksekusi tugas, memudahkan untuk meninjau perubahan atau kembali ke state sebelumnya. <0>Pelajari lebih lanjut" diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 80ff0f8a71..9a760a4726 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Timeout inizializzazione checkpoint (secondi)", + "description": "Tempo massimo di attesa per l'inizializzazione del servizio checkpoint. Predefinito: 15 secondi. Intervallo: 10-60 secondi." + }, "enable": { "label": "Abilita punti di controllo automatici", "description": "Quando abilitato, Roo creerà automaticamente punti di controllo durante l'esecuzione dei compiti, facilitando la revisione delle modifiche o il ritorno a stati precedenti. <0>Scopri di più" diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 264d774473..413856b78f 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "チェックポイント初期化タイムアウト(秒)", + "description": "チェックポイントサービスの初期化を待つ最大時間。デフォルトは15秒。範囲:10~60秒。" + }, "enable": { "label": "自動チェックポイントを有効化", "description": "有効にすると、Rooはタスク実行中に自動的にチェックポイントを作成し、変更の確認や以前の状態への復帰を容易にします。 <0>詳細情報" diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index e490e31f78..5efd38c406 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "체크포인트 초기화 타임아웃(초)", + "description": "체크포인트 서비스 초기화를 기다리는 최대 시간입니다. 기본값은 15초. 범위: 10~60초." + }, "enable": { "label": "자동 체크포인트 활성화", "description": "활성화되면 Roo는 작업 실행 중에 자동으로 체크포인트를 생성하여 변경 사항을 검토하거나 이전 상태로 되돌리기 쉽게 합니다. <0>더 알아보기" diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index ee0ba193e5..2e269ba0a1 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Timeout voor checkpoint-initialisatie (seconden)", + "description": "Maximale wachttijd voor het initialiseren van de checkpointservice. Standaard is 15 seconden. Bereik: 10-60 seconden." + }, "enable": { "label": "Automatische checkpoints inschakelen", "description": "Indien ingeschakeld, maakt Roo automatisch checkpoints tijdens het uitvoeren van taken, zodat je eenvoudig wijzigingen kunt bekijken of terugzetten. <0>Meer informatie" diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 2d30547d9f..467a2eb9e3 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Limit czasu inicjalizacji punktu kontrolnego (sekundy)", + "description": "Maksymalny czas oczekiwania na inicjalizację usługi punktów kontrolnych. Domyślnie 15 sekund. Zakres: 10-60 sekund." + }, "enable": { "label": "Włącz automatyczne punkty kontrolne", "description": "Gdy włączone, Roo automatycznie utworzy punkty kontrolne podczas wykonywania zadań, ułatwiając przeglądanie zmian lub powrót do wcześniejszych stanów. <0>Dowiedz się więcej" diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 338ab9f6b1..a6cea32610 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Tempo limite para inicialização do checkpoint (segundos)", + "description": "Tempo máximo de espera para inicializar o serviço de checkpoint. Padrão: 15 segundos. Faixa: 10-60 segundos." + }, "enable": { "label": "Ativar pontos de verificação automáticos", "description": "Quando ativado, o Roo criará automaticamente pontos de verificação durante a execução de tarefas, facilitando a revisão de alterações ou o retorno a estados anteriores. <0>Saiba mais" diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index be494c571b..7ce4c24b75 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Таймаут инициализации контрольной точки (секунды)", + "description": "Максимальное время ожидания инициализации сервиса контрольных точек. По умолчанию 15 секунд. Диапазон: 10-60 секунд." + }, "enable": { "label": "Включить автоматические контрольные точки", "description": "Если включено, Roo будет автоматически создавать контрольные точки во время выполнения задач, что упрощает просмотр изменений или возврат к предыдущим состояниям. <0>Подробнее" diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index fe4508495b..35f78d4e91 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Kontrol noktası başlatma zaman aşımı (saniye)", + "description": "Kontrol noktası servisini başlatmak için maksimum bekleme süresi. Varsayılan 15 saniye. Aralık: 10-60 saniye." + }, "enable": { "label": "Otomatik kontrol noktalarını etkinleştir", "description": "Etkinleştirildiğinde, Roo görev yürütme sırasında otomatik olarak kontrol noktaları oluşturarak değişiklikleri gözden geçirmeyi veya önceki durumlara dönmeyi kolaylaştırır. <0>Daha fazla bilgi" diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 0f03de47a5..a3bf9b08cb 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "Thời gian chờ khởi tạo điểm kiểm tra (giây)", + "description": "Thời gian tối đa chờ khởi tạo dịch vụ điểm kiểm tra. Mặc định là 15 giây. Khoảng: 10-60 giây." + }, "enable": { "label": "Bật điểm kiểm tra tự động", "description": "Khi được bật, Roo sẽ tự động tạo các điểm kiểm tra trong quá trình thực hiện nhiệm vụ, giúp dễ dàng xem lại các thay đổi hoặc quay lại trạng thái trước đó. <0>Tìm hiểu thêm" diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 51db19562a..499d123d92 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "存档点初始化超时时间(秒)", + "description": "存档点服务初始化最长等待时间。默认 15 秒。范围:10-60 秒。" + }, "enable": { "label": "启用自动存档点", "description": "开启后自动创建任务存档点,方便回溯修改。 <0>了解更多" diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 89d517f5b5..3e39f2f5c6 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -506,6 +506,10 @@ } }, "checkpoints": { + "timeout": { + "label": "檢查點初始化逾時(秒)", + "description": "檢查點服務初始化的最長等待時間。預設為 15 秒。範圍:10-60 秒。" + }, "enable": { "label": "啟用自動檢查點", "description": "啟用後,Roo 將在工作執行期間自動建立檢查點,使審核變更或回到早期狀態變得容易。 <0>了解更多"