Hwandji's picture
feat: initial HuggingFace Space deployment
4343907
raw
history blame
3.6 kB
<template>
<div class="agent-card">
<div class="agent-header">
<div class="agent-avatar" :style="{ backgroundColor: agent.color || '#6B7280' }">
{{ agent.name?.charAt(0) || 'A' }}
</div>
<div class="agent-info">
<h3 class="agent-name">{{ agent.name || 'Unknown Agent' }}</h3>
<p class="agent-type">{{ agent.type || 'Generic' }}</p>
</div>
<div class="agent-status">
<div
class="status-dot"
:class="{
'bg-green-400': agent.status === 'active',
'bg-red-400': agent.status === 'inactive',
'bg-yellow-400': agent.status === 'starting'
}"
></div>
<span class="status-text">{{ agent.status || 'Unknown' }}</span>
</div>
</div>
<div class="agent-metrics">
<div class="metric">
<span class="metric-value">{{ agent.metrics?.messages_processed || 0 }}</span>
<span class="metric-label">Messages</span>
</div>
<div class="metric">
<span class="metric-value">{{ agent.metrics?.average_response_time?.toFixed(1) || '0.0' }}s</span>
<span class="metric-label">Response Time</span>
</div>
</div>
<div class="agent-actions">
<button
v-if="agent.status !== 'active'"
class="action-button start-button"
@click="$emit('start', agent)"
>
▶ Start
</button>
<button
v-else
class="action-button stop-button"
@click="$emit('stop', agent)"
>
⏸ Stop
</button>
<button
class="action-button chat-button"
@click="$emit('chat', agent)"
>
💬 Chat
</button>
<button
class="action-button details-button"
@click="$emit('details', agent)"
>
📋 Details
</button>
</div>
</div>
</template>
<script>
export default {
name: 'AgentCard',
props: {
agent: {
type: Object,
required: true
}
},
emits: ['start', 'stop', 'chat', 'details']
}
</script>
<style scoped>
.agent-card {
@apply bg-white rounded-lg shadow-sm border border-gray-200 p-6 hover:shadow-md transition-shadow;
@apply flex flex-col;
height: 320px;
}
.agent-header {
@apply flex items-start justify-between mb-4;
flex-shrink: 0;
}
.agent-avatar {
@apply w-12 h-12 rounded-lg flex items-center justify-center text-white font-medium text-lg mr-4;
}
.agent-info {
@apply flex-1;
}
.agent-name {
@apply font-semibold text-gray-900 text-lg;
}
.agent-type {
@apply text-sm text-gray-600 mt-1;
}
.agent-status {
@apply flex items-center space-x-2;
}
.status-dot {
@apply w-3 h-3 rounded-full;
}
.status-text {
@apply text-sm font-medium text-gray-700 capitalize;
}
.agent-metrics {
@apply flex space-x-6 mb-4 py-3 border-y border-gray-100;
flex: 1 1 auto;
min-height: 80px;
}
.metric {
@apply text-center;
}
.metric-value {
@apply block text-xl font-bold text-gray-900;
}
.metric-label {
@apply text-xs text-gray-500 uppercase tracking-wide;
}
.agent-actions {
@apply flex space-x-2;
flex-shrink: 0;
}
.action-button {
@apply flex-1 px-3 py-2 text-sm font-medium rounded-md border transition-colors;
}
.start-button {
@apply bg-green-50 text-green-700 border-green-200 hover:bg-green-100;
}
.stop-button {
@apply bg-red-50 text-red-700 border-red-200 hover:bg-red-100;
}
.chat-button {
@apply bg-blue-50 text-blue-700 border-blue-200 hover:bg-blue-100;
}
.details-button {
@apply bg-gray-50 text-gray-700 border-gray-200 hover:bg-gray-100;
}
</style>