Skip to content

Commit 03052f8

Browse files
daniel-lxskiwina
andauthored
Add default task names for empty tasks (#5071)
Co-authored-by: kiwina <[email protected]>
1 parent 954825a commit 03052f8

File tree

19 files changed

+103
-32
lines changed

19 files changed

+103
-32
lines changed

src/core/task-persistence/taskMetadata.ts

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { combineCommandSequences } from "../../shared/combineCommandSequences"
88
import { getApiMetrics } from "../../shared/getApiMetrics"
99
import { findLastIndex } from "../../shared/array"
1010
import { getTaskDirectoryPath } from "../../utils/storage"
11+
import { t } from "../../i18n"
1112

1213
const taskSizeCache = new NodeCache({ stdTTL: 30, checkperiod: 5 * 60 })
1314

@@ -27,29 +28,63 @@ export async function taskMetadata({
2728
workspace,
2829
}: TaskMetadataOptions) {
2930
const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId)
30-
const taskMessage = messages[0] // First message is always the task say.
3131

32-
const lastRelevantMessage =
33-
messages[findLastIndex(messages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"))]
32+
// Determine message availability upfront
33+
const hasMessages = messages && messages.length > 0
3434

35-
let taskDirSize = taskSizeCache.get<number>(taskDir)
35+
// Pre-calculate all values based on availability
36+
let timestamp: number
37+
let tokenUsage: ReturnType<typeof getApiMetrics>
38+
let taskDirSize: number
39+
let taskMessage: ClineMessage | undefined
3640

37-
if (taskDirSize === undefined) {
38-
try {
39-
taskDirSize = await getFolderSize.loose(taskDir)
40-
taskSizeCache.set<number>(taskDir, taskDirSize)
41-
} catch (error) {
42-
taskDirSize = 0
41+
if (!hasMessages) {
42+
// Handle no messages case
43+
timestamp = Date.now()
44+
tokenUsage = {
45+
totalTokensIn: 0,
46+
totalTokensOut: 0,
47+
totalCacheWrites: 0,
48+
totalCacheReads: 0,
49+
totalCost: 0,
50+
contextTokens: 0,
4351
}
44-
}
52+
taskDirSize = 0
53+
} else {
54+
// Handle messages case
55+
taskMessage = messages[0] // First message is always the task say.
56+
57+
const lastRelevantMessage =
58+
messages[findLastIndex(messages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"))] ||
59+
taskMessage
60+
61+
timestamp = lastRelevantMessage.ts
62+
63+
tokenUsage = getApiMetrics(combineApiRequests(combineCommandSequences(messages.slice(1))))
4564

46-
const tokenUsage = getApiMetrics(combineApiRequests(combineCommandSequences(messages.slice(1))))
65+
// Get task directory size
66+
const cachedSize = taskSizeCache.get<number>(taskDir)
67+
68+
if (cachedSize === undefined) {
69+
try {
70+
taskDirSize = await getFolderSize.loose(taskDir)
71+
taskSizeCache.set<number>(taskDir, taskDirSize)
72+
} catch (error) {
73+
taskDirSize = 0
74+
}
75+
} else {
76+
taskDirSize = cachedSize
77+
}
78+
}
4779

80+
// Create historyItem once with pre-calculated values
4881
const historyItem: HistoryItem = {
4982
id: taskId,
5083
number: taskNumber,
51-
ts: lastRelevantMessage.ts,
52-
task: taskMessage.text ?? "",
84+
ts: timestamp,
85+
task: hasMessages
86+
? taskMessage!.text?.trim() || t("common:tasks.incomplete", { taskNumber })
87+
: t("common:tasks.no_messages", { taskNumber }),
5388
tokensIn: tokenUsage.totalTokensIn,
5489
tokensOut: tokenUsage.totalTokensOut,
5590
cacheWrites: tokenUsage.totalCacheWrites,

src/i18n/locales/ca/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@
101101
},
102102
"tasks": {
103103
"canceled": "Error de tasca: Ha estat aturada i cancel·lada per l'usuari.",
104-
"deleted": "Fallada de tasca: Ha estat aturada i eliminada per l'usuari."
104+
"deleted": "Fallada de tasca: Ha estat aturada i eliminada per l'usuari.",
105+
"incomplete": "Tasca #{{taskNumber}} (Incompleta)",
106+
"no_messages": "Tasca #{{taskNumber}} (Sense missatges)"
105107
},
106108
"storage": {
107109
"prompt_custom_path": "Introdueix una ruta d'emmagatzematge personalitzada per a l'historial de converses o deixa-ho buit per utilitzar la ubicació predeterminada",

src/i18n/locales/de/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und abgebrochen.",
100-
"deleted": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und gelöscht."
100+
"deleted": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und gelöscht.",
101+
"incomplete": "Aufgabe #{{taskNumber}} (Unvollständig)",
102+
"no_messages": "Aufgabe #{{taskNumber}} (Keine Nachrichten)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "Gib den benutzerdefinierten Speicherpfad für den Gesprächsverlauf ein, leer lassen für Standardspeicherort",

src/i18n/locales/en/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "Task error: It was stopped and canceled by the user.",
100-
"deleted": "Task failure: It was stopped and deleted by the user."
100+
"deleted": "Task failure: It was stopped and deleted by the user.",
101+
"incomplete": "Task #{{taskNumber}} (Incomplete)",
102+
"no_messages": "Task #{{taskNumber}} (No messages)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "Enter custom conversation history storage path, leave empty to use default location",

src/i18n/locales/es/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "Error de tarea: Fue detenida y cancelada por el usuario.",
100-
"deleted": "Fallo de tarea: Fue detenida y eliminada por el usuario."
100+
"deleted": "Fallo de tarea: Fue detenida y eliminada por el usuario.",
101+
"incomplete": "Tarea #{{taskNumber}} (Incompleta)",
102+
"no_messages": "Tarea #{{taskNumber}} (Sin mensajes)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "Ingresa la ruta de almacenamiento personalizada para el historial de conversaciones, déjala vacía para usar la ubicación predeterminada",

src/i18n/locales/fr/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "Erreur de tâche : Elle a été arrêtée et annulée par l'utilisateur.",
100-
"deleted": "Échec de la tâche : Elle a été arrêtée et supprimée par l'utilisateur."
100+
"deleted": "Échec de la tâche : Elle a été arrêtée et supprimée par l'utilisateur.",
101+
"incomplete": "Tâche #{{taskNumber}} (Incomplète)",
102+
"no_messages": "Tâche #{{taskNumber}} (Aucun message)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "Entrez le chemin de stockage personnalisé pour l'historique des conversations, laissez vide pour utiliser l'emplacement par défaut",

src/i18n/locales/hi/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "टास्क त्रुटि: इसे उपयोगकर्ता द्वारा रोका और रद्द किया गया था।",
100-
"deleted": "टास्क विफलता: इसे उपयोगकर्ता द्वारा रोका और हटाया गया था।"
100+
"deleted": "टास्क विफलता: इसे उपयोगकर्ता द्वारा रोका और हटाया गया था।",
101+
"incomplete": "टास्क #{{taskNumber}} (अधूरा)",
102+
"no_messages": "टास्क #{{taskNumber}} (कोई संदेश नहीं)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "वार्तालाप इतिहास के लिए कस्टम स्टोरेज पाथ दर्ज करें, डिफ़ॉल्ट स्थान का उपयोग करने के लिए खाली छोड़ दें",

src/i18n/locales/id/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "Error tugas: Dihentikan dan dibatalkan oleh pengguna.",
100-
"deleted": "Kegagalan tugas: Dihentikan dan dihapus oleh pengguna."
100+
"deleted": "Kegagalan tugas: Dihentikan dan dihapus oleh pengguna.",
101+
"incomplete": "Tugas #{{taskNumber}} (Tidak lengkap)",
102+
"no_messages": "Tugas #{{taskNumber}} (Tidak ada pesan)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "Masukkan path penyimpanan riwayat percakapan kustom, biarkan kosong untuk menggunakan lokasi default",

src/i18n/locales/it/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@
9797
},
9898
"tasks": {
9999
"canceled": "Errore attività: È stata interrotta e annullata dall'utente.",
100-
"deleted": "Fallimento attività: È stata interrotta ed eliminata dall'utente."
100+
"deleted": "Fallimento attività: È stata interrotta ed eliminata dall'utente.",
101+
"incomplete": "Attività #{{taskNumber}} (Incompleta)",
102+
"no_messages": "Attività #{{taskNumber}} (Nessun messaggio)"
101103
},
102104
"storage": {
103105
"prompt_custom_path": "Inserisci il percorso di archiviazione personalizzato per la cronologia delle conversazioni, lascia vuoto per utilizzare la posizione predefinita",

src/i18n/locales/ja/common.json

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

0 commit comments

Comments
 (0)