
    i
                         d dl Z d dlmZmZmZmZmZ d dlZd dlm	Z	 d dl
mZ deeef   dee   fdZdeeef   deeeef      fdZdeeef   d	ed
ee   ddfdZdedee   fdZd Zedk(  r e        yy)    N)AnyDictListOptionalTuple)
check_yaml)	read_yamlgraphreturnc                     | j                  dg       xs g }g }|D ]5  }|j                  d      }t        |t              s%|j                  |       7 |S )Nnodesid)get
isinstancestrappend)r
   r   idsnnids        A/Users/bowang/.openclaw/workspace/ChatDev/check/check_workflow.py	_node_idsr   
   sO    IIgr"(bECeeDkc3JJsO  J    c                     | j                  dg       xs g }|D cg c]  }t        |t              sd|v sd|v s|! c}S c c}w )Nedgesfromto)r   r   dict)r
   r   es      r   
_edge_listr      sE    IIgr"(bERu!
1d 3!PQ	AuRRRs   AAAA	base_patherrorsc                    | j                  dd      }|ry t        |       }t        |      }| j                  d      }|t        |t              r|g}n(t        |t
              r|}n|j                  | d       y |D ]E  }t        |t              s|j                  | d|        *||vs/|j                  | d| d       G |D 	ci c]  }	|	d }
}	|D 	ci c]  }	|	d }}	t        |       D ]G  }|j                  d	      }|j                  d
      }||v r||xx   dz  cc<   ||
v s;|
|xx   dz  cc<   I |D 	cg c]  }	|j                  |	d      dk(  s|	 }}	t        |      dk(  s||j                  | d       t        | j                  dg       xs g       D ]C  \  }}t        |t              s|j                  d      dk(  s-|j                  d      xs i }t        |t              s|j                  | d| d       j|j                  d      }|dk(  rM|j                  d      }t        |t              s|j                  | d| d       t        || d| d|       |dk(  r[|j                  d      }t        |t              r!t        |j                  d      t              r|j                  | d| d       -|j                  | d| d       F y c c}	w c c}	w c c}	w )Nis_majority_votingFendz(.end must be a string or list of stringsz".end contains non-string element: z!.end references unknown node id ''r   r   r      z<: graph lacks a unique natural end; specify 'end' explicitlyr   typesubgraphconfigz.nodes[z*].config must be object for subgraph nodesz/].config.config must be object when type=configz].config.configfilepathz2].config.config.path must be string when type=filez(].config.type must be 'config' or 'file')r   r   setr   r   listr   r   len	enumerater   _analyze_graph)r
   r    r!   is_mvr   node_setr$   end_listend_node_idr   indegoutdegr   frmr   sinksir   subsg_typeconfig_block
file_blocks                         r   r0   r0      s   II*E2EeE5zH ))E
C
 c3uHT"HMMYK'OPQ $Kk3/ k!CK=Q H, k!B;-qQ $  %%uS!VuE% %&c1fF&eeFmUU4[&=3K1K;"INI  "=ESVZZQ%71%<SEE= J!O;MM+YZ
 %))GR06B71a155=J#>%%/'RCc4(71#5_`aggfoG(""wwx0!,5MM$+WQC/^_ |	{'!O-TV\]F" WWX.
":t4JNNSYDZ\_9`MM$+WQC/ab  k+ST- 8= && >s   	
K*
K/>K4K4datac                     g }t        | t              rd| vrdgS | d   }t        |t              sdgS t        |d|       |S )Nr
   z<root>.graph is requiredz<root>.graph must be object)r   r   r0   )r>   r!   r
   s      r   check_workflow_structurer@   w   sN    FdD!WD%8*++MEeT"-..5'6*Mr   c                  2   t        j                  d      } | j                  dddd       | j                  dd	d
       | j                  ddd d       | j                         }t	        |j
                        }|j                  sOt        j                  |d|j                        }|r+t        d       |D ]  }t        d|         t        d      t        |      }|r+t        d       |D ]  }t        d|         t        d      t        d       y )NzWCheck workflow structure: unique natural start/end or explicit start/end per (sub)graph)descriptionr+   ?zdesign_0.4.0.yamlzPath to YAML file)nargsdefaulthelpz--no-schema
store_truezSkip schema validation (0.4.0))actionrF   z--fn-module	fn_modulezPModule name or .py path where edge functions are defined (for schema validation))destrE   rF   T)set_defaultsfn_module_refzInvalid schema:z- r&   zWorkflow issues:   zWorkflow OK.)argparseArgumentParseradd_argument
parse_argsr	   r+   	no_schemar   validate_designrI   print
SystemExitr@   )parserargsr>   schema_errorsr   logic_errorss         r   mainrZ      s   $$moF
c3FM`a
lAab
Ko  qDTYYD>>"224dZ^ZhZhi#$"1#h #Q-+D1L !ABqc(O mnr   __main__)rN   typingr   r   r   r   r   yamlcheckr   utils.io_utilsr	   r   r   r   r0   r@   rZ   __name__ r   r   <module>rb      s     3 3   $T#s(^ S	 Sd38n Sd38n)= S
[$sCx. [S [$s) [PT [|	3 	49 	: zF r   