(messages: Message[])
| 3210 | } |
| 3211 | |
| 3212 | function getTodoReminderTurnCounts(messages: Message[]): { |
| 3213 | turnsSinceLastTodoWrite: number |
| 3214 | turnsSinceLastReminder: number |
| 3215 | } { |
| 3216 | let lastTodoWriteIndex = -1 |
| 3217 | let lastReminderIndex = -1 |
| 3218 | let assistantTurnsSinceWrite = 0 |
| 3219 | let assistantTurnsSinceReminder = 0 |
| 3220 | |
| 3221 | // Iterate backwards to find most recent events |
| 3222 | for (let i = messages.length - 1; i >= 0; i--) { |
| 3223 | const message = messages[i] |
| 3224 | |
| 3225 | if (message?.type === 'assistant') { |
| 3226 | if (isThinkingMessage(message)) { |
| 3227 | // Skip thinking messages |
| 3228 | continue |
| 3229 | } |
| 3230 | |
| 3231 | // Check for TodoWrite usage BEFORE incrementing counter |
| 3232 | // (we don't want to count the TodoWrite message itself as "1 turn since write") |
| 3233 | if ( |
| 3234 | lastTodoWriteIndex === -1 && |
| 3235 | 'message' in message && |
| 3236 | Array.isArray(message.message?.content) && |
| 3237 | message.message.content.some( |
| 3238 | block => block.type === 'tool_use' && block.name === 'TodoWrite', |
| 3239 | ) |
| 3240 | ) { |
| 3241 | lastTodoWriteIndex = i |
| 3242 | } |
| 3243 | |
| 3244 | // Count assistant turns before finding events |
| 3245 | if (lastTodoWriteIndex === -1) assistantTurnsSinceWrite++ |
| 3246 | if (lastReminderIndex === -1) assistantTurnsSinceReminder++ |
| 3247 | } else if ( |
| 3248 | lastReminderIndex === -1 && |
| 3249 | message?.type === 'attachment' && |
| 3250 | message.attachment.type === 'todo_reminder' |
| 3251 | ) { |
| 3252 | lastReminderIndex = i |
| 3253 | } |
| 3254 | |
| 3255 | if (lastTodoWriteIndex !== -1 && lastReminderIndex !== -1) { |
| 3256 | break |
| 3257 | } |
| 3258 | } |
| 3259 | |
| 3260 | return { |
| 3261 | turnsSinceLastTodoWrite: assistantTurnsSinceWrite, |
| 3262 | turnsSinceLastReminder: assistantTurnsSinceReminder, |
| 3263 | } |
| 3264 | } |
| 3265 | |
| 3266 | async function getTodoReminderAttachments( |
| 3267 | messages: Message[] | undefined, |
no test coverage detected