mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-13 09:16:04 +00:00
feat(web): show active sandbox details in dashboard Box status popover
Fetch box sessions alongside status and display each active sandbox in the popover with session ID, image, resources (CPU/memory), and last used time.
This commit is contained in:
@@ -7,6 +7,8 @@ import {
|
|||||||
CircleX,
|
CircleX,
|
||||||
Loader2,
|
Loader2,
|
||||||
ChevronDown,
|
ChevronDown,
|
||||||
|
Container,
|
||||||
|
Clock,
|
||||||
} from 'lucide-react';
|
} from 'lucide-react';
|
||||||
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
|
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
|
||||||
import {
|
import {
|
||||||
@@ -17,6 +19,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
ApiRespPluginSystemStatus,
|
ApiRespPluginSystemStatus,
|
||||||
ApiRespBoxStatus,
|
ApiRespBoxStatus,
|
||||||
|
BoxSessionInfo,
|
||||||
} from '@/app/infra/entities/api';
|
} from '@/app/infra/entities/api';
|
||||||
import { httpClient } from '@/app/infra/http/HttpClient';
|
import { httpClient } from '@/app/infra/http/HttpClient';
|
||||||
|
|
||||||
@@ -41,16 +44,19 @@ export default function SystemStatusCard({
|
|||||||
const [pluginStatus, setPluginStatus] =
|
const [pluginStatus, setPluginStatus] =
|
||||||
useState<ApiRespPluginSystemStatus | null>(null);
|
useState<ApiRespPluginSystemStatus | null>(null);
|
||||||
const [boxStatus, setBoxStatus] = useState<ApiRespBoxStatus | null>(null);
|
const [boxStatus, setBoxStatus] = useState<ApiRespBoxStatus | null>(null);
|
||||||
|
const [boxSessions, setBoxSessions] = useState<BoxSessionInfo[]>([]);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
const fetchStatus = useCallback(async () => {
|
const fetchStatus = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const [plugin, box] = await Promise.all([
|
const [plugin, box, sessions] = await Promise.all([
|
||||||
httpClient.getPluginSystemStatus().catch(() => null),
|
httpClient.getPluginSystemStatus().catch(() => null),
|
||||||
httpClient.getBoxStatus().catch(() => null),
|
httpClient.getBoxStatus().catch(() => null),
|
||||||
|
httpClient.getBoxSessions().catch(() => [] as BoxSessionInfo[]),
|
||||||
]);
|
]);
|
||||||
setPluginStatus(plugin);
|
setPluginStatus(plugin);
|
||||||
setBoxStatus(box);
|
setBoxStatus(box);
|
||||||
|
setBoxSessions(sessions);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -209,6 +215,37 @@ export default function SystemStatusCard({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
{boxSessions.length > 0 && (
|
||||||
|
<div className="mt-2 space-y-1.5">
|
||||||
|
{boxSessions.map((session) => (
|
||||||
|
<div
|
||||||
|
key={session.session_id}
|
||||||
|
className="rounded border p-1.5 space-y-0.5"
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-1">
|
||||||
|
<Container className="w-3 h-3 text-muted-foreground flex-shrink-0" />
|
||||||
|
<span className="font-mono text-foreground truncate">
|
||||||
|
{session.session_id}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="text-muted-foreground grid grid-cols-2 gap-x-2">
|
||||||
|
<span>
|
||||||
|
{session.image.split(':').pop() || session.image}
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
{session.cpus} CPU / {session.memory_mb}MB
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-1 text-muted-foreground">
|
||||||
|
<Clock className="w-2.5 h-2.5" />
|
||||||
|
<span>
|
||||||
|
{new Date(session.last_used_at).toLocaleString()}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user