import { buildSubagentProjectionForEntry } from '../src/modules/netaclaw/session-tree/subagent_projection.js'; import type { SessionTreeEntry } from '../src/modules/netaclaw/session-tree/types.js'; describe('session tree subagent task replay projection', () => { it('omits tool call and result events from task replay after folding them into tool executions', () => { const entry: SessionTreeEntry = { id: 'entry-result', parentId: 'parent', timestamp: '2026-04-22T10:00:00.000Z', type: 'subagent_result', content: { batchId: 'batch-task-replay', status: 'completed', parentEntryId: 'parent', results: [ { id: 11, status: 'completed', summary: 'done', resultPayload: { processEvents: [ { type: 'run_start', runId: 'subagent-11', timestamp: '2026-04-22T10:00:01.000Z', }, { type: 'tool_call', runId: 'subagent-11', timestamp: '2026-04-22T10:00:02.000Z', toolCallId: 'call-images', name: 'bash', args: { command: 'find ~/Desktop -maxdepth 1 -type f -iname "*.jpg"' }, }, { type: 'tool_result', runId: 'subagent-11', timestamp: '2026-04-22T10:00:03.000Z', toolCallId: 'call-images', name: 'bash', result: '111.jpg', }, { type: 'token', runId: 'subagent-11', timestamp: '2026-04-22T10:00:04.000Z', text: 'done', }, ], }, }, ], }, }; const projection = buildSubagentProjectionForEntry(entry); expect(projection?.taskPanels[0].toolExecutions).toHaveLength(1); expect(projection?.taskPanels[0].processEvents.map(event => event.type)).toEqual([ 'run_start', 'token', ]); }); });