import * as React from 'react' import { BookOpen, Grid2X2, List, Plus, Search } from 'lucide-react' import { AppCreateDialog } from '@/components/app/AppCreateDialog' import { AppDataTable, type AppDataTableColumn } from '@/components/app/AppDataTable' import { AppEmptyState } from '@/components/app/AppEmptyState' import { AppField } from '@/components/app/AppField' import { AppPage } from '@/components/app/AppPage' import { AppPageHeader } from '@/components/app/AppPageHeader' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { InputGroup, InputGroupAddon, InputGroupInput } from '@/components/ui/input-group' import { Textarea } from '@/components/ui/textarea' import { useAgentPageContext } from '@/features/agent-workspace/AgentWorkspaceProvider' import { formatDateTime } from '@/lib/format' import { createKnowledgeBase, listKnowledgeBases } from './api' import type { KnowledgeBase } from './types' type KnowledgeBaseForm = { name: string description: string scope: string } const emptyForm: KnowledgeBaseForm = { name: '', description: '', scope: '' } const columns: AppDataTableColumn[] = [ { key: 'name', header: '名称', cell: (base) => (

{base.name}

{base.description || '暂无描述'}

) }, { key: 'scope', header: '范围', cell: (base) => {base.scope || '-'} }, { key: 'enabled', header: '启用状态', cell: (base) => ( {base.enabled ? '已启用' : '已停用'} ) }, { key: 'updated_at', header: '更新时间', cell: (base) => {formatDateTime(base.updated_at)} } ] export function KnowledgeBaseListPage() { const [bases, setBases] = React.useState([]) const [form, setForm] = React.useState(emptyForm) const [createOpen, setCreateOpen] = React.useState(false) const [creating, setCreating] = React.useState(false) const [createError, setCreateError] = React.useState('') const [error, setError] = React.useState('') const [query, setQuery] = React.useState('') const [viewMode, setViewMode] = React.useState<'grid' | 'list'>('grid') const visibleBases = React.useMemo(() => { const keyword = query.trim().toLowerCase() return keyword ? bases.filter((base) => `${base.name} ${base.description} ${base.scope}`.toLowerCase().includes(keyword)) : bases }, [bases, query]) const agentContext = React.useMemo(() => ({ routeKey: 'knowledge', entityType: 'knowledge-base-list', title: `知识库 · ${bases.length} 个`, status: error ? '加载异常' : '已同步页面数据', metadata: { 启用: String(bases.filter((base) => base.enabled).length), 当前显示: String(visibleBases.length) } }), [bases, error, visibleBases.length]) useAgentPageContext(agentContext) async function load() { try { setBases(await listKnowledgeBases()) setError('') } catch (reason) { setError(reason instanceof Error ? reason.message : '加载知识库失败') } } React.useEffect(() => { void load() }, []) async function handleCreate(event: React.FormEvent) { event.preventDefault() setCreating(true) setCreateError('') try { await createKnowledgeBase(form) setForm(emptyForm) setCreateOpen(false) await load() } catch (reason) { setCreateError(reason instanceof Error ? reason.message : '创建知识库失败') } finally { setCreating(false) } } return ( } />} >
{[['知识库总数', bases.length], ['已启用', bases.filter((base) => base.enabled).length], ['当前结果', visibleBases.length]].map(([label, value], index) => {label}{value})}
setQuery(event.target.value)} placeholder="搜索知识库、范围或描述" />
{ setCreateOpen(open); if (!open) setCreateError('') }} title="新增知识库" description="按业务领域建立知识边界,后续可持续维护文档和知识条目。" submitLabel="创建知识库" onSubmit={handleCreate} pending={creating} error={createError} >
setForm((current) => ({ ...current, name: event.target.value }))} placeholder="例如:税务采集知识库" /> setForm((current) => ({ ...current, scope: event.target.value }))} placeholder="例如:数据采集" />