Add default task names for empty tasks (#5071)

Co-authored-by: kiwina <kiwina@users.noreply.github.com>
This commit is contained in:
Daniel 2025-06-24 10:35:45 -05:00 committed by GitHub
parent 954825afb7
commit 03052f827b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 103 additions and 32 deletions

View file

@ -8,6 +8,7 @@ import { combineCommandSequences } from "../../shared/combineCommandSequences"
import { getApiMetrics } from "../../shared/getApiMetrics"
import { findLastIndex } from "../../shared/array"
import { getTaskDirectoryPath } from "../../utils/storage"
import { t } from "../../i18n"
const taskSizeCache = new NodeCache({ stdTTL: 30, checkperiod: 5 * 60 })
@ -27,29 +28,63 @@ export async function taskMetadata({
workspace,
}: TaskMetadataOptions) {
const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId)
const taskMessage = messages[0] // First message is always the task say.
const lastRelevantMessage =
messages[findLastIndex(messages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"))]
// Determine message availability upfront
const hasMessages = messages && messages.length > 0
let taskDirSize = taskSizeCache.get<number>(taskDir)
// Pre-calculate all values based on availability
let timestamp: number
let tokenUsage: ReturnType<typeof getApiMetrics>
let taskDirSize: number
let taskMessage: ClineMessage | undefined
if (taskDirSize === undefined) {
try {
taskDirSize = await getFolderSize.loose(taskDir)
taskSizeCache.set<number>(taskDir, taskDirSize)
} catch (error) {
taskDirSize = 0
if (!hasMessages) {
// Handle no messages case
timestamp = Date.now()
tokenUsage = {
totalTokensIn: 0,
totalTokensOut: 0,
totalCacheWrites: 0,
totalCacheReads: 0,
totalCost: 0,
contextTokens: 0,
}
taskDirSize = 0
} else {
// Handle messages case
taskMessage = messages[0] // First message is always the task say.
const lastRelevantMessage =
messages[findLastIndex(messages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"))] ||
taskMessage
timestamp = lastRelevantMessage.ts
tokenUsage = getApiMetrics(combineApiRequests(combineCommandSequences(messages.slice(1))))
// Get task directory size
const cachedSize = taskSizeCache.get<number>(taskDir)
if (cachedSize === undefined) {
try {
taskDirSize = await getFolderSize.loose(taskDir)
taskSizeCache.set<number>(taskDir, taskDirSize)
} catch (error) {
taskDirSize = 0
}
} else {
taskDirSize = cachedSize
}
}
const tokenUsage = getApiMetrics(combineApiRequests(combineCommandSequences(messages.slice(1))))
// Create historyItem once with pre-calculated values
const historyItem: HistoryItem = {
id: taskId,
number: taskNumber,
ts: lastRelevantMessage.ts,
task: taskMessage.text ?? "",
ts: timestamp,
task: hasMessages
? taskMessage!.text?.trim() || t("common:tasks.incomplete", { taskNumber })
: t("common:tasks.no_messages", { taskNumber }),
tokensIn: tokenUsage.totalTokensIn,
tokensOut: tokenUsage.totalTokensOut,
cacheWrites: tokenUsage.totalCacheWrites,

View file

@ -101,7 +101,9 @@
},
"tasks": {
"canceled": "Error de tasca: Ha estat aturada i cancel·lada per l'usuari.",
"deleted": "Fallada de tasca: Ha estat aturada i eliminada per l'usuari."
"deleted": "Fallada de tasca: Ha estat aturada i eliminada per l'usuari.",
"incomplete": "Tasca #{{taskNumber}} (Incompleta)",
"no_messages": "Tasca #{{taskNumber}} (Sense missatges)"
},
"storage": {
"prompt_custom_path": "Introdueix una ruta d'emmagatzematge personalitzada per a l'historial de converses o deixa-ho buit per utilitzar la ubicació predeterminada",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und abgebrochen.",
"deleted": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und gelöscht."
"deleted": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und gelöscht.",
"incomplete": "Aufgabe #{{taskNumber}} (Unvollständig)",
"no_messages": "Aufgabe #{{taskNumber}} (Keine Nachrichten)"
},
"storage": {
"prompt_custom_path": "Gib den benutzerdefinierten Speicherpfad für den Gesprächsverlauf ein, leer lassen für Standardspeicherort",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Task error: It was stopped and canceled by the user.",
"deleted": "Task failure: It was stopped and deleted by the user."
"deleted": "Task failure: It was stopped and deleted by the user.",
"incomplete": "Task #{{taskNumber}} (Incomplete)",
"no_messages": "Task #{{taskNumber}} (No messages)"
},
"storage": {
"prompt_custom_path": "Enter custom conversation history storage path, leave empty to use default location",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Error de tarea: Fue detenida y cancelada por el usuario.",
"deleted": "Fallo de tarea: Fue detenida y eliminada por el usuario."
"deleted": "Fallo de tarea: Fue detenida y eliminada por el usuario.",
"incomplete": "Tarea #{{taskNumber}} (Incompleta)",
"no_messages": "Tarea #{{taskNumber}} (Sin mensajes)"
},
"storage": {
"prompt_custom_path": "Ingresa la ruta de almacenamiento personalizada para el historial de conversaciones, déjala vacía para usar la ubicación predeterminada",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Erreur de tâche : Elle a été arrêtée et annulée par l'utilisateur.",
"deleted": "Échec de la tâche : Elle a été arrêtée et supprimée par l'utilisateur."
"deleted": "Échec de la tâche : Elle a été arrêtée et supprimée par l'utilisateur.",
"incomplete": "Tâche #{{taskNumber}} (Incomplète)",
"no_messages": "Tâche #{{taskNumber}} (Aucun message)"
},
"storage": {
"prompt_custom_path": "Entrez le chemin de stockage personnalisé pour l'historique des conversations, laissez vide pour utiliser l'emplacement par défaut",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "टास्क त्रुटि: इसे उपयोगकर्ता द्वारा रोका और रद्द किया गया था।",
"deleted": "टास्क विफलता: इसे उपयोगकर्ता द्वारा रोका और हटाया गया था।"
"deleted": "टास्क विफलता: इसे उपयोगकर्ता द्वारा रोका और हटाया गया था।",
"incomplete": "टास्क #{{taskNumber}} (अधूरा)",
"no_messages": "टास्क #{{taskNumber}} (कोई संदेश नहीं)"
},
"storage": {
"prompt_custom_path": "वार्तालाप इतिहास के लिए कस्टम स्टोरेज पाथ दर्ज करें, डिफ़ॉल्ट स्थान का उपयोग करने के लिए खाली छोड़ दें",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Error tugas: Dihentikan dan dibatalkan oleh pengguna.",
"deleted": "Kegagalan tugas: Dihentikan dan dihapus oleh pengguna."
"deleted": "Kegagalan tugas: Dihentikan dan dihapus oleh pengguna.",
"incomplete": "Tugas #{{taskNumber}} (Tidak lengkap)",
"no_messages": "Tugas #{{taskNumber}} (Tidak ada pesan)"
},
"storage": {
"prompt_custom_path": "Masukkan path penyimpanan riwayat percakapan kustom, biarkan kosong untuk menggunakan lokasi default",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Errore attività: È stata interrotta e annullata dall'utente.",
"deleted": "Fallimento attività: È stata interrotta ed eliminata dall'utente."
"deleted": "Fallimento attività: È stata interrotta ed eliminata dall'utente.",
"incomplete": "Attività #{{taskNumber}} (Incompleta)",
"no_messages": "Attività #{{taskNumber}} (Nessun messaggio)"
},
"storage": {
"prompt_custom_path": "Inserisci il percorso di archiviazione personalizzato per la cronologia delle conversazioni, lascia vuoto per utilizzare la posizione predefinita",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "タスクエラー:ユーザーによって停止およびキャンセルされました。",
"deleted": "タスク失敗:ユーザーによって停止および削除されました。"
"deleted": "タスク失敗:ユーザーによって停止および削除されました。",
"incomplete": "タスク #{{taskNumber}} (未完了)",
"no_messages": "タスク #{{taskNumber}} (メッセージなし)"
},
"storage": {
"prompt_custom_path": "会話履歴のカスタムストレージパスを入力してください。デフォルトの場所を使用する場合は空のままにしてください",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "작업 오류: 사용자에 의해 중지 및 취소되었습니다.",
"deleted": "작업 실패: 사용자에 의해 중지 및 삭제되었습니다."
"deleted": "작업 실패: 사용자에 의해 중지 및 삭제되었습니다.",
"incomplete": "작업 #{{taskNumber}} (미완료)",
"no_messages": "작업 #{{taskNumber}} (메시지 없음)"
},
"storage": {
"prompt_custom_path": "대화 내역을 위한 사용자 지정 저장 경로를 입력하세요. 기본 위치를 사용하려면 비워두세요",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Taakfout: gestopt en geannuleerd door gebruiker.",
"deleted": "Taakfout: gestopt en verwijderd door gebruiker."
"deleted": "Taakfout: gestopt en verwijderd door gebruiker.",
"incomplete": "Taak #{{taskNumber}} (Onvolledig)",
"no_messages": "Taak #{{taskNumber}} (Geen berichten)"
},
"storage": {
"prompt_custom_path": "Voer een aangepast opslagpad voor gespreksgeschiedenis in, laat leeg voor standaardlocatie",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Błąd zadania: Zostało zatrzymane i anulowane przez użytkownika.",
"deleted": "Niepowodzenie zadania: Zostało zatrzymane i usunięte przez użytkownika."
"deleted": "Niepowodzenie zadania: Zostało zatrzymane i usunięte przez użytkownika.",
"incomplete": "Zadanie #{{taskNumber}} (Niekompletne)",
"no_messages": "Zadanie #{{taskNumber}} (Brak wiadomości)"
},
"storage": {
"prompt_custom_path": "Wprowadź niestandardową ścieżkę przechowywania dla historii konwersacji lub pozostaw puste, aby użyć lokalizacji domyślnej",

View file

@ -101,7 +101,9 @@
},
"tasks": {
"canceled": "Erro na tarefa: Foi interrompida e cancelada pelo usuário.",
"deleted": "Falha na tarefa: Foi interrompida e excluída pelo usuário."
"deleted": "Falha na tarefa: Foi interrompida e excluída pelo usuário.",
"incomplete": "Tarefa #{{taskNumber}} (Incompleta)",
"no_messages": "Tarefa #{{taskNumber}} (Sem mensagens)"
},
"storage": {
"prompt_custom_path": "Digite o caminho de armazenamento personalizado para o histórico de conversas, deixe em branco para usar o local padrão",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Ошибка задачи: Она была остановлена и отменена пользователем.",
"deleted": "Сбой задачи: Она была остановлена и удалена пользователем."
"deleted": "Сбой задачи: Она была остановлена и удалена пользователем.",
"incomplete": "Задача #{{taskNumber}} (Незавершенная)",
"no_messages": "Задача #{{taskNumber}} (Нет сообщений)"
},
"storage": {
"prompt_custom_path": "Введите пользовательский путь хранения истории разговоров, оставьте пустым для использования расположения по умолчанию",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Görev hatası: Kullanıcı tarafından durduruldu ve iptal edildi.",
"deleted": "Görev başarısız: Kullanıcı tarafından durduruldu ve silindi."
"deleted": "Görev başarısız: Kullanıcı tarafından durduruldu ve silindi.",
"incomplete": "Görev #{{taskNumber}} (Tamamlanmamış)",
"no_messages": "Görev #{{taskNumber}} (Mesaj yok)"
},
"storage": {
"prompt_custom_path": "Konuşma geçmişi için özel depolama yolunu girin, varsayılan konumu kullanmak için boş bırakın",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "Lỗi nhiệm vụ: Nó đã bị dừng và hủy bởi người dùng.",
"deleted": "Nhiệm vụ thất bại: Nó đã bị dừng và xóa bởi người dùng."
"deleted": "Nhiệm vụ thất bại: Nó đã bị dừng và xóa bởi người dùng.",
"incomplete": "Nhiệm vụ #{{taskNumber}} (Chưa hoàn thành)",
"no_messages": "Nhiệm vụ #{{taskNumber}} (Không có tin nhắn)"
},
"storage": {
"prompt_custom_path": "Nhập đường dẫn lưu trữ tùy chỉnh cho lịch sử hội thoại, để trống để sử dụng vị trí mặc định",

View file

@ -102,7 +102,9 @@
},
"tasks": {
"canceled": "任务错误:它已被用户停止并取消。",
"deleted": "任务失败:它已被用户停止并删除。"
"deleted": "任务失败:它已被用户停止并删除。",
"incomplete": "任务 #{{taskNumber}} (未完成)",
"no_messages": "任务 #{{taskNumber}} (无消息)"
},
"storage": {
"prompt_custom_path": "输入自定义会话历史存储路径,留空以使用默认位置",

View file

@ -97,7 +97,9 @@
},
"tasks": {
"canceled": "工作錯誤:它已被使用者停止並取消。",
"deleted": "工作失敗:它已被使用者停止並刪除。"
"deleted": "工作失敗:它已被使用者停止並刪除。",
"incomplete": "工作 #{{taskNumber}} (未完成)",
"no_messages": "工作 #{{taskNumber}} (無訊息)"
},
"storage": {
"prompt_custom_path": "輸入自訂會話歷史儲存路徑,留空以使用預設位置",