fix(workflow): relax variable update reference validation to ignore stale valueType (#6859)

This commit is contained in:
DigHuang
2026-04-29 18:06:33 +08:00
committed by GitHub
parent 8d67db1eb2
commit be0a41a988
2 changed files with 39 additions and 13 deletions
+11 -13
View File
@@ -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 不需要 valueboolean 由 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 === '';
})
@@ -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([