
    ^(j                        d dl mZ d dlZd dlmZ d dlmZmZ erd dlm	Z	 d dl
mZ d dlZ G d de      Zddd	Z G d
 d      Zy)    )annotationsN)web)TYPE_CHECKING	TypedDict)NodeReplace)is_linkc                  ,    e Zd ZU ded<   ded<   ded<   y)
NodeStructz5dict[str, str | int | float | bool | tuple[str, int]]inputsstr
class_typezdict[str, str]_metaN)__name__
__module____qualname____annotations__     B/Users/danicosta/Desktop/Flux2/ComfyUI/app/node_replace_manager.pyr
   r
      s    AAOr   r
   c                    | j                         }|ri |d<   n| d   j                         |d<   | d   j                         |d<   |S )Nr   r   )copy)node_structempty_inputsnew_node_structs      r   copy_node_structr      sS    !&&(O$&!$/$9$>$>$@!*7388:OGr   c                  B    e Zd ZdZd Zd
dZddZddZddZd Z	d Z
y	)NodeReplaceManagerz'Manages node replacement registrations.c                    i | _         y N_replacements)selfs    r   __init__zNodeReplaceManager.__init__    s
    ;=r   c                   | j                   j                  |j                  g       }|D ]H  }|j                  |j                  k(  st	        j
                  d|j                  |j                          y |j                  |       y)aB  Register a node replacement mapping.

        Idempotent: if a replacement with the same (old_node_id, new_node_id)
        is already registered, the duplicate is ignored. This prevents stale
        entries from accumulating when custom nodes are reloaded in the same
        process (e.g. via ComfyUI-Manager).
        zANode replacement %s -> %s already registered, ignoring duplicate.N)r!   
setdefaultold_node_idnew_node_idloggingdebugappend)r"   node_replaceexistingentrys       r   registerzNodeReplaceManager.register#   ss     %%001I1I2NE  L$<$<<W ,,l.F.F   	%r   c                8    | j                   j                  |      S )z$Get replacements for an old node ID.)r!   getr"   r&   s     r   get_replacementz"NodeReplaceManager.get_replacement5   s    !!%%k22r   c                    || j                   v S )z1Check if a replacement exists for an old node ID.r    r1   s     r   has_replacementz"NodeReplaceManager.has_replacement9   s    d0000r   c                   i }t               }|j                         D ]  \  }}d|vsd|vr|d   }|t        j                  j	                         vr"| j                  |      r|j                  |       |d   j                         D ]=  \  }}t        |      s|d   }	|j                  |	g       j                  |||d   f       ?  |D ]  }||   }|d   }| j                  |      }
|
"|
d   }|j                  }|t        j                  j	                         vrTt        |d      }||d<   |j                  =|j                  D ].  }d|v r|d   |d   |d   <   d	|v s|d   |d	      |d   |d   <   0 |||<   |j                  ||v s||   D ]7  }|\  }}}|j                  D ]   }|d
   |k(  s|d   }||   d   |   }||d<   " 9  y )Nr   r   r      T)r   	set_valuenew_idold_idold_idxnew_idx)setitemsnodesNODE_CLASS_MAPPINGSkeysr4   addr   r%   r*   r2   r'   r   input_mappingoutput_mapping)r"   promptconnectionsneed_replacementnode_numberr   r   input_idinput_valueconn_numberreplacementsreplacementr'   r   	input_mapconnsconn_node_numberconn_input_idold_output_idx
output_mapnew_output_idxprevious_inputs                         r   apply_replacementsz%NodeReplaceManager.apply_replacements=   s;   =?%(U(.$K;.(+2M$\2J!:!:!?!?!AAdFZFZ[eFf $$[1)4X)>)D)D)F%+;'"-a.K**;;BBKQY[fgh[iCjk *G )7 ,K -K$\2J//
;L#&q/K%11K%";";"@"@"BB.{NO,7OL) ((4!,!:!:I"i/IRS^I_1)H2EF!Y.ITU]I^_hiq_rIs1)H2EF	 "; #2F;))5+-!,[!9JOG(-*5*D*DJ))4F1;I1F178H1I(1STa1b4Bq 1	 +E ":; ,r   c                    | j                   j                         D ci c]$  \  }}||D cg c]  }|j                          c}& c}}}S c c}w c c}}}w )z#Serialize all replacements to dict.)r!   r=   as_dict)r"   kv_listvs       r   rW   zNodeReplaceManager.as_dictq   sY     "//557
7	6 V,V		V,,7
 	
,
s   AAAAc                8     |j                  d       fd       }y )Nz/node_replacementsc                R   K   t        j                  j                               S wr   )r   json_responserW   )requestr"   s    r   get_node_replacementsz<NodeReplaceManager.add_routes.<locals>.get_node_replacementsy   s     $$T\\^44s   $')r0   )r"   routesr_   s   `  r   
add_routeszNodeReplaceManager.add_routesx   s    	(	)	5 
*	5r   N)r+   r   )r&   r   returnzlist[NodeReplace] | None)r&   r   rb   bool)rD   zdict[str, NodeStruct])r   r   r   __doc__r#   r.   r2   r4   rU   rW   ra   r   r   r   r   r      s*    1>&$312Ch
5r   r   )F)r   r
   r   rc   rb   r
   )
__future__r   r(   aiohttpr   typingr   r   comfy_api.latest._io_publicr   comfy_execution.graph_utilsr   r>   r
   r   r   r   r   r   <module>rj      s:    "   +7 /  
^5 ^5r   