diff --git a/web/src/app/home/mcp/components/mcp-form/MCPForm.tsx b/web/src/app/home/mcp/components/mcp-form/MCPForm.tsx
index f2732126..4138d1c5 100644
--- a/web/src/app/home/mcp/components/mcp-form/MCPForm.tsx
+++ b/web/src/app/home/mcp/components/mcp-form/MCPForm.tsx
@@ -6,6 +6,7 @@ import React, {
useImperativeHandle,
} from 'react';
import { useTranslation } from 'react-i18next';
+import { Loader2, XCircle, Trash2 } from 'lucide-react';
import { Resolver, useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
@@ -60,26 +61,7 @@ function StatusDisplay({
if (testing) {
return (
-
+
{t('mcp.testing')}
);
@@ -88,26 +70,7 @@ function StatusDisplay({
if (runtimeInfo.status === MCPSessionStatus.CONNECTING) {
return (
-
+
{t('mcp.connecting')}
);
@@ -116,20 +79,7 @@ function StatusDisplay({
return (
-
+
{t('mcp.connectionFailed')}
{runtimeInfo.error_message && (
@@ -839,14 +789,7 @@ const MCPForm = forwardRef
(function MCPForm(
className="shrink-0 text-red-500 hover:text-red-600"
onClick={() => removeStdioArg(index)}
>
-
+
))}
@@ -892,14 +835,7 @@ const MCPForm = forwardRef
(function MCPForm(
className="shrink-0 text-red-500 hover:text-red-600"
onClick={() => removeExtraArg(index)}
>
-
+
))}
diff --git a/web/src/app/home/monitoring/components/FeedbackCard.tsx b/web/src/app/home/monitoring/components/FeedbackCard.tsx
index 5196fb89..c2e93e52 100644
--- a/web/src/app/home/monitoring/components/FeedbackCard.tsx
+++ b/web/src/app/home/monitoring/components/FeedbackCard.tsx
@@ -6,6 +6,8 @@ import {
TrendingUp,
TrendingDown,
Minus,
+ Heart,
+ Smile,
} from 'lucide-react';
interface FeedbackCardProps {
@@ -133,11 +135,7 @@ export function FeedbackStatsCards({ stats, loading }: FeedbackStatsProps) {
{
title: t('monitoring.feedback.totalFeedback'),
value: stats?.totalFeedback ?? 0,
- icon: (
-
- ),
+ icon:
,
variant: 'default' as const,
},
{
@@ -155,11 +153,7 @@ export function FeedbackStatsCards({ stats, loading }: FeedbackStatsProps) {
{
title: t('monitoring.feedback.satisfactionRate'),
value: stats ? `${stats.satisfactionRate}%` : '0%',
- icon: (
-
- ),
+ icon:
,
variant: (stats && stats.satisfactionRate >= 80
? 'success'
: stats && stats.satisfactionRate >= 50
diff --git a/web/src/app/home/monitoring/components/FeedbackList.tsx b/web/src/app/home/monitoring/components/FeedbackList.tsx
index a64fdec1..10f590f2 100644
--- a/web/src/app/home/monitoring/components/FeedbackList.tsx
+++ b/web/src/app/home/monitoring/components/FeedbackList.tsx
@@ -6,6 +6,7 @@ import {
ChevronRight,
ChevronDown,
ExternalLink,
+ Heart,
} from 'lucide-react';
import { FeedbackRecord } from '../types/monitoring';
import { Button } from '@/components/ui/button';
@@ -40,19 +41,7 @@ export function FeedbackList({
if (!feedback || feedback.length === 0) {
return (
-
+
{t('monitoring.feedback.noFeedback')}
diff --git a/web/src/app/home/monitoring/components/MessageContentRenderer.tsx b/web/src/app/home/monitoring/components/MessageContentRenderer.tsx
index c73a9818..cf11f5f1 100644
--- a/web/src/app/home/monitoring/components/MessageContentRenderer.tsx
+++ b/web/src/app/home/monitoring/components/MessageContentRenderer.tsx
@@ -1,4 +1,5 @@
import React, { useState } from 'react';
+import { Paperclip, AudioLines } from 'lucide-react';
import {
MessageChainComponent,
Image as ImageComponent,
@@ -104,13 +105,7 @@ export function MessageContentRenderer({
key={index}
className="inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded bg-muted text-muted-foreground text-sm"
>
-
+
{file.name || 'File'}
);
@@ -123,13 +118,7 @@ export function MessageContentRenderer({
key={index}
className="inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded bg-muted text-muted-foreground text-sm"
>
-
+
Voice{voice.length ? ` ${voice.length}s` : ''}
);
diff --git a/web/src/app/home/monitoring/components/MessageDetailsCard.tsx b/web/src/app/home/monitoring/components/MessageDetailsCard.tsx
index e50b80d3..ef46cf10 100644
--- a/web/src/app/home/monitoring/components/MessageDetailsCard.tsx
+++ b/web/src/app/home/monitoring/components/MessageDetailsCard.tsx
@@ -1,5 +1,6 @@
import React, { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
+import { Info, Clock, AlertCircle, Braces } from 'lucide-react';
import { MessageDetails } from '../types/monitoring';
interface MessageDetailsCardProps {
@@ -25,14 +26,7 @@ export function MessageDetailsCard({ details }: MessageDetailsCardProps) {
{details.message && (
-
+
{t('monitoring.messageList.viewDetails')}
@@ -92,14 +86,7 @@ export function MessageDetailsCard({ details }: MessageDetailsCardProps) {
{details.llmCalls && details.llmCalls.length > 0 && (
-
+
{t('monitoring.llmCalls.title')} ({details.llmCalls.length})
@@ -183,14 +170,7 @@ export function MessageDetailsCard({ details }: MessageDetailsCardProps) {
{details.errors && details.errors.length > 0 && (
-
+
{t('monitoring.errors.title')} ({details.errors.length})
@@ -227,14 +207,7 @@ export function MessageDetailsCard({ details }: MessageDetailsCardProps) {
details.message?.runnerName !== 'local-agent' && (
-
+
{t('monitoring.queryVariables.title')}
diff --git a/web/src/app/home/monitoring/components/overview-cards/MetricCard.tsx b/web/src/app/home/monitoring/components/overview-cards/MetricCard.tsx
index 7c53e33d..2a3e573d 100644
--- a/web/src/app/home/monitoring/components/overview-cards/MetricCard.tsx
+++ b/web/src/app/home/monitoring/components/overview-cards/MetricCard.tsx
@@ -1,4 +1,5 @@
import React from 'react';
+import { TrendingUp, TrendingDown } from 'lucide-react';
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
interface MetricCardProps {
@@ -61,21 +62,11 @@ export default function MetricCard({
: 'bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400'
}`}
>
-
+ {trend.direction === 'up' ? (
+
+ ) : (
+
+ )}
{Math.abs(trend.value)}%
diff --git a/web/src/app/home/monitoring/components/overview-cards/OverviewCards.tsx b/web/src/app/home/monitoring/components/overview-cards/OverviewCards.tsx
index 5dcc4b18..5ef5226d 100644
--- a/web/src/app/home/monitoring/components/overview-cards/OverviewCards.tsx
+++ b/web/src/app/home/monitoring/components/overview-cards/OverviewCards.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
+import { MessageSquare, Sparkles, Check, Users } from 'lucide-react';
import MetricCard from './MetricCard';
import TrafficChart from './TrafficChart';
import {
@@ -27,15 +28,7 @@ export default function OverviewCards({
{
title: t('monitoring.totalMessages'),
value: metrics?.totalMessages || 0,
- icon: (
-
- ),
+ icon: ,
trend: metrics?.trends
? {
value: metrics.trends.messages,
@@ -48,15 +41,7 @@ export default function OverviewCards({
{
title: t('monitoring.modelCallsCount'),
value: metrics?.modelCalls || 0,
- icon: (
-
- ),
+ icon: ,
trend: metrics?.trends
? {
value: metrics.trends.llmCalls,
@@ -69,15 +54,7 @@ export default function OverviewCards({
{
title: t('monitoring.successRate'),
value: metrics ? `${metrics.successRate}%` : '0%',
- icon: (
-
- ),
+ icon: ,
trend: metrics?.trends
? {
value: metrics.trends.successRate,
@@ -90,15 +67,7 @@ export default function OverviewCards({
{
title: t('monitoring.activeSessions'),
value: metrics?.activeSessions || 0,
- icon: (
-
- ),
+ icon: ,
trend: metrics?.trends
? {
value: metrics.trends.sessions,
diff --git a/web/src/app/home/monitoring/components/overview-cards/TrafficChart.tsx b/web/src/app/home/monitoring/components/overview-cards/TrafficChart.tsx
index d1d82b6e..827623bf 100644
--- a/web/src/app/home/monitoring/components/overview-cards/TrafficChart.tsx
+++ b/web/src/app/home/monitoring/components/overview-cards/TrafficChart.tsx
@@ -1,5 +1,6 @@
import React, { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
+import { BarChart3 } from 'lucide-react';
import {
AreaChart,
Area,
@@ -146,14 +147,7 @@ export default function TrafficChart({
{t('monitoring.trafficChart.title')}
-
+
{t('monitoring.trafficChart.noData')}
diff --git a/web/src/app/home/monitoring/page.tsx b/web/src/app/home/monitoring/page.tsx
index 6fa6f121..a86b83ae 100644
--- a/web/src/app/home/monitoring/page.tsx
+++ b/web/src/app/home/monitoring/page.tsx
@@ -2,7 +2,15 @@ import React, { Suspense, useState, useMemo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Button } from '@/components/ui/button';
-import { ChevronRight, ChevronDown, ExternalLink } from 'lucide-react';
+import {
+ ChevronRight,
+ ChevronDown,
+ ExternalLink,
+ RefreshCw,
+ MessageSquare,
+ Sparkles,
+ CheckCircle2,
+} from 'lucide-react';
import OverviewCards from './components/overview-cards/OverviewCards';
import MonitoringFilters from './components/filters/MonitoringFilters';
import { ExportDropdown } from './components/ExportDropdown';
@@ -278,14 +286,7 @@ function MonitoringPageContent() {
onClick={handleRefresh}
className="shadow-sm flex-shrink-0"
>
-
+
{t('monitoring.refreshData')}
@@ -452,14 +453,7 @@ function MonitoringPageContent() {
{!loading &&
(!data || !data.messages || data.messages.length === 0) && (
-
+
{t('monitoring.messageList.noMessages')}
@@ -665,14 +659,7 @@ function MonitoringPageContent() {
!data.modelCalls ||
data.modelCalls.length === 0) && (
-
+
{t('monitoring.modelCalls.noData')}
@@ -867,14 +854,7 @@ function MonitoringPageContent() {
{!loading &&
(!data || !data.errors || data.errors.length === 0) && (
-
+
{t('monitoring.errors.noErrors')}
diff --git a/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx b/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx
index 89eb9656..c744c850 100644
--- a/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx
+++ b/web/src/app/home/pipelines/components/debug-dialog/ImagePreviewDialog.tsx
@@ -1,4 +1,5 @@
import React from 'react';
+import { X } from 'lucide-react';
interface ImagePreviewDialogProps {
open: boolean;
@@ -28,19 +29,7 @@ export default function ImagePreviewDialog({
onClick={onClose}
className="self-end w-9 h-9 rounded-full bg-white hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-800 dark:text-gray-100 shadow-lg transition-all hover:scale-105 flex items-center justify-center"
>
-
+
{/* 图片 */}
diff --git a/web/src/app/home/pipelines/components/monitoring-tab/PipelineMonitoringTab.tsx b/web/src/app/home/pipelines/components/monitoring-tab/PipelineMonitoringTab.tsx
index bd59b4da..9364d9fe 100644
--- a/web/src/app/home/pipelines/components/monitoring-tab/PipelineMonitoringTab.tsx
+++ b/web/src/app/home/pipelines/components/monitoring-tab/PipelineMonitoringTab.tsx
@@ -2,7 +2,15 @@ import React, { useState, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Button } from '@/components/ui/button';
-import { ChevronRight, ChevronDown, ExternalLink } from 'lucide-react';
+import {
+ ChevronRight,
+ ChevronDown,
+ ExternalLink,
+ RefreshCw,
+ MessageCircle,
+ CheckCircle2,
+ Monitor,
+} from 'lucide-react';
import { useMonitoringData } from '@/app/home/monitoring/hooks/useMonitoringData';
import { MessageContentRenderer } from '@/app/home/monitoring/components/MessageContentRenderer';
import { LoadingSpinner } from '@/components/ui/loading-spinner';
@@ -205,14 +213,7 @@ export default function PipelineMonitoringTab({
onClick={onNavigateToMonitoring}
className="bg-white dark:bg-[#2a2a2e] hover:bg-gray-50 dark:hover:bg-gray-800 border-gray-300 dark:border-gray-600"
>
-
+
{t('pipelines.monitoring.detailedLogs')}
)}
@@ -222,14 +223,7 @@ export default function PipelineMonitoringTab({
onClick={refetch}
className="bg-white dark:bg-[#2a2a2e] hover:bg-gray-50 dark:hover:bg-gray-800 border-gray-300 dark:border-gray-600"
>
-
+
{t('monitoring.refreshData')}
@@ -431,19 +425,7 @@ export default function PipelineMonitoringTab({
{!loading &&
(!data || !data.messages || data.messages.length === 0) && (
-
+
{t('monitoring.messageList.noMessages')}
@@ -543,19 +525,7 @@ export default function PipelineMonitoringTab({
{!loading &&
(!data || !data.errors || data.errors.length === 0) && (
-
+
{t('monitoring.errors.noErrors')}
@@ -638,19 +608,7 @@ export default function PipelineMonitoringTab({
{!loading &&
(!data || !data.llmCalls || data.llmCalls.length === 0) && (
-
+
{t('monitoring.llmCalls.noData')}
diff --git a/web/src/app/home/pipelines/components/pipeline-card/PipelineCard.tsx b/web/src/app/home/pipelines/components/pipeline-card/PipelineCard.tsx
index 27e3b3b5..95ad758a 100644
--- a/web/src/app/home/pipelines/components/pipeline-card/PipelineCard.tsx
+++ b/web/src/app/home/pipelines/components/pipeline-card/PipelineCard.tsx
@@ -1,6 +1,7 @@
import styles from './pipelineCard.module.css';
import { PipelineCardVO } from '@/app/home/pipelines/components/pipeline-card/PipelineCardVO';
import { useTranslation } from 'react-i18next';
+import { Clock, Star } from 'lucide-react';
export default function PipelineCard({ cardVO }: { cardVO: PipelineCardVO }) {
const { t } = useTranslation();
@@ -21,14 +22,7 @@ export default function PipelineCard({ cardVO }: { cardVO: PipelineCardVO }) {
-
+
{t('pipelines.updateTime')}
{cardVO.lastUpdatedTimeAgo}
@@ -39,14 +33,7 @@ export default function PipelineCard({ cardVO }: { cardVO: PipelineCardVO }) {
{cardVO.isDefault && (
-
+
{t('pipelines.defaultBadge')}
diff --git a/web/src/app/home/plugins/components/plugin-installed/PluginInstalledComponent.tsx b/web/src/app/home/plugins/components/plugin-installed/PluginInstalledComponent.tsx
index f0ff7899..e82f921e 100644
--- a/web/src/app/home/plugins/components/plugin-installed/PluginInstalledComponent.tsx
+++ b/web/src/app/home/plugins/components/plugin-installed/PluginInstalledComponent.tsx
@@ -21,6 +21,7 @@ import { extractI18nObject } from '@/i18n/I18nProvider';
import { toast } from 'sonner';
import { useAsyncTask, AsyncTaskStatus } from '@/hooks/useAsyncTask';
import { useSidebarData } from '@/app/home/components/home-sidebar/SidebarDataContext';
+import { Puzzle } from 'lucide-react';
export interface PluginInstalledComponentRef {
refreshPluginList: () => void;
@@ -333,14 +334,7 @@ const PluginInstalledComponent = forwardRef
(
{pluginList.length === 0 ? (
-
+
{t('plugins.noPluginInstalled')}
) : (
diff --git a/web/src/app/home/plugins/mcp-server/MCPServerComponent.tsx b/web/src/app/home/plugins/mcp-server/MCPServerComponent.tsx
index c07b271e..ba638dac 100644
--- a/web/src/app/home/plugins/mcp-server/MCPServerComponent.tsx
+++ b/web/src/app/home/plugins/mcp-server/MCPServerComponent.tsx
@@ -3,6 +3,7 @@ import MCPCardComponent from '@/app/home/plugins/mcp-server/mcp-card/MCPCardComp
import { MCPCardVO } from '@/app/home/plugins/mcp-server/MCPCardVO';
import { useTranslation } from 'react-i18next';
import { MCPSessionStatus } from '@/app/infra/entities/api';
+import { Hexagon } from 'lucide-react';
import { httpClient } from '@/app/infra/http/HttpClient';
@@ -79,14 +80,7 @@ export default function MCPComponent({
) : installedServers.length === 0 ? (
-
+
{t('mcp.noServerInstalled')}
) : (
diff --git a/web/src/app/home/plugins/mcp-server/mcp-card/MCPCardComponent.tsx b/web/src/app/home/plugins/mcp-server/mcp-card/MCPCardComponent.tsx
index 72446dde..9be39a86 100644
--- a/web/src/app/home/plugins/mcp-server/mcp-card/MCPCardComponent.tsx
+++ b/web/src/app/home/plugins/mcp-server/mcp-card/MCPCardComponent.tsx
@@ -6,7 +6,14 @@ import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { toast } from 'sonner';
import { useTranslation } from 'react-i18next';
-import { RefreshCcw, Wrench, Ban, AlertCircle, Loader2 } from 'lucide-react';
+import {
+ RefreshCcw,
+ Wrench,
+ Ban,
+ AlertCircle,
+ Loader2,
+ Link,
+} from 'lucide-react';
import { MCPSessionStatus } from '@/app/infra/entities/api';
export default function MCPCardComponent({
@@ -88,15 +95,10 @@ export default function MCPCardComponent({
onClick={onCardClick}
>
-
+
diff --git a/web/src/app/home/plugins/mcp-server/mcp-form/MCPFormDialog.tsx b/web/src/app/home/plugins/mcp-server/mcp-form/MCPFormDialog.tsx
index 93b8292b..1f5ee3ba 100644
--- a/web/src/app/home/plugins/mcp-server/mcp-form/MCPFormDialog.tsx
+++ b/web/src/app/home/plugins/mcp-server/mcp-form/MCPFormDialog.tsx
@@ -1,5 +1,6 @@
import React, { useState, useEffect, useRef } from 'react';
import { useTranslation } from 'react-i18next';
+import { Loader2, XCircle, Trash2 } from 'lucide-react';
import { Resolver, useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
@@ -60,26 +61,7 @@ function StatusDisplay({
if (testing) {
return (
-
+
{t('mcp.testing')}
);
@@ -89,26 +71,7 @@ function StatusDisplay({
if (runtimeInfo.status === MCPSessionStatus.CONNECTING) {
return (
-
+
{t('mcp.connecting')}
);
@@ -118,20 +81,7 @@ function StatusDisplay({
return (
-
+
{t('mcp.connectionFailed')}
{runtimeInfo.error_message && (
@@ -780,14 +730,7 @@ export default function MCPFormDialog({
className="p-2 hover:bg-gray-100 rounded"
onClick={() => removeStdioArg(index)}
>
-
+
))}
@@ -851,14 +794,7 @@ export default function MCPFormDialog({
className="p-2 hover:bg-gray-100 rounded"
onClick={() => removeExtraArg(index)}
>
-
+
))}
diff --git a/web/src/app/home/plugins/page.tsx b/web/src/app/home/plugins/page.tsx
index 84ca8c56..28b6585f 100644
--- a/web/src/app/home/plugins/page.tsx
+++ b/web/src/app/home/plugins/page.tsx
@@ -16,6 +16,7 @@ import {
Copy,
Check,
Bug,
+ Unlink,
} from 'lucide-react';
import {
DropdownMenu,
@@ -507,15 +508,7 @@ function PluginListView() {
const renderPluginConnectionErrorState = () => (
-
+
{t('plugins.connectionError')}
diff --git a/web/src/app/login/page.tsx b/web/src/app/login/page.tsx
index cd4da632..39c45d5c 100644
--- a/web/src/app/login/page.tsx
+++ b/web/src/app/login/page.tsx
@@ -22,7 +22,14 @@ import {
import { useEffect, useState } from 'react';
import { httpClient, initializeUserInfo } from '@/app/infra/http';
import { useNavigate } from 'react-router-dom';
-import { Mail, Lock, Loader2, AlertCircle, RefreshCw } from 'lucide-react';
+import {
+ Mail,
+ Lock,
+ Loader2,
+ AlertCircle,
+ RefreshCw,
+ Layers,
+} from 'lucide-react';
import langbotIcon from '@/app/assets/langbot-logo.webp';
import { toast } from 'sonner';
import { useTranslation } from 'react-i18next';
@@ -242,34 +249,7 @@ export default function Login() {
{spaceLoading ? (
) : (
-
+
)}
{t('common.loginWithSpace')}
diff --git a/web/src/app/register/page.tsx b/web/src/app/register/page.tsx
index 13042082..04f3e4fb 100644
--- a/web/src/app/register/page.tsx
+++ b/web/src/app/register/page.tsx
@@ -22,7 +22,7 @@ import {
import { useEffect, useState } from 'react';
import { httpClient } from '@/app/infra/http/HttpClient';
import { useNavigate } from 'react-router-dom';
-import { Mail, Lock, Loader2, Info } from 'lucide-react';
+import { Mail, Lock, Loader2, Info, Layers } from 'lucide-react';
import {
Popover,
PopoverContent,
@@ -138,34 +138,7 @@ export default function Register() {
{spaceLoading ? (
) : (
-
+
)}
{t('register.initWithSpace')}