
    +j                        S SK Jr  S SKrS SKJr  S SKJrJr  \(       a  S SKJ	r	  S SK
Jr  S SKr " S S\5      rSSS	 jjr " S
 S5      rg)    )annotationsN)web)TYPE_CHECKING	TypedDict)NodeReplace)is_linkc                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)

NodeStruct   z5dict[str, str | int | float | bool | tuple[str, int]]inputsstr
class_typezdict[str, str]_meta N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       8/home/wildlama/comfy/ComfyUI/app/node_replace_manager.pyr
   r
      s    AAOr   r
   c                    U R                  5       nU(       a  0 US'   OU S   R                  5       US'   U S   R                  5       US'   U$ )Nr   r   )copy)node_structempty_inputsnew_node_structs      r   copy_node_structr      sS    !&&(O$&!$/$9$>$>$@!*7388:OGr   c                  R    \ rS rSrSrS rSS jrSS jrSS jrSS jr	S r
S	 rS
rg)NodeReplaceManager   z'Manages node replacement registrations.c                    0 U l         g N_replacements)selfs    r   __init__NodeReplaceManager.__init__    s
    ;=r   c                   U R                   R                  UR                  / 5      nU HK  nUR                  UR                  :X  d  M  [        R
                  " SUR                  UR                  5          g   UR                  U5        g)a  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   registerNodeReplaceManager.register#   ss     %%001I1I2NE  L$<$<<W ,,l.F.F   	%r   c                8    U R                   R                  U5      $ )z$Get replacements for an old node ID.)r%   getr&   r+   s     r   get_replacement"NodeReplaceManager.get_replacement5   s    !!%%k22r   c                    XR                   ;   $ )z1Check if a replacement exists for an old node ID.r$   r7   s     r   has_replacement"NodeReplaceManager.has_replacement9   s    0000r   c                   0 n[        5       nUR                  5        H  u  pESU;  d  SU;  a  M  US   nU[        R                  R	                  5       ;  a'  U R                  U5      (       a  UR                  U5        US   R                  5        HB  u  px[        U5      (       d  M  US   n	UR                  U	/ 5      R                  XGUS   45        MD     M     U GH  nX   nUS   nU R                  U5      n
U
c  M#  U
S   nUR                  nU[        R                  R	                  5       ;  a  MX  [        USS9nXS'   UR                  bE  UR                   H5  nSU;   a  US   US   US   '   M  S	U;   d  M!  US   US	      US   US   '   M7     XU'   UR                  c  M  XB;   d  M  X$    H<  nUu  nnnUR                   H#  nUS
   U:X  d  M  US   nUU   S   U   nUUS'   M%     M>     GM     g )Nr   r   r      T)r   	set_valuenew_idold_idold_idxnew_idx)setitemsnodesNODE_CLASS_MAPPINGSkeysr;   addr   r*   r/   r8   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_replacements%NodeReplaceManager.apply_replacements=   s0   =?%(U(.$K;.(+2M$\2J!:!:!?!?!AAdFZFZ[eFfFf $$[1)4X)>)D)D)F%;''"-a.K**;;BBK[fgh[iCjk *G )7 ,K -K$\2J//
;L#&q/K%11K%";";"@"@"BB.{NO,7L) ((4!,!:!:I"i/IRS^I_1)H2EF!Y.ITU]I^_hiq_rIs1)H2EF	 "; #2;))5-!,!9JOG(-*5*D*DJ))4F1;I1F178H1I(1STa1b4Bq 1	 +E ":; ,r   c                    U R                   R                  5        VVVs0 s H%  u  pX Vs/ s H  o3R                  5       PM     sn_M'     snnn$ s  snf s  snnnf )z#Serialize all replacements to dict.)r%   rE   as_dict)r&   kv_listvs       r   r`   NodeReplaceManager.as_dictq   sU     "//557
7	 V,V		V,,7
 	
,
s   AAAAc                :   ^  UR                  S5      U 4S j5       ng )Nz/node_replacementsc                T   >#    [         R                  " TR                  5       5      $ 7fr#   )r   json_responser`   )requestr&   s    r   get_node_replacements<NodeReplaceManager.add_routes.<locals>.get_node_replacementsy   s     $$T\\^44s   %()r6   )r&   routesri   s   `  r   
add_routesNodeReplaceManager.add_routesx   s    	(	)	5 
*	5r   r$   N)r0   r   )r+   r   returnzlist[NodeReplace] | None)r+   r   rn   bool)rL   zdict[str, NodeStruct])r   r   r   r   __doc__r'   r3   r8   r;   r]   r`   rl   r   r   r   r   r    r       s*    1>&$312Ch
5r   r    )F)r   r
   r   ro   rn   r
   )
__future__r   r-   aiohttpr   typingr   r   comfy_api.latest._io_publicr   comfy_execution.graph_utilsr   rF   r
   r   r    r   r   r   <module>rv      s:    "   +7 /  
^5 ^5r   