Will Li 5 месяцев назад
Родитель
Сommit
917b2cc882

+ 21 - 124
src/core/webview/__tests__/ClineProvider.spec.ts

@@ -145,6 +145,7 @@ vi.mock("vscode", () => ({
 	},
 	window: {
 		showInformationMessage: vi.fn(),
+		showWarningMessage: vi.fn(),
 		showErrorMessage: vi.fn(),
 	},
 	workspace: {
@@ -1289,14 +1290,14 @@ describe("ClineProvider", () => {
 
 	describe("editMessage", () => {
 		beforeEach(async () => {
-			// Mock window.showInformationMessage
-			;(vscode.window.showInformationMessage as any) = vi.fn()
+			// Mock window.showWarningMessage
+			;(vscode.window.showWarningMessage as any) = vi.fn()
 			await provider.resolveWebviewView(mockWebviewView)
 		})
 
-		test('handles "No, just edit this one" edit correctly', async () => {
-			// Mock user selecting "No, just edit this one"
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+		test('handles "Proceed" edit correctly', async () => {
+			// Mock user selecting "Proceed" - need to use the localized string key
+			;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 			// Setup mock messages
 			const mockMessages = [
@@ -1345,20 +1346,13 @@ describe("ClineProvider", () => {
 				editedMessageContent: "Edited message content",
 			})
 
-			// Verify correct messages were kept
-			expect(mockCline.overwriteClineMessages).toHaveBeenCalledWith([
-				mockMessages[0],
-				mockMessages[1],
-				mockMessages[4],
-				mockMessages[5],
-			])
+			// Verify correct messages were kept (only messages before the edited one)
+			expect(mockCline.overwriteClineMessages).toHaveBeenCalledWith([mockMessages[0], mockMessages[1]])
 
-			// Verify correct API messages were kept
+			// Verify correct API messages were kept (only messages before the edited one)
 			expect(mockCline.overwriteApiConversationHistory).toHaveBeenCalledWith([
 				mockApiHistory[0],
 				mockApiHistory[1],
-				mockApiHistory[4],
-				mockApiHistory[5],
 			])
 
 			// Verify handleWebviewAskResponse was called with the edited content
@@ -1368,103 +1362,6 @@ describe("ClineProvider", () => {
 				undefined,
 			)
 		})
-
-		test('handles "Yes" (edit and delete subsequent) correctly', async () => {
-			// Mock user selecting "Yes"
-			;(vscode.window.showInformationMessage as any).mockResolvedValue(
-				"confirmation.edit_this_and_delete_subsequent",
-			)
-
-			// Setup mock messages
-			const mockMessages = [
-				{ ts: 1000, type: "say", say: "user_feedback" },
-				{ ts: 2000, type: "say", say: "text", value: 3000 }, // Message to edit
-				{ ts: 3000, type: "say", say: "user_feedback" },
-				{ ts: 4000, type: "say", say: "user_feedback" },
-			] as ClineMessage[]
-
-			const mockApiHistory = [
-				{ ts: 1000 },
-				{ ts: 2000 },
-				{ ts: 3000 },
-				{ ts: 4000 },
-			] as (Anthropic.MessageParam & {
-				ts?: number
-			})[]
-
-			// Setup Cline instance with auto-mock from the top of the file
-			const mockCline = new Task(defaultTaskOptions) // Create a new mocked instance
-			mockCline.clineMessages = mockMessages
-			mockCline.apiConversationHistory = mockApiHistory
-
-			// Explicitly mock the overwrite methods since they're not being called in the tests
-			mockCline.overwriteClineMessages = vi.fn()
-			mockCline.overwriteApiConversationHistory = vi.fn()
-			mockCline.handleWebviewAskResponse = vi.fn()
-
-			await provider.addClineToStack(mockCline)
-
-			// Mock getTaskWithId
-			;(provider as any).getTaskWithId = vi.fn().mockResolvedValue({
-				historyItem: { id: "test-task-id" },
-			})
-
-			// Trigger message edit
-			// Get the message handler function that was registered with the webview
-			const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as any).mock.calls[0][0]
-
-			// Call the message handler with a submitEditedMessage message
-			await messageHandler({
-				type: "submitEditedMessage",
-				value: 3000,
-				editedMessageContent: "Edited message content",
-			})
-
-			// Verify only messages before the edited message were kept
-			expect(mockCline.overwriteClineMessages).toHaveBeenCalledWith([mockMessages[0]])
-
-			// Verify only API messages before the edited message were kept
-			expect(mockCline.overwriteApiConversationHistory).toHaveBeenCalledWith([mockApiHistory[0]])
-
-			// Verify handleWebviewAskResponse was called with the edited content
-			expect(mockCline.handleWebviewAskResponse).toHaveBeenCalledWith(
-				"messageResponse",
-				"Edited message content",
-				undefined,
-			)
-		})
-
-		test("handles Cancel correctly", async () => {
-			// Mock user selecting "Cancel"
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("Cancel")
-
-			// Setup Cline instance with auto-mock from the top of the file
-			const mockCline = new Task(defaultTaskOptions) // Create a new mocked instance
-			mockCline.clineMessages = [{ ts: 1000 }, { ts: 2000 }] as ClineMessage[]
-			mockCline.apiConversationHistory = [{ ts: 1000 }, { ts: 2000 }] as (Anthropic.MessageParam & {
-				ts?: number
-			})[]
-
-			// Explicitly mock the overwrite methods since they're not being called in the tests
-			mockCline.overwriteClineMessages = vi.fn()
-			mockCline.overwriteApiConversationHistory = vi.fn()
-			mockCline.handleWebviewAskResponse = vi.fn()
-
-			await provider.addClineToStack(mockCline)
-
-			// Trigger message edit
-			const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as any).mock.calls[0][0]
-			await messageHandler({
-				type: "submitEditedMessage",
-				value: 2000,
-				editedMessageContent: "Edited message content",
-			})
-
-			// Verify no messages were edited or deleted
-			expect(mockCline.overwriteClineMessages).not.toHaveBeenCalled()
-			expect(mockCline.overwriteApiConversationHistory).not.toHaveBeenCalled()
-			expect(mockCline.handleWebviewAskResponse).not.toHaveBeenCalled()
-		})
 	})
 
 	describe("getSystemPrompt", () => {
@@ -2813,7 +2710,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 		})
 
 		test("handles editing messages containing images", async () => {
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+			;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 			const mockMessages = [
 				{ ts: 1000, type: "say", say: "user_feedback", text: "Original message" },
@@ -2858,7 +2755,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 		})
 
 		test("handles editing messages with file attachments", async () => {
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+			;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 			const mockMessages = [
 				{ ts: 1000, type: "say", say: "user_feedback", text: "Original message" },
@@ -2908,7 +2805,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 		})
 
 		test("handles network timeout during edit submission", async () => {
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.proceed")
 
 			const mockCline = new Task(defaultTaskOptions)
 			mockCline.clineMessages = [
@@ -2940,7 +2837,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 		})
 
 		test("handles connection drops during edit operation", async () => {
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+			;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 			const mockCline = new Task(defaultTaskOptions)
 			mockCline.clineMessages = [
@@ -2979,7 +2876,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 		})
 
 		test("handles race conditions with simultaneous edits", async () => {
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+			;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 			const mockCline = new Task(defaultTaskOptions)
 			mockCline.clineMessages = [
@@ -3043,7 +2940,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 		})
 
 		test("handles authorization failures during edit", async () => {
-			;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+			;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 			const mockCline = new Task(defaultTaskOptions)
 			mockCline.clineMessages = [
@@ -3161,7 +3058,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 			})
 
 			test("handles edit operations on deleted messages", async () => {
-				;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+				;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 				const mockCline = new Task(defaultTaskOptions)
 				mockCline.clineMessages = [
@@ -3187,7 +3084,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 				})
 
 				// Should show confirmation dialog but not perform any operations
-				expect(vscode.window.showInformationMessage).toHaveBeenCalled()
+				expect(vscode.window.showWarningMessage).toHaveBeenCalled()
 				expect(mockCline.overwriteClineMessages).not.toHaveBeenCalled()
 				expect(mockCline.handleWebviewAskResponse).not.toHaveBeenCalled()
 			})
@@ -3231,7 +3128,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 			})
 
 			test("validates proper cleanup during failed edit operations", async () => {
-				;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+				;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 				const mockCline = new Task(defaultTaskOptions)
 				mockCline.clineMessages = [
@@ -3311,7 +3208,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 			})
 
 			test("handles editing messages with large text content", async () => {
-				;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+				;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 				// Create a large message (10KB of text)
 				const largeText = "A".repeat(10000)
@@ -3419,7 +3316,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 
 			test("handles user cancellation gracefully", async () => {
 				// Mock user canceling the operation
-				;(vscode.window.showInformationMessage as any).mockResolvedValue(undefined)
+				;(vscode.window.showWarningMessage as any).mockResolvedValue(undefined)
 
 				const mockCline = new Task(defaultTaskOptions)
 				mockCline.clineMessages = [
@@ -3485,7 +3382,7 @@ describe("ClineProvider - Comprehensive Edit/Delete Edge Cases", () => {
 			})
 
 			test("handles messages with future timestamps", async () => {
-				;(vscode.window.showInformationMessage as any).mockResolvedValue("confirmation.edit_just_this_message")
+				;(vscode.window.showWarningMessage as any).mockResolvedValue("confirmation.proceed")
 
 				const futureTimestamp = Date.now() + 100000 // Future timestamp
 				const mockCline = new Task(defaultTaskOptions)

+ 9 - 18
src/core/webview/webviewMessageHandler.ts

@@ -193,32 +193,23 @@ export const webviewMessageHandler = async (
 	 * Handles message editing operations with user confirmation
 	 */
 	const handleEditOperation = async (messageTs: number, editedContent: string): Promise<void> => {
-		const options = [
-			t("common:confirmation.edit_this_and_delete_subsequent"),
-			t("common:confirmation.edit_just_this_message"),
-		]
-
-		const answer = await vscode.window.showInformationMessage(
-			t("common:confirmation.edit_message"),
+		const answer = await vscode.window.showWarningMessage(
+			t("common:confirmation.edit_warning"),
 			{ modal: true },
-			...options,
+			t("common:confirmation.proceed"),
 		)
 
-		// Only proceed if user selected one of the options and we have a current cline
-		if (answer && options.includes(answer) && provider.getCurrentCline()) {
+		// Only proceed if user selected "Proceed" and we have a current cline
+		if (answer === t("common:confirmation.proceed") && provider.getCurrentCline()) {
 			const currentCline = provider.getCurrentCline()!
+
+			// Use findMessageIndices to find messages based on timestamp
 			const { messageIndex, apiConversationHistoryIndex } = findMessageIndices(messageTs, currentCline)
 
 			if (messageIndex !== -1) {
 				try {
-					// Check which option the user selected
-					if (answer === options[0]) {
-						// Edit this message and delete subsequent
-						await removeMessagesThisAndSubsequent(currentCline, messageIndex, apiConversationHistoryIndex)
-					} else if (answer === options[1]) {
-						// Edit just this message
-						await removeMessagesJustThis(currentCline, messageIndex, apiConversationHistoryIndex)
-					}
+					// Edit this message and delete subsequent
+					await removeMessagesThisAndSubsequent(currentCline, messageIndex, apiConversationHistoryIndex)
 
 					// Process the edited message as a regular user message
 					// This will add it to the conversation and trigger an AI response

+ 2 - 6
src/i18n/locales/ca/common.json

@@ -23,11 +23,10 @@
 		"delete_config_profile": "Estàs segur que vols eliminar aquest perfil de configuració?",
 		"delete_custom_mode_with_rules": "Esteu segur que voleu suprimir aquest mode {scope}?\n\nAixò també suprimirà la carpeta de regles associada a:\n{rulesFolderPath}",
 		"delete_message": "Què vols eliminar?",
-		"edit_message": "Eliminar tots els missatges després d'aquest?",
+		"edit_warning": "Editar aquest missatge eliminarà tots els missatges posteriors de la conversa. Vols continuar?",
 		"delete_just_this_message": "Només aquest missatge",
-		"edit_just_this_message": "No, només editar aquest",
 		"delete_this_and_subsequent": "Aquest i tots els missatges posteriors",
-		"edit_this_and_delete_subsequent": "Sí"
+		"proceed": "Continuar"
 	},
 	"errors": {
 		"invalid_data_uri": "Format d'URI de dades no vàlid",
@@ -111,13 +110,11 @@
 	"answers": {
 		"yes": "Sí",
 		"no": "No",
-		"cancel": "Cancel·lar",
 		"remove": "Eliminar",
 		"keep": "Mantenir"
 	},
 	"buttons": {
 		"save": "Desar",
-		"cancel": "Cancel·lar",
 		"edit": "Editar"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Suprimeix el mode personalitzat",
 			"description": "Esteu segur que voleu suprimir aquest mode {{scope}}? Això també suprimirà la carpeta de regles associada a: {{rulesFolderPath}}",
 			"descriptionNoRules": "Esteu segur que voleu suprimir aquest mode personalitzat?",
-			"cancel": "Cancel·la",
 			"confirm": "Suprimeix"
 		}
 	}

+ 2 - 6
src/i18n/locales/de/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "Möchtest du dieses Konfigurationsprofil wirklich löschen?",
 		"delete_custom_mode_with_rules": "Bist du sicher, dass du diesen {scope}-Modus löschen möchtest?\n\nDadurch wird auch der zugehörige Regelordner unter folgender Adresse gelöscht:\n{rulesFolderPath}",
 		"delete_message": "Was möchtest du löschen?",
-		"edit_message": "Alle Nachrichten nach dieser löschen?",
+		"edit_warning": "Das Bearbeiten dieser Nachricht wird alle nachfolgenden Nachrichten in der Unterhaltung löschen. Möchtest du fortfahren?",
 		"delete_just_this_message": "Nur diese Nachricht",
-		"edit_just_this_message": "Nein, nur diese bearbeiten",
 		"delete_this_and_subsequent": "Diese und alle nachfolgenden Nachrichten",
-		"edit_this_and_delete_subsequent": "Ja"
+		"proceed": "Fortfahren"
 	},
 	"errors": {
 		"invalid_data_uri": "Ungültiges Daten-URI-Format",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Ja",
 		"no": "Nein",
-		"cancel": "Abbrechen",
 		"remove": "Entfernen",
 		"keep": "Behalten"
 	},
 	"buttons": {
 		"save": "Speichern",
-		"cancel": "Abbrechen",
 		"edit": "Bearbeiten"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Benutzerdefinierten Modus löschen",
 			"description": "Bist du sicher, dass du diesen {{scope}}-Modus löschen möchtest? Dadurch wird auch der zugehörige Regelordner unter {{rulesFolderPath}} gelöscht",
 			"descriptionNoRules": "Bist du sicher, dass du diesen benutzerdefinierten Modus löschen möchtest?",
-			"cancel": "Abbrechen",
 			"confirm": "Löschen"
 		}
 	}

+ 2 - 6
src/i18n/locales/en/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "Are you sure you want to delete this configuration profile?",
 		"delete_custom_mode_with_rules": "Are you sure you want to delete this {scope} mode?\n\nThis will also delete the associated rules folder at:\n{rulesFolderPath}",
 		"delete_message": "What would you like to delete?",
-		"edit_message": "Delete all messages after this one?",
+		"edit_warning": "Editing this message will delete all subsequent messages in the conversation. Do you want to proceed?",
 		"delete_just_this_message": "Just this message",
-		"edit_just_this_message": "No, just edit this one",
 		"delete_this_and_subsequent": "This and all subsequent messages",
-		"edit_this_and_delete_subsequent": "Yes"
+		"proceed": "Proceed"
 	},
 	"errors": {
 		"invalid_data_uri": "Invalid data URI format",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Yes",
 		"no": "No",
-		"cancel": "Cancel",
 		"remove": "Remove",
 		"keep": "Keep"
 	},
 	"buttons": {
 		"save": "Save",
-		"cancel": "Cancel",
 		"edit": "Edit"
 	},
 	"tasks": {
@@ -160,7 +157,6 @@
 			"title": "Delete Custom Mode",
 			"description": "Are you sure you want to delete this {{scope}} mode? This will also delete the associated rules folder at: {{rulesFolderPath}}",
 			"descriptionNoRules": "Are you sure you want to delete this custom mode?",
-			"cancel": "Cancel",
 			"confirm": "Delete"
 		}
 	}

+ 2 - 6
src/i18n/locales/es/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "¿Estás seguro de que deseas eliminar este perfil de configuración?",
 		"delete_custom_mode_with_rules": "¿Estás seguro de que quieres eliminar este modo {scope}?\n\nEsto también eliminará la carpeta de reglas asociada en:\n{rulesFolderPath}",
 		"delete_message": "¿Qué deseas eliminar?",
-		"edit_message": "¿Eliminar todos los mensajes posteriores a este?",
+		"edit_warning": "Editar este mensaje eliminará todos los mensajes posteriores en la conversación. ¿Deseas continuar?",
 		"delete_just_this_message": "Solo este mensaje",
-		"edit_just_this_message": "No, solo editar este",
 		"delete_this_and_subsequent": "Este y todos los mensajes posteriores",
-		"edit_this_and_delete_subsequent": "Sí"
+		"proceed": "Continuar"
 	},
 	"errors": {
 		"invalid_data_uri": "Formato de URI de datos no válido",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Sí",
 		"no": "No",
-		"cancel": "Cancelar",
 		"remove": "Eliminar",
 		"keep": "Mantener"
 	},
 	"buttons": {
 		"save": "Guardar",
-		"cancel": "Cancelar",
 		"edit": "Editar"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Eliminar modo personalizado",
 			"description": "¿Estás seguro de que quieres eliminar este modo {{scope}}? Esto también eliminará la carpeta de reglas asociada en: {{rulesFolderPath}}",
 			"descriptionNoRules": "¿Estás seguro de que quieres eliminar este modo personalizado?",
-			"cancel": "Cancelar",
 			"confirm": "Eliminar"
 		}
 	}

+ 2 - 6
src/i18n/locales/fr/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "Êtes-vous sûr de vouloir supprimer ce profil de configuration ?",
 		"delete_custom_mode_with_rules": "Êtes-vous sûr de vouloir supprimer ce mode {scope} ?\n\nCela supprimera également le dossier de règles associé à l'adresse :\n{rulesFolderPath}",
 		"delete_message": "Que souhaitez-vous supprimer ?",
-		"edit_message": "Supprimer tous les messages après celui-ci ?",
+		"edit_warning": "Modifier ce message supprimera tous les messages suivants dans la conversation. Voulez-vous continuer ?",
 		"delete_just_this_message": "Uniquement ce message",
-		"edit_just_this_message": "Non, modifier uniquement celui-ci",
 		"delete_this_and_subsequent": "Ce message et tous les messages suivants",
-		"edit_this_and_delete_subsequent": "Oui"
+		"proceed": "Continuer"
 	},
 	"errors": {
 		"invalid_data_uri": "Format d'URI de données invalide",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Oui",
 		"no": "Non",
-		"cancel": "Annuler",
 		"remove": "Supprimer",
 		"keep": "Conserver"
 	},
 	"buttons": {
 		"save": "Enregistrer",
-		"cancel": "Annuler",
 		"edit": "Modifier"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Supprimer le mode personnalisé",
 			"description": "Êtes-vous sûr de vouloir supprimer ce mode {{scope}} ? Cela supprimera également le dossier de règles associé à l'adresse : {{rulesFolderPath}}",
 			"descriptionNoRules": "Êtes-vous sûr de vouloir supprimer ce mode personnalisé ?",
-			"cancel": "Annuler",
 			"confirm": "Supprimer"
 		}
 	}

+ 2 - 6
src/i18n/locales/hi/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "क्या आप वाकई इस कॉन्फ़िगरेशन प्रोफ़ाइल को हटाना चाहते हैं?",
 		"delete_custom_mode_with_rules": "क्या आप वाकई इस {scope} मोड को हटाना चाहते हैं?\n\nयह संबंधित नियम फ़ोल्डर को भी यहाँ हटा देगा:\n{rulesFolderPath}",
 		"delete_message": "आप क्या हटाना चाहते हैं?",
-		"edit_message": "इसके बाद के सभी संदेशों को हटाएं?",
+		"edit_warning": "इस संदेश को संपादित करने से बातचीत के सभी बाद के संदेश हट जाएंगे। क्या आप जारी रखना चाहते हैं?",
 		"delete_just_this_message": "सिर्फ यह संदेश",
-		"edit_just_this_message": "नहीं, केवल इसे संपादित करें",
 		"delete_this_and_subsequent": "यह और सभी बाद के संदेश",
-		"edit_this_and_delete_subsequent": "हां"
+		"proceed": "जारी रखें"
 	},
 	"errors": {
 		"invalid_data_uri": "अमान्य डेटा URI फॉर्मेट",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "हां",
 		"no": "नहीं",
-		"cancel": "रद्द करें",
 		"remove": "हटाएं",
 		"keep": "रखें"
 	},
 	"buttons": {
 		"save": "सहेजें",
-		"cancel": "रद्द करें",
 		"edit": "संपादित करें"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "कस्टम मोड हटाएं",
 			"description": "क्या आप वाकई इस {{scope}} मोड को हटाना चाहते हैं? यह संबंधित नियम फ़ोल्डर को भी {{rulesFolderPath}} पर हटा देगा",
 			"descriptionNoRules": "क्या आप वाकई इस कस्टम मोड को हटाना चाहते हैं?",
-			"cancel": "रद्द करें",
 			"confirm": "हटाएं"
 		}
 	}

+ 2 - 6
src/i18n/locales/id/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "Apakah kamu yakin ingin menghapus profil konfigurasi ini?",
 		"delete_custom_mode_with_rules": "Anda yakin ingin menghapus mode {scope} ini?\n\nIni juga akan menghapus folder aturan terkait di:\n{rulesFolderPath}",
 		"delete_message": "Apa yang ingin kamu hapus?",
-		"edit_message": "Hapus semua pesan setelah ini?",
+		"edit_warning": "Mengedit pesan ini akan menghapus semua pesan selanjutnya dalam percakapan. Apakah kamu ingin melanjutkan?",
 		"delete_just_this_message": "Hanya pesan ini",
-		"edit_just_this_message": "Tidak, hanya edit yang ini",
 		"delete_this_and_subsequent": "Ini dan semua pesan selanjutnya",
-		"edit_this_and_delete_subsequent": "Ya"
+		"proceed": "Lanjutkan"
 	},
 	"errors": {
 		"invalid_data_uri": "Format data URI tidak valid",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Ya",
 		"no": "Tidak",
-		"cancel": "Batal",
 		"remove": "Hapus",
 		"keep": "Simpan"
 	},
 	"buttons": {
 		"save": "Simpan",
-		"cancel": "Batal",
 		"edit": "Edit"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Hapus Mode Kustom",
 			"description": "Anda yakin ingin menghapus mode {{scope}} ini? Ini juga akan menghapus folder aturan terkait di: {{rulesFolderPath}}",
 			"descriptionNoRules": "Anda yakin ingin menghapus mode kustom ini?",
-			"cancel": "Batal",
 			"confirm": "Hapus"
 		}
 	}

+ 2 - 6
src/i18n/locales/it/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "Sei sicuro di voler eliminare questo profilo di configurazione?",
 		"delete_custom_mode_with_rules": "Sei sicuro di voler eliminare questa modalità {scope}?\n\nQuesto eliminerà anche la cartella delle regole associata in:\n{rulesFolderPath}",
 		"delete_message": "Cosa desideri eliminare?",
-		"edit_message": "Eliminare tutti i messaggi dopo questo?",
+		"edit_warning": "Modificare questo messaggio eliminerà tutti i messaggi successivi nella conversazione. Vuoi continuare?",
 		"delete_just_this_message": "Solo questo messaggio",
-		"edit_just_this_message": "No, modifica solo questo",
 		"delete_this_and_subsequent": "Questo e tutti i messaggi successivi",
-		"edit_this_and_delete_subsequent": "Sì"
+		"proceed": "Continua"
 	},
 	"errors": {
 		"invalid_data_uri": "Formato URI dati non valido",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Sì",
 		"no": "No",
-		"cancel": "Annulla",
 		"remove": "Rimuovi",
 		"keep": "Mantieni"
 	},
 	"buttons": {
 		"save": "Salva",
-		"cancel": "Annulla",
 		"edit": "Modifica"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Elimina Modalità Personalizzata",
 			"description": "Sei sicuro di voler eliminare questa modalità {{scope}}? Questo eliminerà anche la cartella delle regole associata a: {{rulesFolderPath}}",
 			"descriptionNoRules": "Sei sicuro di voler eliminare questa modalità personalizzata?",
-			"cancel": "Annulla",
 			"confirm": "Elimina"
 		}
 	}

+ 2 - 6
src/i18n/locales/ja/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "この設定プロファイルを削除してもよろしいですか?",
 		"delete_custom_mode_with_rules": "この{scope}モードを削除してもよろしいですか?\n\nこれにより、関連するルールフォルダも次の場所で削除されます:\n{rulesFolderPath}",
 		"delete_message": "何を削除しますか?",
-		"edit_message": "これ以降のメッセージをすべて削除しますか?",
+		"edit_warning": "このメッセージを編集すると、会話内のすべての後続メッセージが削除されます。続行しますか?",
 		"delete_just_this_message": "このメッセージのみ",
-		"edit_just_this_message": "いいえ、これだけを編集",
 		"delete_this_and_subsequent": "これ以降のすべてのメッセージ",
-		"edit_this_and_delete_subsequent": "はい"
+		"proceed": "続行"
 	},
 	"errors": {
 		"invalid_data_uri": "データURIフォーマットが無効です",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "はい",
 		"no": "いいえ",
-		"cancel": "キャンセル",
 		"remove": "削除",
 		"keep": "保持"
 	},
 	"buttons": {
 		"save": "保存",
-		"cancel": "キャンセル",
 		"edit": "編集"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "カスタムモードの削除",
 			"description": "この{{scope}}モードを削除してもよろしいですか?これにより、関連するルールフォルダーも{{rulesFolderPath}}で削除されます",
 			"descriptionNoRules": "このカスタムモードを削除してもよろしいですか?",
-			"cancel": "キャンセル",
 			"confirm": "削除"
 		}
 	}

+ 2 - 6
src/i18n/locales/ko/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "이 구성 프로필을 삭제하시겠습니까?",
 		"delete_custom_mode_with_rules": "이 {scope} 모드를 삭제하시겠습니까?\n\n이렇게 하면 연결된 규칙 폴더도 다음 위치에서 삭제됩니다:\n{rulesFolderPath}",
 		"delete_message": "무엇을 삭제하시겠습니까?",
-		"edit_message": "이 메시지 이후의 모든 메시지를 삭제하시겠습니까?",
+		"edit_warning": "이 메시지를 편집하면 대화의 모든 후속 메시지가 삭제됩니다. 계속하시겠습니까?",
 		"delete_just_this_message": "이 메시지만",
-		"edit_just_this_message": "아니요, 이것만 편집",
 		"delete_this_and_subsequent": "이 메시지와 모든 후속 메시지",
-		"edit_this_and_delete_subsequent": "예"
+		"proceed": "계속"
 	},
 	"errors": {
 		"invalid_data_uri": "잘못된 데이터 URI 형식",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "예",
 		"no": "아니오",
-		"cancel": "취소",
 		"remove": "제거",
 		"keep": "유지"
 	},
 	"buttons": {
 		"save": "저장",
-		"cancel": "취소",
 		"edit": "편집"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "사용자 정의 모드 삭제",
 			"description": "이 {{scope}} 모드를 삭제하시겠습니까? 이렇게 하면 {{rulesFolderPath}}의 관련 규칙 폴더도 삭제됩니다.",
 			"descriptionNoRules": "이 사용자 정의 모드를 삭제하시겠습니까?",
-			"cancel": "취소",
 			"confirm": "삭제"
 		}
 	}

+ 2 - 6
src/i18n/locales/nl/common.json

@@ -21,9 +21,8 @@
 		"delete_message": "Wat wil je verwijderen?",
 		"delete_just_this_message": "Alleen dit bericht",
 		"delete_this_and_subsequent": "Dit en alle volgende berichten",
-		"edit_message": "Alle berichten na dit bericht verwijderen?",
-		"edit_just_this_message": "Nee, alleen dit bericht bewerken",
-		"edit_this_and_delete_subsequent": "Ja"
+		"edit_warning": "Het bewerken van dit bericht zal alle volgende berichten in het gesprek verwijderen. Wil je doorgaan?",
+		"proceed": "Doorgaan"
 	},
 	"errors": {
 		"invalid_data_uri": "Ongeldig data-URI-formaat",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Ja",
 		"no": "Nee",
-		"cancel": "Annuleren",
 		"remove": "Verwijderen",
 		"keep": "Behouden"
 	},
 	"buttons": {
 		"save": "Opslaan",
-		"cancel": "Annuleren",
 		"edit": "Bewerken"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Aangepaste modus verwijderen",
 			"description": "Weet je zeker dat je deze {{scope}}-modus wilt verwijderen? Dit zal ook de bijbehorende regelsmap op {{rulesFolderPath}} verwijderen",
 			"descriptionNoRules": "Weet je zeker dat je deze aangepaste modus wilt verwijderen?",
-			"cancel": "Annuleren",
 			"confirm": "Verwijderen"
 		}
 	}

+ 2 - 6
src/i18n/locales/pl/common.json

@@ -21,9 +21,8 @@
 		"delete_message": "Co chcesz usunąć?",
 		"delete_just_this_message": "Tylko tę wiadomość",
 		"delete_this_and_subsequent": "Tę i wszystkie kolejne wiadomości",
-		"edit_message": "Usunąć wszystkie wiadomości po tej?",
-		"edit_just_this_message": "Nie, tylko edytuj tę wiadomość",
-		"edit_this_and_delete_subsequent": "Tak"
+		"edit_warning": "Edytowanie tej wiadomości usunie wszystkie kolejne wiadomości w rozmowie. Czy chcesz kontynuować?",
+		"proceed": "Kontynuuj"
 	},
 	"errors": {
 		"invalid_data_uri": "Nieprawidłowy format URI danych",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Tak",
 		"no": "Nie",
-		"cancel": "Anuluj",
 		"remove": "Usuń",
 		"keep": "Zachowaj"
 	},
 	"buttons": {
 		"save": "Zapisz",
-		"cancel": "Anuluj",
 		"edit": "Edytuj"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Usuń tryb niestandardowy",
 			"description": "Czy na pewno chcesz usunąć ten tryb {{scope}}? Spowoduje to również usunięcie powiązanego folderu z regułami w {{rulesFolderPath}}",
 			"descriptionNoRules": "Czy na pewno chcesz usunąć ten tryb niestandardowy?",
-			"cancel": "Anuluj",
 			"confirm": "Usuń"
 		}
 	}

+ 2 - 6
src/i18n/locales/pt-BR/common.json

@@ -25,9 +25,8 @@
 		"delete_message": "O que você gostaria de excluir?",
 		"delete_just_this_message": "Apenas esta mensagem",
 		"delete_this_and_subsequent": "Esta e todas as mensagens subsequentes",
-		"edit_message": "Excluir todas as mensagens após esta?",
-		"edit_just_this_message": "Não, apenas editar esta",
-		"edit_this_and_delete_subsequent": "Sim"
+		"edit_warning": "Editar esta mensagem excluirá todas as mensagens subsequentes na conversa. Deseja continuar?",
+		"proceed": "Continuar"
 	},
 	"errors": {
 		"invalid_data_uri": "Formato de URI de dados inválido",
@@ -111,13 +110,11 @@
 	"answers": {
 		"yes": "Sim",
 		"no": "Não",
-		"cancel": "Cancelar",
 		"remove": "Remover",
 		"keep": "Manter"
 	},
 	"buttons": {
 		"save": "Salvar",
-		"cancel": "Cancelar",
 		"edit": "Editar"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Excluir Modo Personalizado",
 			"description": "Tem certeza de que deseja excluir este modo {{scope}}? Isso também excluirá a pasta de regras associada em: {{rulesFolderPath}}",
 			"descriptionNoRules": "Tem certeza de que deseja excluir este modo personalizado?",
-			"cancel": "Cancelar",
 			"confirm": "Excluir"
 		}
 	}

+ 2 - 6
src/i18n/locales/ru/common.json

@@ -21,9 +21,8 @@
 		"delete_message": "Что вы хотите удалить?",
 		"delete_just_this_message": "Только это сообщение",
 		"delete_this_and_subsequent": "Это и все последующие сообщения",
-		"edit_message": "Удалить все сообщения после этого?",
-		"edit_just_this_message": "Нет, только редактировать это",
-		"edit_this_and_delete_subsequent": "Да"
+		"edit_warning": "Редактирование этого сообщения удалит все последующие сообщения в разговоре. Хотите продолжить?",
+		"proceed": "Продолжить"
 	},
 	"errors": {
 		"invalid_data_uri": "Неверный формат URI данных",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Да",
 		"no": "Нет",
-		"cancel": "Отмена",
 		"remove": "Удалить",
 		"keep": "Оставить"
 	},
 	"buttons": {
 		"save": "Сохранить",
-		"cancel": "Отмена",
 		"edit": "Редактировать"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Удалить пользовательский режим",
 			"description": "Вы уверены, что хотите удалить этот режим {{scope}}? Это также удалит связанную папку правил по адресу: {{rulesFolderPath}}",
 			"descriptionNoRules": "Вы уверены, что хотите удалить этот пользовательский режим?",
-			"cancel": "Отмена",
 			"confirm": "Удалить"
 		}
 	}

