@@ -37,16 +37,48 @@ export const getTypesFromNode = (
3737 }
3838 } ;
3939
40+ // Create a version of the node with primitive literals removed
41+ // This allows inferring the "expected" type of parameters (e.g. keyof T)
42+ // rather than the specific type of the argument provided (e.g. "id").
43+ const nodeIdParams = nodeId + "_params" ;
44+ const nodeForParams = {
45+ ...nodeWithDefaults ,
46+ id : nodeIdParams ,
47+ parameters : {
48+ ...nodeWithDefaults . parameters ,
49+ nodes : nodeWithDefaults . parameters . nodes . map ( p => {
50+ // If it's a primitive literal, remove it to allow wider type inference for parameters
51+ if ( p . value ?. __typename === "LiteralValue" && p . value . value !== null && typeof p . value . value !== 'object' ) {
52+ return { ...p , value : null } ;
53+ }
54+ return p ;
55+ } )
56+ }
57+ } ;
58+
4059 const mockFlow : Flow = {
4160 id : "gid://sagittarius/Flow/0" as any ,
42- nodes : { __typename : "NodeFunctionConnection" , nodes : [ nodeWithDefaults ] }
61+ nodes : { __typename : "NodeFunctionConnection" , nodes : [ nodeWithDefaults , nodeForParams ] }
4362 } as Flow ;
4463
4564 const inferred = getInferredTypesFromFlow ( mockFlow , functions , dataTypes ) ;
4665 const sId = sanitizeId ( nodeId ) ;
66+ const sIdParams = sanitizeId ( nodeIdParams ) ;
67+
68+ const directParams = inferred . parameters . get ( sId ) || [ ] ;
69+ const widenedParams = inferred . parameters . get ( sIdParams ) || [ ] ;
70+
71+ // Merge parameters: prefer widened types unless they failed inference (any/unknown)
72+ const parameters = directParams . map ( ( p , i ) => {
73+ const wide = widenedParams [ i ] ;
74+ if ( wide && wide !== "any" && wide !== "unknown" ) {
75+ return wide ;
76+ }
77+ return p ;
78+ } ) ;
4779
4880 return {
49- parameters : inferred . parameters . get ( sId ) || [ ] ,
81+ parameters,
5082 returnType : inferred . nodes . get ( sId ) || "any" ,
5183 } ;
5284} ;
0 commit comments