diff --git a/docSite/content/zh-cn/docs/development/intro.md b/docSite/content/zh-cn/docs/development/intro.md index 2ea32adf04..38522f5dcc 100644 --- a/docSite/content/zh-cn/docs/development/intro.md +++ b/docSite/content/zh-cn/docs/development/intro.md @@ -79,6 +79,7 @@ Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnec # 给自动化脚本代码执行权限(非 linux 系统, 可以手动执行里面的 postinstall.sh 文件内容) chmod -R +x ./scripts/ # 代码根目录下执行,会安装根 package、projects 和 packages 内所有依赖 +# 如果提示 isolate-vm 安装失败,可以参考:https://github.com/laverdet/isolated-vm?tab=readme-ov-file#requirements pnpm i # 非 Make 运行 @@ -103,6 +104,8 @@ docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/f make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 proxy=taobao ``` +如果不使用 `docker` 打包,需要手动把 `Dockerfile` 里 run 阶段的内容全部手动执行一遍(非常不推荐)。 + ## 提交代码至开源仓库 1. 确保你的代码是 Fork [FastGPT](https://github.com/labring/FastGPT) 仓库 diff --git a/docSite/content/zh-cn/docs/development/upgrading/484.md b/docSite/content/zh-cn/docs/development/upgrading/484.md index 9a2592bd14..0804968619 100644 --- a/docSite/content/zh-cn/docs/development/upgrading/484.md +++ b/docSite/content/zh-cn/docs/development/upgrading/484.md @@ -33,4 +33,5 @@ curl --location --request POST 'https://{{host}}/api/admin/init/484' \ 4. 修复 - Debug 模式下,相同 source 和 target 内容,导致连线显示异常。 5. 修复 - 定时执行初始化错误。 6. 修复 - 应用调用传参异常。 -7. 调整组件库全局theme。 \ No newline at end of file +7. 修复 - ctrl + cv 复杂节点时,nodeId错误。 +8. 调整组件库全局theme。 \ No newline at end of file diff --git a/packages/service/common/mongo/sessionRun.ts b/packages/service/common/mongo/sessionRun.ts index 7c8d73de11..0a1d9fdfe9 100644 --- a/packages/service/common/mongo/sessionRun.ts +++ b/packages/service/common/mongo/sessionRun.ts @@ -1,17 +1,24 @@ +import { addLog } from '../system/log'; import { connectionMongo, ClientSession } from './index'; export const mongoSessionRun = async (fn: (session: ClientSession) => Promise) => { const session = await connectionMongo.startSession(); + let committed = false; try { session.startTransaction(); const result = await fn(session); await session.commitTransaction(); + committed = true; return result as T; } catch (error) { - await session.abortTransaction(); + if (!committed) { + await session.abortTransaction(); + } else { + addLog.warn('Un catch mongo session error', { error }); + } return Promise.reject(error); } finally { await session.endSession(); diff --git a/packages/service/core/workflow/dispatch/index.ts b/packages/service/core/workflow/dispatch/index.ts index 7ce1f4c2af..e3f82236f5 100644 --- a/packages/service/core/workflow/dispatch/index.ts +++ b/packages/service/core/workflow/dispatch/index.ts @@ -217,16 +217,16 @@ export async function dispatchWorkFlow(data: Props): Promise import('./icons/core/app/simpleMode/whisper.svg'), 'core/app/toolCall': () => import('./icons/core/app/toolCall.svg'), 'core/app/ttsFill': () => import('./icons/core/app/ttsFill.svg'), + 'core/app/type/simple': () => import('./icons/core/app/type/simple.svg'), + 'core/app/type/workflow': () => import('./icons/core/app/type/workflow.svg'), 'core/app/variable/external': () => import('./icons/core/app/variable/external.svg'), 'core/app/variable/input': () => import('./icons/core/app/variable/input.svg'), 'core/app/variable/select': () => import('./icons/core/app/variable/select.svg'), diff --git a/packages/web/components/common/Icon/icons/core/app/type/simple.svg b/packages/web/components/common/Icon/icons/core/app/type/simple.svg new file mode 100644 index 0000000000..9d86e0d6ae --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/app/type/simple.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/app/type/workflow.svg b/packages/web/components/common/Icon/icons/core/app/type/workflow.svg new file mode 100644 index 0000000000..af1483ae41 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/app/type/workflow.svg @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/web/components/common/MyModal/EditFolderModal.tsx b/packages/web/components/common/MyModal/EditFolderModal.tsx index 8b461ace6d..c368761284 100644 --- a/packages/web/components/common/MyModal/EditFolderModal.tsx +++ b/packages/web/components/common/MyModal/EditFolderModal.tsx @@ -81,7 +81,7 @@ const EditFolderModal = ({ - diff --git a/packages/web/components/common/MyTooltip/index.tsx b/packages/web/components/common/MyTooltip/index.tsx index a33e576391..059f1e4449 100644 --- a/packages/web/components/common/MyTooltip/index.tsx +++ b/packages/web/components/common/MyTooltip/index.tsx @@ -9,32 +9,24 @@ const MyTooltip = ({ children, forceShow = false, shouldWrapChildren = true, ... const [isPc] = useMediaQuery('(min-width: 900px)'); return isPc || forceShow ? ( - - - {children} - - + {children} + ) : ( <>{children} ); diff --git a/packages/web/components/common/Textarea/CodeEditor/index.tsx b/packages/web/components/common/Textarea/CodeEditor/index.tsx index 5ab6a3d8c2..f9491f686d 100644 --- a/packages/web/components/common/Textarea/CodeEditor/index.tsx +++ b/packages/web/components/common/Textarea/CodeEditor/index.tsx @@ -24,7 +24,7 @@ const CodeEditor = (props: Props) => { - diff --git a/packages/web/components/common/Textarea/PromptEditor/index.tsx b/packages/web/components/common/Textarea/PromptEditor/index.tsx index 8d9125dc7c..cd98d37690 100644 --- a/packages/web/components/common/Textarea/PromptEditor/index.tsx +++ b/packages/web/components/common/Textarea/PromptEditor/index.tsx @@ -78,7 +78,7 @@ const PromptEditor = ({ /> - diff --git a/packages/web/hooks/useConfirm.tsx b/packages/web/hooks/useConfirm.tsx index fd169a0d25..9a0d698306 100644 --- a/packages/web/hooks/useConfirm.tsx +++ b/packages/web/hooks/useConfirm.tsx @@ -100,6 +100,7 @@ export const useConfirm = (props?: { onClose(); typeof cancelCb.current === 'function' && cancelCb.current(); }} + px={5} > {closeText} @@ -109,8 +110,9 @@ export const useConfirm = (props?: { size={'sm'} bg={bg ? bg : map.bg} isDisabled={countDownAmount > 0} - ml={4} + ml={3} isLoading={isLoading || requesting} + px={5} onClick={async () => { setRequesting(true); try { diff --git a/packages/web/hooks/useEditTextarea.tsx b/packages/web/hooks/useEditTextarea.tsx index 8d8adb5035..3056d9e279 100644 --- a/packages/web/hooks/useEditTextarea.tsx +++ b/packages/web/hooks/useEditTextarea.tsx @@ -115,7 +115,9 @@ export const useEditTextarea = ({ {closeBtnText} )} - + ), diff --git a/projects/app/i18n/en/app.json b/projects/app/i18n/en/app.json index 8353164932..b155db44fe 100644 --- a/projects/app/i18n/en/app.json +++ b/projects/app/i18n/en/app.json @@ -54,5 +54,9 @@ }, "modules": { "Title is required": "Module name cannot be empty" + }, + "type": { + "Simple bot": "Simple bot", + "Workflow bot": "Workflow" } } diff --git a/projects/app/i18n/zh/app.json b/projects/app/i18n/zh/app.json index ae7eb64e66..b12c0a676e 100644 --- a/projects/app/i18n/zh/app.json +++ b/projects/app/i18n/zh/app.json @@ -53,5 +53,9 @@ }, "modules": { "Title is required": "模块名不能为空" + }, + "type": { + "Simple bot": "简易应用", + "Workflow bot": "工作流" } } diff --git a/projects/app/src/components/common/Modal/EditResourceModal.tsx b/projects/app/src/components/common/Modal/EditResourceModal.tsx index fe90bd82ad..e70094fa87 100644 --- a/projects/app/src/components/common/Modal/EditResourceModal.tsx +++ b/projects/app/src/components/common/Modal/EditResourceModal.tsx @@ -103,7 +103,7 @@ const EditResourceModal = ({ - diff --git a/projects/app/src/components/core/app/TypeTag.tsx b/projects/app/src/components/core/app/TypeTag.tsx new file mode 100644 index 0000000000..288c978318 --- /dev/null +++ b/projects/app/src/components/core/app/TypeTag.tsx @@ -0,0 +1,35 @@ +import React, { useRef } from 'react'; +import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; +import MyTag from '@fastgpt/web/components/common/Tag/index'; +import { useI18n } from '@/web/context/I18n'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import { Box } from '@chakra-ui/react'; + +const AppTypeTag = ({ type }: { type: AppTypeEnum }) => { + const { appT } = useI18n(); + + const map = useRef({ + [AppTypeEnum.simple]: { + label: appT('type.Simple bot'), + icon: 'core/app/type/simple' + }, + [AppTypeEnum.advanced]: { + label: appT('type.Workflow bot'), + icon: 'core/app/type/workflow' + }, + [AppTypeEnum.folder]: undefined + }); + + const data = map.current[type]; + + return data ? ( + + + + {data.label} + + + ) : null; +}; + +export default AppTypeTag; diff --git a/projects/app/src/components/core/workflow/Flow/hooks/useKeyboard.tsx b/projects/app/src/components/core/workflow/Flow/hooks/useKeyboard.tsx index cf8038a823..2ae1f9cf09 100644 --- a/projects/app/src/components/core/workflow/Flow/hooks/useKeyboard.tsx +++ b/projects/app/src/components/core/workflow/Flow/hooks/useKeyboard.tsx @@ -48,19 +48,22 @@ export const useKeyboard = () => { // filter workflow data const newNodes = parseData .filter((item) => !!item.type && item.data?.unique !== true) - .map((item) => ({ - // reset id - ...item, - id: getNanoid(), - data: { - ...item.data, - nodeId: getNanoid() - }, - position: { - x: item.position.x + 100, - y: item.position.y + 100 - } - })); + .map((item) => { + const nodeId = getNanoid(); + return { + // reset id + ...item, + id: nodeId, + data: { + ...item.data, + nodeId + }, + position: { + x: item.position.x + 100, + y: item.position.y + 100 + } + }; + }); setNodes((prev) => prev diff --git a/projects/app/src/components/core/workflow/Flow/nodes/render/RenderInput/templates/Reference.tsx b/projects/app/src/components/core/workflow/Flow/nodes/render/RenderInput/templates/Reference.tsx index e947e866df..fd1114c6d1 100644 --- a/projects/app/src/components/core/workflow/Flow/nodes/render/RenderInput/templates/Reference.tsx +++ b/projects/app/src/components/core/workflow/Flow/nodes/render/RenderInput/templates/Reference.tsx @@ -144,7 +144,7 @@ export const useReference = ({ .filter((item) => item.children.length > 0); return list; - }, [edges, nodeId, nodeList, t, valueType]); + }, [appDetail.chatConfig, edges, nodeId, nodeList, t, valueType]); const formatValue = useMemo(() => { if ( diff --git a/projects/app/src/components/support/permission/MemberManager/MemberListCard.tsx b/projects/app/src/components/support/permission/MemberManager/MemberListCard.tsx index 0e7e75ef64..642431569a 100644 --- a/projects/app/src/components/support/permission/MemberManager/MemberListCard.tsx +++ b/projects/app/src/components/support/permission/MemberManager/MemberListCard.tsx @@ -29,7 +29,9 @@ const MemberListCard = ({ tagStyle, ...props }: MemberListCardProps) => { return ( - {member.name} + + {member.name} + ); })} diff --git a/projects/app/src/components/support/user/team/TeamManageModal/components/PermissionManage/index.tsx b/projects/app/src/components/support/user/team/TeamManageModal/components/PermissionManage/index.tsx index 7f41fa25e4..bd74b02fea 100644 --- a/projects/app/src/components/support/user/team/TeamManageModal/components/PermissionManage/index.tsx +++ b/projects/app/src/components/support/user/team/TeamManageModal/components/PermissionManage/index.tsx @@ -12,6 +12,7 @@ import { TeamModalContext } from '../../context'; import { TeamPermissionList } from '@fastgpt/global/support/permission/user/constant'; import dynamic from 'next/dynamic'; import MyBox from '@fastgpt/web/components/common/MyBox'; +import MyTag from '@fastgpt/web/components/common/Tag/index'; const AddManagerModal = dynamic(() => import('./AddManager')); @@ -56,8 +57,8 @@ function PermissionManage() { bgColor={'myGray.100'} alignItems={'center'} alignContent={'center'} - mx={'6'} px={'3'} + ml={3} borderRadius={'sm'} > {TeamPermissionList['manage'].description} @@ -78,19 +79,20 @@ function PermissionManage() { )} - + {members.map((member) => { if (member.permission.hasManagePer && !member.permission.isOwner) { return ( - - - + + + {member.memberName} - + {userInfo?.team.role === 'owner' && ( )} - + ); } })} diff --git a/projects/app/src/pages/app/list/component/CreateModal.tsx b/projects/app/src/pages/app/list/component/CreateModal.tsx index fa8e22e64b..644c061dc6 100644 --- a/projects/app/src/pages/app/list/component/CreateModal.tsx +++ b/projects/app/src/pages/app/list/component/CreateModal.tsx @@ -186,7 +186,7 @@ const CreateModal = ({ onClose }: { onClose: () => void }) => { - diff --git a/projects/app/src/pages/app/list/component/List.tsx b/projects/app/src/pages/app/list/component/List.tsx index 539d78fa78..7e1179ae8c 100644 --- a/projects/app/src/pages/app/list/component/List.tsx +++ b/projects/app/src/pages/app/list/component/List.tsx @@ -28,6 +28,7 @@ import { postUpdateAppCollaborators } from '@/web/core/app/api/collaborator'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; +import AppTypeTag from '@/components/core/app/TypeTag'; const EditResourceModal = dynamic(() => import('@/components/common/Modal/EditResourceModal')); const ConfigPerModal = dynamic(() => import('@/components/support/permission/ConfigPerModal')); @@ -90,10 +91,12 @@ const ListItem = () => { py={[4, 6]} gridTemplateColumns={['1fr', 'repeat(2,1fr)', 'repeat(3,1fr)', 'repeat(4,1fr)']} gridGap={5} + alignItems={'stretch'} > {myApps.map((app, index) => ( { { color={'myGray.600'} /> +