+ 2 - 6
src/i18n/locales/tr/common.json

@@ -21,9 +21,8 @@
 		"delete_message": "Neyi silmek istersiniz?",
 		"delete_just_this_message": "Sadece bu mesajı",
 		"delete_this_and_subsequent": "Bu ve sonraki tüm mesajları",
-		"edit_message": "Bu mesajdan sonraki tüm mesajlar silinsin mi?",
-		"edit_just_this_message": "Hayır, sadece bunu düzenle",
-		"edit_this_and_delete_subsequent": "Evet"
+		"edit_warning": "Bu mesajı düzenlemek konuşmadaki tüm sonraki mesajları silecektir. Devam etmek istiyor musunuz?",
+		"proceed": "Devam et"
 	},
 	"errors": {
 		"invalid_data_uri": "Geçersiz veri URI formatı",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Evet",
 		"no": "Hayır",
-		"cancel": "İptal",
 		"remove": "Kaldır",
 		"keep": "Koru"
 	},
 	"buttons": {
 		"save": "Kaydet",
-		"cancel": "İptal",
 		"edit": "Düzenle"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "Özel Modu Sil",
 			"description": "Bu {{scope}} modunu silmek istediğinizden emin misiniz? Bu, {{rulesFolderPath}} adresindeki ilişkili kurallar klasörünü de silecektir",
 			"descriptionNoRules": "Bu özel modu silmek istediğinizden emin misiniz?",
-			"cancel": "İptal",
 			"confirm": "Sil"
 		}
 	}

