From 1019cf7f3abe878edd6e3af5c0ca847ecf8e4fae Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Wed, 10 Jun 2026 16:00:53 +0800 Subject: [PATCH 01/11] Move non-shadcn ui component to other folder --- .../agents/components/agentConfig/SkillBuildModal.tsx | 2 +- .../agents/components/agentConfig/SkillDetailModal.tsx | 2 +- frontend/app/[locale]/chat/components/chatAttachment.tsx | 2 +- frontend/app/[locale]/chat/components/chatInput.tsx | 4 ++-- .../app/[locale]/chat/streaming/chatStreamFinalMessage.tsx | 2 +- frontend/app/[locale]/chat/streaming/taskWindow.tsx | 2 +- .../[locale]/knowledges/components/document/DocumentList.tsx | 4 ++-- .../tenant-resources/components/resources/KnowledgeList.tsx | 2 +- frontend/components/{ui => common}/Diagram.tsx | 0 frontend/components/{ui => common}/PdfViewer.tsx | 0 frontend/components/{ui => common}/copyButton.tsx | 0 frontend/components/{ui => common}/filePreviewDrawer.tsx | 4 ++-- frontend/components/{ui => common}/markdownRenderer.tsx | 4 ++-- frontend/components/{ui => common}/tokenUsageIndicator.tsx | 0 14 files changed, 14 insertions(+), 14 deletions(-) rename frontend/components/{ui => common}/Diagram.tsx (100%) rename frontend/components/{ui => common}/PdfViewer.tsx (100%) rename frontend/components/{ui => common}/copyButton.tsx (100%) rename frontend/components/{ui => common}/filePreviewDrawer.tsx (99%) rename frontend/components/{ui => common}/markdownRenderer.tsx (99%) rename frontend/components/{ui => common}/tokenUsageIndicator.tsx (100%) diff --git a/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx b/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx index 7f969edb9..8f040d4b3 100644 --- a/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx +++ b/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx @@ -56,7 +56,7 @@ import { SkillFilesAccessDeniedError, type SkillFileNode, } from "@/services/agentConfigService"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import log from "@/lib/logger"; const { TextArea } = Input; diff --git a/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx b/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx index 4161a3b1a..05f11d6a3 100644 --- a/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx +++ b/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx @@ -10,7 +10,7 @@ import { fetchSkillFileContent, SkillFilesAccessDeniedError, } from "@/services/agentConfigService"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import { buildTreeData, collectDirKeys, diff --git a/frontend/app/[locale]/chat/components/chatAttachment.tsx b/frontend/app/[locale]/chat/components/chatAttachment.tsx index d12e939cd..69dfbc71a 100644 --- a/frontend/app/[locale]/chat/components/chatAttachment.tsx +++ b/frontend/app/[locale]/chat/components/chatAttachment.tsx @@ -19,7 +19,7 @@ import { } from "@/services/storageService"; import { cn } from "@/lib/utils"; import { AttachmentItem, ChatAttachmentProps } from "@/types/chat"; -import { FilePreviewDrawer } from "@/components/ui/filePreviewDrawer"; +import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { App } from "antd"; // Selected file state for preview drawer diff --git a/frontend/app/[locale]/chat/components/chatInput.tsx b/frontend/app/[locale]/chat/components/chatInput.tsx index b609bb999..e53b60a52 100644 --- a/frontend/app/[locale]/chat/components/chatInput.tsx +++ b/frontend/app/[locale]/chat/components/chatInput.tsx @@ -18,7 +18,7 @@ import { Input } from "@/components/ui/input"; import { Button } from "antd"; import { Tooltip } from "@/components/ui/tooltip"; import { Textarea } from "@/components/ui/textarea"; -import { FilePreviewDrawer } from "@/components/ui/filePreviewDrawer"; +import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { conversationService } from "@/services/conversationService"; import { useConfig } from "@/hooks/useConfig"; import { extractColorsFromUri } from "@/lib/avatar"; @@ -27,7 +27,7 @@ import { chatConfig } from "@/const/chatConfig"; import { FilePreview } from "@/types/chat"; import { ChatAgentSelector } from "./chatAgentSelector"; -import { TokenUsageIndicator } from "@/components/ui/tokenUsageIndicator"; +import { TokenUsageIndicator } from "@/components/common/tokenUsageIndicator"; import { TokenMetrics } from "@/types/chat"; // Get file extension diff --git a/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx b/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx index 8ed121b00..40ceaa2eb 100644 --- a/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx +++ b/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx @@ -10,7 +10,7 @@ import { ThumbsUp, } from "lucide-react"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; /** * Convert custom code tags to standard markdown code fences diff --git a/frontend/app/[locale]/chat/streaming/taskWindow.tsx b/frontend/app/[locale]/chat/streaming/taskWindow.tsx index 665ed8467..5a5e7a89a 100644 --- a/frontend/app/[locale]/chat/streaming/taskWindow.tsx +++ b/frontend/app/[locale]/chat/streaming/taskWindow.tsx @@ -13,7 +13,7 @@ import { import { ScrollArea } from "@/components/ui/scrollArea"; import { Button, message as antdMessage } from "antd"; -import { MarkdownRenderer, CodeBlock } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer, CodeBlock } from "@/components/common/markdownRenderer"; import { chatConfig } from "@/const/chatConfig"; import { ChatMessageType, diff --git a/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx b/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx index 0bfbe6467..4f75fd66e 100644 --- a/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx +++ b/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx @@ -18,8 +18,8 @@ import { Glasses, CircleOff, } from "lucide-react"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; -import { FilePreviewDrawer } from "@/components/ui/filePreviewDrawer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; +import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { UI_CONFIG, diff --git a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx index 18d70ad51..b8b00598e 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx @@ -6,7 +6,7 @@ import { Table, Popconfirm, message, Button, Modal, Tag } from "antd"; import { ColumnsType } from "antd/es/table"; import { Edit, Trash2, BookOpen } from "lucide-react"; import { Tooltip } from "@/components/ui/tooltip"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import { useKnowledgeList } from "@/hooks/knowledge/useKnowledgeList"; import { useGroupList } from "@/hooks/group/useGroupList"; import knowledgeBaseService from "@/services/knowledgeBaseService"; diff --git a/frontend/components/ui/Diagram.tsx b/frontend/components/common/Diagram.tsx similarity index 100% rename from frontend/components/ui/Diagram.tsx rename to frontend/components/common/Diagram.tsx diff --git a/frontend/components/ui/PdfViewer.tsx b/frontend/components/common/PdfViewer.tsx similarity index 100% rename from frontend/components/ui/PdfViewer.tsx rename to frontend/components/common/PdfViewer.tsx diff --git a/frontend/components/ui/copyButton.tsx b/frontend/components/common/copyButton.tsx similarity index 100% rename from frontend/components/ui/copyButton.tsx rename to frontend/components/common/copyButton.tsx diff --git a/frontend/components/ui/filePreviewDrawer.tsx b/frontend/components/common/filePreviewDrawer.tsx similarity index 99% rename from frontend/components/ui/filePreviewDrawer.tsx rename to frontend/components/common/filePreviewDrawer.tsx index f36a4db3e..409352e15 100644 --- a/frontend/components/ui/filePreviewDrawer.tsx +++ b/frontend/components/common/filePreviewDrawer.tsx @@ -52,13 +52,13 @@ import { MarkdownRenderer, extractMarkdownHeadings, type MarkdownHeading, -} from "@/components/ui/markdownRenderer"; +} from "@/components/common/markdownRenderer"; import { formatFileSize } from "@/lib/utils"; import log from "@/lib/logger"; const PdfViewer = dynamic( () => - import("@/components/ui/PdfViewer").then((mod) => ({ + import("@/components/common/PdfViewer").then((mod) => ({ default: mod.PdfViewer, })), { diff --git a/frontend/components/ui/markdownRenderer.tsx b/frontend/components/common/markdownRenderer.tsx similarity index 99% rename from frontend/components/ui/markdownRenderer.tsx rename to frontend/components/common/markdownRenderer.tsx index 53dfb6962..93dbcce11 100644 --- a/frontend/components/ui/markdownRenderer.tsx +++ b/frontend/components/common/markdownRenderer.tsx @@ -16,8 +16,8 @@ import { visit } from "unist-util-visit"; import { SearchResult } from "@/types/chat"; import { resolveS3UrlToDataUrl } from "@/services/storageService"; import { Tooltip, TooltipProvider } from "@/components/ui/tooltip"; -import { CopyButton } from "@/components/ui/copyButton"; -import { Diagram } from "@/components/ui/Diagram"; +import { CopyButton } from "@/components/common/copyButton"; +import { Diagram } from "@/components/common/Diagram"; interface MarkdownRendererProps { content: string; diff --git a/frontend/components/ui/tokenUsageIndicator.tsx b/frontend/components/common/tokenUsageIndicator.tsx similarity index 100% rename from frontend/components/ui/tokenUsageIndicator.tsx rename to frontend/components/common/tokenUsageIndicator.tsx From acaaba4e6ac25efb5b9df701a3387f54ae871dad Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Thu, 11 Jun 2026 10:57:39 +0800 Subject: [PATCH 02/11] Bugfix: Fix incomplete display of tenant resources page after window resize --- .../agentConfig/skill/SkillConfigModal.tsx | 2 +- .../[locale]/chat/components/chatInput.tsx | 3 +- .../chat/streaming/chatStreamFinalMessage.tsx | 7 +- .../knowledge/KnowledgeBaseList.tsx | 3 +- .../components/UserManageComp.tsx | 312 +++++++++--------- .../components/resources/GroupList.tsx | 4 +- .../components/resources/InvitationList.tsx | 4 +- .../components/resources/KnowledgeList.tsx | 5 +- .../components/resources/ModelList.tsx | 5 +- .../components/resources/SkillList.tsx | 4 +- .../components/resources/UserList.tsx | 8 +- .../components/common/tokenUsageIndicator.tsx | 2 +- .../skill/InstallOfficialSkillsModal.tsx | 3 +- 13 files changed, 181 insertions(+), 181 deletions(-) diff --git a/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx b/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx index 6f372e2b4..9729007e2 100644 --- a/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx +++ b/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx @@ -12,13 +12,13 @@ import { message, Tag, Skeleton, + Tooltip } from "antd"; import { Settings } from "lucide-react"; import { CloseOutlined } from "@ant-design/icons"; import { Skill, SkillParam } from "@/types/agentConfig"; import { KnowledgeBase } from "@/types/knowledgeBase"; -import { Tooltip } from "@/components/ui/tooltip"; import { saveSkillInstance } from "@/services/agentConfigService"; import KnowledgeBaseSelectorModal from "@/components/tool-config/KnowledgeBaseSelectorModal"; import { diff --git a/frontend/app/[locale]/chat/components/chatInput.tsx b/frontend/app/[locale]/chat/components/chatInput.tsx index e53b60a52..512f940e9 100644 --- a/frontend/app/[locale]/chat/components/chatInput.tsx +++ b/frontend/app/[locale]/chat/components/chatInput.tsx @@ -15,8 +15,7 @@ import { } from "@ant-design/icons"; import { Input } from "@/components/ui/input"; -import { Button } from "antd"; -import { Tooltip } from "@/components/ui/tooltip"; +import { Button, Tooltip } from "antd"; import { Textarea } from "@/components/ui/textarea"; import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { conversationService } from "@/services/conversationService"; diff --git a/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx b/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx index 40ceaa2eb..285225f23 100644 --- a/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx +++ b/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx @@ -30,8 +30,7 @@ const convertToMarkdownCodeFences = (content: string): string => { }); return content; }; -import { Button } from "antd"; -import { Tooltip, TooltipProvider } from "@/components/ui/tooltip"; +import { Button, Tooltip } from "antd"; import { ChatMessageType, MaxStepsInfo } from "@/types/chat"; import { chatConfig, Opinion } from "@/const/chatConfig"; import { conversationService } from "@/services/conversationService"; @@ -403,7 +402,7 @@ function ChatStreamFinalMessageInner({ {/* Tool button */}
- +
{/* Copy button */} - +
)} diff --git a/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx b/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx index 7f4878523..53758147b 100644 --- a/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx +++ b/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx @@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next"; import log from "@/lib/logger"; -import { Button, Input, Select } from "antd"; +import { Button, Input, Select, Tooltip } from "antd"; import { SyncOutlined, PlusOutlined, @@ -19,7 +19,6 @@ import { SquarePen, CircleOff, } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { Can } from "@/components/permission/Can"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; import { useGroupList } from "@/hooks/group/useGroupList"; diff --git a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx b/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx index f4d20ae0b..9c215a0ac 100644 --- a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx +++ b/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx @@ -18,6 +18,8 @@ import { Pagination, Alert, Space, + Divider, + Tooltip } from "antd"; import { Users, @@ -62,7 +64,6 @@ import { useDeployment } from "@/components/providers/deploymentProvider"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; import { USER_ROLES } from "@/const/auth"; import { Can } from "@/components/permission/Can"; -import { Tooltip } from "@/components/ui/tooltip"; import { getPasswordChecks, getStrengthLevel, @@ -1179,167 +1180,170 @@ export default function UserManageComp() { }; return ( -
+
{/* Page header: grouped header without dividing line */} -
- -
-
- -
-
-

