agent-ecosystem/test/main/services/analysis/SubagentDetailBuilder.test.ts
Илия 3849c01955
fix(provenance): classify synthetic user turns
* fix(provenance): classify synthetic user turns

* fix(provenance): keep assistant display rendering intact

* fix(provenance): preserve source tool result rows
2026-05-26 23:51:17 +03:00

75 lines
2 KiB
TypeScript

import { deriveSubagentDescription } from '@main/services/analysis/SubagentDetailBuilder';
import { describe, expect, it } from 'vitest';
import type { ParsedMessage } from '@main/types';
function message(overrides: Partial<ParsedMessage>): ParsedMessage {
return {
uuid: 'msg-1',
parentUuid: null,
type: 'user',
timestamp: new Date('2026-01-01T00:00:00.000Z'),
content: '',
isSidechain: true,
isMeta: false,
toolCalls: [],
toolResults: [],
...overrides,
};
}
describe('deriveSubagentDescription', () => {
it('uses the first authored user text', () => {
expect(
deriveSubagentDescription([
message({ type: 'assistant', content: 'assistant output' }),
message({ content: 'real subagent task' }),
])
).toBe('real subagent task');
});
it('ignores synthetic user replay text before real user text', () => {
expect(
deriveSubagentDescription([
message({
content: 'Human: I tested the feature looks good',
isMeta: true,
isReplay: true,
isSynthetic: true,
}),
message({ content: 'Implement the actual task' }),
])
).toBe('Implement the actual task');
});
it('falls back when no authored user text exists', () => {
expect(
deriveSubagentDescription([
message({
content: 'Human: I tested the feature looks good',
isMeta: true,
isReplay: true,
isSynthetic: true,
}),
])
).toBe('Subagent');
});
it('ignores structured protocol rows before authored text', () => {
expect(
deriveSubagentDescription([
message({
content: 'plain protocol payload',
protocolKind: 'teammate-message',
}),
message({ content: 'Implement the actual task' }),
])
).toBe('Implement the actual task');
});
it('preserves the existing 100 character truncation behavior', () => {
expect(deriveSubagentDescription([message({ content: 'a'.repeat(101) })])).toBe(
`${'a'.repeat(100)}...`
);
});
});