| 164 | } |
| 165 | |
| 166 | function parseAssistantReply(turns: XcodeTurnRow[], index: number): { assistantContent: string; assistantData: XcodeAssistantData | null } { |
| 167 | if (index + 1 >= turns.length || turns[index + 1].role !== 'assistant') { |
| 168 | return { assistantContent: '', assistantData: null }; |
| 169 | } |
| 170 | |
| 171 | try { |
| 172 | const assistantData = JSON.parse(turns[index + 1].data) as XcodeAssistantData; |
| 173 | let assistantContent = assistantData?.content || ''; |
| 174 | if (!assistantContent && Array.isArray(assistantData?.editAgentRounds)) { |
| 175 | assistantContent = assistantData.editAgentRounds |
| 176 | .map(round => round.reply || '') |
| 177 | .filter(Boolean) |
| 178 | .join('\n'); |
| 179 | } |
| 180 | return { assistantContent, assistantData }; |
| 181 | } catch { |
| 182 | return { assistantContent: '', assistantData: null }; |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | function extractToolsFromRounds(rounds: Array<{ toolCalls?: Array<{ name?: string }> }>): string[] { |
| 187 | const toolsUsed: string[] = []; |