
    :j                         d Z ddlmZmZ ddlmZmZ ddlmZ  ed      Z	 G d de
      Z G d d	e
      Z G d
 d      Zy)zt
Dependency resolution engine for pipeline stages.
Calculates stage creation order and validates dependency chains.
    )DictList)StageDefinitionStageRegistry)
get_loggerstagec                       e Zd ZdZy)CircularDependencyErrorz.Raised when circular dependencies are detectedN__name__
__module____qualname____doc__     5/root/.openclaw/workspace/harvester/stage/resolver.pyr
   r
      s    8r   r
   c                       e Zd ZdZy)MissingDependencyErrorz-Raised when required dependencies are missingNr   r   r   r   r   r      s    7r   r   c            	           e Zd ZdZdefdZdee   dee   fdZdee   de	fdZ
d	edee   fd
Zd	edee   fdZdeeef   deeef   deeef   fdZdeeef   dee   fdZdee   deeeeee   f   f   fdZy)DependencyResolverz9Resolves stage dependencies and calculates creation orderregistryc                     || _         y )N)r   )selfr   s     r   __init__zDependencyResolver.__init__   s	     r   requested_stagesreturnc                 P   | j                   j                         D ci c]  }|j                  | }}i }|D ](  }||v r	||   ||<   t        j	                  d| d       * |sg S | j                  ||      }| j                  |      }t        j                  d|        |S c c}w )z
        Resolve stage creation order based on dependencies.
        Returns stages in the order they should be created.
        zRequested stage 'z' not found in registryzResolved stage order: )r   list_allnameloggerwarning_collect_dependencies_topological_sortinfo)r   r   r   
all_stagesavailable_stagesr   needed_stagesordered_stagess           r   resolve_orderz DependencyResolver.resolve_order"   s     6:]]5K5K5MNEejj%'N
N $ 	RDz!)3D)9 &!24&8OPQ		R  I 223CZP //>,^,<=>) Os   B#stagesc                 R    	 | j                  |       y# t        t        f$ r Y yw xY w)z/Validate that all dependencies can be satisfiedTF)r)   r
   r   )r   r*   s     r   validate_dependenciesz(DependencyResolver.validate_dependencies>   s0    	v&')?@ 		s    &&
stage_namec                 X    | j                   j                  |      }|r|j                  S g S )z"Get direct dependencies of a stage)r   get
depends_on)r   r-   
definitions      r   get_dependenciesz#DependencyResolver.get_dependenciesF   s)    ]]&&z2
(2z$$::r   c                     g }| j                   j                         D ],  }||j                  v s|j                  |j                         . |S )z)Get stages that depend on the given stage)r   r   r0   appendr   )r   r-   
dependentsr1   s       r   get_dependentsz!DependencyResolver.get_dependentsK   sK    
--002 	3JZ222!!*//2	3 r   	requestedr%   c                 N   |j                         }t        |j                               }|ry|j                  d      }||   }|j                  D ]Q  }||vs||v r5||   ||<   |j                  |       t        j                  d| d|        At        d| d| d       |ry|S )z-Recursively collect all required dependenciesr   zAdded dependency: z for zStage 'z' depends on 'z' which is not registered)	copylistkeyspopr0   r4   r    debugr   )r   r7   r%   needed
to_processcurrentr1   dep_names           r   r"   z(DependencyResolver._collect_dependenciesS   s     !)..*+
 nnQ'GJ&11 	6):-+5h+?x("))(3'9(5	%RS4%gYnXJF_` 		  r   c                 r   i }i }|D ]  }g ||<   d||<    |j                         D ]<  \  }}|j                  D ](  }||v s||   j                  |       ||xx   dz  cc<   * > |j                         D cg c]  \  }}|dk(  s| }}}g }	|rV|j                  d      }
|	j                  |
       ||
   D ])  }||xx   dz  cc<   ||   dk(  s|j                  |       + |rVt	        |	      t	        |      k7  r3t        |j                               t        |	      z
  }t        d|       |	S c c}}w )z4Perform topological sort to determine creation orderr      z+Circular dependency detected among stages: )itemsr0   r4   r<   lensetr;   r
   )r   r*   graph	in_degreer   r1   depdegreequeueresultr@   neighbor	remainings                r   r#   z$DependencyResolver._topological_sortk   sZ    	 	 DE$KIdO	  !' 	)D*!,, )%<#J%%d+dOq(O)	) +4//*;K,$v{KKiilGMM'"!'N +(#q(#X&!+LL*+	  v;#f+%FKKM*S[8I),WXaWb*cdd# Ls   8D3D3c                     | j                  |      }|i i d}|D ]C  }| j                  |      |d   |<   |D cg c]  }|| j                  |      v s| c}|d   |<   E |S c c}w )z=Build a complete dependency graph for visualization/debugging)nodesdependenciesr5   rQ   r5   )r)   r2   )r   r*   r(   rG   r   rI   s         r   build_dependency_graphz)DependencyResolver.build_dependency_graph   s    ++F3("BO# 	pE+/+@+@+GE.!%(9G)o#5TXTiTijmTnKn#)oE,&	p  *ps   A"A"N)r   r   r   r   r   r   r   strr)   boolr,   r2   r6   r   r   r"   r#   rR   r   r   r   r   r      s    C! !d3i DI 8DI $ ;3 ;49 ;
 c c?23AEc?FZA[	c?"	#0"S/-A(B "tCy "H
T#Y 
4T#tTWy.EY@Y;Z 
r   r   N)r   typingr   r   stage.registryr   r   tools.loggerr   r    	Exceptionr
   r   r   r   r   r   <module>rY      sC   
  9 #	G		i 		Y 	} }r   