feat: shared supervisor timeline, story assignment and time-spiral view

Each source version is extracted once for every review scope; events carry spans and projects from their sources, and attention density is counted from messages. After publication, events are assigned to project features and sub-threads (cross-project stories only when enabled), with user rename, merge, remove, move and undo. The story graph gains a lazily loaded Three.js time-spiral view. Includes the 3D concept demo, real-data DeepSeek check scripts and docs.
This commit is contained in:
mesalogo
2026-10-02 15:21:48 +08:00
parent 3d4e9577b5
commit 5dc65457d9
53 changed files with 4051 additions and 83 deletions
@@ -88,6 +88,9 @@ it('supervision preserves result history and protected identities within scope t
const other = structuredClone(third)
other.request.scope = { kind: 'projects', projectIds: [projects[1]!.id] }
// Cross-project off: project B is never offered project A's entities, so it cannot claim them.
other.candidates = db.listSupervisionCandidates(other.request, { projectId: projects[1]!.id, crossProject: false })
expect(other.candidates).toEqual([])
expect(() => db.saveSupervisionResult(other)).toThrow('本次范围')
other.output.entities.forEach((entity) => { delete entity.persistedId })
other.evidence = [{ ...first.evidence[0]!, sourceId: 'B', title: 'B source' }]