| 60 | const childrenByParent = new Map<string, ThreadSummary[]>(); |
| 61 | const roots: ThreadSummary[] = []; |
| 62 | const resolveVisibleParentId = (threadId: string) => { |
| 63 | let current = threadParentById[threadId]; |
| 64 | const visited = new Set<string>([threadId]); |
| 65 | while (current && !visited.has(current)) { |
| 66 | if (threadIds.has(current)) { |
| 67 | return current; |
| 68 | } |
| 69 | visited.add(current); |
| 70 | current = threadParentById[current]; |
| 71 | } |
| 72 | return null; |
| 73 | }; |
| 74 | |
| 75 | visibleThreads.forEach((thread) => { |
| 76 | const parentId = resolveVisibleParentId(thread.id); |