agent-ecosystem/test/main/services/team/stallMonitor/BoardTaskActivityBatchIndexer.test.ts

118 lines
3.4 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { BoardTaskActivityBatchIndexer } from '../../../../../src/main/services/team/stallMonitor/BoardTaskActivityBatchIndexer';
import { BoardTaskActivityRecordBuilder } from '../../../../../src/main/services/team/taskLogs/activity/BoardTaskActivityRecordBuilder';
import type { RawTaskActivityMessage } from '../../../../../src/main/services/team/taskLogs/activity/BoardTaskActivityTranscriptReader';
import type { TeamTask } from '../../../../../src/shared/types';
describe('BoardTaskActivityBatchIndexer', () => {
it('delegates one batched build through buildForTasks', () => {
const built = new Map([['task-a', [{ id: 'r1' }]]]);
const builder = {
buildForTasks: vi.fn(() => built),
};
const indexer = new BoardTaskActivityBatchIndexer(builder as never);
const result = indexer.buildIndex({
teamName: 'demo',
tasks: [{ id: 'task-a', subject: 'A', status: 'in_progress' } as TeamTask],
messages: [{ uuid: 'm1' } as RawTaskActivityMessage],
});
expect(result).toBe(built);
expect(builder.buildForTasks).toHaveBeenCalledTimes(1);
});
it('keeps buildForTask behavior consistent with batched build', () => {
const builder = new BoardTaskActivityRecordBuilder();
const taskA: TeamTask = {
id: 'task-a',
displayId: 'abcd1234',
subject: 'Task A',
status: 'in_progress',
};
const taskB: TeamTask = {
id: 'task-b',
displayId: 'deadbeef',
subject: 'Task B',
status: 'pending',
};
const messages: RawTaskActivityMessage[] = [
{
filePath: '/tmp/session.jsonl',
uuid: 'msg-1',
timestamp: '2026-04-19T12:00:00.000Z',
sessionId: 'session-a',
agentName: 'alice',
isSidechain: true,
sourceOrder: 1,
boardTaskLinks: [
{
schemaVersion: 1,
toolUseId: 'tool-1',
task: {
ref: 'task-a',
refKind: 'canonical',
canonicalId: 'task-a',
},
targetRole: 'subject',
linkKind: 'board_action',
actorContext: {
relation: 'same_task',
},
},
{
schemaVersion: 1,
toolUseId: 'tool-2',
task: {
ref: 'task-b',
refKind: 'canonical',
canonicalId: 'task-b',
},
targetRole: 'subject',
linkKind: 'board_action',
actorContext: {
relation: 'same_task',
},
},
],
boardTaskToolActions: [
{
schemaVersion: 1,
toolUseId: 'tool-1',
canonicalToolName: 'task_start',
},
{
schemaVersion: 1,
toolUseId: 'tool-2',
canonicalToolName: 'task_add_comment',
},
],
},
];
const recordsByTaskId = builder.buildForTasks({
teamName: 'demo',
tasks: [taskA, taskB],
messages,
});
expect(recordsByTaskId.get('task-a')).toEqual(
builder.buildForTask({
teamName: 'demo',
targetTask: taskA,
tasks: [taskA, taskB],
messages,
})
);
expect(recordsByTaskId.get('task-b')).toEqual(
builder.buildForTask({
teamName: 'demo',
targetTask: taskB,
tasks: [taskA, taskB],
messages,
})
);
});
});