
    +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dS )    )annotationsN)web)TYPE_CHECKING	TypedDict)NodeReplace)is_linkc                  .    e Zd ZU ded<   ded<   ded<   dS )
NodeStructz5dict[str, str | int | float | bool | tuple[str, int]]inputsstr
class_typezdict[str, str]_metaN)__name__
__module____qualname____annotations__     8/home/wildlama/comfy/ComfyUI/app/node_replace_manager.pyr
   r
      s3         AAAAOOOr   r
   Fnode_structempty_inputsboolreturnc                    |                                  }|ri |d<   n| d                                          |d<   | d                                          |d<   |S )Nr   r   )copy)r   r   new_node_structs      r   copy_node_structr      se    !&&((O A$&!!$/$9$>$>$@$@!*7388::OGr   c                  D    e Zd ZdZd ZddZdd
ZddZddZd Z	d Z
dS )NodeReplaceManagerz'Manages node replacement registrations.c                    i | _         d S N_replacementsselfs    r   __init__zNodeReplaceManager.__init__    s    ;=r   node_replacer   c                    | j                             |j        g           }|D ]5}|j        |j        k    r#t	          j        d|j        |j                    dS 6|                    |           dS )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%   r'   existingentrys       r   registerzNodeReplaceManager.register#   s     %001I2NN 	 	E L$<<<W ,l.F    = 	%%%%%r   r*   r   r   list[NodeReplace] | Nonec                6    | j                             |          S )z$Get replacements for an old node ID.)r#   getr%   r*   s     r   get_replacementz"NodeReplaceManager.get_replacement5   s    !%%k222r   r   c                    || j         v S )z1Check if a replacement exists for an old node ID.r"   r5   s     r   has_replacementz"NodeReplaceManager.has_replacement9   s    d000r   promptdict[str, NodeStruct]c                $   i }t                      }|                                D ]\  }}d|vsd|vr|d         }|t          j                                        vr*|                     |          r|                    |           |d                                         D ]N\  }}t          |          r:|d         }	|                    |	g           	                    |||d         f           O|D ]}||         }|d         }| 
                    |          }
|
+|
d         }|j        }|t          j                                        vr[t          |d          }||d<   |j        M|j        D ]E}d|v r|d         |d         |d         <   d	|v r#|d         |d	                  |d         |d         <   F|||<   |j        L||v rH||         D ]?}|\  }}}|j        D ]/}|d
         |k    r!|d         }||         d         |         }||d<   0@d S )Nr   r   r      T)r   	set_valuenew_idold_idold_idxnew_idx)setitemsnodesNODE_CLASS_MAPPINGSkeysr8   addr   r)   r.   r6   r+   r   input_mappingoutput_mapping)r%   r9   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   =?%(UU(. 	l 	l$K;..(+2M2M$\2J!:!?!?!A!AAAdFZFZ[eFfFfA $$[111)4X)>)D)D)F)F l l%+;'' l"-a.K**;;;BBKQY[fgh[iCjkkkl , #	C #	CK -K$\2J//
;;L#&q/K%1K%";"@"@"B"BBB.{NNNO,7OL) (4!,!: t tI"i//IRS^I_1)H2EFF!Y..ITU]I^_hiq_rIs1)H2EF"1F;)5+--!,[!9 C CJOG(-*5*D C CJ))4FF1;I1F178H1I(1STa1b4Bq 1	C?#	C #	Cr   c                H    d | j                                         D             S )z#Serialize all replacements to dict.c                .    i | ]\  }}|d  |D             S )c                6    g | ]}|                                 S r   )as_dict).0vs     r   
<listcomp>z9NodeReplaceManager.as_dict.<locals>.<dictcomp>.<listcomp>t   s     ,,,		,,,r   r   )r_   kv_lists      r   
<dictcomp>z.NodeReplaceManager.as_dict.<locals>.<dictcomp>s   s=     
 
 
6 ,,V,,,
 
 
r   )r#   rC   r$   s    r   r^   zNodeReplaceManager.as_dictq   s2    
 
!/5577
 
 
 	
r   c                H     |                     d           fd            }d S )Nz/node_replacementsc                T   K   t          j                                                  S r!   )r   json_responser^   )requestr%   s    r   get_node_replacementsz<NodeReplaceManager.add_routes.<locals>.get_node_replacementsy   s       $T\\^^444r   )r4   )r%   routesri   s   `  r   
add_routeszNodeReplaceManager.add_routesx   s>    	(	)	)	5 	5 	5 	5 
*	)	5 	5 	5r   N)r'   r   )r*   r   r   r2   )r*   r   r   r   )r9   r:   )r   r   r   __doc__r&   r1   r6   r8   rZ   r^   rk   r   r   r   r   r      s        11> > >& & & &$3 3 3 31 1 1 12C 2C 2C 2Ch
 
 
5 5 5 5 5r   r   )F)r   r
   r   r   r   r
   )
__future__r   r,   aiohttpr   typingr   r   comfy_api.latest._io_publicr   comfy_execution.graph_utilsr   rD   r
   r   r   r   r   r   <module>rr      s    " " " " " "        + + + + + + + + 8777777 / / / / / /        
    ^5 ^5 ^5 ^5 ^5 ^5 ^5 ^5 ^5 ^5r   