refactor(admin): A2UI 双轨收敛,统一 artifact 协议

- mergeArtifactIntoMessage 不再派发 legacy 列表,只维护 uiArtifacts
- 渲染层从 uiArtifacts 派生 forms/reviews/charts,为空时回退 legacy
  (历史消息兼容,老 metadata 仅 a2uiForm/a2uiReview/a2uiChart)
- sseReducer 删除 ui.form/ui.review/ui.chart 旧事件分支,只消费
  ui.artifact(后端过渡期双发,旧事件将被忽略)
- types.ts legacy 字段标注 deprecated;契约文档同步现状
- 测试更新:旧事件忽略 + uiArtifacts 合并/恢复断言

aislop scan: 5 引擎 0 issues
This commit is contained in:
2026-08-08 09:33:53 +08:00
parent a644a8de42
commit bcd2d1a559
7 changed files with 98 additions and 79 deletions

View File

@@ -78,7 +78,7 @@ describe('AI chat history mapper', () => {
expect(mapped.message.forms?.[0]).toMatchObject({ id: 'form-9', title: '新增学生' });
});
it('restores uiArtifacts from message metadata and derives legacy lists', () => {
it('restores uiArtifacts from message metadata (统一协议)', () => {
const mapped = mapHistoryMessage({
id: 8,
role: 'assistant',
@@ -120,8 +120,14 @@ describe('AI chat history mapper', () => {
});
expect(mapped.message.uiArtifacts).toHaveLength(2);
expect(mapped.message.forms?.[0]).toMatchObject({ id: 'form-10', status: 'submitted' });
expect(mapped.message.reviews?.[0]).toMatchObject({ id: 'review-10', status: 'expired' });
expect(mapped.message.uiArtifacts?.[0].payload).toMatchObject({
id: 'form-10',
status: 'submitted',
});
expect(mapped.message.uiArtifacts?.[1].payload).toMatchObject({
id: 'review-10',
status: 'expired',
});
});
it('restores a persisted A2UI review from message metadata', () => {