fix: prevent client-side crashes from null/undefined plugin data in workflow (#23154) (#23182)

This commit is contained in:
lyzno1
2025-07-31 10:03:33 +08:00
committed by GitHub
parent 646900b00c
commit 1b2046da3f
9 changed files with 260 additions and 14 deletions

View File

@@ -26,7 +26,8 @@ export type SwitchPluginVersionProps = {
export const SwitchPluginVersion: FC<SwitchPluginVersionProps> = (props) => {
const { uniqueIdentifier, tooltip, onChange, className } = props
const [pluginId] = uniqueIdentifier.split(':')
const [pluginId] = uniqueIdentifier?.split(':') || ['']
const [isShow, setIsShow] = useState(false)
const [isShowUpdateModal, { setTrue: showUpdateModal, setFalse: hideUpdateModal }] = useBoolean(false)
const [target, setTarget] = useState<{
@@ -60,6 +61,11 @@ export const SwitchPluginVersion: FC<SwitchPluginVersionProps> = (props) => {
})
}
const { t } = useTranslation()
// Guard against null/undefined uniqueIdentifier to prevent app crash
if (!uniqueIdentifier || !pluginId)
return null
return <Tooltip popupContent={!isShow && !isShowUpdateModal && tooltip} triggerMethod='hover'>
<div className={cn('flex w-fit items-center justify-center', className)} onClick={e => e.stopPropagation()}>
{isShowUpdateModal && pluginDetail && <PluginMutationModel

View File

@@ -77,7 +77,13 @@ const useSingleRunFormParams = ({
}, [runResult, t])
const getDependentVars = () => {
return varInputs.map(item => item.variable.slice(1, -1).split('.'))
return varInputs.map((item) => {
// Guard against null/undefined variable to prevent app crash
if (!item.variable || typeof item.variable !== 'string')
return []
return item.variable.slice(1, -1).split('.')
}).filter(arr => arr.length > 0)
}
return {

View File

@@ -62,7 +62,13 @@ const useSingleRunFormParams = ({
}, [inputVarValues, setInputVarValues, varInputs])
const getDependentVars = () => {
return varInputs.map(item => item.variable.slice(1, -1).split('.'))
return varInputs.map((item) => {
// Guard against null/undefined variable to prevent app crash
if (!item.variable || typeof item.variable !== 'string')
return []
return item.variable.slice(1, -1).split('.')
}).filter(arr => arr.length > 0)
}
return {

View File

@@ -168,7 +168,13 @@ const useSingleRunFormParams = ({
})()
const getDependentVars = () => {
const promptVars = varInputs.map(item => item.variable.slice(1, -1).split('.'))
const promptVars = varInputs.map((item) => {
// Guard against null/undefined variable to prevent app crash
if (!item.variable || typeof item.variable !== 'string')
return []
return item.variable.slice(1, -1).split('.')
}).filter(arr => arr.length > 0)
const contextVar = payload.context.variable_selector
const vars = [...promptVars, contextVar]
if (isVisionModel && payload.vision?.enabled && payload.vision?.configs?.variable_selector) {

View File

@@ -120,7 +120,13 @@ const useSingleRunFormParams = ({
})()
const getDependentVars = () => {
const promptVars = varInputs.map(item => item.variable.slice(1, -1).split('.'))
const promptVars = varInputs.map((item) => {
// Guard against null/undefined variable to prevent app crash
if (!item.variable || typeof item.variable !== 'string')
return []
return item.variable.slice(1, -1).split('.')
}).filter(arr => arr.length > 0)
const vars = [payload.query, ...promptVars]
if (isVisionModel && payload.vision?.enabled && payload.vision?.configs?.variable_selector) {
const visionVar = payload.vision.configs.variable_selector

View File

@@ -118,7 +118,13 @@ const useSingleRunFormParams = ({
})()
const getDependentVars = () => {
const promptVars = varInputs.map(item => item.variable.slice(1, -1).split('.'))
const promptVars = varInputs.map((item) => {
// Guard against null/undefined variable to prevent app crash
if (!item.variable || typeof item.variable !== 'string')
return []
return item.variable.slice(1, -1).split('.')
}).filter(arr => arr.length > 0)
const vars = [payload.query_variable_selector, ...promptVars]
if (isVisionModel && payload.vision?.enabled && payload.vision?.configs?.variable_selector) {
const visionVar = payload.vision.configs.variable_selector

View File

@@ -88,7 +88,13 @@ const useSingleRunFormParams = ({
const toolIcon = useToolIcon(payload)
const getDependentVars = () => {
return varInputs.map(item => item.variable.slice(1, -1).split('.'))
return varInputs.map((item) => {
// Guard against null/undefined variable to prevent app crash
if (!item.variable || typeof item.variable !== 'string')
return []
return item.variable.slice(1, -1).split('.')
}).filter(arr => arr.length > 0)
}
return {