Why: A single run re-registering one deliverable left three identical report files side by side (storage is append-only by design and the prompt even teaches revisions-as-new-versions); the panel listed every row. Per the owner ruling, storage keeps all versions - the panel now groups by name, shows only the latest row, badges multi-version groups with the count, and expands (Collapsible primitive) to list history with per-version preview/download. Evidence: tsc clean; vitest 99/99 including new grouping tests (latest selection by updatedAt, ordering, cross-name independence, empty); knip unchanged. Impact: Frontend-only display logic; no storage, API, or prompt changes. Refs: Dev task fix/artifact-version-dedupe
34 lines
1.5 KiB
TypeScript
34 lines
1.5 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { groupArtifactsByName } from './artifactGrouping'
|
|
import type { Artifact } from './contracts'
|
|
|
|
// 2026-10-11 实测事故:一次 run 内 register_artifact 三次 → 文件面板三份同名
|
|
// 转写报告并列。修复语义(用户裁定):存储保留版本、界面按名称分组去重。
|
|
|
|
function art(id: string, name: string, updatedAt: string, size = 40000): Artifact {
|
|
return { id, projectId: 'p1', name, kind: 'document', size, createdAt: updatedAt, updatedAt }
|
|
}
|
|
|
|
describe('groupArtifactsByName', () => {
|
|
it('同名 3 行归一组:latest 为最新,versions 新→旧', () => {
|
|
const g = groupArtifactsByName([
|
|
art('a1', '报告.docx', '2026-10-11T15:22:20Z'),
|
|
art('a2', '报告.docx', '2026-10-11T15:24:06Z'),
|
|
art('a3', '报告.docx', '2026-10-11T15:23:38Z'),
|
|
art('b1', '其他.md', '2026-10-11T15:20:00Z', 100),
|
|
])
|
|
expect(g).toHaveLength(2)
|
|
const grp = g.find(x => x.latest.name === '报告.docx')!
|
|
expect(grp.latest.id).toBe('a2') // 最新 15:24:06
|
|
expect(grp.versions).toHaveLength(3)
|
|
expect(grp.versions.map(v => v.id)).toEqual(['a2', 'a3', 'a1'])
|
|
expect(g.find(x => x.latest.name === '其他.md')!.versions).toHaveLength(1)
|
|
})
|
|
|
|
it('不同名互不影响;空列表返回空', () => {
|
|
const g = groupArtifactsByName([art('x', 'a.md', 'T1'), art('y', 'b.md', 'T2')])
|
|
expect(g).toHaveLength(2)
|
|
expect(groupArtifactsByName([])).toEqual([])
|
|
})
|
|
})
|