Newer
Older
cortex-hub / frontend / src / features / agents / components / BuddyAvatar.js
import React from 'react';

/**
 * BuddyAvatar: A mood-based visual indicator for the Co-Worker agent's state. 
 * Renders different expressions based on quality score and evaluation status.
 */
export const BuddyAvatar = ({ score, status }) => {
    let expression = '😊'; // Neutral/Happy
    let moodColor = 'text-emerald-500';
    let borderColor = 'border-emerald-500/20';
    let bgColor = 'bg-emerald-500/10';
    let label = 'Healthy';

    if (status === 'evaluating') {
        expression = '🧐'; // Analyzing
        moodColor = 'text-indigo-500';
        borderColor = 'border-indigo-500/30';
        bgColor = 'bg-indigo-500/10';
        label = 'Auditing...';
    } else if (status === 'reworking') {
        expression = '🛠️'; // Reworking
        moodColor = 'text-amber-500';
        borderColor = 'border-amber-500/30';
        bgColor = 'bg-amber-500/10';
        label = 'Refining';
    } else if (status === 'failed_limit') {
        expression = '😤'; // Stern/Critical - FAILED AFTER MAX ATTEMPTS
        moodColor = 'text-rose-500';
        borderColor = 'border-rose-500/40';
        bgColor = 'bg-rose-500/20';
        label = 'CRITICAL FAILURE';
    } else if (score < 60 && score > 0) {
        expression = '😟'; // Low score concern
        moodColor = 'text-rose-400';
        borderColor = 'border-rose-400/30';
        bgColor = 'bg-rose-400/5';
        label = 'Sub-Par';
    } else if (score >= 80) {
        expression = '✨'; // Excellent
        moodColor = 'text-emerald-400';
        borderColor = 'border-emerald-400/30';
        bgColor = 'bg-emerald-400/10';
        label = 'Optimal';
    }

    return (
        <div className={`relative group flex flex-col items-center justify-center w-12 h-12 rounded-xl border-2 shadow-sm transition-all duration-500 ${borderColor} ${bgColor}`}>
            <div className={`text-2xl transition-transform duration-500 group-hover:scale-110 ${status === 'evaluating' || status === 'reworking' ? 'animate-pulse' : ''}`}>
                {expression}
            </div>
            
            {/* Hover Mood Label */}
            <div className="absolute -bottom-8 left-1/2 -translate-x-1/2 opacity-0 group-hover:opacity-100 transition-opacity bg-gray-900 text-[8px] font-black uppercase tracking-widest text-white px-2 py-0.5 rounded whitespace-nowrap z-50 pointer-events-none">
                MOOD: <span className={moodColor}>{label}</span>
            </div>
            
            {/* Status Indicator Dot */}
             <div className={`absolute -top-1 -right-1 w-2.5 h-2.5 rounded-full border-2 border-white dark:border-gray-800 ${
                 status === 'passed' ? 'bg-emerald-500' : 
                 status === 'failed_limit' ? 'bg-rose-600' : 
                 status === 'reworking' ? 'bg-amber-500' : 
                 'bg-gray-400'
             }`} />
        </div>
    );
};

export default BuddyAvatar;