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

@@ -148,14 +148,15 @@ interface AiUiForm {
- **统一类型**`types.ts` 以 `AiArtifactSchema``message.uiArtifacts`)为唯一事实源,
`artifact.type` ∈ `form | review | chart | import_wizard``payload` 携带各类型 schema。
- **合并逻辑**`uiArtifacts.ts` 的 `mergeArtifactIntoMessage` 将新 artifact upsert 进
`uiArtifacts`,并**向后兼容**地派发 legacy 字段(`forms`/`reviews`/`charts`)供老消息渲染
- **渲染层**`AiMessageContent.tsx` 消费 legacy 列表渲染 `DynamicForm`/`DynamicReview`/
`DynamicChart`;每个制品用 `ArtifactErrorBoundary` 包裹(单个渲染失败不影响整条气泡)。
- **合并逻辑**`uiArtifacts.ts` 的 `mergeArtifactIntoMessage` 只维护 `uiArtifacts`
(不再派发 legacy);渲染层经 `deriveForms/deriveReviews/deriveCharts` 从 artifact 派生
- **SSE 事件**:后端过渡期仍双发 `ui.form/ui.review/ui.chart` 与 `ui.artifact`
前端**只消费 `ui.artifact`**,旧事件分支已删除(后端后续可移除旧发射)。
- **历史兼容**:老消息 metadata 中只有 `a2uiForm/a2uiReview/a2uiChart`(无 uiArtifacts
`sseReducer`/`message-mappers` 恢复为 legacy 字段(`message.forms/reviews/charts`
已在 `types.ts` 标注 deprecated渲染层在 uiArtifacts 为空时回退使用;
新数据一律只写 `uiArtifacts`。
- **A2UI 组件实现**`DynamicForm`/`DynamicReview`/`DynamicChart` 共享
`useSubmissionState`(提交状态:防重复提交 + 失败可重试)与 `useXCardSurface`
XCard commands 增量更新 + createSurface 自动去重)。
- **SSE 事件 / 提交与确认接口**:与上文契约一致,未变更。
后续若彻底移除 legacy 字段,需保证历史消息(持久化 metadata 中的 `forms`/`reviews`/`charts`
仍可渲染——建议先迁移历史数据或保留兼容读取。
- **提交与确认接口**:与上文契约一致,未变更。