bot tag and profile images yay urls only though...

This commit is contained in:
legop3
2026-05-14 16:54:13 -04:00
parent fa506b0970
commit bc8a13dd65
21 changed files with 94 additions and 56 deletions
@@ -62,7 +62,7 @@ export function buildLlmConversationRowsFromMessages(modelMessages, rawOutput) {
nickname,
text: content,
role: 'spectator',
system: role === 'system',
bot: role === 'system',
},
};
});
@@ -75,7 +75,7 @@ export function buildLlmConversationRowsFromMessages(modelMessages, rawOutput) {
nickname: 'LLM Output',
text: raw.trim() ? raw : '<empty>',
role: 'spectator',
system: true,
bot: true,
},
});
}
+25 -10
View File
@@ -17,8 +17,8 @@ function roleColors(role) {
}
}
function isBotSystemMessage(message) {
return Boolean(message?.system);
function isBotMessage(message) {
return Boolean(message?.bot);
}
function formatTime(ts) {
@@ -65,24 +65,39 @@ function DiscordAvatar({ guildIconUrl, userAvatarUrl, label }) {
);
}
function ProfileAvatar({ imageUrl, label }) {
if (!imageUrl) return null;
return (
<span className="flex h-4 w-4 overflow-hidden rounded-full border border-slate-700/80" title={label}>
<span
className="h-full w-full bg-cover bg-center bg-no-repeat"
style={{ backgroundImage: `url(${imageUrl})` }}
/>
</span>
);
}
export function ChatIdentity({ message }) {
const discordLabel = message.fromDiscord
? `${message.discordGuildName || 'Discord'} · ${displayName(message)}`
: null;
const isBot = isBotSystemMessage(message);
const isBot = isBotMessage(message);
const nameClass = isBot ? 'text-emerald-300' : roleColors(message.role);
return (
<>
{message.fromDiscord ? (
<>
<FaDiscord className="h-3.5 w-3.5 text-indigo-200" />
<DiscordAvatar
guildIconUrl={message.discordGuildIconUrl}
userAvatarUrl={message.discordUserAvatarUrl}
label={discordLabel}
/>
</>
) : null}
<ProfileAvatar imageUrl={message.profileImage} label={discordLabel || displayName(message)} />
{!message.profileImage ? (
<DiscordAvatar
guildIconUrl={message.discordGuildIconUrl}
userAvatarUrl={message.discordUserAvatarUrl}
label={discordLabel}
/>
) : null}
<span className={`font-semibold text-[0.85rem] ${nameClass}`}>
{displayName(message)}
</span>
@@ -104,7 +119,7 @@ export function ChatIdentity({ message }) {
}
function chatRowClass(message) {
if (isBotSystemMessage(message)) {
if (isBotMessage(message)) {
return 'surface-muted relative flex flex-wrap items-start gap-0.5 border border-emerald-500/40 bg-emerald-900/15 text-sm';
}
const isAdmin =
@@ -119,7 +134,7 @@ function chatRowClass(message) {
}
export default function ChatMessageRow({ message }) {
const isBot = isBotSystemMessage(message);
const isBot = isBotMessage(message);
return (
<div className={chatRowClass(message)}>
<ChatIdentity message={message} />
@@ -379,16 +379,8 @@ export default function RoverMediaPlayer({
const handleStatus = (nextStatus, info) => {
if (!active) return;
logAudio('audio/status', { nextStatus, info: info || null });
setAudioDetail(info || (nextStatus === 'connected' ? 'connected' : null));
setAudioStatus((prev) => {
if (nextStatus === 'connected' && (prev === 'playing' || prev === 'connecting')) {
return prev;
}
if (nextStatus === 'new') {
return prev;
}
return nextStatus;
});
setAudioStatus(nextStatus);
setAudioDetail(info || null);
if (['error', 'failed'].includes(nextStatus)) {
scheduleAudioRestart();
}