From c8ae6e39d2eb3000afbb83b96463615d7adb4a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9B=90=E7=B2=92=20Yanli?= Date: Fri, 23 Jan 2026 10:15:20 +0800 Subject: [PATCH 1/3] fix: NextStep crash when target node is missing (#31416) --- .../nodes/_base/components/next-step/index.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx index 0b22d44aac..8081f09b0c 100644 --- a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx @@ -44,11 +44,19 @@ const NextStep = ({ const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id) const list = useMemo(() => { + const resolveNextNodes = (connected: typeof connectedEdges) => { + return connected.reduce((acc, edge) => { + const nextNode = outgoers.find(outgoer => outgoer.id === edge.target) + if (nextNode) + acc.push(nextNode) + return acc + }, []) + } let items = [] if (branches?.length) { items = branches.map((branch, index) => { const connected = connectedEdges.filter(edge => edge.sourceHandle === branch.id) - const nextNodes = connected.map(edge => outgoers.find(outgoer => outgoer.id === edge.target)!) + const nextNodes = resolveNextNodes(connected) return { branch: { @@ -61,7 +69,7 @@ const NextStep = ({ } else { const connected = connectedEdges.filter(edge => edge.sourceHandle === 'source') - const nextNodes = connected.map(edge => outgoers.find(outgoer => outgoer.id === edge.target)!) + const nextNodes = resolveNextNodes(connected) items = [{ branch: { @@ -73,7 +81,7 @@ const NextStep = ({ if (data.error_strategy === ErrorHandleTypeEnum.failBranch && hasErrorHandleNode(data.type)) { const connected = connectedEdges.filter(edge => edge.sourceHandle === ErrorHandleTypeEnum.failBranch) - const nextNodes = connected.map(edge => outgoers.find(outgoer => outgoer.id === edge.target)!) + const nextNodes = resolveNextNodes(connected) items.push({ branch: { From 056095238b16431fd3183daec28f7742e4e49bb8 Mon Sep 17 00:00:00 2001 From: wangxiaolei Date: Fri, 23 Jan 2026 11:34:47 +0800 Subject: [PATCH 2/3] fix: fix create-by-file doc_form (#31346) --- .../service_api/dataset/document.py | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/api/controllers/service_api/dataset/document.py b/api/controllers/service_api/dataset/document.py index c800c0e4e1..49ff4f57dc 100644 --- a/api/controllers/service_api/dataset/document.py +++ b/api/controllers/service_api/dataset/document.py @@ -261,17 +261,6 @@ class DocumentAddByFileApi(DatasetApiResource): @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def post(self, tenant_id, dataset_id): """Create document by upload file.""" - args = {} - if "data" in request.form: - args = json.loads(request.form["data"]) - if "doc_form" not in args: - args["doc_form"] = "text_model" - if "doc_language" not in args: - args["doc_language"] = "English" - - # get dataset info - dataset_id = str(dataset_id) - tenant_id = str(tenant_id) dataset = db.session.query(Dataset).where(Dataset.tenant_id == tenant_id, Dataset.id == dataset_id).first() if not dataset: @@ -280,6 +269,18 @@ class DocumentAddByFileApi(DatasetApiResource): if dataset.provider == "external": raise ValueError("External datasets are not supported.") + args = {} + if "data" in request.form: + args = json.loads(request.form["data"]) + if "doc_form" not in args: + args["doc_form"] = dataset.chunk_structure or "text_model" + if "doc_language" not in args: + args["doc_language"] = "English" + + # get dataset info + dataset_id = str(dataset_id) + tenant_id = str(tenant_id) + indexing_technique = args.get("indexing_technique") or dataset.indexing_technique if not indexing_technique: raise ValueError("indexing_technique is required.") @@ -370,17 +371,6 @@ class DocumentUpdateByFileApi(DatasetApiResource): @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def post(self, tenant_id, dataset_id, document_id): """Update document by upload file.""" - args = {} - if "data" in request.form: - args = json.loads(request.form["data"]) - if "doc_form" not in args: - args["doc_form"] = "text_model" - if "doc_language" not in args: - args["doc_language"] = "English" - - # get dataset info - dataset_id = str(dataset_id) - tenant_id = str(tenant_id) dataset = db.session.query(Dataset).where(Dataset.tenant_id == tenant_id, Dataset.id == dataset_id).first() if not dataset: @@ -389,6 +379,18 @@ class DocumentUpdateByFileApi(DatasetApiResource): if dataset.provider == "external": raise ValueError("External datasets are not supported.") + args = {} + if "data" in request.form: + args = json.loads(request.form["data"]) + if "doc_form" not in args: + args["doc_form"] = dataset.chunk_structure or "text_model" + if "doc_language" not in args: + args["doc_language"] = "English" + + # get dataset info + dataset_id = str(dataset_id) + tenant_id = str(tenant_id) + # indexing_technique is already set in dataset since this is an update args["indexing_technique"] = dataset.indexing_technique From f911199c8e062fa6b2e03dcb1341edcf8c607282 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Fri, 23 Jan 2026 11:35:14 +0800 Subject: [PATCH 3/3] chore: disable serwist in dev (#31424) Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- web/app/components/provider/serwist.tsx | 41 ++++++++++++++++++++++++- web/app/layout.tsx | 9 ++---- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/web/app/components/provider/serwist.tsx b/web/app/components/provider/serwist.tsx index 39a80f5ac2..2eef43a7d6 100644 --- a/web/app/components/provider/serwist.tsx +++ b/web/app/components/provider/serwist.tsx @@ -1,3 +1,42 @@ 'use client' -export { SerwistProvider } from '@serwist/turbopack/react' +import { SerwistProvider } from '@serwist/turbopack/react' +import { useEffect } from 'react' +import { IS_DEV } from '@/config' +import { isClient } from '@/utils/client' + +export function PWAProvider({ children }: { children: React.ReactNode }) { + if (IS_DEV) { + return {children} + } + + const basePath = process.env.NEXT_PUBLIC_BASE_PATH || '' + const swUrl = `${basePath}/serwist/sw.js` + + return ( + + {children} + + ) +} + +function DisabledPWAProvider({ children }: { children: React.ReactNode }) { + useEffect(() => { + if (isClient && 'serviceWorker' in navigator) { + navigator.serviceWorker.getRegistrations() + .then((registrations) => { + registrations.forEach((registration) => { + registration.unregister() + .catch((error) => { + console.error('Error unregistering service worker:', error) + }) + }) + }) + .catch((error) => { + console.error('Error unregistering service workers:', error) + }) + } + }, []) + + return <>{children} +} diff --git a/web/app/layout.tsx b/web/app/layout.tsx index b970fddc7a..845cae2d4e 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -12,7 +12,7 @@ import { ToastProvider } from './components/base/toast' import BrowserInitializer from './components/browser-initializer' import { ReactScanLoader } from './components/devtools/react-scan/loader' import { I18nServerProvider } from './components/provider/i18n-server' -import { SerwistProvider } from './components/provider/serwist' +import { PWAProvider } from './components/provider/serwist' import SentryInitializer from './components/sentry-initializer' import RoutePrefixHandle from './routePrefixHandle' import './styles/globals.css' @@ -40,9 +40,6 @@ const LocaleLayout = async ({ }) => { const locale = await getLocaleOnServer() - const basePath = process.env.NEXT_PUBLIC_BASE_PATH || '' - const swUrl = `${basePath}/serwist/sw.js` - const datasetMap: Record = { [DatasetAttr.DATA_API_PREFIX]: process.env.NEXT_PUBLIC_API_PREFIX, [DatasetAttr.DATA_PUBLIC_API_PREFIX]: process.env.NEXT_PUBLIC_PUBLIC_API_PREFIX, @@ -96,7 +93,7 @@ const LocaleLayout = async ({ className="color-scheme h-full select-auto" {...datasetMap} > - + - + )