Zion Boggan
repos/TreeTrace/src/adapters/grok.js
zionboggan.com ↗
51 lines · javascript
History for this file →
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
}