MCPcopy Create free account
hub / github.com/ChatLab/ChatLab / buildMergedOutput

Function buildMergedOutput

packages/node-runtime/src/merger/index.ts:106–193  ·  view source on GitHub ↗
(
  dataSources: Array<{ source: MergerDataSource; filename: string }>,
  outputName: string
)

Source from the content-addressed store, hash-verified

104 * assembles the output. Does NOT write to disk or import to DB.
105 */
106export function buildMergedOutput(
107 dataSources: Array<{ source: MergerDataSource; filename: string }>,
108 outputName: string
109): MergeOrchestrationResult {
110 const metas = dataSources.map(({ source, filename }) => ({
111 meta: source.getMeta(),
112 members: source.getMembers(),
113 filename,
114 source,
115 }))
116
117 const collidingIds = getCollidingPlatformIds(
118 metas.map(({ meta, members }) => ({
119 platform: meta?.platform || 'unknown',
120 members: members.map((m) => ({ platformId: m.platformId })),
121 }))
122 )
123
124 const memberMap = mergeMergerMembers(
125 metas.map(({ meta, members }) => ({
126 platform: meta?.platform || 'unknown',
127 members,
128 })),
129 collidingIds
130 )
131
132 // Streaming dedup: process batches to avoid loading all into memory
133 const seenKeys = new Set<string>()
134 const mergedMessages: MergedMessage[] = []
135
136 for (const { source, meta } of metas) {
137 const platform = meta?.platform || 'unknown'
138 source.streamMessages(10000, (messages) => {
139 for (const msg of messages) {
140 const nid = normalizePlatformId(msg.senderPlatformId, platform, collidingIds)
141 const key = generateMessageKey(msg.timestamp, nid, msg.content ?? null)
142 if (seenKeys.has(key)) continue
143 seenKeys.add(key)
144 mergedMessages.push({
145 sender: nid,
146 accountName: msg.senderAccountName,
147 groupNickname: msg.senderGroupNickname,
148 timestamp: msg.timestamp,
149 type: msg.type,
150 content: msg.content,
151 })
152 }
153 })
154 }
155
156 mergedMessages.sort((a, b) => a.timestamp - b.timestamp)
157
158 const sources: MergeSourceInfo[] = dataSources.map(({ source, filename }) => ({
159 filename,
160 platform: source.getMeta()?.platform || 'unknown',
161 messageCount: source.getMessageCount(),
162 }))
163

Callers 2

registerMergeRoutesFunction · 0.90
merger.test.tsFile · 0.90

Calls 9

getCollidingPlatformIdsFunction · 0.90
normalizePlatformIdFunction · 0.90
generateMessageKeyFunction · 0.90
getMetaMethod · 0.65
getMembersMethod · 0.65
streamMessagesMethod · 0.65
getMessageCountMethod · 0.65
addMethod · 0.45
nowMethod · 0.45

Tested by

no test coverage detected