| 1 | import { newSession, finalizeSession, pushTurn, flattenParts, looksSynthetic } from './shared.js'; |
| 2 | |
| 3 | function messageText(content) { |
| 4 | if (typeof content === 'string') return content; |
| 5 | return flattenParts(content); |
| 6 | } |
| 7 | |
| 8 | function grokMessages(parsed) { |
| 9 | if (Array.isArray(parsed)) return parsed; |
| 10 | if (parsed && Array.isArray(parsed.conversation)) return parsed.conversation; |
| 11 | if (parsed && Array.isArray(parsed.messages)) return parsed.messages; |
| 12 | return null; |
| 13 | } |
| 14 | |
| 15 | function hasGrokSignal(parsed) { |
| 16 | if (Array.isArray(parsed)) return false; |
| 17 | if (typeof parsed.model === 'string' && /^grok/i.test(parsed.model)) return true; |
| 18 | if (typeof parsed.tool === 'string' && /grok/i.test(parsed.tool)) return true; |
| 19 | if (parsed.grok !== undefined || parsed.xai !== undefined) return true; |
| 20 | return false; |
| 21 | } |
| 22 | |
| 23 | export function detectGrok(parsed) { |
| 24 | if (!parsed || typeof parsed !== 'object') return false; |
| 25 | const messages = grokMessages(parsed); |
| 26 | if (!Array.isArray(messages) || !messages.length) return false; |
| 27 | if (!messages.every((m) => m && typeof m === 'object' && 'role' in m && 'content' in m)) return false; |
| 28 | return hasGrokSignal(parsed); |
| 29 | } |
| 30 | |
| 31 | export function parseGrok(parsed, path, sessionId) { |
| 32 | const messages = grokMessages(parsed) || []; |
| 33 | const session = newSession(path, (parsed && parsed.sessionId) || sessionId); |
| 34 | if (parsed && parsed.model) session.stats.models.add(parsed.model); |
| 35 | let turn = 0; |
| 36 | for (const msg of messages) { |
| 37 | if (!msg) continue; |
| 38 | const ts = msg.timestamp ? new Date(msg.timestamp).toISOString() : null; |
| 39 | if (msg.role === 'user') { |
| 40 | const text = messageText(msg.content); |
| 41 | if (looksSynthetic(text)) continue; |
| 42 | pushTurn(session, ++turn, text, ts); |
| 43 | } else if (msg.role === 'assistant') { |
| 44 | session.stats.assistantLines++; |
| 45 | if (Array.isArray(msg.tool_calls)) session.stats.toolUses += msg.tool_calls.length; |
| 46 | } else if (msg.role === 'tool') { |
| 47 | session.stats.toolUses++; |
| 48 | } |
| 49 | } |
| 50 | return finalizeSession(session); |
| 51 | } |