43 lines
1.8 KiB
TypeScript
43 lines
1.8 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|||
|
|
import type { Message, Part } from '@opencode-ai/sdk/v2';
|
||
|
|
|
||
|
|
import {
|
||
|
|
buildTaskSummaryEntriesFromSession,
|
||
|
|
parseTaskMetadataBlock,
|
||
|
|
readTaskSessionIdFromRecord,
|
||
|
|
readTaskSessionIdFromOutput,
|
||
|
|
} from './taskToolModel';
|
||
|
|
|
||
|
|
describe('taskToolModel', () => {
|
||
|
|
test('reads the current OpenCode running-state identity contract', () => {
|
||
|
|
expect(readTaskSessionIdFromRecord({ sessionId: 'child-live' })).toBe('child-live');
|
||
|
|
expect(readTaskSessionIdFromRecord({})).toBe(undefined);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('reads authoritative session and summary metadata', () => {
|
||
|
|
const output = 'result\n<task_metadata>{"sessionID":"child-1","calls":[{"id":"tool-1","tool":"read","title":"a.ts"}]}</task_metadata>';
|
||
|
|
expect(parseTaskMetadataBlock(output)).toEqual({
|
||
|
|
sessionId: 'child-1',
|
||
|
|
summaryEntries: [{ id: 'tool-1', tool: 'read', state: { status: undefined, title: 'a.ts', input: undefined } }],
|
||
|
|
});
|
||
|
|
expect(readTaskSessionIdFromOutput(output)).toBe('child-1');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('projects tool calls while excluding nested task and todo bookkeeping', () => {
|
||
|
|
const message = {
|
||
|
|
info: { id: 'message-1', role: 'assistant' } as Message,
|
||
|
|
parts: [
|
||
|
|
{ id: 'read-1', type: 'tool', tool: 'read', state: { status: 'completed', input: { filePath: 'a.ts' } } },
|
||
|
|
{ id: 'task-1', type: 'tool', tool: 'task', state: { status: 'running' } },
|
||
|
|
{ id: 'todo-1', type: 'tool', tool: 'todowrite', state: { status: 'completed' } },
|
||
|
|
] as unknown as Part[],
|
||
|
|
};
|
||
|
|
|
||
|
|
expect(buildTaskSummaryEntriesFromSession([message])).toEqual([{
|
||
|
|
id: 'read-1',
|
||
|
|
tool: 'read',
|
||
|
|
state: { status: 'completed', title: undefined, input: { filePath: 'a.ts' } },
|
||
|
|
}]);
|
||
|
|
});
|
||
|
|
});
|