({
taskId: id,
rootTaskId,
parentTaskId,
taskNumber,
messages,
globalStoragePath,
workspace,
mode,
apiConfigName,
initialStatus,
}: TaskMetadataOptions)
| 28 | } |
| 29 | |
| 30 | export async function taskMetadata({ |
| 31 | taskId: id, |
| 32 | rootTaskId, |
| 33 | parentTaskId, |
| 34 | taskNumber, |
| 35 | messages, |
| 36 | globalStoragePath, |
| 37 | workspace, |
| 38 | mode, |
| 39 | apiConfigName, |
| 40 | initialStatus, |
| 41 | }: TaskMetadataOptions) { |
| 42 | const taskDir = await getTaskDirectoryPath(globalStoragePath, id) |
| 43 | |
| 44 | // Determine message availability upfront |
| 45 | const hasMessages = messages && messages.length > 0 |
| 46 | |
| 47 | // Pre-calculate all values based on availability |
| 48 | let timestamp: number |
| 49 | let tokenUsage: ReturnType<typeof getApiMetrics> |
| 50 | let taskDirSize: number |
| 51 | let taskMessage: ClineMessage | undefined |
| 52 | |
| 53 | if (!hasMessages) { |
| 54 | // Handle no messages case |
| 55 | timestamp = Date.now() |
| 56 | tokenUsage = { |
| 57 | totalTokensIn: 0, |
| 58 | totalTokensOut: 0, |
| 59 | totalCacheWrites: 0, |
| 60 | totalCacheReads: 0, |
| 61 | totalCost: 0, |
| 62 | contextTokens: 0, |
| 63 | } |
| 64 | taskDirSize = 0 |
| 65 | } else { |
| 66 | // Handle messages case |
| 67 | taskMessage = messages[0] // First message is always the task say. |
| 68 | |
| 69 | const lastRelevantMessage = |
| 70 | messages[findLastIndex(messages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"))] || |
| 71 | taskMessage |
| 72 | |
| 73 | timestamp = lastRelevantMessage.ts |
| 74 | |
| 75 | tokenUsage = getApiMetrics(combineApiRequests(combineCommandSequences(messages.slice(1)))) |
| 76 | |
| 77 | // Get task directory size |
| 78 | const cachedSize = taskSizeCache.get<number>(taskDir) |
| 79 | |
| 80 | if (cachedSize === undefined) { |
| 81 | try { |
| 82 | taskDirSize = await getFolderSize.loose(taskDir) |
| 83 | taskSizeCache.set<number>(taskDir, taskDirSize) |
| 84 | } catch (error) { |
| 85 | taskDirSize = 0 |
| 86 | } |
| 87 | } else { |
no test coverage detected