feat(ai): complete v3.2 risk watch agent
This commit is contained in:
@@ -5,7 +5,9 @@ import type { VersionWithContext } from './derive';
|
||||
import type { V22XiaobaoWarningSummary } from './v22-api';
|
||||
import {
|
||||
buildXiaobaoRisksFromV22Summaries,
|
||||
collectV22XiaobaoLatestInsights,
|
||||
filterV22XiaobaoSummariesForVisibleVersions,
|
||||
mergeV22XiaobaoLatestInsights,
|
||||
shouldLoadXiaobaoAppDataFallback,
|
||||
} from './xiaobao-v22-summary';
|
||||
|
||||
@@ -165,6 +167,69 @@ test('filterV22XiaobaoSummariesForVisibleVersions keeps only visible version sum
|
||||
assert.deepEqual(result.map((item) => item.versionId), ['visible-1', 'visible-2']);
|
||||
});
|
||||
|
||||
test('collectV22XiaobaoLatestInsights exposes relation-backed AI insights', () => {
|
||||
const result = collectV22XiaobaoLatestInsights([
|
||||
summary({
|
||||
versionId: 'version-1',
|
||||
latestInsight: {
|
||||
versionId: 'version-1',
|
||||
riskSignature: 'signature-1',
|
||||
generatedAt: '2026-07-08T10:00:00.000Z',
|
||||
providerInfo: { model: 'claude-test' },
|
||||
insight: {
|
||||
summary: '高风险版本需要处理阻塞。',
|
||||
why: ['存在阻塞项'],
|
||||
forecast: '预计延期 1 天。',
|
||||
suggestedActions: ['先解除阻塞'],
|
||||
ownerHints: ['确认阻塞负责人'],
|
||||
generatedAt: '2026-07-08T10:00:00.000Z',
|
||||
},
|
||||
},
|
||||
}),
|
||||
summary({ versionId: 'version-2' }),
|
||||
]);
|
||||
|
||||
assert.equal(result.length, 1);
|
||||
assert.equal(result[0].versionId, 'version-1');
|
||||
assert.equal(result[0].riskSignature, 'signature-1');
|
||||
assert.equal(result[0].insight.summary, '高风险版本需要处理阻塞。');
|
||||
assert.equal(result[0].providerInfo?.model, 'claude-test');
|
||||
});
|
||||
|
||||
test('mergeV22XiaobaoLatestInsights prefers relation-backed insights over legacy cache duplicates', () => {
|
||||
const relationInsight = {
|
||||
versionId: 'version-1',
|
||||
riskSignature: 'signature-1',
|
||||
generatedAt: '2026-07-08T10:00:00.000Z',
|
||||
insight: {
|
||||
summary: '关系表新解读。',
|
||||
why: ['new'],
|
||||
forecast: 'new forecast',
|
||||
suggestedActions: ['new action'],
|
||||
ownerHints: ['new owner'],
|
||||
generatedAt: '2026-07-08T10:00:00.000Z',
|
||||
},
|
||||
};
|
||||
const legacyInsight = {
|
||||
versionId: 'version-1',
|
||||
riskSignature: 'signature-1',
|
||||
generatedAt: '2026-07-08T09:00:00.000Z',
|
||||
insight: {
|
||||
summary: '旧缓存解读。',
|
||||
why: ['old'],
|
||||
forecast: 'old forecast',
|
||||
suggestedActions: ['old action'],
|
||||
ownerHints: ['old owner'],
|
||||
generatedAt: '2026-07-08T09:00:00.000Z',
|
||||
},
|
||||
};
|
||||
|
||||
const result = mergeV22XiaobaoLatestInsights([relationInsight], [legacyInsight]);
|
||||
|
||||
assert.equal(result.length, 1);
|
||||
assert.equal(result[0].insight.summary, '关系表新解读。');
|
||||
});
|
||||
|
||||
function summary(patch: Partial<V22XiaobaoWarningSummary> = {}): V22XiaobaoWarningSummary {
|
||||
return {
|
||||
versionId: 'version-1',
|
||||
|
||||
Reference in New Issue
Block a user