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.
This commit is contained in:
NaccOll 2025-09-16 15:30:51 +08:00
parent 68c5be8030
commit a9a2e8c234
53 changed files with 239 additions and 33 deletions

View file

@ -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(),

View file

@ -168,6 +168,7 @@ vi.mock("../activate", () => ({
vi.mock("../i18n", () => ({
initializeI18n: vi.fn(),
t: vi.fn((key) => key),
}))
describe("extension.ts", () => {

View file

@ -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

View file

@ -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<TaskEvents> implements TaskLike {
// Checkpoints
enableCheckpoints: boolean
checkpointTimeout: number
checkpointService?: RepoPerTaskCheckpointService
checkpointServiceInitializing = false
@ -302,6 +304,7 @@ export class Task extends EventEmitter<TaskEvents> 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<TaskEvents> 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

View file

@ -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,

View file

@ -557,6 +557,7 @@ describe("ClineProvider", () => {
remoteControlEnabled: false,
taskSyncEnabled: false,
featureRoomoteControlEnabled: false,
checkpointTimeout: 15,
}
const message: ExtensionMessage = {

View file

@ -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)

View file

@ -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.",

View file

@ -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.",

View file

@ -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",

View file

@ -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.",

View file

@ -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é.",

View file

@ -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 रिपॉजिटरी को हटाएं या स्थानांतरित करें।",

View file

@ -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.",

View file

@ -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.",

View file

@ -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リポジトリを削除または移動してください。",

View file

@ -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 저장소를 제거하거나 이동해주세요.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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-репозиторий.",

View file

@ -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.",

View file

@ -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.",

View file

@ -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 仓库。",

View file

@ -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 儲存庫。",

View file

@ -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

View file

@ -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

View file

@ -99,6 +99,7 @@ export interface WebviewMessage {
| "soundVolume"
| "diffEnabled"
| "enableCheckpoints"
| "checkpointTimeout"
| "browserViewportSize"
| "screenshotQuality"
| "remoteBrowserHost"

View file

@ -192,7 +192,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
const [isAtBottom, setIsAtBottom] = useState(false)
const lastTtsRef = useRef<string>("")
const [wasStreaming, setWasStreaming] = useState<boolean>(false)
const [showCheckpointWarning, setShowCheckpointWarning] = useState<boolean>(false)
const [checkpointWarningText, setCheckpointWarningText] = useState<string>("")
const [isCondensing, setIsCondensing] = useState<boolean>(false)
const [showAnnouncementModal, setShowAnnouncementModal] = useState(false)
const everVisibleMessagesTsRef = useRef<LRUCache<number, boolean>>(
@ -829,6 +829,9 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
setIsCondensing(false)
}
break
case "checkpointInitWarning":
setCheckpointWarningText(message.checkpointWarning || "")
break
}
// textAreaRef.current is not explicitly required here since React
// guarantees that ref will be stable across re-renders, and we're
@ -845,6 +848,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
handleSetChatBoxMessage,
handlePrimaryButtonClick,
handleSecondaryButtonClick,
setCheckpointWarningText,
],
)
@ -1420,26 +1424,12 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
useEvent("wheel", handleWheel, window, { passive: true }) // passive improves scrolling performance
// Effect to handle showing the checkpoint warning after a delay
// Effect to clear checkpoint warning when messages appear or task changes
useEffect(() => {
// 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<ChatViewRef, ChatViewPro
</div>
)}
{showCheckpointWarning && (
{checkpointWarningText && (
<div className="px-3">
<CheckpointWarning />
<CheckpointWarning text={checkpointWarningText} />
</div>
)}
</>

View file

@ -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 (
<div className="flex items-center p-3 my-3 bg-vscode-inputValidation-warningBackground border border-vscode-inputValidation-warningBorder rounded">
<span className="codicon codicon-loading codicon-modifier-spin mr-2" />
<span className="text-vscode-foreground">
<Trans
i18nKey="chat:checkpoint.initializingWarning"
i18nKey={warningText}
components={{
settingsLink: (
<VSCodeLink

View file

@ -66,6 +66,7 @@ describe("MarketplaceView", () => {
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

View file

@ -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<HTMLDivElement> & {
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 (
<div {...props}>
@ -44,6 +51,33 @@ export const CheckpointSettings = ({ enableCheckpoints, setCachedStateField, ...
</Trans>
</div>
</div>
{enableCheckpoints && (
<div className="mt-4">
<label className="block text-sm font-medium mb-2">
{t("settings:checkpoints.timeout.label")}
</label>
<div className="flex items-center gap-2">
<Slider
min={10}
max={60}
step={1}
defaultValue={[checkpointTimeout ?? 15]}
onValueChange={([value]) => {
if (value >= 10 && value <= 60) {
setCachedStateField("checkpointTimeout", value)
}
}}
className="flex-1"
data-testid="checkpoint-timeout-slider"
/>
<span className="w-12 text-center">{checkpointTimeout ?? 15}</span>
</div>
<div className="text-vscode-descriptionForeground text-sm mt-1">
{t("settings:checkpoints.timeout.description")}
</div>
</div>
)}
</Section>
</div>
)

View file

@ -147,6 +147,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
browserToolEnabled,
browserViewportSize,
enableCheckpoints,
checkpointTimeout,
diffEnabled,
experiments,
fuzzyMatchThreshold,
@ -324,6 +325,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ 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<SettingsViewRef, SettingsViewProps>(({ onDone, t
{activeTab === "checkpoints" && (
<CheckpointSettings
enableCheckpoints={enableCheckpoints}
checkpointTimeout={checkpointTimeout}
setCachedStateField={setCachedStateField}
/>
)}

View file

@ -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 })),

View file

@ -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<ExperimentId, boolean>,
checkpointTimeout: 10,
}
const newState: ExtensionState = {
@ -236,6 +238,7 @@ describe("mergeExtensionState", () => {
imageGeneration: false,
runSlashCommand: false,
} as Record<ExperimentId, boolean>,
checkpointTimeout: 20,
}
const result = mergeExtensionState(prevState, newState)

View file

@ -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ó</0>"

View file

@ -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</0>"

View file

@ -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</0>"

View file

@ -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</0>"

View file

@ -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</0>"

View file

@ -506,6 +506,10 @@
}
},
"checkpoints": {
"timeout": {
"label": "चेकपॉइंट इनिशियलाइज़ेशन टाइमआउट (सेकंड)",
"description": "चेकपॉइंट सेवा इनिशियलाइज़ करने के लिए अधिकतम प्रतीक्षा समय। डिफ़ॉल्ट 15 सेकंड है। सीमा: 10-60 सेकंड।"
},
"enable": {
"label": "स्वचालित चेकपॉइंट सक्षम करें",
"description": "जब सक्षम होता है, तो Roo कार्य निष्पादन के दौरान स्वचालित रूप से चेकपॉइंट बनाएगा, जिससे परिवर्तनों की समीक्षा करना या पहले की स्थितियों पर वापस जाना आसान हो जाएगा। <0>अधिक जानें</0>"

View file

@ -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</0>"

View file

@ -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ù</0>"

View file

@ -506,6 +506,10 @@
}
},
"checkpoints": {
"timeout": {
"label": "チェックポイント初期化タイムアウト(秒)",
"description": "チェックポイントサービスの初期化を待つ最大時間。デフォルトは15秒。範囲1060秒。"
},
"enable": {
"label": "自動チェックポイントを有効化",
"description": "有効にすると、Rooはタスク実行中に自動的にチェックポイントを作成し、変更の確認や以前の状態への復帰を容易にします。 <0>詳細情報</0>"

View file

@ -506,6 +506,10 @@
}
},
"checkpoints": {
"timeout": {
"label": "체크포인트 초기화 타임아웃(초)",
"description": "체크포인트 서비스 초기화를 기다리는 최대 시간입니다. 기본값은 15초. 범위: 10~60초."
},
"enable": {
"label": "자동 체크포인트 활성화",
"description": "활성화되면 Roo는 작업 실행 중에 자동으로 체크포인트를 생성하여 변경 사항을 검토하거나 이전 상태로 되돌리기 쉽게 합니다. <0>더 알아보기</0>"

View file

@ -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</0>"

View file

@ -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</0>"

View file

@ -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</0>"

View file

@ -506,6 +506,10 @@
}
},
"checkpoints": {
"timeout": {
"label": "Таймаут инициализации контрольной точки (секунды)",
"description": "Максимальное время ожидания инициализации сервиса контрольных точек. По умолчанию 15 секунд. Диапазон: 10-60 секунд."
},
"enable": {
"label": "Включить автоматические контрольные точки",
"description": "Если включено, Roo будет автоматически создавать контрольные точки во время выполнения задач, что упрощает просмотр изменений или возврат к предыдущим состояниям. <0>Подробнее</0>"

View file

@ -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</0>"

View file

@ -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</0>"

View file

@ -506,6 +506,10 @@
}
},
"checkpoints": {
"timeout": {
"label": "存档点初始化超时时间(秒)",
"description": "存档点服务初始化最长等待时间。默认 15 秒。范围10-60 秒。"
},
"enable": {
"label": "启用自动存档点",
"description": "开启后自动创建任务存档点,方便回溯修改。 <0>了解更多</0>"

View file

@ -506,6 +506,10 @@
}
},
"checkpoints": {
"timeout": {
"label": "檢查點初始化逾時(秒)",
"description": "檢查點服務初始化的最長等待時間。預設為 15 秒。範圍10-60 秒。"
},
"enable": {
"label": "啟用自動檢查點",
"description": "啟用後Roo 將在工作執行期間自動建立檢查點,使審核變更或回到早期狀態變得容易。 <0>了解更多</0>"