diff --git a/app/src/lib/i18n/ar.ts b/app/src/lib/i18n/ar.ts index b89e553db..0f44a0a31 100644 --- a/app/src/lib/i18n/ar.ts +++ b/app/src/lib/i18n/ar.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'أُلغيت', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2817,10 +2818,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'يعمل…', 'conversations.subagent.noOutputYet': 'لا يوجد ناتج بعد', 'conversations.subagent.close': 'إغلاق', + 'conversations.subagent.cancel': 'إلغاء المهمة', + 'conversations.subagent.cancelling': 'جارٍ الإلغاء…', + 'conversations.subagent.cancelFailed': 'تعذّر إلغاء المهمة. حاول مرة أخرى.', 'conversations.subagent.statusRunning': 'قيد التشغيل', 'conversations.subagent.statusCompleted': 'اكتمل', 'conversations.subagent.statusFailed': 'فشل', 'conversations.subagent.statusAwaitingUser': 'في انتظار المستخدم', + 'conversations.subagent.statusCancelled': 'أُلغيت', 'conversations.agentTaskInsights.title': 'رؤى مهام الوكيل', 'conversations.agentTaskInsights.processSourceTitle': 'مصدر عملية الوكيل', 'conversations.agentTaskInsights.stepsHeading': 'الخطوات', diff --git a/app/src/lib/i18n/bn.ts b/app/src/lib/i18n/bn.ts index f8e165fb6..ec9a54bf5 100644 --- a/app/src/lib/i18n/bn.ts +++ b/app/src/lib/i18n/bn.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'বাতিল হয়েছে', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2876,10 +2877,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'কাজ করছে…', 'conversations.subagent.noOutputYet': 'এখনও কোনো আউটপুট নেই', 'conversations.subagent.close': 'বন্ধ করুন', + 'conversations.subagent.cancel': 'কাজ বাতিল করুন', + 'conversations.subagent.cancelling': 'বাতিল করা হচ্ছে…', + 'conversations.subagent.cancelFailed': 'কাজটি বাতিল করা যায়নি। আবার চেষ্টা করুন।', 'conversations.subagent.statusRunning': 'চলছে', 'conversations.subagent.statusCompleted': 'সম্পন্ন', 'conversations.subagent.statusFailed': 'ব্যর্থ', 'conversations.subagent.statusAwaitingUser': 'ব্যবহারকারীর অপেক্ষায়', + 'conversations.subagent.statusCancelled': 'বাতিল হয়েছে', 'conversations.agentTaskInsights.title': 'এজেন্ট টাস্ক অন্তর্দৃষ্টি', 'conversations.agentTaskInsights.processSourceTitle': 'এজেন্ট প্রক্রিয়া উৎস', 'conversations.agentTaskInsights.stepsHeading': 'ধাপসমূহ', diff --git a/app/src/lib/i18n/de.ts b/app/src/lib/i18n/de.ts index 8526ec023..ca55e154a 100644 --- a/app/src/lib/i18n/de.ts +++ b/app/src/lib/i18n/de.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Abgebrochen', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2946,10 +2947,15 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'Arbeitet…', 'conversations.subagent.noOutputYet': 'Noch keine Ausgabe', 'conversations.subagent.close': 'Schließen', + 'conversations.subagent.cancel': 'Aufgabe abbrechen', + 'conversations.subagent.cancelling': 'Wird abgebrochen…', + 'conversations.subagent.cancelFailed': + 'Aufgabe konnte nicht abgebrochen werden. Bitte erneut versuchen.', 'conversations.subagent.statusRunning': 'läuft', 'conversations.subagent.statusCompleted': 'abgeschlossen', 'conversations.subagent.statusFailed': 'fehlgeschlagen', 'conversations.subagent.statusAwaitingUser': 'warte auf Benutzer', + 'conversations.subagent.statusCancelled': 'abgebrochen', 'conversations.agentTaskInsights.title': 'Agenten-Aufgabeneinblicke', 'conversations.agentTaskInsights.processSourceTitle': 'Agentenprozess-Quelle', 'conversations.agentTaskInsights.stepsHeading': 'Schritte', diff --git a/app/src/lib/i18n/en.ts b/app/src/lib/i18n/en.ts index 52baba9f5..07b1d6b33 100644 --- a/app/src/lib/i18n/en.ts +++ b/app/src/lib/i18n/en.ts @@ -3399,6 +3399,9 @@ const en: TranslationMap = { 'conversations.subagent.working': 'Working…', 'conversations.subagent.noOutputYet': 'No output yet', 'conversations.subagent.close': 'Close', + 'conversations.subagent.cancel': 'Cancel task', + 'conversations.subagent.cancelling': 'Cancelling…', + 'conversations.subagent.cancelFailed': "Couldn't cancel the task. Try again.", 'conversations.backgroundTasks.title': 'Background tasks', 'conversations.backgroundTasks.titleWithCount': 'Background tasks ({count})', 'conversations.backgroundTasks.running': '{count} running', @@ -3410,6 +3413,7 @@ const en: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Cancelled', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -3419,6 +3423,7 @@ const en: TranslationMap = { 'conversations.subagent.statusCompleted': 'completed', 'conversations.subagent.statusFailed': 'failed', 'conversations.subagent.statusAwaitingUser': 'awaiting user', + 'conversations.subagent.statusCancelled': 'cancelled', 'conversations.agentTaskInsights.title': 'Agentic task insights', 'conversations.agentTaskInsights.processSourceTitle': 'Agent Process Source', 'conversations.agentTaskInsights.stepsHeading': 'Steps', diff --git a/app/src/lib/i18n/es.ts b/app/src/lib/i18n/es.ts index ff6c56c38..fb54de0b7 100644 --- a/app/src/lib/i18n/es.ts +++ b/app/src/lib/i18n/es.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Cancelado', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2926,10 +2927,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'Trabajando…', 'conversations.subagent.noOutputYet': 'Aún no hay resultados', 'conversations.subagent.close': 'Cerrar', + 'conversations.subagent.cancel': 'Cancelar tarea', + 'conversations.subagent.cancelling': 'Cancelando…', + 'conversations.subagent.cancelFailed': 'No se pudo cancelar la tarea. Inténtalo de nuevo.', 'conversations.subagent.statusRunning': 'en ejecución', 'conversations.subagent.statusCompleted': 'completado', 'conversations.subagent.statusFailed': 'fallido', 'conversations.subagent.statusAwaitingUser': 'esperando al usuario', + 'conversations.subagent.statusCancelled': 'cancelado', 'conversations.agentTaskInsights.title': 'Información de tareas del agente', 'conversations.agentTaskInsights.processSourceTitle': 'Fuente del proceso del agente', 'conversations.agentTaskInsights.stepsHeading': 'Pasos', diff --git a/app/src/lib/i18n/fr.ts b/app/src/lib/i18n/fr.ts index 9684c92fc..111cb1e3d 100644 --- a/app/src/lib/i18n/fr.ts +++ b/app/src/lib/i18n/fr.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Annulé', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2941,10 +2942,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'En cours…', 'conversations.subagent.noOutputYet': 'Aucun résultat pour l’instant', 'conversations.subagent.close': 'Fermer', + 'conversations.subagent.cancel': 'Annuler la tâche', + 'conversations.subagent.cancelling': 'Annulation…', + 'conversations.subagent.cancelFailed': "Impossible d'annuler la tâche. Réessayez.", 'conversations.subagent.statusRunning': 'en cours', 'conversations.subagent.statusCompleted': 'terminé', 'conversations.subagent.statusFailed': 'échoué', 'conversations.subagent.statusAwaitingUser': "en attente de l'utilisateur", + 'conversations.subagent.statusCancelled': 'annulé', 'conversations.agentTaskInsights.title': "Aperçu des tâches de l'agent", 'conversations.agentTaskInsights.processSourceTitle': "Source du processus de l'agent", 'conversations.agentTaskInsights.stepsHeading': 'Étapes', diff --git a/app/src/lib/i18n/hi.ts b/app/src/lib/i18n/hi.ts index d55ef67df..b1eee3e76 100644 --- a/app/src/lib/i18n/hi.ts +++ b/app/src/lib/i18n/hi.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'रद्द किया गया', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2877,10 +2878,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'काम कर रहा है…', 'conversations.subagent.noOutputYet': 'अभी तक कोई आउटपुट नहीं', 'conversations.subagent.close': 'बंद करें', + 'conversations.subagent.cancel': 'कार्य रद्द करें', + 'conversations.subagent.cancelling': 'रद्द किया जा रहा है…', + 'conversations.subagent.cancelFailed': 'कार्य रद्द नहीं किया जा सका। पुनः प्रयास करें।', 'conversations.subagent.statusRunning': 'चल रहा है', 'conversations.subagent.statusCompleted': 'पूर्ण', 'conversations.subagent.statusFailed': 'विफल', 'conversations.subagent.statusAwaitingUser': 'उपयोगकर्ता की प्रतीक्षा', + 'conversations.subagent.statusCancelled': 'रद्द किया गया', 'conversations.agentTaskInsights.title': 'एजेंट कार्य अंतर्दृष्टि', 'conversations.agentTaskInsights.processSourceTitle': 'एजेंट प्रक्रिया स्रोत', 'conversations.agentTaskInsights.stepsHeading': 'चरण', diff --git a/app/src/lib/i18n/id.ts b/app/src/lib/i18n/id.ts index 9f69595d6..c15c09027 100644 --- a/app/src/lib/i18n/id.ts +++ b/app/src/lib/i18n/id.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Dibatalkan', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2881,10 +2882,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'Bekerja…', 'conversations.subagent.noOutputYet': 'Belum ada keluaran', 'conversations.subagent.close': 'Tutup', + 'conversations.subagent.cancel': 'Batalkan tugas', + 'conversations.subagent.cancelling': 'Membatalkan…', + 'conversations.subagent.cancelFailed': 'Tidak dapat membatalkan tugas. Coba lagi.', 'conversations.subagent.statusRunning': 'berjalan', 'conversations.subagent.statusCompleted': 'selesai', 'conversations.subagent.statusFailed': 'gagal', 'conversations.subagent.statusAwaitingUser': 'menunggu pengguna', + 'conversations.subagent.statusCancelled': 'dibatalkan', 'conversations.agentTaskInsights.title': 'Wawasan tugas agen', 'conversations.agentTaskInsights.processSourceTitle': 'Sumber proses agen', 'conversations.agentTaskInsights.stepsHeading': 'Langkah', diff --git a/app/src/lib/i18n/it.ts b/app/src/lib/i18n/it.ts index a43a6b540..78576f457 100644 --- a/app/src/lib/i18n/it.ts +++ b/app/src/lib/i18n/it.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Annullato', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2920,10 +2921,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'In corso…', 'conversations.subagent.noOutputYet': 'Ancora nessun output', 'conversations.subagent.close': 'Chiudi', + 'conversations.subagent.cancel': 'Annulla attività', + 'conversations.subagent.cancelling': 'Annullamento…', + 'conversations.subagent.cancelFailed': "Impossibile annullare l'attività. Riprova.", 'conversations.subagent.statusRunning': 'in esecuzione', 'conversations.subagent.statusCompleted': 'completato', 'conversations.subagent.statusFailed': 'non riuscito', 'conversations.subagent.statusAwaitingUser': "in attesa dell'utente", + 'conversations.subagent.statusCancelled': 'annullato', 'conversations.agentTaskInsights.title': 'Approfondimenti attività agente', 'conversations.agentTaskInsights.processSourceTitle': "Origine del processo dell'agente", 'conversations.agentTaskInsights.stepsHeading': 'Passaggi', diff --git a/app/src/lib/i18n/ko.ts b/app/src/lib/i18n/ko.ts index 0a37938fd..75ed6a3d7 100644 --- a/app/src/lib/i18n/ko.ts +++ b/app/src/lib/i18n/ko.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': '취소됨', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2852,10 +2853,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': '작업 중…', 'conversations.subagent.noOutputYet': '아직 출력이 없습니다', 'conversations.subagent.close': '닫기', + 'conversations.subagent.cancel': '작업 취소', + 'conversations.subagent.cancelling': '취소 중…', + 'conversations.subagent.cancelFailed': '작업을 취소할 수 없습니다. 다시 시도하세요.', 'conversations.subagent.statusRunning': '실행 중', 'conversations.subagent.statusCompleted': '완료됨', 'conversations.subagent.statusFailed': '실패', 'conversations.subagent.statusAwaitingUser': '사용자 대기 중', + 'conversations.subagent.statusCancelled': '취소됨', 'conversations.agentTaskInsights.title': '에이전트 작업 인사이트', 'conversations.agentTaskInsights.processSourceTitle': '에이전트 프로세스 소스', 'conversations.agentTaskInsights.stepsHeading': '단계', diff --git a/app/src/lib/i18n/pl.ts b/app/src/lib/i18n/pl.ts index 0b6f268ea..caedc854a 100644 --- a/app/src/lib/i18n/pl.ts +++ b/app/src/lib/i18n/pl.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Anulowano', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2909,10 +2910,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'Pracuje…', 'conversations.subagent.noOutputYet': 'Brak wyników', 'conversations.subagent.close': 'Zamknij', + 'conversations.subagent.cancel': 'Anuluj zadanie', + 'conversations.subagent.cancelling': 'Anulowanie…', + 'conversations.subagent.cancelFailed': 'Nie udało się anulować zadania. Spróbuj ponownie.', 'conversations.subagent.statusRunning': 'w toku', 'conversations.subagent.statusCompleted': 'zakończono', 'conversations.subagent.statusFailed': 'niepowodzenie', 'conversations.subagent.statusAwaitingUser': 'oczekiwanie na użytkownika', + 'conversations.subagent.statusCancelled': 'anulowano', 'conversations.agentTaskInsights.title': 'Wgląd w zadania agenta', 'conversations.agentTaskInsights.processSourceTitle': 'Źródło procesu agenta', 'conversations.agentTaskInsights.stepsHeading': 'Kroki', diff --git a/app/src/lib/i18n/pt.ts b/app/src/lib/i18n/pt.ts index ca1cd3867..75ca6e9b1 100644 --- a/app/src/lib/i18n/pt.ts +++ b/app/src/lib/i18n/pt.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Cancelado', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2926,10 +2927,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'Trabalhando…', 'conversations.subagent.noOutputYet': 'Ainda sem resultado', 'conversations.subagent.close': 'Fechar', + 'conversations.subagent.cancel': 'Cancelar tarefa', + 'conversations.subagent.cancelling': 'Cancelando…', + 'conversations.subagent.cancelFailed': 'Não foi possível cancelar a tarefa. Tente novamente.', 'conversations.subagent.statusRunning': 'em execução', 'conversations.subagent.statusCompleted': 'concluído', 'conversations.subagent.statusFailed': 'falhou', 'conversations.subagent.statusAwaitingUser': 'aguardando usuário', + 'conversations.subagent.statusCancelled': 'cancelado', 'conversations.agentTaskInsights.title': 'Insights de tarefas do agente', 'conversations.agentTaskInsights.processSourceTitle': 'Fonte do processo do agente', 'conversations.agentTaskInsights.stepsHeading': 'Etapas', diff --git a/app/src/lib/i18n/ru.ts b/app/src/lib/i18n/ru.ts index cecc5a68e..1a8ad84e4 100644 --- a/app/src/lib/i18n/ru.ts +++ b/app/src/lib/i18n/ru.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': 'Отменено', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2899,10 +2900,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': 'Выполняется…', 'conversations.subagent.noOutputYet': 'Пока нет результата', 'conversations.subagent.close': 'Закрыть', + 'conversations.subagent.cancel': 'Отменить задачу', + 'conversations.subagent.cancelling': 'Отмена…', + 'conversations.subagent.cancelFailed': 'Не удалось отменить задачу. Попробуйте снова.', 'conversations.subagent.statusRunning': 'выполняется', 'conversations.subagent.statusCompleted': 'завершено', 'conversations.subagent.statusFailed': 'ошибка', 'conversations.subagent.statusAwaitingUser': 'ожидание пользователя', + 'conversations.subagent.statusCancelled': 'отменено', 'conversations.agentTaskInsights.title': 'Сведения о задачах агента', 'conversations.agentTaskInsights.processSourceTitle': 'Источник процесса агента', 'conversations.agentTaskInsights.stepsHeading': 'Шаги', diff --git a/app/src/lib/i18n/zh-CN.ts b/app/src/lib/i18n/zh-CN.ts index 3b8d21de1..e51241e59 100644 --- a/app/src/lib/i18n/zh-CN.ts +++ b/app/src/lib/i18n/zh-CN.ts @@ -14,6 +14,7 @@ const messages: TranslationMap = { 'conversations.backgroundTasks.statusDone': 'Done', 'conversations.backgroundTasks.statusFailed': 'Failed', 'conversations.backgroundTasks.statusNeedsYou': 'Needs you', + 'conversations.backgroundTasks.statusCancelled': '已取消', 'conversations.backgroundTasks.toolCallOne': '{count} tool call', 'conversations.backgroundTasks.toolCallOther': '{count} tool calls', 'conversations.backgroundTasks.steps': '{count} steps', @@ -2737,10 +2738,14 @@ const messages: TranslationMap = { 'conversations.subagent.working': '处理中…', 'conversations.subagent.noOutputYet': '暂无输出', 'conversations.subagent.close': '关闭', + 'conversations.subagent.cancel': '取消任务', + 'conversations.subagent.cancelling': '正在取消…', + 'conversations.subagent.cancelFailed': '无法取消任务。请重试。', 'conversations.subagent.statusRunning': '运行中', 'conversations.subagent.statusCompleted': '已完成', 'conversations.subagent.statusFailed': '失败', 'conversations.subagent.statusAwaitingUser': '等待用户', + 'conversations.subagent.statusCancelled': '已取消', 'conversations.agentTaskInsights.title': '智能体任务洞察', 'conversations.agentTaskInsights.processSourceTitle': '智能体处理来源', 'conversations.agentTaskInsights.stepsHeading': '步骤', diff --git a/app/src/pages/Conversations.tsx b/app/src/pages/Conversations.tsx index dbcc2d9f1..3ae97c273 100644 --- a/app/src/pages/Conversations.tsx +++ b/app/src/pages/Conversations.tsx @@ -30,6 +30,7 @@ import { import { useT } from '../lib/i18n/I18nContext'; import { trackEvent } from '../services/analytics'; import { applyOpenRouterFreeModels } from '../services/api/openrouterFreeModels'; +import { subagentApi } from '../services/api/subagentApi'; import { threadApi } from '../services/api/threadApi'; import { chatCancel, chatSend, useRustChat } from '../services/chatService'; import { callCoreRpc } from '../services/coreRpcClient'; @@ -43,6 +44,7 @@ import { beginInferenceTurn, clearRuntimeForThread, fetchAndHydrateTurnState, + markSubagentCancelled, registerParallelRequest, setTaskBoardForThread, setToolTimelineForThread, @@ -2591,8 +2593,28 @@ const Conversations = ({ }} /> { + const taskId = openSubagentEntry.subagent!.taskId; + const result = await subagentApi.cancel(taskId); + // Only flip the row when something was actually aborted — a + // cancelled=false result means the run already finished/unknown, + // and overwriting its real terminal state would hide it. No + // terminal socket event arrives for an aborted run, so the + // optimistic mark is what surfaces the cancellation (the notice + // itself reaches chat via the idle-gated delivery path). + if (result.cancelled) { + dispatch( + markSubagentCancelled({ threadId: selectedThreadId, taskId: result.taskId }) + ); + } + } + : undefined + } onClose={() => setOpenSubagentTaskId(null)} /> Promise; onClose: () => void; }) { const { t } = useT(); + // Cancel-in-flight + last-error state for the "Cancel task" affordance. + // The parent keys this drawer by task id, so a different sub-agent remounts + // with fresh state — no effect-driven reset needed (which would trip the + // repo's `react-hooks/set-state-in-effect` rule). + const [cancelling, setCancelling] = useState(false); + const [cancelError, setCancelError] = useState(false); // Close on Escape for keyboard parity with the backdrop click. useEffect(() => { @@ -162,7 +188,25 @@ export function SubagentDrawer({ if (!subagent) return null; const tone = statusTone(status); - const isRunning = status !== 'success' && status !== 'error'; + const isRunning = status !== 'success' && status !== 'error' && status !== 'cancelled'; + // The "Cancel task" CTA is only meaningful for a live, still-running run the + // parent gave us a cancel handler for. + const canCancel = status === 'running' && Boolean(onCancel); + + const handleCancel = async () => { + if (!onCancel || cancelling) return; + setCancelling(true); + setCancelError(false); + try { + await onCancel(); + // Success: the parent flips the row to cancelled and the notice rides the + // idle-delivery path into chat — close the drawer. + onClose(); + } catch { + setCancelling(false); + setCancelError(true); + } + }; // Only trust the fetched transcript when it belongs to the current worker. const fetchedForCurrent = fetched && workerThreadId && fetched.workerThreadId === workerThreadId ? fetched : null; @@ -219,6 +263,18 @@ export function SubagentDrawer({ {subagent.mode ? {subagent.mode} : null} + {canCancel ? ( + + ) : null}