39 lines
2.4 KiB
TypeScript
39 lines
2.4 KiB
TypeScript
// @vitest-environment node
|
|
import { describe, expect, it } from 'vitest';
|
|
import { cloudToolActivity } from '../../electron/coding-teacher/cloud-activity';
|
|
|
|
describe('teacher cloud tool activity projection', () => {
|
|
it.each(['tool_call', 'tool_call_delta'])('takes only identity and state from %s', type => {
|
|
expect(cloudToolActivity({ stream_event: {
|
|
type, tool_call_id: 'call', name: 'read_project_file', args: { path: 'private.ts' }, args_delta: '{"secret":',
|
|
} }, 'run')).toEqual({ id: 'run:call', name: 'read_project_file', status: 'running' });
|
|
});
|
|
it.each([
|
|
['tool-started', undefined, undefined, 'running'],
|
|
['tool-finished', { type: 'tool', content: '{"private":"value"}', status: 'success' }, undefined, 'completed'],
|
|
['tool-finished', 'result text', undefined, 'completed'],
|
|
['tool-finished', { status: 'error', content: 'internal error' }, undefined, 'failed'],
|
|
['tool-finished', undefined, 'internal stack trace', 'failed'],
|
|
])('projects %s without leaking tool output', (event, output, error, status) => {
|
|
expect(cloudToolActivity({ status: 'stream_event', event: { method: 'tools', data: {
|
|
event, tool_call_id: 'call', tool_name: 'read_conversation', output, error,
|
|
} } }, 'run')).toEqual({ id: 'run:call', name: 'read_conversation', status });
|
|
});
|
|
it('does not guess activity from answer text, reasoning or unidentified deltas', () => {
|
|
for (const chunk of [
|
|
{ stream_event: { type: 'message_delta', content: '{"tool_call_id":"call","name":"read_project_file"}' } },
|
|
{ stream_event: { type: 'message_delta', reasoning_content: 'internal reasoning' } },
|
|
{ stream_event: { type: 'tool_call_delta', index: 0, args_delta: '{}' } },
|
|
{ status: 'stream_event', event: { method: 'messages', data: { event: 'tool-started', tool_call_id: 'call', tool_name: 'test' } } },
|
|
]) expect(cloudToolActivity(chunk, 'run')).toBeUndefined();
|
|
});
|
|
it.each([
|
|
['tool-finished', { type: 'tool', content: 'tool result', status: 'success' }, undefined, 'completed'],
|
|
['tool-error', undefined, 'private error', 'failed'],
|
|
])('accepts real %s events that carry only the call id', (event, output, error, status) => {
|
|
expect(cloudToolActivity({ status: 'stream_event', event: { method: 'tools', data: {
|
|
event, tool_call_id: 'call', output, error,
|
|
} } }, 'run')).toEqual({ id: 'run:call', status });
|
|
});
|
|
});
|