"use client"; import React, { useState, useEffect } from "react"; import "./knowledge.css"; import { fetchGroups, queryKnowledge, Group, fetchSignals, Signal, parseMetaList, } from "../lib/api"; export default function EntityPanel() { const [searchQuery, setSearchQuery] = useState(""); const [groups, setGroups] = useState([]); const [selectedGroup, setSelectedGroup] = useState(""); const [queryResult, setQueryResult] = useState(null); const [querying, setQuerying] = useState(false); const [topSignals, setTopSignals] = useState([]); const [loadingSignals, setLoadingSignals] = useState(false); useEffect(() => { fetchGroups().then((grps) => { setGroups(grps); if (grps.length > 0) { setSelectedGroup(grps[0].group_id); loadSignals(grps[0].group_id); } }); }, []); async function loadSignals(groupId: string) { setLoadingSignals(true); try { const sigs = await fetchSignals(groupId); setTopSignals(sigs.slice(0, 2)); } catch { setTopSignals([]); } finally { setLoadingSignals(false); } } const handleGroupChange = (groupId: string) => { setSelectedGroup(groupId); setQueryResult(null); loadSignals(groupId); }; const handleSearch = async () => { if (!searchQuery.trim() || !selectedGroup) return; setQuerying(true); setQueryResult(null); try { const res = await queryKnowledge(selectedGroup, searchQuery); setQueryResult(res.answer); } catch { setQueryResult("⚠ Backend unavailable or group has no signals yet."); } finally { setQuerying(false); } }; const selectedGroupData = groups.find((g) => g.group_id === selectedGroup); const topEntities = topSignals .flatMap((s) => parseMetaList(s.metadata.entities)) .filter(Boolean) .slice(0, 4); return (
{/* Group Selector */} {groups.length > 1 && (

Select Group

)} {/* Search Header */}
setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleSearch()} placeholder="Query knowledge base..." className="flex-1 bg-transparent text-[#E9D9FF] placeholder-[#8B7BB1] focus:outline-none text-[13px] font-medium tracking-wide" />
{/* Header */}
{selectedGroupData ? "ACTIVE_GROUP" : "NO_GROUP"} close

{selectedGroup ? selectedGroup.replace(/-/g, "_").toUpperCase() : "Select a group"}

{selectedGroupData ? `${selectedGroupData.signal_count} signals · lens: ${selectedGroupData.lens || "unknown"}` : "No data"}

{/* Query Result */} {queryResult && ( <>

Query Result

{queryResult}

)} {/* Content */}
{/* Primary Insights */}

Signal Overview

Signals

{selectedGroupData?.signal_count ?? "—"}

Lens

{selectedGroupData?.lens?.slice(0, 8) ?? "—"}

{/* Recent Entities */} {topEntities.length > 0 && (

Recent Entities

{topEntities.map((entity, i) => ( {entity} ))}
)} {/* Loading state */} {loadingSignals && (
autorenew Loading signals...
)} {/* Empty state */} {!loadingSignals && selectedGroupData?.signal_count === 0 && (

No signals yet. Send messages to the monitored Telegram group to populate the knowledge base.

)}
{/* Footer Action */}
); }