(
state: AIChatSessionState,
content: string
)
| 1359 | } |
| 1360 | |
| 1361 | async function resolveMentionedMembersFromContent( |
| 1362 | state: AIChatSessionState, |
| 1363 | content: string |
| 1364 | ): Promise<MentionedMemberContext[]> { |
| 1365 | const mentionTokens = new Set<string>() |
| 1366 | for (const match of content.matchAll(/@([^\s@]+)/g)) { |
| 1367 | const token = normalizeMentionLookupText(match[1] ?? '') |
| 1368 | if (token) { |
| 1369 | mentionTokens.add(token) |
| 1370 | } |
| 1371 | } |
| 1372 | |
| 1373 | if (mentionTokens.size === 0) { |
| 1374 | return [] |
| 1375 | } |
| 1376 | |
| 1377 | try { |
| 1378 | const members = await useDataService().getMembers(state.sessionId) |
| 1379 | const displayNameCounts = new Map<string, number>() |
| 1380 | members.forEach((member) => { |
| 1381 | const displayName = member.groupNickname || member.accountName || member.platformId |
| 1382 | displayNameCounts.set(displayName, (displayNameCounts.get(displayName) ?? 0) + 1) |
| 1383 | }) |
| 1384 | |
| 1385 | const candidates = members.map((member) => { |
| 1386 | const displayName = member.groupNickname || member.accountName || member.platformId |
| 1387 | const insertName = |
| 1388 | (displayNameCounts.get(displayName) ?? 0) > 1 ? `${displayName}·${member.platformId}` : displayName |
| 1389 | const aliases = [...member.aliases] |
| 1390 | const lookupValues = [ |
| 1391 | displayName, |
| 1392 | member.groupNickname || '', |
| 1393 | member.accountName || '', |
| 1394 | member.platformId, |
| 1395 | insertName, |
| 1396 | ...aliases, |
| 1397 | ] |
| 1398 | .map(normalizeMentionLookupText) |
| 1399 | .filter(Boolean) |
| 1400 | |
| 1401 | return { |
| 1402 | memberId: member.id, |
| 1403 | platformId: member.platformId, |
| 1404 | displayName, |
| 1405 | aliases, |
| 1406 | mentionText: `@${insertName}`, |
| 1407 | lookupValues, |
| 1408 | } |
| 1409 | }) |
| 1410 | |
| 1411 | const selected: MentionedMemberContext[] = [] |
| 1412 | const selectedIds = new Set<number>() |
| 1413 | for (const token of mentionTokens) { |
| 1414 | const candidate = candidates.find( |
| 1415 | (item) => !selectedIds.has(item.memberId) && item.lookupValues.includes(token) |
| 1416 | ) |
| 1417 | if (!candidate) continue |
| 1418 |
no test coverage detected