(messages: Message[])
| 48 | * Index 0 = latest, 1 = second-to-latest, etc. Caps at MAX_LOOKBACK. |
| 49 | */ |
| 50 | export function collectRecentAssistantTexts(messages: Message[]): string[] { |
| 51 | const texts: string[] = []; |
| 52 | for (let i = messages.length - 1; i >= 0 && texts.length < MAX_LOOKBACK; i--) { |
| 53 | const msg = messages[i]; |
| 54 | if (msg?.type !== 'assistant' || msg.isApiErrorMessage) continue; |
| 55 | const content = (msg as AssistantMessage).message.content; |
| 56 | if (!Array.isArray(content)) continue; |
| 57 | const text = extractTextContent(content, '\n\n'); |
| 58 | if (text) texts.push(text); |
| 59 | } |
| 60 | return texts; |
| 61 | } |
| 62 | export function fileExtension(lang: string | undefined): string { |
| 63 | if (lang) { |
| 64 | // Sanitize to prevent path traversal (e.g. ```../../etc/passwd) |
no test coverage detected