Files
sundynix-agentix/sundynix-desktop/frontend/src/shell/LeftNav.tsx
T
Blizzard 8ff68078b7 feat: 知识库管理界面(入库监控 + 检索台)
桌面端「知识库」模块从占位变为可用:入库(切块/embedding/Milvus 监控) +
检索调试台(向量召回,带分数与来源)。

- mcp-go: 新工具 kb_search(返回结构化 JSON [{text,score}]);rag.Hit 加 json 标签
- gateway: POST /api/v1/kb/search → kb_search(结构化命中给检索台)
- desktop: lib/api ingestKb/searchKb;新 KbView(左 入库+监控日志 / 右 检索台命中列表
  带 Milvus 来源徽标+分数);App 接 kb 视图;LeftNav 知识库 ready
- 验证: gateway/mcp-go build✓ + e2e PASS + 前端 build✓;真实浏览器——入库3条→监控
  '已入库3块';语义查询'存储和搜索向量的组件'→Milvus(0.612)>Neo4j>NATS 排序正确,
  全走真实百炼 embedding(控制面下发)+Milvus

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 17:40:32 +08:00

64 lines
2.2 KiB
TypeScript

export type ViewKey =
| "home"
| "studio"
| "kb"
| "report"
| "runs"
| "memory"
| "market"
| "admin";
interface Item {
key: ViewKey;
label: string;
icon: string;
group?: string;
ready?: boolean;
}
const ITEMS: Item[] = [
{ key: "home", label: "工作台", icon: "■" },
{ key: "studio", label: "编排", icon: "◆", group: "BUILD", ready: true },
{ key: "kb", label: "知识库", icon: "▣", group: "BUILD", ready: true },
{ key: "report", label: "报告", icon: "▤", group: "BUILD" },
{ key: "runs", label: "运行", icon: "▸", group: "RUN" },
{ key: "memory", label: "记忆", icon: "◇", group: "MANAGE", ready: true },
{ key: "market", label: "市场", icon: "⌧", group: "MANAGE" },
{ key: "admin", label: "管理", icon: "⚙", group: "MANAGE" },
];
// 左导航栏:模块切换,分组 BUILD / RUN / MANAGE;未就绪模块灰显(规划中)。
export function LeftNav({ active, onSelect }: { active: ViewKey; onSelect: (v: ViewKey) => void }) {
let lastGroup: string | undefined;
return (
<nav className="flex w-20 shrink-0 flex-col border-r bg-gray-50 py-2">
{ITEMS.map((it) => {
const header = it.group && it.group !== lastGroup ? it.group : null;
lastGroup = it.group ?? lastGroup;
return (
<div key={it.key}>
{header && (
<div className="mt-2 px-2 text-[9px] font-semibold tracking-wider text-gray-300">
{header}
</div>
)}
<button
onClick={() => onSelect(it.key)}
className={`flex w-full flex-col items-center gap-0.5 py-2 text-[11px] ${
active === it.key
? "bg-violet-50 font-medium text-violet-700"
: "text-gray-500 hover:bg-gray-100"
}`}
title={it.ready === false ? `${it.label}(规划中)` : it.label}
>
<span className="text-base leading-none">{it.icon}</span>
{it.label}
{it.ready === false && <span className="text-[8px] text-gray-300"></span>}
</button>
</div>
);
})}
</nav>
);
}