File size: 1,375 Bytes
7c5ed63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { describe, it, expect } from 'vitest';

import { parseLogLine } from '../../src/lib/log-reader';

describe('parseLogLine', () => {
  it('parses time, level, message, and trailing key=value fields', () => {
    const line = '2026-06-15T05:32:08.722Z INFO  llm config  turnStep=0.1 provider=openai model=coding-model-okapi thinkingEffort=high';
    const parsed = parseLogLine(line, 7);
    expect(parsed.lineNo).toBe(7);
    expect(parsed.time).toBe('2026-06-15T05:32:08.722Z');
    expect(parsed.level).toBe('INFO');
    expect(parsed.message).toBe('llm config');
    expect(parsed.fields).toEqual({
      turnStep: '0.1',
      provider: 'openai',
      model: 'coding-model-okapi',
      thinkingEffort: 'high',
    });
  });

  it('handles a message with no fields', () => {
    const parsed = parseLogLine('2026-06-15T05:32:16.680Z WARN  something happened', 1);
    expect(parsed.level).toBe('WARN');
    expect(parsed.message).toBe('something happened');
    expect(parsed.fields).toEqual({});
  });

  it('keeps unparseable lines verbatim as a message', () => {
    const parsed = parseLogLine('    at someStackFrame (file.ts:1:2)', 3);
    expect(parsed.time).toBeNull();
    expect(parsed.level).toBeNull();
    expect(parsed.message).toBe('    at someStackFrame (file.ts:1:2)');
    expect(parsed.raw).toBe('    at someStackFrame (file.ts:1:2)');
  });
});