import { describe, expect, it } from 'vitest'; import { createFullTraceSelector } from '../src/traces.js'; const message = (role, content, extra = {}) => ({ role, content, ...extra }); const example = (...messages) => ({ messages }); describe('full trace selection', () => { it('keeps only the maximal snapshot of a growing conversation', () => { const user = message('user', 'Start'); const first = message('assistant', 'First'); const next = message('user', 'Continue'); const last = message('assistant', 'Done'); const examples = [ example(user, first, next, last), example(user, first), ]; expect(examples.filter(createFullTraceSelector())).toEqual([examples[0]]); }); it('keeps every leaf when a conversation is rewound and branched', () => { const shared = [message('user', 'Start'), message('assistant', 'Shared')]; const branchC = example(...shared, message('user', 'Choose C'), message('assistant', 'C')); const branchD = example(...shared, message('user', 'Choose D'), message('assistant', 'D')); const intermediate = example(...shared); const examples = [branchD, branchC, intermediate]; expect(examples.filter(createFullTraceSelector())).toEqual([branchD, branchC]); }); it('matches JSON tool arguments despite provider whitespace changes', () => { const requestToolCall = message('assistant', null, { tool_calls: [{ id: 'call_1', type: 'function', function: { name: 'run', arguments: '{ "path": "a" }' } }], }); const echoedToolCall = message('assistant', null, { tool_calls: [{ type: 'function', function: { arguments: '{"path":"a"}', name: 'run' }, id: 'call_1' }], }); const newest = example( message('user', 'Run it'), echoedToolCall, message('tool', 'ok', { tool_call_id: 'call_1' }), message('assistant', 'Done'), ); const intermediate = example(message('user', 'Run it'), requestToolCall); const examples = [newest, intermediate]; expect(examples.filter(createFullTraceSelector())).toEqual([newest]); }); it('does not combine unrelated conversations', () => { const examples = [ example(message('user', 'One'), message('assistant', '1')), example(message('user', 'Two'), message('assistant', '2')), ]; expect(examples.filter(createFullTraceSelector())).toEqual(examples); }); });