export interface RuntimeNodeData { nodeId?: string; input?: Record; [key: string]: any; } const isRuntimeNode = (item: any): item is RuntimeNodeData => { return !!item && typeof item === 'object' && typeof item.nodeId === 'string'; }; export const flattenRuntimeNodeData = (runtimeData: any): RuntimeNodeData[] => { if (!Array.isArray(runtimeData)) { return []; } return runtimeData.reduce((nodes, item) => { if (isRuntimeNode(item)) { nodes.push(item); return nodes; } if (Array.isArray(item?.nodes)) { nodes.push(...item.nodes.filter(isRuntimeNode)); } return nodes; }, []); }; export const getRuntimeImageUrl = ( runtimeData: any, nodeId: string ): string => { const nodeData = flattenRuntimeNodeData(runtimeData).find( (item) => item.nodeId === nodeId ); const imageUrl = nodeData?.input?.in; return typeof imageUrl === 'string' ? imageUrl.trim() : ''; };