- {t("tenantResources.title") || "Tenant Resource Management"} -

-

- {t("tenantResources.subtitle") || - "Manage tenants, users, groups and resources"} -

-
+
+
+
+
- +
+

+ {t("tenantResources.title") || "Tenant Resource Management"} +

+

+ {t("tenantResources.subtitle") || + "Manage tenants, users, groups and resources"} +

+
+
- - - -
-
-
- setTenantId(id)} - tenants={tenantData?.data || []} - total={tenantData?.total} - page={tenantData?.page} - pageSize={tenantData?.page_size} - totalPages={tenantData?.total_pages} - onPageChange={handlePageChange} - onTenantsRefetch={async () => { - setCurrentPage(1); - return refetchTenants(); - }} - loading={tenantsLoading} - t={t} - onUserListRefresh={() => - setUserListRefreshKey((prev) => prev + 1) - } - onInvitationListRefresh={() => - setInvitationListRefreshKey((prev) => prev + 1) - } - locale={locale} - /> +
+
+ + +
+
+
+ setTenantId(id)} + tenants={tenantData?.data || []} + total={tenantData?.total} + page={tenantData?.page} + pageSize={tenantData?.page_size} + totalPages={tenantData?.total_pages} + onPageChange={handlePageChange} + onTenantsRefetch={async () => { + setCurrentPage(1); + return refetchTenants(); + }} + loading={tenantsLoading} + t={t} + onUserListRefresh={() => + setUserListRefreshKey((prev) => prev + 1) + } + onInvitationListRefresh={() => + setInvitationListRefreshKey((prev) => prev + 1) + } + locale={locale} + /> +
-
- - - -
- {/* Tenant name header */} -
- {isEditingTenantName ? ( - setEditingTenantName(e.target.value)} - onBlur={saveTenantName} - onKeyDown={handleTenantNameKeyDown} - className="text-lg font-semibold text-gray-900 dark:text-gray-100" - placeholder={t("tenantResources.tenants.name")} - /> - ) : ( -
-

- {currentTenantName} -

- + + + +
+ {/* Tenant name header */} +
+ {isEditingTenantName ? ( + setEditingTenantName(e.target.value)} + onBlur={saveTenantName} + onKeyDown={handleTenantNameKeyDown} + className="text-lg font-semibold text-gray-900 dark:text-gray-100" + placeholder={t("tenantResources.tenants.name")} + /> + ) : ( +
+

+ {currentTenantName} +

+ +
+ )} + +
+ +
+ +
+ {tenantId ? ( + + ), + }, + { + key: "groups", + label: t("tenantResources.tabs.groups") || "Groups", + children: , + }, + { + key: "models", + label: t("tenantResources.tabs.models") || "Models", + children: , + }, + { + key: "knowledge", + label: + t("tenantResources.tabs.knowledge") || "Knowledge Base", + children: , + }, + { + key: "agents", + label: t("tenantResources.tabs.agents") || "Agents", + children: , + }, + { + key: "mcp", + label: t("tenantResources.tabs.mcp") || "MCP", + children: , + }, + { + key: "skills", + label: "Skills", + children: , + }, + { + key: "invitations", + label: t("tenantResources.invitation.tab") || "Invitations", + children: ( + + ), + }, + ]} + /> + ) : ( +
+
+ +
+

+ {t("tenantResources.selectTenantFirst") || + "Please select a tenant"} +

+

+ {t("tenantResources.selectTenantDescription") || + "Choose a tenant from the list to manage its users, groups, models, and knowledge base."} +

+
+ )}
- )} -
- {tenantId ? ( - - ), - }, - { - key: "groups", - label: t("tenantResources.tabs.groups") || "Groups", - children: , - }, - { - key: "models", - label: t("tenantResources.tabs.models") || "Models", - children: , - }, - { - key: "knowledge", - label: - t("tenantResources.tabs.knowledge") || "Knowledge Base", - children: , - }, - { - key: "agents", - label: t("tenantResources.tabs.agents") || "Agents", - children: , - }, - { - key: "mcp", - label: t("tenantResources.tabs.mcp") || "MCP", - children: , - }, - { - key: "skills", - label: "Skills", - children: , - }, - { - key: "invitations", - label: t("tenantResources.invitation.tab") || "Invitations", - children: ( - - ), - }, - ]} - /> - ) : ( -
-
- -
-

- {t("tenantResources.selectTenantFirst") || - "Please select a tenant"} -

-

- {t("tenantResources.selectTenantDescription") || - "Choose a tenant from the list to manage its users, groups, models, and knowledge base."} -

- )} -
- - +
+ +
+
); } diff --git a/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx index ec3397219..32af131db 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx @@ -12,9 +12,9 @@ import { Popconfirm, message, Select, + Tooltip } from "antd"; import { Edit, Trash2 } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { ColumnsType } from "antd/es/table"; import { useGroupList } from "@/hooks/group/useGroupList"; import { useUserList } from "@/hooks/user/useUserList"; @@ -278,7 +278,7 @@ export default function GroupList({ tenantId }: { tenantId: string | null }) { }; return ( -
+
diff --git a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx index 688fda8b1..648936660 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx @@ -17,6 +17,7 @@ import { Collapse, DatePicker, Progress, + Tooltip } from "antd"; import { ColumnsType } from "antd/es/table"; import { useInvitationList } from "@/hooks/invitation/useInvitationList"; @@ -41,7 +42,6 @@ import { Copy, CircleSlash, } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { formatDate } from "@/lib/date"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; import { @@ -443,7 +443,7 @@ export default function InvitationList({ }, [invitations, tenantId]); return ( -
+
diff --git a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx index b8b00598e..0ca15065c 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx @@ -2,10 +2,9 @@ import React, { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { Table, Popconfirm, message, Button, Modal, Tag } from "antd"; +import { Table, Popconfirm, message, Button, Modal, Tag, Tooltip } from "antd"; import { ColumnsType } from "antd/es/table"; import { Edit, Trash2, BookOpen } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import { useKnowledgeList } from "@/hooks/knowledge/useKnowledgeList"; import { useGroupList } from "@/hooks/group/useGroupList"; @@ -255,7 +254,7 @@ export default function KnowledgeList({ ]; return ( -
+
+
+
), + width: "20%" }, ], [] @@ -207,7 +210,7 @@ export default function UserList({ tenantId, refreshKey }: { tenantId: string | }; return ( -
+
- Date: Thu, 11 Jun 2026 15:14:34 +0800 Subject: [PATCH 03/11] Bugfix: Fix incomplete display of tenant resources page after window resize --- .../components/AssetOwnerResourcesComp.tsx | 16 +++- .../components/UserManageComp.tsx | 16 +++- .../components/resources/AgentList.tsx | 27 ++++--- .../components/resources/InvitationList.tsx | 6 +- .../components/resources/KnowledgeList.tsx | 6 +- .../components/resources/McpList.tsx | 78 +++++++++---------- .../components/resources/ModelList.tsx | 6 +- .../components/resources/SkillList.tsx | 8 +- .../components/resources/UserList.tsx | 6 +- 9 files changed, 96 insertions(+), 73 deletions(-) diff --git a/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx b/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx index 38fb3ceb1..6cf23c0a9 100644 --- a/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx +++ b/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx @@ -54,7 +54,7 @@ export default function AssetOwnerResourcesComp() { ); } + + diff --git a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx b/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx index 9c215a0ac..cfff26fe9 100644 --- a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx +++ b/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx @@ -1234,7 +1234,7 @@ export default function UserManageComp() { -
+
{/* Tenant name header */}
{isEditingTenantName ? ( @@ -1267,7 +1267,7 @@ export default function UserManageComp() { {tenantId ? ( ); } + + diff --git a/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx index 41fbf4c93..2e2383ad5 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx @@ -411,20 +411,19 @@ export default function AgentList({ tenantId }: { tenantId: string | null }) { ]; return ( -
-
-
-
- +
+
+
{/* View Modal */} diff --git a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx index 648936660..6365ab68a 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx @@ -443,7 +443,7 @@ export default function InvitationList({ }, [invitations, tenantId]); return ( -
+
@@ -465,8 +465,8 @@ export default function InvitationList({ loading={isLoading} rowKey="invitation_id" pagination={{ pageSize: 10 }} - scroll={{ x: 1000 }} - className="flex-1" + scroll={{ y: "calc(100vh - 560px)" }} + className="flex-1 [&_.ant-table]:h-full" /> ) : ( // Multi-tenant view with collapse diff --git a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx index 0ca15065c..7b1a703b1 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx @@ -254,15 +254,15 @@ export default function KnowledgeList({ ]; return ( -
+
{/* Edit Knowledge Base Modal */} diff --git a/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx index 19e8e23ae..412ff402f 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx @@ -760,7 +760,7 @@ export default function McpList({ tenantId }: { tenantId: string | null }) { ]; return ( -
+
-
-
- {t("mcpConfig.serverList.title")} -
`${record.service_name}-${record.mcp_url}`} - loading={loading} - size="small" - pagination={{ pageSize: 7 }} - locale={{ emptyText: t("mcpConfig.serverList.empty") }} - /> - +
+ {t("mcpConfig.serverList.title")} +
`${record.service_name}-${record.mcp_url}`} + loading={loading} + size="small" + pagination={{ pageSize: 7 }} + locale={{ emptyText: t("mcpConfig.serverList.empty") }} + scroll={{ y: "calc(100vh - 560px)" }} + className="flex-1 [&_.ant-table]:h-full" + /> -
- {t("mcpConfig.containerList.title")} -
- + {t("mcpConfig.containerList.title")} +
-
- {t("mcpConfig.openapiService.list.title")} -
- + {t("mcpConfig.openapiService.list.title")} +
{/* Add Modal */} diff --git a/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx index b19fd6fc7..6715852f7 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx @@ -360,7 +360,7 @@ export default function ModelList({ tenantId }: { tenantId: string | null }) { ]; return ( -
+
(null); const [savingParams, setSavingParams] = useState(false); @@ -730,8 +729,8 @@ export default function SkillList({ tenantId }: { tenantId: string | null }) { : "closed"; return ( -
-
+
+
Date: Tue, 16 Jun 2026 10:42:47 +0800 Subject: [PATCH 04/11] Bugfix: Fix inability to select agent from agent space to edit --- frontend/app/[locale]/agents/page.tsx | 24 +++++++++++++++++++ .../[locale]/space/components/AgentCard.tsx | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/frontend/app/[locale]/agents/page.tsx b/frontend/app/[locale]/agents/page.tsx index 52d66fe8a..2ef7692d4 100644 --- a/frontend/app/[locale]/agents/page.tsx +++ b/frontend/app/[locale]/agents/page.tsx @@ -12,6 +12,8 @@ import AgentInfoComp from "./components/AgentInfoComp"; import { useAgentConfigStore } from "@/stores/agentConfigStore"; import AgentVersionManage from "./AgentVersionManage"; import AgentSelectorHeader from "./components/AgentSelectorHeader"; +import { searchAgentInfo } from "@/services/agentConfigService"; +import log from "@/lib/logger"; const { Header, Content } = Layout; @@ -21,6 +23,8 @@ export default function AgentSetupOrchestrator() { const enterCreateMode = useAgentConfigStore((state) => state.enterCreateMode); const reset = useAgentConfigStore((state) => state.reset); const setDefaultLlmConfig = useAgentConfigStore((state) => state.setDefaultLlmConfig); + const currentAgentId = useAgentConfigStore((state) => state.currentAgentId); + const setCurrentAgent = useAgentConfigStore((state) => state.setCurrentAgent); const { config } = useConfig(); // Sync default LLM config from load_config @@ -47,6 +51,26 @@ export default function AgentSetupOrchestrator() { } }, [searchParams, enterCreateMode]); + // Handle auto-select agent from URL params (agent_id) + useEffect(() => { + const agentId = searchParams.get('agent_id'); + if (agentId && (!currentAgentId || String(currentAgentId) !== agentId)) { + const loadAgent = async () => { + try { + const result = await searchAgentInfo(parseInt(agentId)); + if (result.success && result.data) { + setCurrentAgent(result.data); + } else { + log.warn("Failed to load agent from URL agent_id:", result.message); + } + } catch (error) { + log.error("Failed to load agent from URL agent_id:", error); + } + }; + loadAgent(); + } + }, [searchParams, currentAgentId, setCurrentAgent]); + // Reset agent selection state when leaving the page useEffect(() => { return () => { diff --git a/frontend/app/[locale]/space/components/AgentCard.tsx b/frontend/app/[locale]/space/components/AgentCard.tsx index 0e005d9be..099694e66 100644 --- a/frontend/app/[locale]/space/components/AgentCard.tsx +++ b/frontend/app/[locale]/space/components/AgentCard.tsx @@ -139,9 +139,9 @@ export default function AgentCard({ agent, onRefresh }: AgentCardProps) { } }; - // Handle edit - navigate to agents view + // Handle edit - navigate to agents view with agent id const handleEdit = () => { - router.push("/agents"); + router.push(`/agents?agent_id=${agent.id}`); }; const queryClient = useQueryClient(); From a2e1487ae2360190ab1e66af0ae111358e7ed2b4 Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Tue, 16 Jun 2026 14:50:35 +0800 Subject: [PATCH 05/11] Bugfix: Display correct version info when viewing agent details --- backend/services/agent_service.py | 8 +++++++- backend/services/agent_version_service.py | 6 +++--- frontend/app/[locale]/space/components/AgentCard.tsx | 5 ++++- frontend/services/agentConfigService.ts | 2 +- test/backend/services/test_agent_service.py | 11 +++++++++-- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/backend/services/agent_service.py b/backend/services/agent_service.py index 4354a32d4..b6cbf42b7 100644 --- a/backend/services/agent_service.py +++ b/backend/services/agent_service.py @@ -73,7 +73,7 @@ from database.attachment_db import upload_fileobj from services.skill_service import SkillService from services.file_management_service import is_allowed_skill_upload_path -from database.agent_version_db import query_version_list +from database.agent_version_db import query_version_list, query_current_version_no from database.group_db import query_group_ids_by_user from database.user_tenant_db import get_user_tenant_by_user_id from database.a2a_agent_db import get_server_agent_ids, query_external_sub_agents @@ -1068,6 +1068,12 @@ async def get_agent_info_impl(agent_id: int, tenant_id: str, version_no: int = 0 agent_info["is_available"] = is_available agent_info["unavailable_reasons"] = unavailable_reasons + # Set current_version_no from draft record (version_no=0) + # This ensures the returned data always has the current published version info + if version_no > 0: + draft_version_no = query_current_version_no(agent_id, tenant_id) + agent_info["current_version_no"] = draft_version_no + return agent_info diff --git a/backend/services/agent_version_service.py b/backend/services/agent_version_service.py index e711da0d6..8ed6e14d4 100644 --- a/backend/services/agent_version_service.py +++ b/backend/services/agent_version_service.py @@ -879,8 +879,8 @@ async def list_published_agents_impl( agent_info['sub_agent_id_list'] = [r['selected_agent_id'] for r in relations_snapshot] agent_info['sub_agent_relations'] = _build_sub_agent_relations(relations_snapshot) - # Add published version info - agent_info['published_version_no'] = current_version_no + # Add current version info + agent_info['current_version_no'] = current_version_no # Check agent availability using the shared function _, unavailable_reasons = check_agent_availability( @@ -934,7 +934,7 @@ async def list_published_agents_impl( "is_new": agent.get("is_new", False), "group_ids": agent.get("group_ids", []), "permission": permission, - "published_version_no": agent.get("published_version_no"), + "current_version_no": agent.get("current_version_no"), "greeting_message": agent.get("greeting_message"), "example_questions": agent.get("example_questions"), }) diff --git a/frontend/app/[locale]/space/components/AgentCard.tsx b/frontend/app/[locale]/space/components/AgentCard.tsx index 099694e66..cd4ecb57a 100644 --- a/frontend/app/[locale]/space/components/AgentCard.tsx +++ b/frontend/app/[locale]/space/components/AgentCard.tsx @@ -166,7 +166,10 @@ export default function AgentCard({ agent, onRefresh }: AgentCardProps) { setShowDetail(true); setIsLoadingDetails(true); try { - const result = await searchAgentInfo(parseInt(agent.id)); + // Use current_version_no if available (the currently published version) + // Falls back to 0 only if not set (for unpublished/draft agents) + const versionNo = agent.current_version_no ?? 0; + const result = await searchAgentInfo(parseInt(agent.id), undefined, versionNo); if (result.success) { setAgentDetails(result.data); } else { diff --git a/frontend/services/agentConfigService.ts b/frontend/services/agentConfigService.ts index 5e53865ad..7e7182baf 100644 --- a/frontend/services/agentConfigService.ts +++ b/frontend/services/agentConfigService.ts @@ -200,7 +200,7 @@ export const fetchPublishedAgentList = async () => { group_ids: agent.group_ids || [], is_new: agent.is_new || false, permission: agent.permission, - published_version_no: agent.published_version_no, + current_version_no: agent.current_version_no, greeting_message: agent.greeting_message, example_questions: agent.example_questions || [], })); diff --git a/test/backend/services/test_agent_service.py b/test/backend/services/test_agent_service.py index ce0ab1406..6cd7b5da4 100644 --- a/test/backend/services/test_agent_service.py +++ b/test/backend/services/test_agent_service.py @@ -505,6 +505,7 @@ async def test_get_agent_info_impl_success(mock_search_agent_info, mock_search_t mock_check_availability.assert_called_once() +@patch('backend.services.agent_service.query_current_version_no') @patch('backend.services.agent_service.SkillService') @patch('backend.services.agent_service.query_external_sub_agents') @patch('backend.services.agent_service.check_agent_availability') @@ -513,7 +514,7 @@ async def test_get_agent_info_impl_success(mock_search_agent_info, mock_search_t @patch('backend.services.agent_service.search_tools_for_sub_agent') @patch('backend.services.agent_service.search_agent_info_by_agent_id') @pytest.mark.asyncio -async def test_get_agent_info_impl_with_version_no(mock_search_agent_info, mock_search_tools, mock_query_sub_agents_id, mock_get_model_by_model_id, mock_check_availability, mock_query_external_sub_agents, mock_skill_service): +async def test_get_agent_info_impl_with_version_no(mock_search_agent_info, mock_search_tools, mock_query_sub_agents_id, mock_get_model_by_model_id, mock_check_availability, mock_query_external_sub_agents, mock_skill_service, mock_query_current_version_no): """ Test get_agent_info_impl with explicit version_no parameter. @@ -549,6 +550,9 @@ async def test_get_agent_info_impl_with_version_no(mock_search_agent_info, mock_ # Mock check_agent_availability - agent is available mock_check_availability.return_value = (True, []) + # Mock query_current_version_no - return 5 as the current version + mock_query_current_version_no.return_value = 5 + # Execute with explicit version_no result = await get_agent_info_impl(agent_id=123, tenant_id="test_tenant", version_no=5) @@ -566,7 +570,8 @@ async def test_get_agent_info_impl_with_version_no(mock_search_agent_info, mock_ "prompt_template_id": 0, "prompt_template_name": "system_default", "is_available": True, - "unavailable_reasons": [] + "unavailable_reasons": [], + "current_version_no": 5 } assert result == expected_result # Verify version_no is passed correctly @@ -576,6 +581,8 @@ async def test_get_agent_info_impl_with_version_no(mock_search_agent_info, mock_ mock_query_sub_agents_id.assert_called_once_with( main_agent_id=123, tenant_id="test_tenant") mock_check_availability.assert_called_once() + # Verify query_current_version_no is called for version_no > 0 + mock_query_current_version_no.assert_called_once_with(123, "test_tenant") @patch('backend.services.agent_service.get_model_by_model_id') From 921fe424028a2e43d83ea3c52121901c420c2cf2 Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Tue, 16 Jun 2026 20:27:19 +0800 Subject: [PATCH 06/11] Bugfix: Adjust agent detail UI layout to accommodate newly added "self-verification" field --- .../agents/components/agentInfo/AgentGenerateDetail.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/app/[locale]/agents/components/agentInfo/AgentGenerateDetail.tsx b/frontend/app/[locale]/agents/components/agentInfo/AgentGenerateDetail.tsx index 24ec60616..69046c8a9 100644 --- a/frontend/app/[locale]/agents/components/agentInfo/AgentGenerateDetail.tsx +++ b/frontend/app/[locale]/agents/components/agentInfo/AgentGenerateDetail.tsx @@ -809,7 +809,7 @@ export default function AgentGenerateDetail({}) { - + - + - + - + Date: Mon, 22 Jun 2026 15:31:34 +0800 Subject: [PATCH 07/11] Refactor: update left navigation menu --- docker/init.sql | 147 +++++++++------ .../sql/v2.2.2_0622_update_left_nav_menu.sql | 101 ++++++++++ .../components/AgentCard.tsx | 0 .../components/AgentDetailModal.tsx | 0 .../[locale]/{space => agent-space}/page.tsx | 0 .../components/McpServiceCard.tsx | 0 .../components/McpServiceDetailModal.tsx | 0 .../components/McpServicesFilterBar.tsx | 0 .../components/PublishConfirmModal.tsx | 0 .../components/PublishedServiceCard.tsx | 0 .../PublishedServiceDetailModal.tsx | 0 .../components/add/AddMcpServiceModal.tsx | 0 .../AddMcpServiceCommunitySection.tsx | 0 .../add/community/McpCommunityCard.tsx | 0 .../add/community/McpCommunityCardList.tsx | 0 .../add/community/McpCommunityDetailModal.tsx | 0 .../add/community/McpCommunityToolbar.tsx | 0 .../add/local/AddMcpServiceLocalSection.tsx | 0 .../registry/AddMcpServiceRegistrySection.tsx | 0 .../add/registry/McpRegistryCard.tsx | 0 .../add/registry/McpRegistryCardList.tsx | 0 .../add/registry/McpRegistryDetailModal.tsx | 0 .../add/registry/McpRegistryToolbar.tsx | 0 .../components/shared/ContainerPortField.tsx | 0 .../components/shared/JsonPreviewModal.tsx | 0 .../components/shared/StatusBadge.tsx | 0 .../components/shared/TagEditor.tsx | 0 .../components/shared/TransportIcon.tsx | 0 .../{mcp-tools => mcp-space}/page.tsx | 0 .../page.tsx | 2 +- .../components/AssetOwnerResourcesComp.tsx | 0 .../components/UserManageComp.tsx | 0 .../components/resources/AgentList.tsx | 0 .../components/resources/GroupList.tsx | 0 .../components/resources/InvitationList.tsx | 0 .../components/resources/KnowledgeList.tsx | 0 .../components/resources/McpList.tsx | 0 .../components/resources/ModelList.tsx | 0 .../components/resources/SkillList.tsx | 0 .../components/resources/UserList.tsx | 0 .../page.tsx | 0 .../{monitoring => skill-space}/page.tsx | 28 +-- .../components/navigation/SideNavigation.tsx | 172 +++++++++++------- frontend/public/locales/en/common.json | 94 +++------- frontend/public/locales/zh/common.json | 68 ++----- .../charts/nexent-common/files/init.sql | 127 ++++++++----- 46 files changed, 440 insertions(+), 299 deletions(-) create mode 100644 docker/sql/v2.2.2_0622_update_left_nav_menu.sql rename frontend/app/[locale]/{space => agent-space}/components/AgentCard.tsx (100%) rename frontend/app/[locale]/{space => agent-space}/components/AgentDetailModal.tsx (100%) rename frontend/app/[locale]/{space => agent-space}/page.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/McpServiceCard.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/McpServiceDetailModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/McpServicesFilterBar.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/PublishConfirmModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/PublishedServiceCard.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/PublishedServiceDetailModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/AddMcpServiceModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/community/AddMcpServiceCommunitySection.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/community/McpCommunityCard.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/community/McpCommunityCardList.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/community/McpCommunityDetailModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/community/McpCommunityToolbar.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/local/AddMcpServiceLocalSection.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/registry/AddMcpServiceRegistrySection.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/registry/McpRegistryCard.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/registry/McpRegistryCardList.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/registry/McpRegistryDetailModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/add/registry/McpRegistryToolbar.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/shared/ContainerPortField.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/shared/JsonPreviewModal.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/shared/StatusBadge.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/shared/TagEditor.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/components/shared/TransportIcon.tsx (100%) rename frontend/app/[locale]/{mcp-tools => mcp-space}/page.tsx (100%) rename frontend/app/[locale]/{asset-owner-resources => owner-manage}/page.tsx (77%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/AssetOwnerResourcesComp.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/UserManageComp.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/AgentList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/GroupList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/InvitationList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/KnowledgeList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/McpList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/ModelList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/SkillList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/components/resources/UserList.tsx (100%) rename frontend/app/[locale]/{tenant-resources => resource-manage}/page.tsx (100%) rename frontend/app/[locale]/{monitoring => skill-space}/page.tsx (74%) diff --git a/docker/init.sql b/docker/init.sql index 046bdecf1..94c8e26f1 100644 --- a/docker/init.sql +++ b/docker/init.sql @@ -916,7 +916,8 @@ CREATE TABLE IF NOT EXISTS nexent.role_permission_t ( user_role VARCHAR(30) NOT NULL, permission_category VARCHAR(30), permission_type VARCHAR(30), - permission_subtype VARCHAR(30) + permission_subtype VARCHAR(30), + parent_key VARCHAR(50) ); -- Add comments for role_permission_t table @@ -926,14 +927,12 @@ COMMENT ON COLUMN nexent.role_permission_t.user_role IS 'User role: SU, ADMIN, D COMMENT ON COLUMN nexent.role_permission_t.permission_category IS 'Permission category'; COMMENT ON COLUMN nexent.role_permission_t.permission_type IS 'Permission type'; COMMENT ON COLUMN nexent.role_permission_t.permission_subtype IS 'Permission subtype'; +COMMENT ON COLUMN nexent.role_permission_t.parent_key IS 'Parent menu key for hierarchical menus, NULL for first-level menus'; -- 6. Insert role permission data after clearing old data DELETE FROM nexent.role_permission_t; INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES -(1, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(2, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(3, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources'), (4, 'SU', 'RESOURCE', 'AGENT', 'READ'), (5, 'SU', 'RESOURCE', 'AGENT', 'DELETE'), (6, 'SU', 'RESOURCE', 'KB', 'READ'), @@ -971,19 +970,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (38, 'SU', 'RESOURCE', 'GROUP', 'READ'), (39, 'SU', 'RESOURCE', 'GROUP', 'UPDATE'), (40, 'SU', 'RESOURCE', 'GROUP', 'DELETE'), -(41, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(42, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(43, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/setup'), -(44, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(45, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(46, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(47, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(48, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-tools'), -(49, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(50, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), -(51, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), -(52, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), -(53, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources'), (54, 'ADMIN', 'RESOURCE', 'AGENT', 'CREATE'), (55, 'ADMIN', 'RESOURCE', 'AGENT', 'READ'), (56, 'ADMIN', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1022,18 +1008,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (89, 'ADMIN', 'RESOURCE', 'GROUP', 'READ'), (90, 'ADMIN', 'RESOURCE', 'GROUP', 'UPDATE'), (91, 'ADMIN', 'RESOURCE', 'GROUP', 'DELETE'), -(92, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(93, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(94, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/setup'), -(95, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(96, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(97, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(98, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(99, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-tools'), -(100, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(101, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), -(102, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), -(103, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), (104, 'DEV', 'RESOURCE', 'AGENT', 'CREATE'), (105, 'DEV', 'RESOURCE', 'AGENT', 'READ'), (106, 'DEV', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1059,10 +1033,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (126, 'DEV', 'RESOURCE', 'MODEL', 'READ'), (127, 'DEV', 'RESOURCE', 'TENANT.INFO', 'READ'), (128, 'DEV', 'RESOURCE', 'GROUP', 'READ'), -(129, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(130, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(131, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), -(132, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), (133, 'USER', 'RESOURCE', 'AGENT', 'READ'), (134, 'USER', 'RESOURCE', 'USER.ROLE', 'READ'), (135, 'USER', 'RESOURCE', 'MEM.SETTING', 'READ'), @@ -1073,17 +1043,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (140, 'USER', 'RESOURCE', 'MEM.PRIVATE', 'DELETE'), (141, 'USER', 'RESOURCE', 'TENANT.INFO', 'READ'), (142, 'USER', 'RESOURCE', 'GROUP', 'READ'), -(143, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(144, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(145, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/setup'), -(146, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(147, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(148, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(149, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(150, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-tools'), -(151, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(152, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), -(153, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), (154, 'SPEED', 'RESOURCE', 'AGENT', 'CREATE'), (155, 'SPEED', 'RESOURCE', 'AGENT', 'READ'), (156, 'SPEED', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1118,13 +1077,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (189, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'READ'), (190, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'UPDATE'), (191, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'DELETE'), -(192, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(193, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(194, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(195, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(196, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(197, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(198, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), (199, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'CREATE'), (200, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'READ'), (201, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1145,10 +1097,95 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (216, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'READ'), (217, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'UPDATE'), (218, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'DELETE'), -(219, 'ASSET_OWNER', 'RESOURCE', 'USER.ROLE', 'READ'), -(220, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), -(221, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/asset-owner-resources') -; +(219, 'ASSET_OWNER', 'RESOURCE', 'USER.ROLE', 'READ'); + +-- SU Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1001, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1002, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); + +-- ADMIN Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1101, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1102, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1103, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1104, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1105, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'), +(1106, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); +-- Agent Development submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1107, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1108, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1109, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1110, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +-- Resource Space submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1111, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1112, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1113, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- DEV Menus (NO /resource-manage, root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1201, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1202, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1203, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1204, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1205, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); +-- Agent Development submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1206, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1207, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1208, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1209, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +-- Resource Space submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1210, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1211, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1212, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- USER Menus (Minimal, all root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1301, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1302, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1303, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), +(1304, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); + +-- SPEED Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1401, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1402, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1403, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1404, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1405, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); +-- Agent Development submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1406, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1407, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1408, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1409, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +-- Resource Space submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1410, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1411, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1412, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- ASSET_OWNER Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1501, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1502, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1503, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1504, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1505, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/owner-manage'); +-- Agent Development submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1506, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1507, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1508, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'); +-- Resource Space submenu +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1509, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1510, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1511, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); -- Insert SPEED role user into user_tenant_t table if not exists INSERT INTO nexent.user_tenant_t (user_id, tenant_id, user_role, user_email, created_by, updated_by) diff --git a/docker/sql/v2.2.2_0622_update_left_nav_menu.sql b/docker/sql/v2.2.2_0622_update_left_nav_menu.sql new file mode 100644 index 000000000..2de41f987 --- /dev/null +++ b/docker/sql/v2.2.2_0622_update_left_nav_menu.sql @@ -0,0 +1,101 @@ +-- ============================================================ +-- Menu Structure Migration V2 +-- Migration Date: 2026-06-22 +-- ============================================================ + +-- Step 1: Clear all existing LEFT_NAV_MENU permissions +DELETE FROM nexent.role_permission_t +WHERE permission_category = 'VISIBILITY' AND permission_type = 'LEFT_NAV_MENU'; + +ALTER TABLE role_permission_t +ADD COLUMN IF NOT EXISTS parent_key VARCHAR(50); +-- ============================================================ +-- New Menu Structure: +-- ROOT: /, /chat, /agent-dev, /resource-space, /resource-manage, /owner-manage, /users +-- AGENT-DEV: /models, /knowledges, /agents, /memory +-- RESOURCE-SPACE: /agent-space, /mcp-space, /skill-space +-- ============================================================ +-- ID Format: xx +-- SU=10xx, ADMIN=11xx, DEV=12xx, USER=13xx, SPEED=14xx, ASSET_OWNER=15xx +-- parent_key: NULL for first-level, parent route for second-level +-- ============================================================ + +-- SU Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1001, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1002, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); + +-- ADMIN Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1101, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1102, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1103, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1104, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1105, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'), +(1106, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1107, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1108, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1109, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1110, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1111, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1112, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1113, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- DEV Menus (NO /resource-manage, root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1201, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1202, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1203, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1204, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1205, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1206, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1207, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1208, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1209, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1210, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1211, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1212, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- USER Menus (Minimal, all root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1301, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1302, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1303, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), +(1304, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); + +-- SPEED Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1401, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1402, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1403, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1404, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1405, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1406, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1407, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1408, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1409, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1410, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1411, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1412, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- ASSET_OWNER Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1501, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1502, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1503, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1504, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1505, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/owner-manage'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1506, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1507, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1508, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1509, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1510, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1511, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); \ No newline at end of file diff --git a/frontend/app/[locale]/space/components/AgentCard.tsx b/frontend/app/[locale]/agent-space/components/AgentCard.tsx similarity index 100% rename from frontend/app/[locale]/space/components/AgentCard.tsx rename to frontend/app/[locale]/agent-space/components/AgentCard.tsx diff --git a/frontend/app/[locale]/space/components/AgentDetailModal.tsx b/frontend/app/[locale]/agent-space/components/AgentDetailModal.tsx similarity index 100% rename from frontend/app/[locale]/space/components/AgentDetailModal.tsx rename to frontend/app/[locale]/agent-space/components/AgentDetailModal.tsx diff --git a/frontend/app/[locale]/space/page.tsx b/frontend/app/[locale]/agent-space/page.tsx similarity index 100% rename from frontend/app/[locale]/space/page.tsx rename to frontend/app/[locale]/agent-space/page.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/McpServiceCard.tsx b/frontend/app/[locale]/mcp-space/components/McpServiceCard.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/McpServiceCard.tsx rename to frontend/app/[locale]/mcp-space/components/McpServiceCard.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/McpServiceDetailModal.tsx b/frontend/app/[locale]/mcp-space/components/McpServiceDetailModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/McpServiceDetailModal.tsx rename to frontend/app/[locale]/mcp-space/components/McpServiceDetailModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/McpServicesFilterBar.tsx b/frontend/app/[locale]/mcp-space/components/McpServicesFilterBar.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/McpServicesFilterBar.tsx rename to frontend/app/[locale]/mcp-space/components/McpServicesFilterBar.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/PublishConfirmModal.tsx b/frontend/app/[locale]/mcp-space/components/PublishConfirmModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/PublishConfirmModal.tsx rename to frontend/app/[locale]/mcp-space/components/PublishConfirmModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/PublishedServiceCard.tsx b/frontend/app/[locale]/mcp-space/components/PublishedServiceCard.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/PublishedServiceCard.tsx rename to frontend/app/[locale]/mcp-space/components/PublishedServiceCard.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/PublishedServiceDetailModal.tsx b/frontend/app/[locale]/mcp-space/components/PublishedServiceDetailModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/PublishedServiceDetailModal.tsx rename to frontend/app/[locale]/mcp-space/components/PublishedServiceDetailModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/AddMcpServiceModal.tsx b/frontend/app/[locale]/mcp-space/components/add/AddMcpServiceModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/AddMcpServiceModal.tsx rename to frontend/app/[locale]/mcp-space/components/add/AddMcpServiceModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/community/AddMcpServiceCommunitySection.tsx b/frontend/app/[locale]/mcp-space/components/add/community/AddMcpServiceCommunitySection.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/community/AddMcpServiceCommunitySection.tsx rename to frontend/app/[locale]/mcp-space/components/add/community/AddMcpServiceCommunitySection.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityCard.tsx b/frontend/app/[locale]/mcp-space/components/add/community/McpCommunityCard.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityCard.tsx rename to frontend/app/[locale]/mcp-space/components/add/community/McpCommunityCard.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityCardList.tsx b/frontend/app/[locale]/mcp-space/components/add/community/McpCommunityCardList.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityCardList.tsx rename to frontend/app/[locale]/mcp-space/components/add/community/McpCommunityCardList.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityDetailModal.tsx b/frontend/app/[locale]/mcp-space/components/add/community/McpCommunityDetailModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityDetailModal.tsx rename to frontend/app/[locale]/mcp-space/components/add/community/McpCommunityDetailModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityToolbar.tsx b/frontend/app/[locale]/mcp-space/components/add/community/McpCommunityToolbar.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/community/McpCommunityToolbar.tsx rename to frontend/app/[locale]/mcp-space/components/add/community/McpCommunityToolbar.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/local/AddMcpServiceLocalSection.tsx b/frontend/app/[locale]/mcp-space/components/add/local/AddMcpServiceLocalSection.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/local/AddMcpServiceLocalSection.tsx rename to frontend/app/[locale]/mcp-space/components/add/local/AddMcpServiceLocalSection.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/registry/AddMcpServiceRegistrySection.tsx b/frontend/app/[locale]/mcp-space/components/add/registry/AddMcpServiceRegistrySection.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/registry/AddMcpServiceRegistrySection.tsx rename to frontend/app/[locale]/mcp-space/components/add/registry/AddMcpServiceRegistrySection.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryCard.tsx b/frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryCard.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryCard.tsx rename to frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryCard.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryCardList.tsx b/frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryCardList.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryCardList.tsx rename to frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryCardList.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryDetailModal.tsx b/frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryDetailModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryDetailModal.tsx rename to frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryDetailModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryToolbar.tsx b/frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryToolbar.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/add/registry/McpRegistryToolbar.tsx rename to frontend/app/[locale]/mcp-space/components/add/registry/McpRegistryToolbar.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/shared/ContainerPortField.tsx b/frontend/app/[locale]/mcp-space/components/shared/ContainerPortField.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/shared/ContainerPortField.tsx rename to frontend/app/[locale]/mcp-space/components/shared/ContainerPortField.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/shared/JsonPreviewModal.tsx b/frontend/app/[locale]/mcp-space/components/shared/JsonPreviewModal.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/shared/JsonPreviewModal.tsx rename to frontend/app/[locale]/mcp-space/components/shared/JsonPreviewModal.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/shared/StatusBadge.tsx b/frontend/app/[locale]/mcp-space/components/shared/StatusBadge.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/shared/StatusBadge.tsx rename to frontend/app/[locale]/mcp-space/components/shared/StatusBadge.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/shared/TagEditor.tsx b/frontend/app/[locale]/mcp-space/components/shared/TagEditor.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/shared/TagEditor.tsx rename to frontend/app/[locale]/mcp-space/components/shared/TagEditor.tsx diff --git a/frontend/app/[locale]/mcp-tools/components/shared/TransportIcon.tsx b/frontend/app/[locale]/mcp-space/components/shared/TransportIcon.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/components/shared/TransportIcon.tsx rename to frontend/app/[locale]/mcp-space/components/shared/TransportIcon.tsx diff --git a/frontend/app/[locale]/mcp-tools/page.tsx b/frontend/app/[locale]/mcp-space/page.tsx similarity index 100% rename from frontend/app/[locale]/mcp-tools/page.tsx rename to frontend/app/[locale]/mcp-space/page.tsx diff --git a/frontend/app/[locale]/asset-owner-resources/page.tsx b/frontend/app/[locale]/owner-manage/page.tsx similarity index 77% rename from frontend/app/[locale]/asset-owner-resources/page.tsx rename to frontend/app/[locale]/owner-manage/page.tsx index 24a3105ce..fedd99714 100644 --- a/frontend/app/[locale]/asset-owner-resources/page.tsx +++ b/frontend/app/[locale]/owner-manage/page.tsx @@ -3,7 +3,7 @@ import React from "react"; import { Flex } from "antd"; -import AssetOwnerResourcesComp from "../tenant-resources/components/AssetOwnerResourcesComp"; +import AssetOwnerResourcesComp from "../resource-manage/components/AssetOwnerResourcesComp"; export default function AssetOwnerResourcesPage() { return ( diff --git a/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx b/frontend/app/[locale]/resource-manage/components/AssetOwnerResourcesComp.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx rename to frontend/app/[locale]/resource-manage/components/AssetOwnerResourcesComp.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx b/frontend/app/[locale]/resource-manage/components/UserManageComp.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx rename to frontend/app/[locale]/resource-manage/components/UserManageComp.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx b/frontend/app/[locale]/resource-manage/components/resources/AgentList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/AgentList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx b/frontend/app/[locale]/resource-manage/components/resources/GroupList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/GroupList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx b/frontend/app/[locale]/resource-manage/components/resources/InvitationList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/InvitationList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx b/frontend/app/[locale]/resource-manage/components/resources/KnowledgeList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/KnowledgeList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx b/frontend/app/[locale]/resource-manage/components/resources/McpList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/McpList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx b/frontend/app/[locale]/resource-manage/components/resources/ModelList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/ModelList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/SkillList.tsx b/frontend/app/[locale]/resource-manage/components/resources/SkillList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/SkillList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/SkillList.tsx diff --git a/frontend/app/[locale]/tenant-resources/components/resources/UserList.tsx b/frontend/app/[locale]/resource-manage/components/resources/UserList.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/components/resources/UserList.tsx rename to frontend/app/[locale]/resource-manage/components/resources/UserList.tsx diff --git a/frontend/app/[locale]/tenant-resources/page.tsx b/frontend/app/[locale]/resource-manage/page.tsx similarity index 100% rename from frontend/app/[locale]/tenant-resources/page.tsx rename to frontend/app/[locale]/resource-manage/page.tsx diff --git a/frontend/app/[locale]/monitoring/page.tsx b/frontend/app/[locale]/skill-space/page.tsx similarity index 74% rename from frontend/app/[locale]/monitoring/page.tsx rename to frontend/app/[locale]/skill-space/page.tsx index d0f502fe6..91bc77465 100644 --- a/frontend/app/[locale]/monitoring/page.tsx +++ b/frontend/app/[locale]/skill-space/page.tsx @@ -3,11 +3,11 @@ import React from "react"; import { motion } from "framer-motion"; import { useTranslation } from "react-i18next"; -import { Activity } from "lucide-react"; +import { Sparkles } from "lucide-react"; import { useSetupFlow } from "@/hooks/useSetupFlow"; -export default function MonitoringContent({}) { +export default function SkillSpaceContent({}) { const { t } = useTranslation("common"); const { pageVariants, pageTransition } = useSetupFlow(); return ( @@ -26,9 +26,9 @@ export default function MonitoringContent({}) { initial={{ scale: 0 }} animate={{ scale: 1 }} transition={{ delay: 0.2, type: "spring", stiffness: 200 }} - className="w-24 h-24 rounded-full bg-gradient-to-br from-emerald-500 to-sky-600 flex items-center justify-center shadow-lg" + className="w-24 h-24 rounded-full bg-gradient-to-br from-violet-500 to-fuchsia-600 flex items-center justify-center shadow-lg" > - + - {t("monitoring.comingSoon.title")} + {t("skillSpace.comingSoon.title")} - {t("monitoring.comingSoon.description")} + {t("skillSpace.comingSoon.description")}
  • - + - {t("monitoring.comingSoon.feature1")} + {t("skillSpace.comingSoon.feature1")}
  • - + - {t("monitoring.comingSoon.feature2")} + {t("skillSpace.comingSoon.feature2")}
  • - + - {t("monitoring.comingSoon.feature3")} + {t("skillSpace.comingSoon.feature3")}
  • @@ -79,9 +79,9 @@ export default function MonitoringContent({}) { initial={{ opacity: 0, scale: 0.8 }} animate={{ opacity: 1, scale: 1 }} transition={{ delay: 0.6 }} - className="px-4 py-2 bg-gradient-to-r from-emerald-500 to-sky-600 text-white rounded-full text-sm font-medium shadow-md" + className="px-4 py-2 bg-gradient-to-r from-violet-500 to-fuchsia-600 text-white rounded-full text-sm font-medium shadow-md" > - {t("monitoring.comingSoon.badge")} + {t("skillSpace.comingSoon.badge")} diff --git a/frontend/components/navigation/SideNavigation.tsx b/frontend/components/navigation/SideNavigation.tsx index dbef5ace0..479bf3fb6 100644 --- a/frontend/components/navigation/SideNavigation.tsx +++ b/frontend/components/navigation/SideNavigation.tsx @@ -7,17 +7,14 @@ import { Menu, ConfigProvider } from "antd"; import { Bot, Globe, - Zap, Settings, BookOpen, - User, Database, - ShoppingBag, Code, Home, Puzzle, - Activity, Building2, + Zap, } from "lucide-react"; import type { MenuProps } from "antd"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; @@ -42,6 +39,14 @@ interface RouteConfig { Icon: React.ComponentType<{ className?: string }>; labelKey: string; order: number; + parentKey?: string | null; +} + +/** + * Processed route with children for nested menus + */ +interface ProcessedRoute extends RouteConfig { + children: RouteConfig[]; } /** @@ -49,55 +54,22 @@ interface RouteConfig { * All available routes with their metadata */ const ROUTE_CONFIG: RouteConfig[] = [ - { path: "/", Icon: Home, labelKey: "sidebar.homePage", order: 0 }, - { path: "/chat", Icon: Bot, labelKey: "sidebar.startChat", order: 1 }, - { path: "/setup", Icon: Zap, labelKey: "sidebar.quickConfig", order: 2 }, - { path: "/space", Icon: Globe, labelKey: "sidebar.agentSpace", order: 3 }, - { - path: "/market", - Icon: ShoppingBag, - labelKey: "sidebar.agentMarket", - order: 4, - }, - { path: "/agents", Icon: Code, labelKey: "sidebar.agentDev", order: 5 }, - { - path: "/knowledges", - Icon: BookOpen, - labelKey: "sidebar.knowledgeBase", - order: 6, - }, - { - path: "/mcp-tools", - Icon: Puzzle, - labelKey: "sidebar.mcpToolsManagement", - order: 7, - }, - { - path: "/monitoring", - Icon: Activity, - labelKey: "sidebar.monitoringManagement", - order: 8, - }, - { - path: "/models", - Icon: Settings, - labelKey: "sidebar.modelManagement", - order: 9, - }, - { - path: "/memory", - Icon: Database, - labelKey: "sidebar.memoryManagement", - order: 10, - }, - { path: "/users", Icon: User, labelKey: "sidebar.userManagement", order: 11 }, - { - path: "/tenant-resources", - Icon: Building2, - labelKey: "sidebar.tenantResources", - order: 12, - }, - { path: "/asset-owner-resources", Icon: Building2, labelKey: "sidebar.assetOwnerResources", order: 13 }, + { path: "/", Icon: Home, labelKey: "sidebar.homePage", order: 0, parentKey: null }, + { path: "/chat", Icon: Bot, labelKey: "sidebar.startChat", order: 1, parentKey: null }, + // Agent Development submenu + { path: "/agent-dev", Icon: Code, labelKey: "sidebar.agentDev", order: 2, parentKey: null }, + { path: "/models", Icon: Settings, labelKey: "sidebar.modelManagement", order: 3, parentKey: "/agent-dev" }, + { path: "/knowledges", Icon: BookOpen, labelKey: "sidebar.knowledgeBase", order: 4, parentKey: "/agent-dev" }, + { path: "/agents", Icon: Bot, labelKey: "sidebar.agentDev", order: 5, parentKey: "/agent-dev" }, + { path: "/memory", Icon: Database, labelKey: "sidebar.memoryManagement", order: 6, parentKey: "/agent-dev" }, + // Resource Space submenu + { path: "/resource-space", Icon: Globe, labelKey: "sidebar.resourceSpace", order: 7, parentKey: null }, + { path: "/agent-space", Icon: Bot, labelKey: "sidebar.agentSpace", order: 8, parentKey: "/resource-space" }, + { path: "/mcp-space", Icon: Puzzle, labelKey: "sidebar.mcpSpace", order: 9, parentKey: "/resource-space" }, + { path: "/skill-space", Icon: Zap, labelKey: "sidebar.skillSpace", order: 10, parentKey: "/resource-space" }, + // Management menus + { path: "/resource-manage", Icon: Building2, labelKey: "sidebar.resourceManage", order: 11, parentKey: null }, + { path: "/owner-manage", Icon: Building2, labelKey: "sidebar.ownerManage", order: 12, parentKey: null }, ]; /** @@ -118,16 +90,27 @@ export function SideNavigation({ collapsed }: SideNavigationProps) { const pathname = usePathname(); const [selectedKey, setSelectedKey] = useState("/"); + const [openKeys, setOpenKeys] = useState([]); const [pendingNavigationPath, setPendingNavigationPath] = useState< string | null >(null); const isCollapsed = typeof collapsed === "boolean" ? collapsed : false; - // Update selected key when pathname changes + // Find parent key for a given path + const findParentKey = (path: string): string | null => { + const route = ROUTE_CONFIG.find((r) => r.path === path); + return route?.parentKey || null; + }; + + // Update selected key and expand parent menu when pathname changes useEffect(() => { const currentPath = getEffectiveRoutePath(pathname); - const matchedKey = ROUTE_PATHS.includes(currentPath) ? currentPath : "/"; - setSelectedKey(matchedKey); + const matchedKey = ROUTE_PATHS.includes(currentPath) ? currentPath : null; + setSelectedKey(matchedKey || ""); + + // Auto-expand parent menu when visiting child page + const parentKey = findParentKey(currentPath); + setOpenKeys(parentKey ? [parentKey] : []); }, [pathname]); // Listen for login success event and navigate to pending path @@ -160,15 +143,38 @@ export function SideNavigation({ collapsed }: SideNavigationProps) { }, []); // Filter and sort routes based on accessibleRoutes from authorization context - const accessibleMenuItems = useMemo((): RouteConfig[] => { + // Build nested menu structure with parent-child relationships + const accessibleMenuItems = useMemo((): ProcessedRoute[] => { if (!accessibleRoutes || accessibleRoutes.length === 0) { - // If no accessibleRoutes available, show all routes (fallback) return []; } - return ROUTE_CONFIG.filter((route) => + const filtered = ROUTE_CONFIG.filter((route) => accessibleRoutes.includes(route.path) - ).sort((a, b) => a.order - b.order); + ); + + // Separate root items and children + const rootItems = filtered + .filter((route) => !route.parentKey || route.parentKey === null) + .sort((a, b) => a.order - b.order); + + const childrenByParent = new Map(); + filtered + .filter((route) => route.parentKey && route.parentKey !== null) + .sort((a, b) => a.order - b.order) + .forEach((route) => { + const parent = route.parentKey!; + if (!childrenByParent.has(parent)) { + childrenByParent.set(parent, []); + } + childrenByParent.get(parent)!.push(route); + }); + + // Build nested structure + return rootItems.map((root) => ({ + ...root, + children: childrenByParent.get(root.path) || [], + })); }, [accessibleRoutes]); /** @@ -207,8 +213,48 @@ export function SideNavigation({ collapsed }: SideNavigationProps) { }; }; - // Generate menu items from accessible routes - const menuItems: MenuProps["items"] = accessibleMenuItems.map(createMenuItem); + // Build menu items from accessible routes with nested submenus + const buildMenuItems = (): MenuProps["items"] => { + return accessibleMenuItems.map((item) => { + // If this item has children, create a submenu + if (item.children && item.children.length > 0) { + return { + key: item.path, + icon: , + label: t(item.labelKey), + children: item.children.map((child) => ({ + key: child.path, + icon: , + label: t(child.labelKey), + onClick: () => { + setSelectedKey(child.path); + if (!isAuthenticated && !isSpeedMode && child.path !== "/") { + setPendingNavigationPath(child.path); + casService.getConfig().then((config) => { + if ( + !authFlowState.isExplicitLogoutInProgress() && + config.enabled && + config.login_mode === "force" + ) { + casService.startLogin(child.path); + return; + } + openAuthPromptModal(); + }); + return; + } + router.push(child.path); + }, + })), + }; + } + + // Regular menu item + return createMenuItem(item); + }); + }; + + const menuItems: MenuProps["items"] = buildMenuItems(); return ( @@ -226,6 +272,8 @@ export function SideNavigation({ collapsed }: SideNavigationProps) { mode="inline" inlineCollapsed={isCollapsed} selectedKeys={[selectedKey]} + openKeys={openKeys} + onOpenChange={setOpenKeys} items={menuItems} className="bg-transparent border-r-0 h-full" /> diff --git a/frontend/public/locales/en/common.json b/frontend/public/locales/en/common.json index c3ccbd6c0..86dc7a601 100644 --- a/frontend/public/locales/en/common.json +++ b/frontend/public/locales/en/common.json @@ -1614,12 +1614,17 @@ "sidebar.homePage": "Home Page", "sidebar.startChat": "Start Chat", "sidebar.quickConfig": "Quick Setup", + "sidebar.resourceSpace": "Resource Space", "sidebar.agentSpace": "Agent Space", + "sidebar.mcpSpace": "MCP Space", + "sidebar.skillSpace": "Skill Space", "sidebar.agentMarket": "Agent Market", "sidebar.agentDev": "Agent Development", "sidebar.knowledgeBase": "Knowledge Base", "sidebar.modelManagement": "Model Management", "sidebar.memoryManagement": "Memory Management", + "sidebar.resourceManage": "Resource Management", + "sidebar.ownerManage": "Owner Management", "sidebar.userManagement": "Profile", "sidebar.tenantResources": "Tenant Resources", "sidebar.assetOwnerResources": "Asset Administrator Resources", @@ -1872,7 +1877,7 @@ "mcpTools.comingSoon.feature2": "Sync, inspect, and organize MCP tools", "mcpTools.comingSoon.feature3": "Monitor MCP connectivity and usage status", "mcpTools.comingSoon.badge": "Coming Soon", - "mcpTools.page.title": "MCP Service Management", + "mcpTools.page.title": "MCP Space", "mcpTools.page.subtitle": "Manage local and public-market MCP services in one place, with search, add, and enable controls.", "mcpTools.page.searchPlaceholder": "Search by MCP service name, description, or tags", "mcpTools.page.resultCount": "{{count}} results", @@ -2144,13 +2149,19 @@ "mcpTools.detail.noDescription": "No description provided", "mcpTools.detail.editBasic": "Edit", - "monitoring.comingSoon.title": "Monitoring & Operations Coming Soon", - "monitoring.comingSoon.description": "Unified monitoring and operations center for your Agents. Track health, performance, and incidents in real time.", - "monitoring.comingSoon.feature1": "Monitor Agent health, latency, and error rates", - "monitoring.comingSoon.feature2": "View and filter Agent logs and run history", - "monitoring.comingSoon.feature3": "Configure alerts and operational actions for critical events", - "monitoring.comingSoon.badge": "Coming Soon", "monitoring.topbar.openDashboard": "Open monitoring dashboard", + "monitoring.dashboard.timeRange.24h": "Last 24h", + "monitoring.dashboard.timeRange.7d": "Last 7d", + "monitoring.dashboard.timeRange.30d": "Last 30d", + "monitoring.dashboard.refresh": "Refresh", + "monitoring.table.requests": "Requests", + "monitoring.table.errorRate": "Error Rate", + "monitoring.table.avgDuration": "Avg Duration", + "monitoring.table.avgTTFT": "Avg TTFT", + "monitoring.table.tokens": "Tokens", + "monitoring.table.tokenGenerationRate": "Token Gen Rate", + "monitoring.time.ms": "ms", + "monitoring.unit.tokensPerSec": "tokens/sec", "market.title": "Agent Market", "market.description": "Discover and download pre-built intelligent Agents", @@ -2781,67 +2792,10 @@ "collaborativeAgent.internalAgents": "Internal Agents", "collaborativeAgent.externalAgents": "External Agents", "collaborativeAgent.addExternal": "Add External Agent", - "monitoring.comingSoon.title": "Monitoring coming soon", - "monitoring.comingSoon.description": "Stay tuned for real-time monitoring features across your agents.", - "monitoring.comingSoon.feature1": "Health checks and uptime monitoring", - "monitoring.comingSoon.feature2": "Real-time logs and alerts", - "monitoring.comingSoon.feature3": "Performance metrics and dashboards", - "monitoring.comingSoon.badge": "Coming Soon", - "monitoring.topbar.openDashboard": "Open monitoring dashboard", - "monitoring.dashboard.title": "Model Monitoring", - "monitoring.dashboard.subtitle": "Monitor model performance and health in real time", - "monitoring.dashboard.totalRequests": "Total Requests", - "monitoring.dashboard.errorRate": "Error Rate", - "monitoring.dashboard.avgDuration": "Average Duration", - "monitoring.dashboard.totalTokens": "Total Tokens", - "monitoring.dashboard.avgTTFT": "Average TTFT", - "monitoring.dashboard.tokenGenerationRate": "Token Generation Rate", - "monitoring.dashboard.models": "All Models", - "monitoring.dashboard.alerts": "Alerts", - "monitoring.dashboard.timeRange.24h": "Last 24h", - "monitoring.dashboard.timeRange.7d": "Last 7d", - "monitoring.dashboard.timeRange.30d": "Last 30d", - "monitoring.dashboard.refresh": "Refresh", - "monitoring.dashboard.autoRefresh": "Auto Refresh", - "monitoring.table.modelName": "Model Name", - "monitoring.table.requests": "Requests", - "monitoring.table.errorRate": "Error Rate", - "monitoring.table.avgDuration": "Avg Duration", - "monitoring.table.avgTTFT": "Avg TTFT", - "monitoring.table.tokens": "Tokens", - "monitoring.table.tokenGenerationRate": "Token Gen Rate", - "monitoring.table.status": "Status", - "monitoring.table.severity": "Severity", - "monitoring.table.type": "Type", - "monitoring.table.message": "Message", - "monitoring.table.createdAt": "Created At", - "monitoring.detail.overview": "Overview", - "monitoring.detail.trends": "Trend Analysis", - "monitoring.detail.errors": "Error Analysis", - "monitoring.detail.performance": "Performance Metrics", - "monitoring.detail.totalRequests": "Total Requests", - "monitoring.detail.errorRate": "Error Rate", - "monitoring.detail.avgDuration": "Average Response Time", - "monitoring.detail.p50Duration": "P50 Latency", - "monitoring.detail.p95Duration": "P95 Latency", - "monitoring.detail.p99Duration": "P99 Latency", - "monitoring.detail.avgTTFT": "Average TTFT", - "monitoring.detail.inputTokens": "Input Tokens", - "monitoring.detail.outputTokens": "Output Tokens", - "monitoring.detail.totalTokens": "Total Tokens", - "monitoring.detail.tokenGenerationRate": "Token Generation Rate", - "monitoring.detail.mockData": "Mock Data", - "monitoring.detail.errorBreakdown": "Error Breakdown", - "monitoring.errors.noErrors": "No errors", - "monitoring.errors.timestamp": "Time", - "monitoring.errors.type": "Error Type", - "monitoring.errors.errorMessage": "Error Message", - "monitoring.errors.duration": "Duration", - "monitoring.errors.statusCode": "Status Code", - "monitoring.time.ms": "ms", - "monitoring.time.seconds": "seconds", - "monitoring.unit.tokens": "tokens", - "monitoring.unit.tokensPerSec": "tokens/sec", - "monitoring.unit.requests": "requests", - "monitoring.unit.usd": "USD" + "skillSpace.comingSoon.title": "Skill Space Coming Soon", + "skillSpace.comingSoon.description": "A powerful marketplace to discover, install, and manage AI skills for your agents. Extend capabilities with pre-built skill packs.", + "skillSpace.comingSoon.feature1": "Browse and install community-built skills", + "skillSpace.comingSoon.feature2": "Create and publish your own skill packs", + "skillSpace.comingSoon.feature3": "Version control and skill dependency management", + "skillSpace.comingSoon.badge": "Coming Soon" } diff --git a/frontend/public/locales/zh/common.json b/frontend/public/locales/zh/common.json index 09b8bcd4a..5457a4d82 100644 --- a/frontend/public/locales/zh/common.json +++ b/frontend/public/locales/zh/common.json @@ -1535,7 +1535,7 @@ "diagram.format.selectFormat": "选择格式", "diagram.error.renderFailed": "渲染失败", - "space.title": "智能体空间", + "space.title": "Agent 空间", "space.description": "管理和使用您的智能体", "space.createAgent": "创建智能体", "space.noAgents": "暂无智能体,创建您的第一个智能体吧!", @@ -1585,12 +1585,17 @@ "sidebar.homePage": "首页", "sidebar.startChat": "开始问答", "sidebar.quickConfig": "快速配置", - "sidebar.agentSpace": "智能体空间", + "sidebar.resourceSpace": "资源空间", + "sidebar.agentSpace": "Agent 空间", + "sidebar.mcpSpace": "MCP 空间", + "sidebar.skillSpace": "Skill 空间", "sidebar.agentMarket": "智能体市场", "sidebar.agentDev": "智能体开发", "sidebar.knowledgeBase": "知识库", "sidebar.modelManagement": "模型管理", "sidebar.memoryManagement": "记忆管理", + "sidebar.resourceManage": "资源管理", + "sidebar.ownerManage": "资产管理", "sidebar.userManagement": "个人信息", "sidebar.tenantResources": "租户资源", "sidebar.assetOwnerResources": "资产管理员资源", @@ -2003,7 +2008,7 @@ "mcpTools.comingSoon.feature2": "同步、查看和组织 MCP 工具列表", "mcpTools.comingSoon.feature3": "监控 MCP 连接状态和使用情况", "mcpTools.comingSoon.badge": "即将推出", - "mcpTools.page.title": "MCP 服务管理", + "mcpTools.page.title": "MCP 空间", "mcpTools.page.subtitle": "统一管理本地与公共市场的 MCP 服务,支持搜索、添加与启用配置。", "mcpTools.page.searchPlaceholder": "搜索 MCP 服务名称、描述或标签", "mcpTools.page.resultCount": "{{count}} 个结果", @@ -2275,69 +2280,26 @@ "mcpTools.detail.noDescription": "暂无描述", "mcpTools.detail.editBasic": "编辑", - "monitoring.comingSoon.title": "监控与运维中心即将推出", - "monitoring.comingSoon.description": "面向智能体的统一监控与运维中心,用于实时跟踪健康状态、性能指标与异常事件。", - "monitoring.comingSoon.feature1": "监控智能体健康状态、延迟与错误率", - "monitoring.comingSoon.feature2": "查看并筛选智能体运行日志和历史任务", - "monitoring.comingSoon.feature3": "配置告警策略与关键事件的运维操作", - "monitoring.comingSoon.badge": "即将推出", "monitoring.topbar.openDashboard": "打开监控面板", - "monitoring.dashboard.title": "模型监控", - "monitoring.dashboard.subtitle": "实时监控模型性能和健康状况", - "monitoring.dashboard.totalRequests": "总请求数", - "monitoring.dashboard.errorRate": "错误率", - "monitoring.dashboard.avgDuration": "平均耗时", - "monitoring.dashboard.totalTokens": "总Token数", - "monitoring.dashboard.avgTTFT": "平均首Token时间", - "monitoring.dashboard.tokenGenerationRate": "Token生成速率", - "monitoring.dashboard.models": "全部模型", - "monitoring.dashboard.alerts": "告警", "monitoring.dashboard.timeRange.24h": "最近 24 小时", "monitoring.dashboard.timeRange.7d": "最近 7 天", "monitoring.dashboard.timeRange.30d": "最近 30 天", "monitoring.dashboard.refresh": "刷新", - "monitoring.dashboard.autoRefresh": "自动刷新", - "monitoring.table.modelName": "模型名称", "monitoring.table.requests": "请求数", "monitoring.table.errorRate": "错误率", "monitoring.table.avgDuration": "平均耗时", "monitoring.table.avgTTFT": "平均首Token时间", "monitoring.table.tokens": "Token数", "monitoring.table.tokenGenerationRate": "Token生成速率", - "monitoring.table.status": "状态", - "monitoring.table.severity": "严重程度", - "monitoring.table.type": "类型", - "monitoring.table.message": "消息", - "monitoring.table.createdAt": "创建时间", - "monitoring.detail.overview": "概览", - "monitoring.detail.trends": "趋势分析", - "monitoring.detail.errors": "错误分析", - "monitoring.detail.performance": "性能指标", - "monitoring.detail.totalRequests": "总请求数", - "monitoring.detail.errorRate": "错误率", - "monitoring.detail.avgDuration": "平均响应时间", - "monitoring.detail.p50Duration": "P50 延迟", - "monitoring.detail.p95Duration": "P95 延迟", - "monitoring.detail.p99Duration": "P99 延迟", - "monitoring.detail.avgTTFT": "平均首Token时间", - "monitoring.detail.inputTokens": "输入Token数", - "monitoring.detail.outputTokens": "输出Token数", - "monitoring.detail.totalTokens": "总Token数", - "monitoring.detail.tokenGenerationRate": "Token生成速率", - "monitoring.detail.mockData": "模拟数据", - "monitoring.detail.errorBreakdown": "错误分类", - "monitoring.errors.noErrors": "暂无错误", - "monitoring.errors.timestamp": "时间", - "monitoring.errors.type": "错误类型", - "monitoring.errors.errorMessage": "错误信息", - "monitoring.errors.duration": "耗时", - "monitoring.errors.statusCode": "状态码", "monitoring.time.ms": "毫秒", - "monitoring.time.seconds": "秒", - "monitoring.unit.tokens": "tokens", "monitoring.unit.tokensPerSec": "tokens/秒", - "monitoring.unit.requests": "请求", - "monitoring.unit.usd": "美元", + + "skillSpace.comingSoon.title": "技能空间即将推出", + "skillSpace.comingSoon.description": "强大的技能市场,用于发现、安装和管理面向智能体的 AI 技能。使用预置技能包扩展能力。", + "skillSpace.comingSoon.feature1": "浏览并安装社区创建的技能", + "skillSpace.comingSoon.feature2": "创建并发布自己的技能包", + "skillSpace.comingSoon.feature3": "版本控制与技能依赖管理", + "skillSpace.comingSoon.badge": "即将推出", "common.loading": "加载中", "common.save": "保存", diff --git a/k8s/helm/nexent/charts/nexent-common/files/init.sql b/k8s/helm/nexent/charts/nexent-common/files/init.sql index a2f202b90..1155648ca 100644 --- a/k8s/helm/nexent/charts/nexent-common/files/init.sql +++ b/k8s/helm/nexent/charts/nexent-common/files/init.sql @@ -912,7 +912,8 @@ CREATE TABLE IF NOT EXISTS nexent.role_permission_t ( user_role VARCHAR(30) NOT NULL, permission_category VARCHAR(30), permission_type VARCHAR(30), - permission_subtype VARCHAR(30) + permission_subtype VARCHAR(30), + parent_key VARCHAR(50) ); -- Add comments for role_permission_t table @@ -922,14 +923,12 @@ COMMENT ON COLUMN nexent.role_permission_t.user_role IS 'User role: SU, ADMIN, D COMMENT ON COLUMN nexent.role_permission_t.permission_category IS 'Permission category'; COMMENT ON COLUMN nexent.role_permission_t.permission_type IS 'Permission type'; COMMENT ON COLUMN nexent.role_permission_t.permission_subtype IS 'Permission subtype'; +COMMENT ON COLUMN nexent.role_permission_t.parent_key IS 'Parent menu key for hierarchical menus, NULL for first-level menus'; -- 6. Insert role permission data after clearing old data DELETE FROM nexent.role_permission_t; INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES -(1, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(2, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(3, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources'), (4, 'SU', 'RESOURCE', 'AGENT', 'READ'), (5, 'SU', 'RESOURCE', 'AGENT', 'DELETE'), (6, 'SU', 'RESOURCE', 'KB', 'READ'), @@ -967,19 +966,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (38, 'SU', 'RESOURCE', 'GROUP', 'READ'), (39, 'SU', 'RESOURCE', 'GROUP', 'UPDATE'), (40, 'SU', 'RESOURCE', 'GROUP', 'DELETE'), -(41, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(42, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(43, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/setup'), -(44, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(45, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(46, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(47, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(48, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-tools'), -(49, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(50, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), -(51, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), -(52, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), -(53, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/tenant-resources'), (54, 'ADMIN', 'RESOURCE', 'AGENT', 'CREATE'), (55, 'ADMIN', 'RESOURCE', 'AGENT', 'READ'), (56, 'ADMIN', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1018,18 +1004,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (89, 'ADMIN', 'RESOURCE', 'GROUP', 'READ'), (90, 'ADMIN', 'RESOURCE', 'GROUP', 'UPDATE'), (91, 'ADMIN', 'RESOURCE', 'GROUP', 'DELETE'), -(92, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(93, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(94, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/setup'), -(95, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(96, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(97, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(98, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(99, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-tools'), -(100, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(101, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), -(102, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), -(103, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), (104, 'DEV', 'RESOURCE', 'AGENT', 'CREATE'), (105, 'DEV', 'RESOURCE', 'AGENT', 'READ'), (106, 'DEV', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1055,10 +1029,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (126, 'DEV', 'RESOURCE', 'MODEL', 'READ'), (127, 'DEV', 'RESOURCE', 'TENANT.INFO', 'READ'), (128, 'DEV', 'RESOURCE', 'GROUP', 'READ'), -(129, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(130, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(131, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), -(132, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'), (133, 'USER', 'RESOURCE', 'AGENT', 'READ'), (134, 'USER', 'RESOURCE', 'USER.ROLE', 'READ'), (135, 'USER', 'RESOURCE', 'MEM.SETTING', 'READ'), @@ -1069,17 +1039,6 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (140, 'USER', 'RESOURCE', 'MEM.PRIVATE', 'DELETE'), (141, 'USER', 'RESOURCE', 'TENANT.INFO', 'READ'), (142, 'USER', 'RESOURCE', 'GROUP', 'READ'), -(143, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), -(144, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), -(145, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/setup'), -(146, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'), -(147, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'), -(148, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'), -(149, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'), -(150, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-tools'), -(151, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/monitoring'), -(152, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'), -(153, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), (154, 'SPEED', 'RESOURCE', 'AGENT', 'CREATE'), (155, 'SPEED', 'RESOURCE', 'AGENT', 'READ'), (156, 'SPEED', 'RESOURCE', 'AGENT', 'UPDATE'), @@ -1111,6 +1070,86 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (186, 'SPEED', 'RESOURCE', 'TENANT.INVITE', 'UPDATE'), (187, 'SPEED', 'RESOURCE', 'TENANT.INVITE', 'DELETE'); +-- SU Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1001, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1002, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); + +-- ADMIN Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1101, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1102, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1103, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1104, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1105, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'), +(1106, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1107, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1108, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1109, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1110, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1111, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1112, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1113, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- DEV Menus (NO /resource-manage, root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1201, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1202, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1203, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1204, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1205, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1206, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1207, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1208, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1209, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1210, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1211, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1212, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- USER Menus (Minimal, all root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1301, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1302, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1303, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory'), +(1304, 'USER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); + +-- SPEED Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1401, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1402, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1403, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1404, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1405, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1406, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1407, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1408, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), +(1409, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1410, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1411, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1412, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + +-- ASSET_OWNER Menus (root level) +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype) VALUES +(1501, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'), +(1502, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'), +(1503, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), +(1504, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), +(1505, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/owner-manage'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1506, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), +(1507, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), +(1508, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'); +INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES +(1509, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), +(1510, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), +(1511, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/skill-space', '/resource-space'); + -- Insert SPEED role user into user_tenant_t table if not exists INSERT INTO nexent.user_tenant_t (user_id, tenant_id, user_role, user_email, created_by, updated_by) VALUES ('user_id', 'tenant_id', 'SPEED', '', 'system', 'system') From 1805069138039b5332e1b30611bd4e31cf4a13ae Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Mon, 22 Jun 2026 15:35:36 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/app/[locale]/setup/page.tsx | 162 --------------------------- 1 file changed, 162 deletions(-) delete mode 100644 frontend/app/[locale]/setup/page.tsx diff --git a/frontend/app/[locale]/setup/page.tsx b/frontend/app/[locale]/setup/page.tsx deleted file mode 100644 index fb06ba386..000000000 --- a/frontend/app/[locale]/setup/page.tsx +++ /dev/null @@ -1,162 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { Steps, Button } from "antd"; -import { ChevronLeft, ChevronRight, Check } from "lucide-react"; -import { useSetupFlow } from "@/hooks/useSetupFlow"; -import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; -import { useDeployment } from "@/components/providers/deploymentProvider"; -import ModelsContent from "../models/page"; -import KnowledgesContent from "../knowledges/page"; -import AgentSetupOrchestrator from "../agents/page"; - -type SetupStep = "models" | "knowledges" | "agents"; - -export default function SetupPage() { - const { t, router } = useSetupFlow({}); - - // Get auth state directly from providers - const { isSpeedMode } = useDeployment(); - const { user } = useAuthorizationContext(); - - const [currentStepIndex, setCurrentStepIndex] = useState(0); - const [isSaving, setIsSaving] = useState(false); - - const steps = [ - { - key: "models" as SetupStep, - title: t("setup.model.description"), - }, - { - key: "knowledges" as SetupStep, - title: t("setup.knowledge.description"), - }, - { - key: "agents" as SetupStep, - title: t("setup.agent.description"), - }, - ]; - - const [completed, setCompleted] = useState( - new Array(steps.length).fill(false) - ); - - const currentStep = steps[currentStepIndex]; - const isFirstStep = currentStepIndex === 0; - const isLastStep = currentStepIndex === steps.length - 1; - - const handleNext = () => { - // mark current as completed then advance (unless last) - setCompleted((prev) => { - const next = [...prev]; - next[currentStepIndex] = true; - return next; - }); - if (!isLastStep) { - setCurrentStepIndex((i) => i + 1); - } else { - // last step -> complete - router.push("/chat"); - } - }; - - const handleBack = () => { - if (!isFirstStep) { - // Mark current step as incomplete when going back - setCompleted((prev) => { - const next = [...prev]; - next[currentStepIndex - 1] = false; - return next; - }); - setCurrentStepIndex((i) => i - 1); - } - }; - - const handleComplete = () => { - router.push("/chat"); - }; - - const renderStepContent = () => { - switch (currentStep.key) { - case "models": - return ; - case "knowledges": - return ; - case "agents": - return ; - default: - return null; - } - }; - - - return ( -
    - {/* Top fixed Steps bar */} -
    -
    - { - // allow jumping only to already completed steps or current - if (idx <= currentStepIndex || completed[idx]) { - setCurrentStepIndex(idx); - } - }} - size="default" - items={steps.map((s, i) => ({ - title: s.title, - status: completed[i] - ? "finish" - : i === currentStepIndex - ? "process" - : "wait", - icon: completed[i] ? : undefined, - }))} - /> -
    -
    - - {/* Main container*/} -
    - {/* Main Content area */} - {renderStepContent()} -
    - - {/* Bottom fixed action bar */} -
    -
    - - {!isLastStep ? ( - - ) : ( - - )} -
    -
    -
    - ); -} From 272788d93f9cd2f8e46402c264c30820fc08787e Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Mon, 22 Jun 2026 15:41:36 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/init.sql | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docker/init.sql b/docker/init.sql index 94c8e26f1..5b0ff025b 100644 --- a/docker/init.sql +++ b/docker/init.sql @@ -1112,13 +1112,11 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (1104, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), (1105, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'), (1106, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); --- Agent Development submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1107, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), (1108, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), (1109, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), (1110, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); --- Resource Space submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1111, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), (1112, 'ADMIN', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), @@ -1131,13 +1129,11 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (1203, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), (1204, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), (1205, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'); --- Agent Development submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1206, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), (1207, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), (1208, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), (1209, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); --- Resource Space submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1210, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), (1211, 'DEV', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), @@ -1157,13 +1153,11 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (1403, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), (1404, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), (1405, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-manage'); --- Agent Development submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1406, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), (1407, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), (1408, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'), (1409, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/memory', '/agent-dev'); --- Resource Space submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1410, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), (1411, 'SPEED', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), @@ -1176,12 +1170,10 @@ INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_ (1503, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-dev'), (1504, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/resource-space'), (1505, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/owner-manage'); --- Agent Development submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1506, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/models', '/agent-dev'), (1507, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges', '/agent-dev'), (1508, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents', '/agent-dev'); --- Resource Space submenu INSERT INTO nexent.role_permission_t (role_permission_id, user_role, permission_category, permission_type, permission_subtype, parent_key) VALUES (1509, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agent-space', '/resource-space'), (1510, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/mcp-space', '/resource-space'), From 246f918c54b2854e5ffc0d26c0d0a799f53356a6 Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Mon, 22 Jun 2026 16:00:19 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/components/navigation/SideNavigation.tsx | 8 ++++---- frontend/public/locales/en/common.json | 4 ++++ frontend/public/locales/zh/common.json | 7 ++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/frontend/components/navigation/SideNavigation.tsx b/frontend/components/navigation/SideNavigation.tsx index 479bf3fb6..a2ce2f42f 100644 --- a/frontend/components/navigation/SideNavigation.tsx +++ b/frontend/components/navigation/SideNavigation.tsx @@ -58,10 +58,10 @@ const ROUTE_CONFIG: RouteConfig[] = [ { path: "/chat", Icon: Bot, labelKey: "sidebar.startChat", order: 1, parentKey: null }, // Agent Development submenu { path: "/agent-dev", Icon: Code, labelKey: "sidebar.agentDev", order: 2, parentKey: null }, - { path: "/models", Icon: Settings, labelKey: "sidebar.modelManagement", order: 3, parentKey: "/agent-dev" }, - { path: "/knowledges", Icon: BookOpen, labelKey: "sidebar.knowledgeBase", order: 4, parentKey: "/agent-dev" }, - { path: "/agents", Icon: Bot, labelKey: "sidebar.agentDev", order: 5, parentKey: "/agent-dev" }, - { path: "/memory", Icon: Database, labelKey: "sidebar.memoryManagement", order: 6, parentKey: "/agent-dev" }, + { path: "/models", Icon: Settings, labelKey: "sidebar.modelConfig", order: 3, parentKey: "/agent-dev" }, + { path: "/knowledges", Icon: BookOpen, labelKey: "sidebar.knowledgeBaseConfig", order: 4, parentKey: "/agent-dev" }, + { path: "/agents", Icon: Bot, labelKey: "sidebar.agentConfig", order: 5, parentKey: "/agent-dev" }, + { path: "/memory", Icon: Database, labelKey: "sidebar.memoryConfig", order: 6, parentKey: "/agent-dev" }, // Resource Space submenu { path: "/resource-space", Icon: Globe, labelKey: "sidebar.resourceSpace", order: 7, parentKey: null }, { path: "/agent-space", Icon: Bot, labelKey: "sidebar.agentSpace", order: 8, parentKey: "/resource-space" }, diff --git a/frontend/public/locales/en/common.json b/frontend/public/locales/en/common.json index 86dc7a601..458317f87 100644 --- a/frontend/public/locales/en/common.json +++ b/frontend/public/locales/en/common.json @@ -1630,6 +1630,10 @@ "sidebar.assetOwnerResources": "Asset Administrator Resources", "sidebar.mcpToolsManagement": "MCP Tools", "sidebar.monitoringManagement": "Monitoring & Ops", + "sidebar.agentConfig": "Agent Configuration", + "sidebar.knowledgeBaseConfig": "Knowledge Base Configuration", + "sidebar.modelConfig": "Model Configuration", + "sidebar.memoryConfig": "Memory Configuration", "tenantResources.create": "Create", "tenantResources.subtitle": "Manage tenants, users, groups and resources", diff --git a/frontend/public/locales/zh/common.json b/frontend/public/locales/zh/common.json index 5457a4d82..37cb863ce 100644 --- a/frontend/public/locales/zh/common.json +++ b/frontend/public/locales/zh/common.json @@ -1591,9 +1591,10 @@ "sidebar.skillSpace": "Skill 空间", "sidebar.agentMarket": "智能体市场", "sidebar.agentDev": "智能体开发", - "sidebar.knowledgeBase": "知识库", - "sidebar.modelManagement": "模型管理", - "sidebar.memoryManagement": "记忆管理", + "sidebar.agentConfig": "智能体配置", + "sidebar.knowledgeBaseConfig": "知识库配置", + "sidebar.modelConfig": "模型配置", + "sidebar.memoryConfig": "记忆配置", "sidebar.resourceManage": "资源管理", "sidebar.ownerManage": "资产管理", "sidebar.userManagement": "个人信息", From d315d0a66e29519367082686e981c46175c18959 Mon Sep 17 00:00:00 2001 From: xuyaqist Date: Tue, 23 Jun 2026 20:25:55 +0800 Subject: [PATCH 11/11] Bugfix: Fix i18n translation issues in navigation sidebar --- frontend/public/locales/zh/common.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/public/locales/zh/common.json b/frontend/public/locales/zh/common.json index 4735f22c5..90925d18b 100644 --- a/frontend/public/locales/zh/common.json +++ b/frontend/public/locales/zh/common.json @@ -1593,10 +1593,10 @@ "sidebar.homePage": "首页", "sidebar.startChat": "开始问答", "sidebar.quickConfig": "快速配置", - "sidebar.resourceSpace": "资源空间", - "sidebar.agentSpace": "Agent 空间", - "sidebar.mcpSpace": "MCP 空间", - "sidebar.skillSpace": "Skill 空间", + "sidebar.resourceSpace": "资源仓库", + "sidebar.agentSpace": "Agent 仓库", + "sidebar.mcpSpace": "MCP 仓库", + "sidebar.skillSpace": "Skill 仓库", "sidebar.agentMarket": "智能体市场", "sidebar.agentDev": "智能体开发", "sidebar.agentConfig": "智能体配置",