+ 2 - 6
src/i18n/locales/vi/common.json

@@ -21,9 +21,8 @@
 		"delete_message": "Bạn muốn xóa gì?",
 		"delete_just_this_message": "Chỉ tin nhắn này",
 		"delete_this_and_subsequent": "Tin nhắn này và tất cả tin nhắn tiếp theo",
-		"edit_message": "Xóa tất cả tin nhắn sau tin nhắn này?",
-		"edit_just_this_message": "Không, chỉ chỉnh sửa tin nhắn này",
-		"edit_this_and_delete_subsequent": "Có"
+		"edit_warning": "Chỉnh sửa tin nhắn này sẽ xóa tất cả tin nhắn tiếp theo trong cuộc trò chuyện. Bạn có muốn tiếp tục không?",
+		"proceed": "Tiếp tục"
 	},
 	"errors": {
 		"invalid_data_uri": "Định dạng URI dữ liệu không hợp lệ",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "Có",
 		"no": "Không",
-		"cancel": "Hủy",
 		"remove": "Xóa",
 		"keep": "Giữ"
 	},
 	"buttons": {
 		"save": "Lưu",
-		"cancel": "Hủy",
 		"edit": "Chỉnh sửa"
 	},
 	"tasks": {
@@ -178,7 +175,6 @@
 				"deleteConfirmation": "Chắc chắn xóa chế độ này?"
 			},
 			"descriptionNoRules": "Bạn có chắc chắn muốn xóa chế độ tùy chỉnh này không?",
