118 lines
3.4 KiB
TypeScript
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,
|
|
})
|
|
);
|
|
});
|
|
});
|