From b3acd570f72ba9a70cd58fdc62e316c15d0f8b31 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Thu, 22 Aug 2024 13:43:19 +0800 Subject: [PATCH] 4.8.10 test (#2470) * i18n * perf: invoice type * fix: helper line change error * perf: base64 image * perf: app list ui * perf: upload max size check * perf: init system plugin * perf: dataset list ui * perf: http node ui * perf: ui * perf: invoice tip * fix: ts * perf: invoice table * perf: null check --- .../zh-cn/docs/development/upgrading/4810.md | 12 +- .../core/workflow/template/system/http468.ts | 4 +- packages/global/support/user/team/type.d.ts | 10 +- packages/global/support/wallet/bill/type.d.ts | 3 +- packages/service/common/file/multer.ts | 4 + .../core/workflow/dispatch/tools/http468.ts | 3 +- packages/web/i18n/en/dataset.json | 1 + packages/web/i18n/en/user.json | 3 + packages/web/i18n/zh/common.json | 3 +- packages/web/i18n/zh/dataset.json | 1 + packages/web/i18n/zh/user.json | 3 + projects/app/.env.template | 2 +- .../app/src/components/Markdown/img/Image.tsx | 6 +- .../app/src/components/Markdown/index.tsx | 7 +- .../src/components/common/NextHead/index.tsx | 1 + .../app/src/pages/account/components/Info.tsx | 10 +- .../components/bill/ApplyInvoiceModal.tsx | 98 ++-- .../components/bill/BillAndInvoice.tsx | 21 +- .../account/components/bill/BillTable.tsx | 25 +- .../components/bill/InvoiceHeaderForm.tsx | 289 +++++------ .../account/components/bill/InvoiceTable.tsx | 4 +- .../app/src/pages/api/common/file/upload.ts | 2 +- .../dataset/collection/create/localFile.ts | 2 +- .../Flow/hooks/useWorkflow.tsx | 8 +- .../Flow/nodes/NodeHttp/index.tsx | 77 ++- .../Flow/nodes/render/NodeCard.tsx | 2 +- .../src/pages/app/list/components/List.tsx | 4 +- projects/app/src/pages/app/list/index.tsx | 2 +- .../pages/dataset/detail/components/Info.tsx | 14 +- .../dataset/list/component/CreateModal.tsx | 28 +- .../src/pages/dataset/list/component/List.tsx | 457 +++++++++--------- .../pages/dataset/list/component/SideTag.tsx | 12 +- projects/app/src/service/mongo.ts | 10 +- 33 files changed, 576 insertions(+), 552 deletions(-) diff --git a/docSite/content/zh-cn/docs/development/upgrading/4810.md b/docSite/content/zh-cn/docs/development/upgrading/4810.md index 886a512c7..76c7ee46e 100644 --- a/docSite/content/zh-cn/docs/development/upgrading/4810.md +++ b/docSite/content/zh-cn/docs/development/upgrading/4810.md @@ -34,8 +34,10 @@ STORE_LOG_LEVEL=warn 7. 商业版新增 - SSO 定制 8. 优化 - 知识库集合禁用,目录禁用会递归修改其下所有 children 的禁用状态。 9. 优化 - 节点选择,避免切换 tab 时候,path 加载报错。 -10. 修复 - Prompt 模式调用工具,stream=false 模式下,会携带 0: 开头标记。 -11. 修复 - 对话日志鉴权问题:仅为 APP 管理员的用户,无法查看对话日志详情。 -12. 修复 - 选择 Milvus 部署时,无法导出知识库。 -13. 修复 - 创建 APP 副本,无法复制系统配置。 -14. 修复 - 图片识别模式下,自动解析图片链接正则不够严谨问题。 +10. 优化 - 最新 React Markdown 组件,支持 Base64 图片。 +11. 优化 - 知识库列表 UI。 +12. 修复 - Prompt 模式调用工具,stream=false 模式下,会携带 0: 开头标记。 +13. 修复 - 对话日志鉴权问题:仅为 APP 管理员的用户,无法查看对话日志详情。 +14. 修复 - 选择 Milvus 部署时,无法导出知识库。 +15. 修复 - 创建 APP 副本,无法复制系统配置。 +16. 修复 - 图片识别模式下,自动解析图片链接正则不够严谨问题。 diff --git a/packages/global/core/workflow/template/system/http468.ts b/packages/global/core/workflow/template/system/http468.ts index ebd2837ec..d5eff3f90 100644 --- a/packages/global/core/workflow/template/system/http468.ts +++ b/packages/global/core/workflow/template/system/http468.ts @@ -49,8 +49,8 @@ export const HttpNode468: FlowNodeTemplateType = { renderTypeList: [FlowNodeInputTypeEnum.custom], valueType: WorkflowIOValueTypeEnum.number, label: '', - value: 120, - min: 30, + value: 30, + min: 5, max: 600, required: true }, diff --git a/packages/global/support/user/team/type.d.ts b/packages/global/support/user/team/type.d.ts index 325e2e63b..f359797a1 100644 --- a/packages/global/support/user/team/type.d.ts +++ b/packages/global/support/user/team/type.d.ts @@ -94,11 +94,11 @@ export type LafAccountType = { export type TeamInvoiceHeaderType = { teamName: string; unifiedCreditCode: string; - companyAddress: string; - companyPhone: string; - bankName: string; - bankAccount: string; - needSpecialInvoice?: boolean; + companyAddress?: string; + companyPhone?: string; + bankName?: string; + bankAccount?: string; + needSpecialInvoice: boolean; emailAddress: string; }; diff --git a/packages/global/support/wallet/bill/type.d.ts b/packages/global/support/wallet/bill/type.d.ts index 7f38797a2..2820bc37c 100644 --- a/packages/global/support/wallet/bill/type.d.ts +++ b/packages/global/support/wallet/bill/type.d.ts @@ -36,9 +36,10 @@ export type InvoiceType = { } & TeamInvoiceHeaderType; export type InvoiceSchemaType = { - teamId: string; _id: string; + teamId: string; status: 1 | 2; createTime: Date; finishTime?: Date; + file?: Buffer; } & InvoiceType; diff --git a/packages/service/common/file/multer.ts b/packages/service/common/file/multer.ts index a1c531d1a..1ffa00a91 100644 --- a/packages/service/common/file/multer.ts +++ b/packages/service/common/file/multer.ts @@ -14,8 +14,12 @@ type FileType = { size: number; }; +/* + maxSize: File max size (MB) +*/ export const getUploadModel = ({ maxSize = 500 }: { maxSize?: number }) => { maxSize *= 1024 * 1024; + class UploadModel { uploader = multer({ limits: { diff --git a/packages/service/core/workflow/dispatch/tools/http468.ts b/packages/service/core/workflow/dispatch/tools/http468.ts index 72eb168a2..0b9ab1ec9 100644 --- a/packages/service/core/workflow/dispatch/tools/http468.ts +++ b/packages/service/core/workflow/dispatch/tools/http468.ts @@ -31,6 +31,7 @@ type HttpRequestProps = ModuleDispatchProps<{ [NodeInputKeyEnum.httpParams]: PropsArrType[]; [NodeInputKeyEnum.httpJsonBody]: string; [NodeInputKeyEnum.addInputParam]: Record; + [NodeInputKeyEnum.httpTimeout]?: number; [key: string]: any; }>; type HttpResponse = DispatchNodeResultType<{ @@ -57,7 +58,7 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise { const [renderSrc, setRenderSrc] = useState(src); + if (src?.includes('base64') && !src.startsWith('data:image')) { + return Invalid base64 image; + } + return ( { + return val; + }, []); + return ( {formatSource} diff --git a/projects/app/src/components/common/NextHead/index.tsx b/projects/app/src/components/common/NextHead/index.tsx index 823607154..580b131ab 100644 --- a/projects/app/src/components/common/NextHead/index.tsx +++ b/projects/app/src/components/common/NextHead/index.tsx @@ -9,6 +9,7 @@ const NextHead = ({ title, icon, desc }: { title?: string; icon?: string; desc?: name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no, viewport-fit=cover" /> + {desc && } {icon && } diff --git a/projects/app/src/pages/account/components/Info.tsx b/projects/app/src/pages/account/components/Info.tsx index a813007da..8a832c476 100644 --- a/projects/app/src/pages/account/components/Info.tsx +++ b/projects/app/src/pages/account/components/Info.tsx @@ -409,7 +409,7 @@ const PlanUsage = () => { return standardPlan ? ( - + {t('common:support.wallet.subscription.Team plan and usage')} @@ -428,7 +428,7 @@ const PlanUsage = () => { borderColor={'borderColor.low'} borderRadius={'md'} > - + {t('common:support.wallet.subscription.Current plan')} @@ -475,8 +475,10 @@ const PlanUsage = () => { > - {t('common:info.resource')} - + + {t('common:info.resource')} + + {t('common:info.include')} diff --git a/projects/app/src/pages/account/components/bill/ApplyInvoiceModal.tsx b/projects/app/src/pages/account/components/bill/ApplyInvoiceModal.tsx index d820bf179..a7e1bb815 100644 --- a/projects/app/src/pages/account/components/bill/ApplyInvoiceModal.tsx +++ b/projects/app/src/pages/account/components/bill/ApplyInvoiceModal.tsx @@ -32,52 +32,25 @@ import MyBox from '@fastgpt/web/components/common/MyBox'; import { getTeamInvoiceHeader } from '@/web/support/user/team/api'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useRouter } from 'next/router'; +import { useForm } from 'react-hook-form'; + type chosenBillDataType = { _id: string; price: number; }; + const ApplyInvoiceModal = ({ onClose }: { onClose: () => void }) => { const { t } = useTranslation(); - const { toast } = useToast(); + const router = useRouter(); + const [chosenBillDataList, setChosenBillDataList] = useState([]); const [totalPrice, setTotalPrice] = useState(0); - const [formData, setFormData] = useState({ - teamName: '', - unifiedCreditCode: '', - companyAddress: '', - companyPhone: '', - bankName: '', - bankAccount: '', - needSpecialInvoice: undefined, - emailAddress: '' - }); - - const router = useRouter(); const { isOpen: isOpenSettleModal, onOpen: onOpenSettleModal, onClose: onCloseSettleModal } = useDisclosure(); - const handleChange = useCallback((e: any) => { - const { name, value } = e.target; - setFormData((prev) => ({ ...prev, [name]: value })); - }, []); - - const handleRatiosChange = useCallback((v: string) => { - setFormData((prev) => ({ ...prev, needSpecialInvoice: v === 'true' })); - }, []); - - const isHeaderValid = useCallback((v: TeamInvoiceHeaderType) => { - const emailRegex = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; - for (const [key, value] of Object.entries(v)) { - if (typeof value === 'string' && value.trim() === '') { - return false; - } - } - return emailRegex.test(v.emailAddress); - }, []); - const { loading: isLoading, data: billsList, @@ -86,12 +59,23 @@ const ApplyInvoiceModal = ({ onClose }: { onClose: () => void }) => { manual: false }); - const { run: handleSubmitInvoice, loading: isSubmitting } = useRequest2( - () => + const handleSingleCheck = useCallback( + (item: invoiceBillDataType) => { + if (chosenBillDataList.find((bill) => bill._id === item._id)) { + setChosenBillDataList(chosenBillDataList.filter((bill) => bill._id !== item._id)); + } else { + setChosenBillDataList([...chosenBillDataList, { _id: item._id, price: item.price }]); + } + }, + [chosenBillDataList] + ); + + const { runAsync: onSubmitApply, loading: isSubmitting } = useRequest2( + (data) => submitInvoice({ amount: totalPrice, billIdList: chosenBillDataList.map((item) => item._id), - ...formData + ...data }), { manual: true, @@ -104,39 +88,29 @@ const ApplyInvoiceModal = ({ onClose }: { onClose: () => void }) => { } ); + const inputForm = useForm({ + defaultValues: { + teamName: '', + unifiedCreditCode: '', + companyAddress: '', + companyPhone: '', + bankName: '', + bankAccount: '', + needSpecialInvoice: false, + emailAddress: '' + } + }); const { loading: isLoadingHeader } = useRequest2(() => getTeamInvoiceHeader(), { manual: false, - onSuccess: (res) => setFormData(res) + onSuccess: (res) => inputForm.reset(res) }); - const handleSubmit = useCallback(async () => { - if (!isHeaderValid(formData)) { - toast({ - title: t('common:support.wallet.invoice_data.in_valid'), - status: 'info' - }); - return; - } - handleSubmitInvoice(); - }, [formData, handleSubmitInvoice, isHeaderValid, t, toast]); - const handleBack = useCallback(() => { setChosenBillDataList([]); getInvoiceBills(); onCloseSettleModal(); }, [getInvoiceBills, onCloseSettleModal]); - const handleSingleCheck = useCallback( - (item: invoiceBillDataType) => { - if (chosenBillDataList.find((bill) => bill._id === item._id)) { - setChosenBillDataList(chosenBillDataList.filter((bill) => bill._id !== item._id)); - } else { - setChosenBillDataList([...chosenBillDataList, { _id: item._id, price: item.price }]); - } - }, - [chosenBillDataList] - ); - return ( void }) => { - + void }) => { - - )} - + + + {t('common:core.module.Http timeout')} - + + {isEditTimeout ? ( + setIsEditTimeout(false)} + onChange={(e) => { + onChangeNode({ + nodeId, + type: 'updateInput', + key: NodeInputKeyEnum.httpTimeout, + value: { + ...timeout, + value: Number(e) + } + }); + }} + > + + + + + + + ) : ( + + )} + + ); }; const RenderForm = ({ diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/NodeCard.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/NodeCard.tsx index ca1f2d523..975b55f68 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/NodeCard.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/NodeCard.tsx @@ -201,7 +201,7 @@ const NodeCard = (props: Props) => { )} - {!!nodeTemplate?.diagram && ( + {!!nodeTemplate?.diagram && !hasNewVersion && ( diff --git a/projects/app/src/pages/app/list/components/List.tsx b/projects/app/src/pages/app/list/components/List.tsx index 74a05c49e..afe94e724 100644 --- a/projects/app/src/pages/app/list/components/List.tsx +++ b/projects/app/src/pages/app/list/components/List.tsx @@ -149,8 +149,8 @@ const ListItem = () => { app.type === AppTypeEnum.folder ? t('common:common.folder.Open folder') : app.permission.hasWritePer - ? appT('edit_app') - : appT('go_to_chat') + ? t('app:edit_app') + : t('app:go_to_chat') } > { flex={'1 0 0'} flexDirection={'column'} h={'100%'} - pr={folderDetail ? [4, 2] : [4, 10]} + pr={folderDetail ? [3, 2] : [3, 10]} pl={3} overflowY={'auto'} overflowX={'hidden'} diff --git a/projects/app/src/pages/dataset/detail/components/Info.tsx b/projects/app/src/pages/dataset/detail/components/Info.tsx index 045e94302..de99c8a1d 100644 --- a/projects/app/src/pages/dataset/detail/components/Info.tsx +++ b/projects/app/src/pages/dataset/detail/components/Info.tsx @@ -143,9 +143,10 @@ const Info = ({ datasetId }: { datasetId: string }) => { {datasetDetail._id} - - {t('common:core.ai.model.Vector Model')} - + + {t('common:core.ai.model.Vector Model')} + + { {vectorModel.maxToken} - - {t('common:core.ai.model.Dataset Agent Model')} - + + {t('common:core.ai.model.Dataset Agent Model')} + + - - {t('common:core.ai.model.Vector Model')} - - - - + {t('common:core.ai.model.Vector Model')} + + - - {t('common:core.ai.model.Dataset Agent Model')} - + {t('common:core.ai.model.Dataset Agent Model')} + + - + diff --git a/projects/app/src/pages/dataset/list/component/List.tsx b/projects/app/src/pages/dataset/list/component/List.tsx index 89dc1f642..3cb191515 100644 --- a/projects/app/src/pages/dataset/list/component/List.tsx +++ b/projects/app/src/pages/dataset/list/component/List.tsx @@ -1,6 +1,5 @@ import React, { useMemo, useRef, useState } from 'react'; import { resumeInheritPer } from '@/web/core/dataset/api'; -import { useDatasetStore } from '@/web/core/dataset/store/dataset'; import { Box, Flex, Grid, HStack } from '@chakra-ui/react'; import { DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constants'; import MyMenu from '@fastgpt/web/components/common/MyMenu'; @@ -39,6 +38,8 @@ import { formatTimeToChatTime } from '@fastgpt/global/common/string/time'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import SideTag from './SideTag'; +const EditResourceModal = dynamic(() => import('@/components/common/Modal/EditResourceModal')); + function List() { const { setLoading } = useSystemStore(); const { toast } = useToast(); @@ -76,7 +77,7 @@ function List() { } }); - const { data: members = [], loading: isLoadMembers } = useRequest2(loadAndGetTeamMembers, { + const { data: members = [] } = useRequest2(loadAndGetTeamMembers, { manual: false }); @@ -111,8 +112,6 @@ function List() { errorToast: t('common:dataset.Export Dataset Limit Error') }); - const EditResourceModal = dynamic(() => import('@/components/common/Modal/EditResourceModal')); - const DeleteTipsMap = useRef({ [DatasetTypeEnum.folder]: t('common:dataset.deleteFolderTips'), [DatasetTypeEnum.dataset]: t('common:core.dataset.Delete Confirm'), @@ -161,238 +160,235 @@ function List() { gridGap={5} alignItems={'stretch'} > - {!isLoadMembers && - formatDatasets.map((dataset, index) => { - const owner = members.find((v) => v.tmbId === dataset.tmbId); - return ( - - - {dataset.type === DatasetTypeEnum.folder - ? t('common.folder.Open folder') - : t('common.folder.open_dataset')} - - - } + {formatDatasets.map((dataset, index) => { + const owner = members.find((v) => v.tmbId === dataset.tmbId); + return ( + + + {dataset.type === DatasetTypeEnum.folder + ? t('common:common.folder.Open folder') + : t('common:common.folder.open_dataset')} + + + } + > + { + if (dataset.type === DatasetTypeEnum.folder) { + router.push({ + pathname: '/dataset/list', + query: { + parentId: dataset._id + } + }); + } else { + router.push({ + pathname: '/dataset/detail', + query: { + datasetId: dataset._id + } + }); + } + }} > - { - if (dataset.type === DatasetTypeEnum.folder) { - router.push({ - pathname: '/dataset/list', - query: { - parentId: dataset._id - } - }); - } else { - router.push({ - pathname: '/dataset/detail', - query: { - datasetId: dataset._id - } - }); - } - }} - > - - - - {dataset.name} - - - - {dataset.type !== DatasetTypeEnum.folder && ( - - )} - - - - - {dataset.intro || - (dataset.type === DatasetTypeEnum.folder - ? t('common:core.dataset.Folder placeholder') - : t('common:core.dataset.Intro Placeholder'))} + + + + {dataset.name} - - - {owner && ( - - - - {owner.memberName} - - - )} - + {dataset.type !== DatasetTypeEnum.folder && ( + - + )} + + - - {isPc && ( - - - - {formatTimeToChatTime(dataset.updateTime)} - - - )} - {dataset.permission.hasWritePer && ( - { - e.stopPropagation(); - }} - > - - - - } - menuList={[ - { - children: [ - { - icon: 'edit', - label: commonT('dataset.Edit Info'), - onClick: () => - setEditedDataset({ - id: dataset._id, - name: dataset.name, - intro: dataset.intro, - avatar: dataset.avatar - }) - }, - { - icon: 'common/file/move', - label: t('common:Move'), - onClick: () => setMoveDatasetId(dataset._id) - }, - ...(dataset.permission.hasManagePer - ? [ - { - icon: 'support/team/key', - label: t('common:permission.Permission'), - onClick: () => setEditPerDatasetIndex(index) - } - ] - : []) - ] - }, - ...(dataset.type != DatasetTypeEnum.folder - ? [ - { - children: [ - { - icon: 'export', - label: t('common:Export'), - onClick: () => { - exportDataset(dataset); - } - } - ] - } - ] - : []), - ...(dataset.permission.hasManagePer - ? [ - { - children: [ - { - icon: 'delete', - label: t('common:common.Delete'), - type: 'danger' as 'danger', - onClick: () => onClickDeleteDataset(dataset._id) - } - ] - } - ] - : []) - ]} - /> + + {dataset.intro || + (dataset.type === DatasetTypeEnum.folder + ? t('common:core.dataset.Folder placeholder') + : t('common:core.dataset.Intro Placeholder'))} + + + + + {owner && ( + + + + {owner.memberName} - )} - - - - - ); - })} + + )} + + + + + {isPc && ( + + + {formatTimeToChatTime(dataset.updateTime)} + + )} + {dataset.permission.hasWritePer && ( + { + e.stopPropagation(); + }} + > + + + + } + menuList={[ + { + children: [ + { + icon: 'edit', + label: commonT('dataset.Edit Info'), + onClick: () => + setEditedDataset({ + id: dataset._id, + name: dataset.name, + intro: dataset.intro, + avatar: dataset.avatar + }) + }, + { + icon: 'common/file/move', + label: t('common:Move'), + onClick: () => setMoveDatasetId(dataset._id) + }, + ...(dataset.permission.hasManagePer + ? [ + { + icon: 'support/team/key', + label: t('common:permission.Permission'), + onClick: () => setEditPerDatasetIndex(index) + } + ] + : []) + ] + }, + ...(dataset.type != DatasetTypeEnum.folder + ? [ + { + children: [ + { + icon: 'export', + label: t('common:Export'), + onClick: () => { + exportDataset(dataset); + } + } + ] + } + ] + : []), + ...(dataset.permission.hasManagePer + ? [ + { + children: [ + { + icon: 'delete', + label: t('common:common.Delete'), + type: 'danger' as 'danger', + onClick: () => onClickDeleteDataset(dataset._id) + } + ] + } + ] + : []) + ]} + /> + + )} + + + + + ); + })} )} {myDatasets.length === 0 && ( @@ -415,7 +411,6 @@ function List() { intro: data.intro, avatar: data.avatar }); - setEditedDataset(undefined); }} /> )} diff --git a/projects/app/src/pages/dataset/list/component/SideTag.tsx b/projects/app/src/pages/dataset/list/component/SideTag.tsx index df6eae04f..9b107e4b3 100644 --- a/projects/app/src/pages/dataset/list/component/SideTag.tsx +++ b/projects/app/src/pages/dataset/list/component/SideTag.tsx @@ -11,18 +11,15 @@ const SideTag = ({ type, ...props }: { type: `${DatasetTypeEnum}` } & FlexProps) return { [DatasetTypeEnum.dataset]: { icon: 'core/dataset/commonDatasetOutline', - label: t('dataset:common_dataset'), - collectionLabel: 'common.File' + label: t('dataset:common_dataset') }, [DatasetTypeEnum.websiteDataset]: { icon: 'core/dataset/websiteDatasetOutline', - label: t('dataset:website_dataset'), - collectionLabel: 'common.Website' + label: t('dataset:website_dataset') }, [DatasetTypeEnum.externalFile]: { icon: 'core/dataset/externalDatasetOutline', - label: t('dataset:external_file'), - collectionLabel: 'common.File' + label: t('dataset:external_file') } }; }, [t]); @@ -31,8 +28,6 @@ const SideTag = ({ type, ...props }: { type: `${DatasetTypeEnum}` } & FlexProps) return ( - {/* @ts-ignore */} {item.label} diff --git a/projects/app/src/service/mongo.ts b/projects/app/src/service/mongo.ts index b0e13a4f0..3e7068100 100644 --- a/projects/app/src/service/mongo.ts +++ b/projects/app/src/service/mongo.ts @@ -12,7 +12,7 @@ import { startMongoWatch } from './common/system/volumnMongoWatch'; import { startTrainingQueue } from './core/dataset/training/utils'; import { systemStartCb } from '@fastgpt/service/common/system/tools'; import { addLog } from '@fastgpt/service/common/system/log'; -import { getSystemPluginCb } from './core/app/plugin'; +import { getSystemPluginCb, getSystemPlugins } from './core/app/plugin'; /** * This function is equivalent to the entry to the service @@ -32,7 +32,13 @@ export function connectToDatabase() { systemStartCb(); //init system config;init vector database;init root user - await Promise.all([getInitConfig(), getSystemPluginCb(), initVectorStore(), initRootUser()]); + await Promise.all([ + getInitConfig(), + getSystemPluginCb(), + getSystemPlugins(), + initVectorStore(), + initRootUser() + ]); startMongoWatch(); // cron