-			"cancel": "Hủy",
 			"confirm": "Xóa"
 		}
 	}

+ 2 - 6
src/i18n/locales/zh-CN/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "您确定要删除此配置文件吗?",
 		"delete_custom_mode_with_rules": "您确定要删除此 {scope} 模式吗?\n\n这也将删除位于以下位置的关联规则文件夹:\n{rulesFolderPath}",
 		"delete_message": "您想删除什么?",
-		"edit_message": "删除此消息后的所有消息?",
+		"edit_warning": "编辑此消息将删除对话中的所有后续消息。您要继续吗?",
 		"delete_just_this_message": "仅此消息",
-		"edit_just_this_message": "不,仅编辑此消息",
 		"delete_this_and_subsequent": "此消息及所有后续消息",
-		"edit_this_and_delete_subsequent": "是"
+		"proceed": "继续"
 	},
 	"errors": {
 		"invalid_mcp_config": "项目MCP配置格式无效",
@@ -112,13 +111,11 @@
 	"answers": {
 		"yes": "是",
 		"no": "否",
-		"cancel": "取消",
 		"remove": "删除",
 		"keep": "保留"
 	},
 	"buttons": {
 		"save": "保存",
-		"cancel": "取消",
 		"edit": "编辑"
 	},
 	"tasks": {
@@ -176,7 +173,6 @@
 			"title": "删除自定义模式",
 			"description": "您确定要删除此 {{scope}} 模式吗?这也将删除位于 {{rulesFolderPath}} 的关联规则文件夹",
 			"descriptionNoRules": "您确定要删除此自定义模式吗?",
-			"cancel": "取消",
 			"confirm": "删除"
 		}
 	}

