const SOURCE_LABELS: Record = { api_server: 'API', bluebubbles: 'iMessage', cli: 'CLI', codex: 'Codex', desktop: 'Desktop', discord: 'Discord', email: 'Email', gateway: 'Gateway', local: 'Local', matrix: 'Matrix', mattermost: 'Mattermost', qqbot: 'QQ', signal: 'Signal', slack: 'Slack', sms: 'SMS', telegram: 'Telegram', tui: 'TUI', webhook: 'Webhook', weixin: 'WeChat', whatsapp: 'WhatsApp', yuanbao: 'Yuanbao' } const SOURCE_ALIASES: Record = { bluebubbles: ['apple messages', 'imessage'], cli: ['terminal'], desktop: ['app', 'gui'], local: ['machine'], qqbot: ['qq'], telegram: ['tg'], tui: ['terminal'], weixin: ['wechat'], whatsapp: ['wa'] } export function normalizeSessionSource(source: null | string | undefined): string | null { const id = source?.trim().toLowerCase() return id || null } export function sessionSourceLabel(source: null | string | undefined): string | null { const id = normalizeSessionSource(source) if (!id) { return null } return SOURCE_LABELS[id] || id.replace(/[_-]+/g, ' ').replace(/\b\w/g, char => char.toUpperCase()) } export function sessionSourceSearchTerms(source: null | string | undefined): string[] { const id = normalizeSessionSource(source) const label = sessionSourceLabel(id) if (!id) { return [] } return [id, label ?? '', ...(SOURCE_ALIASES[id] ?? [])].filter(Boolean) }