From be0a41a988cda14920ba557dfb0d00cfeea4fb83 Mon Sep 17 00:00:00 2001 From: DigHuang <114602213+DigHuang@users.noreply.github.com> Date: Wed, 29 Apr 2026 18:06:33 +0800 Subject: [PATCH] fix(workflow): relax variable update reference validation to ignore stale valueType (#6859) --- projects/app/src/web/core/workflow/utils.ts | 24 ++++++++-------- .../test/web/core/app/workflow/utils.test.ts | 28 +++++++++++++++++++ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/projects/app/src/web/core/workflow/utils.ts b/projects/app/src/web/core/workflow/utils.ts index 3f217c7ab7..7db066f9ff 100644 --- a/projects/app/src/web/core/workflow/utils.ts +++ b/projects/app/src/web/core/workflow/utils.ts @@ -569,23 +569,21 @@ export const checkWorkflowNodeAndConnection = ({ if (!isValidReferenceValue(item.variable, nodeIds) || !isLiveReference(item.variable)) return true; - const isArrayVar = - typeof item.valueType === 'string' && item.valueType.startsWith('array'); - if (item.renderType === FlowNodeInputTypeEnum.reference) { - if (isArrayVar) { - return ( - !Array.isArray(item.value) || - item.value.length === 0 || - (item.value as ReferenceItemValueType[]).some((v) => !isLiveReference(v)) - ); + // 接受单引用 [ref] 与引用数组 [[ref], ...],与 dispatcher 对齐 + if (isValidReferenceValueFormat(item.value)) { + return !isLiveReference(item.value as ReferenceItemValueType); } - return !isLiveReference(item.value as ReferenceItemValueType); + return ( + !Array.isArray(item.value) || + item.value.length === 0 || + (item.value as ReferenceItemValueType[]).some((v) => !isLiveReference(v)) + ); } - // input mode: clear 不需要 value;boolean 由 booleanMode 决定 - if (isArrayVar && item.arrayMode === 'clear') return false; - if (item.valueType === WorkflowIOValueTypeEnum.boolean) return false; + // input 模式:clear / boolean 由模式字段决定,不读 value + if (item.arrayMode === 'clear') return false; + if (item.booleanMode) return false; const inputVal = item.value?.[1]; return inputVal === undefined || inputVal === null || inputVal === ''; }) diff --git a/projects/app/test/web/core/app/workflow/utils.test.ts b/projects/app/test/web/core/app/workflow/utils.test.ts index 591c3804b0..eb173e3674 100644 --- a/projects/app/test/web/core/app/workflow/utils.test.ts +++ b/projects/app/test/web/core/app/workflow/utils.test.ts @@ -528,6 +528,34 @@ describe('checkWorkflowNodeAndConnection', () => { ).toEqual(['u1']); }); + // item.valueType 是写入快照,不与目标变量同步——校验只看 value 形态 + it('passes reference array form regardless of stale valueType', () => { + expect( + run([ + { + variable: [VARIABLE_NODE_ID, 'foo'], + value: [[VARIABLE_NODE_ID, 'bar']], + valueType: WorkflowIOValueTypeEnum.string, + renderType: FlowNodeInputTypeEnum.reference + } + ]) + ).toBeUndefined(); + }); + + // 历史数据:array reference 旧版本存为单引用 [refNode, refOutputId] + it('passes legacy single-reference form for array valueType', () => { + expect( + run([ + { + variable: [VARIABLE_NODE_ID, 'foo'], + value: [VARIABLE_NODE_ID, 'bar'], + valueType: WorkflowIOValueTypeEnum.arrayString, + renderType: FlowNodeInputTypeEnum.reference + } + ]) + ).toBeUndefined(); + }); + it('passes a fully filled input row', () => { expect( run([