+ 2 - 6
src/i18n/locales/zh-TW/common.json

@@ -19,11 +19,10 @@
 		"delete_config_profile": "您確定要刪除此設定檔案嗎?",
 		"delete_custom_mode_with_rules": "您確定要刪除此 {scope} 模式嗎?\n\n這也將刪除位於以下位置的關聯規則資料夾:\n{rulesFolderPath}",
 		"delete_message": "您想刪除哪些內容?",
-		"edit_message": "刪除此訊息後的所有訊息?",
+		"edit_warning": "編輯此訊息將刪除對話中的所有後續訊息。您要繼續嗎?",
 		"delete_just_this_message": "僅這則訊息",
-		"edit_just_this_message": "否,僅編輯此訊息",
 		"delete_this_and_subsequent": "這則訊息及所有後續訊息",
-		"edit_this_and_delete_subsequent": "是"
+		"proceed": "繼續"
 	},
 	"errors": {
 		"invalid_data_uri": "資料 URI 格式無效",
@@ -107,13 +106,11 @@
 	"answers": {
 		"yes": "是",
 		"no": "否",
-		"cancel": "取消",
 		"remove": "刪除",
 		"keep": "保留"
 	},
 	"buttons": {
 		"save": "儲存",
-		"cancel": "取消",
 		"edit": "編輯"
 	},
 	"tasks": {
@@ -171,7 +168,6 @@
 			"title": "刪除自訂模式",
 			"description": "您確定要刪除此 {{scope}} 模式嗎?這也將刪除位於 {{rulesFolderPath}} 的關聯規則資料夾",
 			"descriptionNoRules": "您確定要刪除此自訂模式嗎?",
-			"cancel": "取消",
 			"confirm": "刪除"
 		}
 	}