mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-09-06 08:18:39 +00:00
feat: add restore to task start button
Adds a button in the task header that allows users to restore the workspace to its initial state when the task was created. This uses the baseHash checkpoint from the shadow git repository. - Add checkpointRestoreToBase() function in checkpoints/index.ts - Add restoreToTaskStart message handler in webviewMessageHandler.ts - Add RestoreTaskDialog component with confirmation dialog - Add restore button to TaskActions (visible when checkpoints enabled) - Add translations for all 17 supported locales - Add 4 unit tests for the new checkpoint restore function
This commit is contained in:
parent
d7fa963b13
commit
2766839dcc
42 changed files with 332 additions and 21 deletions
|
|
@ -517,6 +517,7 @@ export interface WebviewMessage {
|
|||
| "openCustomModesSettings"
|
||||
| "checkpointDiff"
|
||||
| "checkpointRestore"
|
||||
| "restoreToTaskStart"
|
||||
| "deleteMcpServer"
|
||||
| "codebaseIndexEnabled"
|
||||
| "telemetrySetting"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,13 @@
|
|||
import { describe, it, expect, vi, beforeEach, afterEach, Mock } from "vitest"
|
||||
import { Task } from "../../task/Task"
|
||||
import { ClineProvider } from "../../webview/ClineProvider"
|
||||
import { checkpointSave, checkpointRestore, checkpointDiff, getCheckpointService } from "../index"
|
||||
import {
|
||||
checkpointSave,
|
||||
checkpointRestore,
|
||||
checkpointRestoreToBase,
|
||||
checkpointDiff,
|
||||
getCheckpointService,
|
||||
} from "../index"
|
||||
import { MessageManager } from "../../message-manager"
|
||||
import * as vscode from "vscode"
|
||||
|
||||
|
|
@ -296,6 +302,56 @@ describe("Checkpoint functionality", () => {
|
|||
})
|
||||
})
|
||||
|
||||
describe("checkpointRestoreToBase", () => {
|
||||
beforeEach(() => {
|
||||
mockCheckpointService.baseHash = "initial-commit-hash"
|
||||
})
|
||||
|
||||
it("should restore to base hash successfully", async () => {
|
||||
const result = await checkpointRestoreToBase(mockTask)
|
||||
|
||||
expect(result).toBe(true)
|
||||
expect(mockCheckpointService.restoreCheckpoint).toHaveBeenCalledWith("initial-commit-hash")
|
||||
expect(mockProvider.postMessageToWebview).toHaveBeenCalledWith({
|
||||
type: "currentCheckpointUpdated",
|
||||
text: "initial-commit-hash",
|
||||
})
|
||||
expect(mockProvider.cancelTask).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it("should return false if no checkpoint service available", async () => {
|
||||
mockTask.checkpointService = undefined
|
||||
mockTask.enableCheckpoints = false
|
||||
|
||||
const result = await checkpointRestoreToBase(mockTask)
|
||||
|
||||
expect(result).toBe(false)
|
||||
expect(mockCheckpointService.restoreCheckpoint).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it("should return false if no baseHash available", async () => {
|
||||
mockCheckpointService.baseHash = undefined
|
||||
|
||||
const result = await checkpointRestoreToBase(mockTask)
|
||||
|
||||
expect(result).toBe(false)
|
||||
expect(mockCheckpointService.restoreCheckpoint).not.toHaveBeenCalled()
|
||||
expect(mockProvider.log).toHaveBeenCalledWith("[checkpointRestoreToBase] no baseHash available")
|
||||
})
|
||||
|
||||
it("should disable checkpoints on error", async () => {
|
||||
mockCheckpointService.restoreCheckpoint.mockRejectedValue(new Error("Restore failed"))
|
||||
|
||||
const result = await checkpointRestoreToBase(mockTask)
|
||||
|
||||
expect(result).toBe(false)
|
||||
expect(mockTask.enableCheckpoints).toBe(false)
|
||||
expect(mockProvider.log).toHaveBeenCalledWith(
|
||||
"[checkpointRestoreToBase] disabling checkpoints for this task",
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("checkpointDiff", () => {
|
||||
beforeEach(() => {
|
||||
mockTask.clineMessages = [
|
||||
|
|
|
|||
|
|
@ -301,6 +301,46 @@ export async function checkpointRestore(
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the workspace to its initial state (baseHash) - the state when the shadow git repo was initialized.
|
||||
* This is a simpler version of checkpointRestore that doesn't need to rewind messages since we're
|
||||
* restoring to the very beginning of the task.
|
||||
* @returns true if restoration was successful, false otherwise
|
||||
*/
|
||||
export async function checkpointRestoreToBase(task: Task): Promise<boolean> {
|
||||
const service = await getCheckpointService(task)
|
||||
|
||||
if (!service) {
|
||||
return false
|
||||
}
|
||||
|
||||
const baseHash = service.baseHash
|
||||
|
||||
if (!baseHash) {
|
||||
const provider = task.providerRef.deref()
|
||||
provider?.log("[checkpointRestoreToBase] no baseHash available")
|
||||
return false
|
||||
}
|
||||
|
||||
const provider = task.providerRef.deref()
|
||||
|
||||
try {
|
||||
await service.restoreCheckpoint(baseHash)
|
||||
TelemetryService.instance.captureCheckpointRestored(task.taskId)
|
||||
await provider?.postMessageToWebview({ type: "currentCheckpointUpdated", text: baseHash })
|
||||
|
||||
// Cancel the task to reinitialize with the restored state
|
||||
// This follows the same pattern as checkpointRestore
|
||||
provider?.cancelTask()
|
||||
|
||||
return true
|
||||
} catch (err) {
|
||||
provider?.log("[checkpointRestoreToBase] disabling checkpoints for this task")
|
||||
task.enableCheckpoints = false
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
export type CheckpointDiffOptions = {
|
||||
ts?: number
|
||||
previousCommitHash?: string
|
||||
|
|
|
|||
|
|
@ -1207,6 +1207,42 @@ export const webviewMessageHandler = async (
|
|||
|
||||
break
|
||||
}
|
||||
case "restoreToTaskStart": {
|
||||
const currentTask = provider.getCurrentTask()
|
||||
|
||||
if (!currentTask) {
|
||||
vscode.window.showErrorMessage(t("common:errors.checkpoint_no_active_task"))
|
||||
break
|
||||
}
|
||||
|
||||
if (!currentTask.enableCheckpoints) {
|
||||
vscode.window.showErrorMessage(t("common:errors.checkpoint_not_enabled"))
|
||||
break
|
||||
}
|
||||
|
||||
// Cancel the current task first
|
||||
await provider.cancelTask()
|
||||
|
||||
try {
|
||||
await pWaitFor(() => provider.getCurrentTask()?.isInitialized === true, { timeout: 3_000 })
|
||||
} catch (error) {
|
||||
vscode.window.showErrorMessage(t("common:errors.checkpoint_timeout"))
|
||||
break
|
||||
}
|
||||
|
||||
try {
|
||||
const { checkpointRestoreToBase } = await import("../checkpoints")
|
||||
const success = await checkpointRestoreToBase(provider.getCurrentTask()!)
|
||||
|
||||
if (!success) {
|
||||
vscode.window.showErrorMessage(t("common:errors.checkpoint_restore_base_failed"))
|
||||
}
|
||||
} catch (error) {
|
||||
vscode.window.showErrorMessage(t("common:errors.checkpoint_failed"))
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
case "cancelTask":
|
||||
await provider.cancelTask()
|
||||
break
|
||||
|
|
|
|||
3
src/i18n/locales/ca/common.json
generated
3
src/i18n/locales/ca/common.json
generated
|
|
@ -32,6 +32,9 @@
|
|||
"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.",
|
||||
"checkpoint_failed": "Ha fallat la restauració del punt de control.",
|
||||
"checkpoint_no_active_task": "No hi ha cap tasca activa per restaurar.",
|
||||
"checkpoint_not_enabled": "Els punts de control no estan activats per a aquesta tasca.",
|
||||
"checkpoint_restore_base_failed": "Ha fallat la restauració de l'espai de treball a l'estat inicial.",
|
||||
"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.",
|
||||
"checkpoint_no_first": "No hi ha un primer punt de control per comparar.",
|
||||
"checkpoint_no_previous": "No hi ha un punt de control anterior per comparar.",
|
||||
|
|
|
|||
3
src/i18n/locales/de/common.json
generated
3
src/i18n/locales/de/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Datei konnte nicht geöffnet werden!",
|
||||
"checkpoint_timeout": "Zeitüberschreitung beim Versuch, den Checkpoint wiederherzustellen.",
|
||||
"checkpoint_failed": "Fehler beim Wiederherstellen des Checkpoints.",
|
||||
"checkpoint_no_active_task": "Keine aktive Aufgabe zum Wiederherstellen.",
|
||||
"checkpoint_not_enabled": "Checkpoints sind für diese Aufgabe nicht aktiviert.",
|
||||
"checkpoint_restore_base_failed": "Wiederherstellung des Arbeitsbereichs in den Ausgangszustand fehlgeschlagen.",
|
||||
"git_not_installed": "Git ist für die Checkpoint-Funktion erforderlich. Bitte installiere Git, um Checkpoints zu aktivieren.",
|
||||
"checkpoint_no_first": "Kein erster Checkpoint zum Vergleich vorhanden.",
|
||||
"checkpoint_no_previous": "Kein vorheriger Checkpoint zum Vergleich vorhanden.",
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Could not open file!",
|
||||
"checkpoint_timeout": "Timed out when attempting to restore checkpoint.",
|
||||
"checkpoint_failed": "Failed to restore checkpoint.",
|
||||
"checkpoint_no_active_task": "No active task to restore.",
|
||||
"checkpoint_not_enabled": "Checkpoints are not enabled for this task.",
|
||||
"checkpoint_restore_base_failed": "Failed to restore workspace to initial state.",
|
||||
"git_not_installed": "Git is required for the checkpoints feature. Please install Git to enable checkpoints.",
|
||||
"checkpoint_no_first": "No first checkpoint to compare.",
|
||||
"checkpoint_no_previous": "No previous checkpoint to compare.",
|
||||
|
|
|
|||
3
src/i18n/locales/es/common.json
generated
3
src/i18n/locales/es/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "¡No se pudo abrir el archivo!",
|
||||
"checkpoint_timeout": "Se agotó el tiempo al intentar restaurar el punto de control.",
|
||||
"checkpoint_failed": "Error al restaurar el punto de control.",
|
||||
"checkpoint_no_active_task": "No hay ninguna tarea activa para restaurar.",
|
||||
"checkpoint_not_enabled": "Los puntos de control no están habilitados para esta tarea.",
|
||||
"checkpoint_restore_base_failed": "Error al restaurar el espacio de trabajo al estado inicial.",
|
||||
"git_not_installed": "Git es necesario para la función de puntos de control. Por favor, instala Git para activar los puntos de control.",
|
||||
"checkpoint_no_first": "No hay primer punto de control para comparar.",
|
||||
"checkpoint_no_previous": "No hay punto de control anterior para comparar.",
|
||||
|
|
|
|||
3
src/i18n/locales/fr/common.json
generated
3
src/i18n/locales/fr/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"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.",
|
||||
"checkpoint_failed": "Échec du rétablissement du checkpoint.",
|
||||
"checkpoint_no_active_task": "Aucune tâche active à restaurer.",
|
||||
"checkpoint_not_enabled": "Les points de contrôle ne sont pas activés pour cette tâche.",
|
||||
"checkpoint_restore_base_failed": "Échec de la restauration de l'espace de travail à l'état initial.",
|
||||
"git_not_installed": "Git est requis pour la fonctionnalité des points de contrôle. Veuillez installer Git pour activer les points de contrôle.",
|
||||
"checkpoint_no_first": "Aucun premier point de contrôle à comparer.",
|
||||
"checkpoint_no_previous": "Aucun point de contrôle précédent à comparer.",
|
||||
|
|
|
|||
3
src/i18n/locales/hi/common.json
generated
3
src/i18n/locales/hi/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "फ़ाइल नहीं खोली जा सकी!",
|
||||
"checkpoint_timeout": "चेकपॉइंट को पुनर्स्थापित करने का प्रयास करते समय टाइमआउट हो गया।",
|
||||
"checkpoint_failed": "चेकपॉइंट पुनर्स्थापित करने में विफल।",
|
||||
"checkpoint_no_active_task": "पुनर्स्थापित करने के लिए कोई सक्रिय कार्य नहीं।",
|
||||
"checkpoint_not_enabled": "इस कार्य के लिए चेकपॉइंट सक्षम नहीं हैं।",
|
||||
"checkpoint_restore_base_failed": "वर्कस्पेस को प्रारंभिक स्थिति में पुनर्स्थापित करने में विफल।",
|
||||
"git_not_installed": "चेकपॉइंट सुविधा के लिए Git आवश्यक है। कृपया चेकपॉइंट सक्षम करने के लिए Git इंस्टॉल करें।",
|
||||
"checkpoint_no_first": "तुलना करने के लिए कोई पहला चेकपॉइंट नहीं है।",
|
||||
"checkpoint_no_previous": "तुलना करने के लिए कोई पिछला चेकपॉइंट नहीं है।",
|
||||
|
|
|
|||
3
src/i18n/locales/id/common.json
generated
3
src/i18n/locales/id/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Tidak dapat membuka file!",
|
||||
"checkpoint_timeout": "Timeout saat mencoba memulihkan checkpoint.",
|
||||
"checkpoint_failed": "Gagal memulihkan checkpoint.",
|
||||
"checkpoint_no_active_task": "Tidak ada tugas aktif untuk dipulihkan.",
|
||||
"checkpoint_not_enabled": "Checkpoint tidak diaktifkan untuk tugas ini.",
|
||||
"checkpoint_restore_base_failed": "Gagal memulihkan workspace ke keadaan awal.",
|
||||
"git_not_installed": "Git diperlukan untuk fitur checkpoint. Silakan instal Git untuk mengaktifkan checkpoint.",
|
||||
"checkpoint_no_first": "Tidak ada checkpoint pertama untuk dibandingkan.",
|
||||
"checkpoint_no_previous": "Tidak ada checkpoint sebelumnya untuk dibandingkan.",
|
||||
|
|
|
|||
3
src/i18n/locales/it/common.json
generated
3
src/i18n/locales/it/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Impossibile aprire il file!",
|
||||
"checkpoint_timeout": "Timeout durante il tentativo di ripristinare il checkpoint.",
|
||||
"checkpoint_failed": "Impossibile ripristinare il checkpoint.",
|
||||
"checkpoint_no_active_task": "Nessuna attività attiva da ripristinare.",
|
||||
"checkpoint_not_enabled": "I checkpoint non sono abilitati per questa attività.",
|
||||
"checkpoint_restore_base_failed": "Impossibile ripristinare lo spazio di lavoro allo stato iniziale.",
|
||||
"git_not_installed": "Git è richiesto per la funzione di checkpoint. Per favore, installa Git per abilitare i checkpoint.",
|
||||
"checkpoint_no_first": "Nessun primo checkpoint da confrontare.",
|
||||
"checkpoint_no_previous": "Nessun checkpoint precedente da confrontare.",
|
||||
|
|
|
|||
3
src/i18n/locales/ja/common.json
generated
3
src/i18n/locales/ja/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "ファイルを開けませんでした!",
|
||||
"checkpoint_timeout": "チェックポイントの復元を試みる際にタイムアウトしました。",
|
||||
"checkpoint_failed": "チェックポイントの復元に失敗しました。",
|
||||
"checkpoint_no_active_task": "復元するアクティブなタスクがありません。",
|
||||
"checkpoint_not_enabled": "このタスクではチェックポイントが有効になっていません。",
|
||||
"checkpoint_restore_base_failed": "ワークスペースを初期状態に復元できませんでした。",
|
||||
"git_not_installed": "チェックポイント機能にはGitが必要です。チェックポイントを有効にするにはGitをインストールしてください。",
|
||||
"checkpoint_no_first": "比較する最初のチェックポイントがありません。",
|
||||
"checkpoint_no_previous": "比較する前のチェックポイントがありません。",
|
||||
|
|
|
|||
3
src/i18n/locales/ko/common.json
generated
3
src/i18n/locales/ko/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "파일을 열 수 없습니다!",
|
||||
"checkpoint_timeout": "체크포인트 복원을 시도하는 중 시간 초과되었습니다.",
|
||||
"checkpoint_failed": "체크포인트 복원에 실패했습니다.",
|
||||
"checkpoint_no_active_task": "복원할 활성 작업이 없습니다.",
|
||||
"checkpoint_not_enabled": "이 작업에는 체크포인트가 활성화되어 있지 않습니다.",
|
||||
"checkpoint_restore_base_failed": "워크스페이스를 초기 상태로 복원하는 데 실패했습니다.",
|
||||
"git_not_installed": "체크포인트 기능을 사용하려면 Git이 필요합니다. 체크포인트를 활성화하려면 Git을 설치하세요.",
|
||||
"checkpoint_no_first": "비교할 첫 번째 체크포인트가 없습니다.",
|
||||
"checkpoint_no_previous": "비교할 이전 체크포인트가 없습니다.",
|
||||
|
|
|
|||
3
src/i18n/locales/nl/common.json
generated
3
src/i18n/locales/nl/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Kon bestand niet openen!",
|
||||
"checkpoint_timeout": "Time-out bij het herstellen van checkpoint.",
|
||||
"checkpoint_failed": "Herstellen van checkpoint mislukt.",
|
||||
"checkpoint_no_active_task": "Geen actieve taak om te herstellen.",
|
||||
"checkpoint_not_enabled": "Checkpoints zijn niet ingeschakeld voor deze taak.",
|
||||
"checkpoint_restore_base_failed": "Herstellen van workspace naar begintoestand mislukt.",
|
||||
"git_not_installed": "Git is vereist voor de checkpoint-functie. Installeer Git om checkpoints in te schakelen.",
|
||||
"checkpoint_no_first": "Geen eerste checkpoint om mee te vergelijken.",
|
||||
"checkpoint_no_previous": "Geen vorig checkpoint om mee te vergelijken.",
|
||||
|
|
|
|||
3
src/i18n/locales/pl/common.json
generated
3
src/i18n/locales/pl/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Nie można otworzyć pliku!",
|
||||
"checkpoint_timeout": "Upłynął limit czasu podczas próby przywrócenia punktu kontrolnego.",
|
||||
"checkpoint_failed": "Nie udało się przywrócić punktu kontrolnego.",
|
||||
"checkpoint_no_active_task": "Brak aktywnego zadania do przywrócenia.",
|
||||
"checkpoint_not_enabled": "Punkty kontrolne nie są włączone dla tego zadania.",
|
||||
"checkpoint_restore_base_failed": "Nie udało się przywrócić obszaru roboczego do stanu początkowego.",
|
||||
"git_not_installed": "Funkcja punktów kontrolnych wymaga oprogramowania Git. Zainstaluj Git, aby włączyć punkty kontrolne.",
|
||||
"checkpoint_no_first": "Brak pierwszego punktu kontrolnego do porównania.",
|
||||
"checkpoint_no_previous": "Brak poprzedniego punktu kontrolnego do porównania.",
|
||||
|
|
|
|||
3
src/i18n/locales/pt-BR/common.json
generated
3
src/i18n/locales/pt-BR/common.json
generated
|
|
@ -32,6 +32,9 @@
|
|||
"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.",
|
||||
"checkpoint_failed": "Falha ao restaurar o ponto de verificação.",
|
||||
"checkpoint_no_active_task": "Nenhuma tarefa ativa para restaurar.",
|
||||
"checkpoint_not_enabled": "Os pontos de verificação não estão habilitados para esta tarefa.",
|
||||
"checkpoint_restore_base_failed": "Falha ao restaurar o espaço de trabalho ao estado inicial.",
|
||||
"git_not_installed": "O Git é necessário para o recurso de checkpoints. Por favor, instale o Git para habilitar os checkpoints.",
|
||||
"checkpoint_no_first": "Nenhum primeiro ponto de verificação para comparar.",
|
||||
"checkpoint_no_previous": "Nenhum ponto de verificação anterior para comparar.",
|
||||
|
|
|
|||
3
src/i18n/locales/ru/common.json
generated
3
src/i18n/locales/ru/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Не удалось открыть файл!",
|
||||
"checkpoint_timeout": "Превышено время ожидания при попытке восстановления контрольной точки.",
|
||||
"checkpoint_failed": "Не удалось восстановить контрольную точку.",
|
||||
"checkpoint_no_active_task": "Нет активной задачи для восстановления.",
|
||||
"checkpoint_not_enabled": "Контрольные точки не включены для этой задачи.",
|
||||
"checkpoint_restore_base_failed": "Не удалось восстановить рабочее пространство до исходного состояния.",
|
||||
"git_not_installed": "Для функции контрольных точек требуется Git. Пожалуйста, установите Git, чтобы включить контрольные точки.",
|
||||
"checkpoint_no_first": "Нет первой контрольной точки для сравнения.",
|
||||
"checkpoint_no_previous": "Нет предыдущей контрольной точки для сравнения.",
|
||||
|
|
|
|||
3
src/i18n/locales/tr/common.json
generated
3
src/i18n/locales/tr/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "Dosya açılamadı!",
|
||||
"checkpoint_timeout": "Kontrol noktasını geri yüklemeye çalışırken zaman aşımına uğradı.",
|
||||
"checkpoint_failed": "Kontrol noktası geri yüklenemedi.",
|
||||
"checkpoint_no_active_task": "Geri yüklenecek aktif görev yok.",
|
||||
"checkpoint_not_enabled": "Bu görev için kontrol noktaları etkinleştirilmemiş.",
|
||||
"checkpoint_restore_base_failed": "Çalışma alanı başlangıç durumuna 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.",
|
||||
"checkpoint_no_first": "Karşılaştırılacak ilk kontrol noktası yok.",
|
||||
"checkpoint_no_previous": "Karşılaştırılacak önceki kontrol noktası yok.",
|
||||
|
|
|
|||
3
src/i18n/locales/vi/common.json
generated
3
src/i18n/locales/vi/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"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.",
|
||||
"checkpoint_failed": "Không thể khôi phục điểm kiểm tra.",
|
||||
"checkpoint_no_active_task": "Không có nhiệm vụ đang hoạt động để khôi phục.",
|
||||
"checkpoint_not_enabled": "Các điểm kiểm tra chưa được bật cho nhiệm vụ này.",
|
||||
"checkpoint_restore_base_failed": "Không thể khôi phục không gian làm việc về trạng thái ban đầu.",
|
||||
"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.",
|
||||
"checkpoint_no_first": "Không có điểm kiểm tra đầu tiên để so sánh.",
|
||||
"checkpoint_no_previous": "Không có điểm kiểm tra trước đó để so sánh.",
|
||||
|
|
|
|||
3
src/i18n/locales/zh-CN/common.json
generated
3
src/i18n/locales/zh-CN/common.json
generated
|
|
@ -33,6 +33,9 @@
|
|||
"could_not_open_file_generic": "无法打开文件!",
|
||||
"checkpoint_timeout": "尝试恢复检查点时超时。",
|
||||
"checkpoint_failed": "恢复检查点失败。",
|
||||
"checkpoint_no_active_task": "没有活动任务可恢复。",
|
||||
"checkpoint_not_enabled": "此任务未启用检查点。",
|
||||
"checkpoint_restore_base_failed": "无法将工作区恢复到初始状态。",
|
||||
"git_not_installed": "检查点功能需要 Git。请安装 Git 以启用检查点。",
|
||||
"checkpoint_no_first": "没有第一个存档点可供比较。",
|
||||
"checkpoint_no_previous": "没有上一个存档点可供比较。",
|
||||
|
|
|
|||
3
src/i18n/locales/zh-TW/common.json
generated
3
src/i18n/locales/zh-TW/common.json
generated
|
|
@ -28,6 +28,9 @@
|
|||
"could_not_open_file_generic": "無法開啟檔案!",
|
||||
"checkpoint_timeout": "嘗試恢復檢查點時超時。",
|
||||
"checkpoint_failed": "恢復檢查點失敗。",
|
||||
"checkpoint_no_active_task": "沒有活動任務可還原。",
|
||||
"checkpoint_not_enabled": "此任務未啟用存檔點。",
|
||||
"checkpoint_restore_base_failed": "無法將工作區還原至初始狀態。",
|
||||
"git_not_installed": "存檔點功能需要 Git。請安裝 Git 以啟用存檔點。",
|
||||
"checkpoint_no_first": "沒有第一個存檔點可供比較。",
|
||||
"checkpoint_no_previous": "沒有上一個存檔點可供比較。",
|
||||
|
|
|
|||
57
webview-ui/src/components/chat/RestoreTaskDialog.tsx
Normal file
57
webview-ui/src/components/chat/RestoreTaskDialog.tsx
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import { useCallback, useEffect } from "react"
|
||||
import { useKeyPress } from "react-use"
|
||||
import { AlertDialogProps } from "@radix-ui/react-alert-dialog"
|
||||
|
||||
import {
|
||||
AlertDialog,
|
||||
AlertDialogAction,
|
||||
AlertDialogCancel,
|
||||
AlertDialogContent,
|
||||
AlertDialogDescription,
|
||||
AlertDialogFooter,
|
||||
AlertDialogHeader,
|
||||
AlertDialogTitle,
|
||||
Button,
|
||||
} from "@/components/ui"
|
||||
import { useAppTranslation } from "@/i18n/TranslationContext"
|
||||
|
||||
import { vscode } from "@/utils/vscode"
|
||||
|
||||
export const RestoreTaskDialog = ({ ...props }: AlertDialogProps) => {
|
||||
const { t } = useAppTranslation()
|
||||
const [isEnterPressed] = useKeyPress("Enter")
|
||||
|
||||
const { onOpenChange } = props
|
||||
|
||||
const onRestore = useCallback(() => {
|
||||
vscode.postMessage({ type: "restoreToTaskStart" })
|
||||
onOpenChange?.(false)
|
||||
}, [onOpenChange])
|
||||
|
||||
useEffect(() => {
|
||||
if (props.open && isEnterPressed) {
|
||||
onRestore()
|
||||
}
|
||||
}, [props.open, isEnterPressed, onRestore])
|
||||
|
||||
return (
|
||||
<AlertDialog {...props}>
|
||||
<AlertDialogContent onEscapeKeyDown={() => onOpenChange?.(false)}>
|
||||
<AlertDialogHeader>
|
||||
<AlertDialogTitle>{t("chat:task.restoreToStart")}</AlertDialogTitle>
|
||||
<AlertDialogDescription>{t("chat:task.restoreToStartConfirm")}</AlertDialogDescription>
|
||||
</AlertDialogHeader>
|
||||
<AlertDialogFooter>
|
||||
<AlertDialogCancel asChild>
|
||||
<Button variant="secondary">{t("common:answers.cancel")}</Button>
|
||||
</AlertDialogCancel>
|
||||
<AlertDialogAction asChild>
|
||||
<Button variant="destructive" onClick={onRestore}>
|
||||
{t("chat:task.restoreToStartButton")}
|
||||
</Button>
|
||||
</AlertDialogAction>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
)
|
||||
}
|
||||
|
|
@ -8,9 +8,10 @@ import { useCopyToClipboard } from "@/utils/clipboard"
|
|||
import { useExtensionState } from "@/context/ExtensionStateContext"
|
||||
|
||||
import { DeleteTaskDialog } from "../history/DeleteTaskDialog"
|
||||
import { RestoreTaskDialog } from "./RestoreTaskDialog"
|
||||
import { ShareButton } from "./ShareButton"
|
||||
import { CloudTaskButton } from "./CloudTaskButton"
|
||||
import { CopyIcon, DownloadIcon, Trash2Icon, FileJsonIcon, MessageSquareCodeIcon } from "lucide-react"
|
||||
import { CopyIcon, DownloadIcon, Trash2Icon, FileJsonIcon, MessageSquareCodeIcon, RotateCcw } from "lucide-react"
|
||||
import { LucideIconButton } from "./LucideIconButton"
|
||||
|
||||
interface TaskActionsProps {
|
||||
|
|
@ -20,9 +21,10 @@ interface TaskActionsProps {
|
|||
|
||||
export const TaskActions = ({ item, buttonsDisabled }: TaskActionsProps) => {
|
||||
const [deleteTaskId, setDeleteTaskId] = useState<string | null>(null)
|
||||
const [showRestoreDialog, setShowRestoreDialog] = useState(false)
|
||||
const { t } = useTranslation()
|
||||
const { copyWithFeedback } = useCopyToClipboard()
|
||||
const { debug } = useExtensionState()
|
||||
const { debug, enableCheckpoints } = useExtensionState()
|
||||
|
||||
return (
|
||||
<div className="flex flex-row items-center -ml-0.5 mt-1 gap-1">
|
||||
|
|
@ -65,6 +67,17 @@ export const TaskActions = ({ item, buttonsDisabled }: TaskActionsProps) => {
|
|||
)}
|
||||
<ShareButton item={item} disabled={false} />
|
||||
<CloudTaskButton item={item} disabled={buttonsDisabled} />
|
||||
{enableCheckpoints && (
|
||||
<>
|
||||
<LucideIconButton
|
||||
icon={RotateCcw}
|
||||
title={t("chat:task.restoreToStart")}
|
||||
disabled={buttonsDisabled}
|
||||
onClick={() => setShowRestoreDialog(true)}
|
||||
/>
|
||||
<RestoreTaskDialog open={showRestoreDialog} onOpenChange={setShowRestoreDialog} />
|
||||
</>
|
||||
)}
|
||||
{debug && item?.id && (
|
||||
<>
|
||||
<LucideIconButton
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/ca/chat.json
generated
5
webview-ui/src/i18n/locales/ca/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Continua monitoritzant o interactuant amb Roo des de qualsevol lloc. Escaneja, fes clic o copia per obrir.",
|
||||
"openApiHistory": "Obrir historial d'API",
|
||||
"openUiHistory": "Obrir historial d'UI",
|
||||
"backToParentTask": "Tasca principal"
|
||||
"backToParentTask": "Tasca principal",
|
||||
"restoreToStart": "Restaurar l'espai de treball a l'inici de la tasca",
|
||||
"restoreToStartConfirm": "Això restablirà tots els fitxers de l'espai de treball al seu estat quan es va crear aquesta tasca. Els canvis realitzats per aquesta tasca, per altres tasques o manualment seran revertits. Aquesta acció no es pot desfer.",
|
||||
"restoreToStartButton": "Restaurar"
|
||||
},
|
||||
"unpin": "Desfixar",
|
||||
"pin": "Fixar",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/de/chat.json
generated
5
webview-ui/src/i18n/locales/de/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Überwache oder interagiere mit Roo von überall aus. Scanne, klicke oder kopiere zum Öffnen.",
|
||||
"openApiHistory": "API-Verlauf öffnen",
|
||||
"openUiHistory": "UI-Verlauf öffnen",
|
||||
"backToParentTask": "Übergeordnete Aufgabe"
|
||||
"backToParentTask": "Übergeordnete Aufgabe",
|
||||
"restoreToStart": "Arbeitsbereich auf Aufgabenstart zurücksetzen",
|
||||
"restoreToStartConfirm": "Dadurch werden alle Dateien im Arbeitsbereich auf ihren Zustand zurückgesetzt, als diese Aufgabe erstellt wurde. Änderungen durch diese Aufgabe, durch andere Aufgaben oder manuell vorgenommene Änderungen werden alle rückgängig gemacht. Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"restoreToStartButton": "Zurücksetzen"
|
||||
},
|
||||
"unpin": "Lösen von oben",
|
||||
"pin": "Anheften",
|
||||
|
|
|
|||
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Keep monitoring or interacting with Roo from anywhere. Scan, click or copy to open.",
|
||||
"openApiHistory": "Open API History",
|
||||
"openUiHistory": "Open UI History",
|
||||
"backToParentTask": "Parent task"
|
||||
"backToParentTask": "Parent task",
|
||||
"restoreToStart": "Restore workspace to task start",
|
||||
"restoreToStartConfirm": "This will reset all files in the workspace to their state when this task was created. Changes made by this task, by other tasks, or manually will all be reverted. This action cannot be undone.",
|
||||
"restoreToStartButton": "Restore"
|
||||
},
|
||||
"unpin": "Unpin",
|
||||
"pin": "Pin",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/es/chat.json
generated
5
webview-ui/src/i18n/locales/es/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Continúa monitoreando o interactuando con Roo desde cualquier lugar. Escanea, haz clic o copia para abrir.",
|
||||
"openApiHistory": "Abrir historial de API",
|
||||
"openUiHistory": "Abrir historial de UI",
|
||||
"backToParentTask": "Tarea principal"
|
||||
"backToParentTask": "Tarea principal",
|
||||
"restoreToStart": "Restaurar espacio de trabajo al inicio de la tarea",
|
||||
"restoreToStartConfirm": "Esto restablecerá todos los archivos en el espacio de trabajo a su estado cuando se creó esta tarea. Los cambios realizados por esta tarea, por otras tareas o manualmente se revertirán. Esta acción no se puede deshacer.",
|
||||
"restoreToStartButton": "Restaurar"
|
||||
},
|
||||
"unpin": "Desfijar",
|
||||
"pin": "Fijar",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/fr/chat.json
generated
5
webview-ui/src/i18n/locales/fr/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Continue à surveiller ou interagir avec Roo depuis n'importe où. Scanne, clique ou copie pour ouvrir.",
|
||||
"openApiHistory": "Ouvrir l'historique de l'API",
|
||||
"openUiHistory": "Ouvrir l'historique de l'UI",
|
||||
"backToParentTask": "Tâche parente"
|
||||
"backToParentTask": "Tâche parente",
|
||||
"restoreToStart": "Restaurer l'espace de travail au début de la tâche",
|
||||
"restoreToStartConfirm": "Cela réinitialisera tous les fichiers de l'espace de travail à leur état lors de la création de cette tâche. Les modifications effectuées par cette tâche, par d'autres tâches ou manuellement seront toutes annulées. Cette action ne peut pas être annulée.",
|
||||
"restoreToStartButton": "Restaurer"
|
||||
},
|
||||
"unpin": "Désépingler",
|
||||
"pin": "Épingler",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/hi/chat.json
generated
5
webview-ui/src/i18n/locales/hi/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "कहीं से भी Roo की निगरानी या इंटरैक्ट करना जारी रखें। खोलने के लिए स्कैन करें, क्लिक करें या कॉपी करें।",
|
||||
"openApiHistory": "API इतिहास खोलें",
|
||||
"openUiHistory": "UI इतिहास खोलें",
|
||||
"backToParentTask": "मूल कार्य"
|
||||
"backToParentTask": "मूल कार्य",
|
||||
"restoreToStart": "कार्यक्षेत्र को कार्य प्रारंभ पर पुनर्स्थापित करें",
|
||||
"restoreToStartConfirm": "यह कार्यक्षेत्र में सभी फ़ाइलों को उस स्थिति में रीसेट कर देगा जब यह कार्य बनाया गया था। इस कार्य द्वारा, अन्य कार्यों द्वारा, या मैन्युअल रूप से किए गए परिवर्तन सभी को वापस कर दिया जाएगा। इस क्रिया को पूर्ववत नहीं किया जा सकता।",
|
||||
"restoreToStartButton": "पुनर्स्थापित करें"
|
||||
},
|
||||
"unpin": "पिन करें",
|
||||
"pin": "अवपिन करें",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/id/chat.json
generated
5
webview-ui/src/i18n/locales/id/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Terus pantau atau berinteraksi dengan Roo dari mana saja. Pindai, klik atau salin untuk membuka.",
|
||||
"openApiHistory": "Buka Riwayat API",
|
||||
"openUiHistory": "Buka Riwayat UI",
|
||||
"backToParentTask": "Tugas Induk"
|
||||
"backToParentTask": "Tugas Induk",
|
||||
"restoreToStart": "Pulihkan workspace ke awal tugas",
|
||||
"restoreToStartConfirm": "Ini akan mereset semua file di workspace ke keadaan saat tugas ini dibuat. Perubahan yang dibuat oleh tugas ini, tugas lain, atau manual akan dikembalikan. Tindakan ini tidak dapat dibatalkan.",
|
||||
"restoreToStartButton": "Pulihkan"
|
||||
},
|
||||
"history": {
|
||||
"title": "Riwayat"
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/it/chat.json
generated
5
webview-ui/src/i18n/locales/it/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Continua a monitorare o interagire con Roo da qualsiasi luogo. Scansiona, clicca o copia per aprire.",
|
||||
"openApiHistory": "Apri cronologia API",
|
||||
"openUiHistory": "Apri cronologia UI",
|
||||
"backToParentTask": "Attività principale"
|
||||
"backToParentTask": "Attività principale",
|
||||
"restoreToStart": "Ripristina lo spazio di lavoro all'inizio dell'attività",
|
||||
"restoreToStartConfirm": "Questo ripristinerà tutti i file nello spazio di lavoro al loro stato quando questa attività è stata creata. Le modifiche apportate da questa attività, da altre attività o manualmente verranno tutte annullate. Questa azione non può essere annullata.",
|
||||
"restoreToStartButton": "Ripristina"
|
||||
},
|
||||
"unpin": "Rilascia",
|
||||
"pin": "Fissa",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/ja/chat.json
generated
5
webview-ui/src/i18n/locales/ja/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "どこからでもRooの監視や操作を続けられます。スキャン、クリック、またはコピーして開いてください。",
|
||||
"openApiHistory": "API履歴を開く",
|
||||
"openUiHistory": "UI履歴を開く",
|
||||
"backToParentTask": "親タスク"
|
||||
"backToParentTask": "親タスク",
|
||||
"restoreToStart": "ワークスペースをタスク開始時に復元",
|
||||
"restoreToStartConfirm": "これにより、ワークスペース内のすべてのファイルが、このタスクが作成されたときの状態にリセットされます。このタスク、他のタスク、または手動で行われた変更はすべて元に戻されます。この操作は元に戻せません。",
|
||||
"restoreToStartButton": "復元"
|
||||
},
|
||||
"unpin": "ピン留めを解除",
|
||||
"pin": "ピン留め",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/ko/chat.json
generated
5
webview-ui/src/i18n/locales/ko/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "어디서나 Roo를 계속 모니터링하거나 상호작용할 수 있습니다. 스캔, 클릭 또는 복사하여 열기.",
|
||||
"openApiHistory": "API 기록 열기",
|
||||
"openUiHistory": "UI 기록 열기",
|
||||
"backToParentTask": "상위 작업"
|
||||
"backToParentTask": "상위 작업",
|
||||
"restoreToStart": "작업 시작 시점으로 워크스페이스 복원",
|
||||
"restoreToStartConfirm": "이 작업이 생성되었을 때의 상태로 워크스페이스의 모든 파일을 재설정합니다. 이 작업, 다른 작업 또는 수동으로 수행한 변경 사항이 모두 되돌려집니다. 이 작업은 취소할 수 없습니다.",
|
||||
"restoreToStartButton": "복원"
|
||||
},
|
||||
"unpin": "고정 해제하기",
|
||||
"pin": "고정하기",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/nl/chat.json
generated
5
webview-ui/src/i18n/locales/nl/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Blijf Roo vanaf elke locatie monitoren of ermee interacteren. Scan, klik of kopieer om te openen.",
|
||||
"openApiHistory": "API-geschiedenis openen",
|
||||
"openUiHistory": "UI-geschiedenis openen",
|
||||
"backToParentTask": "Bovenliggende taak"
|
||||
"backToParentTask": "Bovenliggende taak",
|
||||
"restoreToStart": "Werkruimte herstellen naar taakstart",
|
||||
"restoreToStartConfirm": "Dit zal alle bestanden in de werkruimte resetten naar hun staat toen deze taak werd aangemaakt. Wijzigingen gemaakt door deze taak, door andere taken of handmatig zullen allemaal worden teruggedraaid. Deze actie kan niet ongedaan worden gemaakt.",
|
||||
"restoreToStartButton": "Herstellen"
|
||||
},
|
||||
"unpin": "Losmaken",
|
||||
"pin": "Vastmaken",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/pl/chat.json
generated
5
webview-ui/src/i18n/locales/pl/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Kontynuuj monitorowanie lub interakcję z Roo z dowolnego miejsca. Zeskanuj, kliknij lub skopiuj, aby otworzyć.",
|
||||
"openApiHistory": "Otwórz historię API",
|
||||
"openUiHistory": "Otwórz historię UI",
|
||||
"backToParentTask": "Zadanie nadrzędne"
|
||||
"backToParentTask": "Zadanie nadrzędne",
|
||||
"restoreToStart": "Przywróć obszar roboczy do początku zadania",
|
||||
"restoreToStartConfirm": "Spowoduje to zresetowanie wszystkich plików w obszarze roboczym do stanu z momentu utworzenia tego zadania. Zmiany wprowadzone przez to zadanie, przez inne zadania lub ręcznie zostaną cofnięte. Ta operacja nie może być cofnięta.",
|
||||
"restoreToStartButton": "Przywróć"
|
||||
},
|
||||
"unpin": "Odepnij",
|
||||
"pin": "Przypnij",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/pt-BR/chat.json
generated
5
webview-ui/src/i18n/locales/pt-BR/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Continue monitorando ou interagindo com Roo de qualquer lugar. Escaneie, clique ou copie para abrir.",
|
||||
"openApiHistory": "Abrir histórico da API",
|
||||
"openUiHistory": "Abrir histórico da UI",
|
||||
"backToParentTask": "Tarefa pai"
|
||||
"backToParentTask": "Tarefa pai",
|
||||
"restoreToStart": "Restaurar espaço de trabalho ao início da tarefa",
|
||||
"restoreToStartConfirm": "Isso irá redefinir todos os arquivos no espaço de trabalho para seu estado quando esta tarefa foi criada. Alterações feitas por esta tarefa, por outras tarefas ou manualmente serão todas revertidas. Esta ação não pode ser desfeita.",
|
||||
"restoreToStartButton": "Restaurar"
|
||||
},
|
||||
"unpin": "Desfixar",
|
||||
"pin": "Fixar",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/ru/chat.json
generated
5
webview-ui/src/i18n/locales/ru/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Продолжай отслеживать или взаимодействовать с Roo откуда угодно. Отсканируй, нажми или скопируй для открытия.",
|
||||
"openApiHistory": "Открыть историю API",
|
||||
"openUiHistory": "Открыть историю UI",
|
||||
"backToParentTask": "Родительская задача"
|
||||
"backToParentTask": "Родительская задача",
|
||||
"restoreToStart": "Восстановить рабочее пространство до начала задачи",
|
||||
"restoreToStartConfirm": "Это сбросит все файлы в рабочем пространстве до их состояния на момент создания этой задачи. Изменения, внесенные этой задачей, другими задачами или вручную, будут отменены. Это действие нельзя отменить.",
|
||||
"restoreToStartButton": "Восстановить"
|
||||
},
|
||||
"unpin": "Открепить",
|
||||
"pin": "Закрепить",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/tr/chat.json
generated
5
webview-ui/src/i18n/locales/tr/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Roo'yu her yerden izlemeye veya etkileşime devam et. Açmak için tara, tıkla veya kopyala.",
|
||||
"openApiHistory": "API Geçmişini Aç",
|
||||
"openUiHistory": "UI Geçmişini Aç",
|
||||
"backToParentTask": "Üst görev"
|
||||
"backToParentTask": "Üst görev",
|
||||
"restoreToStart": "Çalışma alanını görev başlangıcına geri yükle",
|
||||
"restoreToStartConfirm": "Bu, çalışma alanındaki tüm dosyaları bu görev oluşturulduğundaki durumlarına sıfırlayacaktır. Bu görev tarafından, diğer görevler tarafından veya manuel olarak yapılan değişiklikler geri alınacaktır. Bu işlem geri alınamaz.",
|
||||
"restoreToStartButton": "Geri Yükle"
|
||||
},
|
||||
"unpin": "Sabitlemeyi iptal et",
|
||||
"pin": "Sabitle",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/vi/chat.json
generated
5
webview-ui/src/i18n/locales/vi/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "Tiếp tục theo dõi hoặc tương tác với Roo từ bất cứ đâu. Quét, nhấp hoặc sao chép để mở.",
|
||||
"openApiHistory": "Mở lịch sử API",
|
||||
"openUiHistory": "Mở lịch sử UI",
|
||||
"backToParentTask": "Nhiệm vụ cha"
|
||||
"backToParentTask": "Nhiệm vụ cha",
|
||||
"restoreToStart": "Khôi phục không gian làm việc về lúc bắt đầu nhiệm vụ",
|
||||
"restoreToStartConfirm": "Điều này sẽ đặt lại tất cả các tệp trong không gian làm việc về trạng thái khi nhiệm vụ này được tạo. Các thay đổi do nhiệm vụ này, do các nhiệm vụ khác hoặc được thực hiện thủ công sẽ đều bị hoàn tác. Hành động này không thể hoàn tác.",
|
||||
"restoreToStartButton": "Khôi phục"
|
||||
},
|
||||
"unpin": "Bỏ ghim khỏi đầu",
|
||||
"pin": "Ghim lên đầu",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/zh-CN/chat.json
generated
5
webview-ui/src/i18n/locales/zh-CN/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "从任何地方继续监控或与 Roo 交互。扫描、点击或复制以打开。",
|
||||
"openApiHistory": "打开 API 历史",
|
||||
"openUiHistory": "打开 UI 历史",
|
||||
"backToParentTask": "父任务"
|
||||
"backToParentTask": "父任务",
|
||||
"restoreToStart": "恢复工作区到任务开始时",
|
||||
"restoreToStartConfirm": "这将把工作区中的所有文件重置为创建此任务时的状态。由此任务、其他任务或手动进行的更改都将被还原。此操作不可撤销。",
|
||||
"restoreToStartButton": "恢复"
|
||||
},
|
||||
"unpin": "取消置顶",
|
||||
"pin": "置顶",
|
||||
|
|
|
|||
5
webview-ui/src/i18n/locales/zh-TW/chat.json
generated
5
webview-ui/src/i18n/locales/zh-TW/chat.json
generated
|
|
@ -29,7 +29,10 @@
|
|||
"openInCloudIntro": "從任何地方繼續監控或與 Roo 互動。掃描、點選或複製即可開啟。",
|
||||
"openApiHistory": "開啟 API 歷史紀錄",
|
||||
"openUiHistory": "開啟 UI 歷史紀錄",
|
||||
"backToParentTask": "上層工作"
|
||||
"backToParentTask": "上層工作",
|
||||
"restoreToStart": "還原工作區至任務開始時",
|
||||
"restoreToStartConfirm": "這將把工作區中的所有檔案重置為建立此任務時的狀態。由此任務、其他任務或手動進行的變更都將被還原。此操作無法復原。",
|
||||
"restoreToStartButton": "還原"
|
||||
},
|
||||
"unpin": "取消釘選",
|
||||
"pin": "釘選",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue