
    i6                        d Z ddlZddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZmZmZmZmZ ddlmZmZ ded	ed
efdZdddeded
efdZdeded
eeef   fdZdededededed
dfdZdededed
dfdZdededed
dfdZy)z<Utilities for validating and persisting workflow YAML files.    N)Path)AnyTuple)check_config)ResourceConflictErrorResourceNotFoundErrorSecurityErrorValidationErrorWorkflowExecutionError)get_server_loggerLogTypecontentworkflow_idreturnc                 r   t        j                  dt         j                        }|j                  |       }|r|j	                  d| | d      S | j                         }d}|r|d   j                         dk(  rd}|j                  |d|        dj                  |      }| j                  d      r|dz  }|S )	Nz^(id:\\s*).*$z\\1   )countr   z---zid: 
)
recompile	MULTILINEsearchsub
splitlinesstripinsertjoinendswith)r   r   patternmatchlinesinsert_indexupdateds          M/Users/bowang/.openclaw/workspace/ChatDev/server/services/workflow_storage.py_update_workflow_idr%      s    jj)2<<8GNN7#E{{c+/{BB ELq!U*	LLk]34iiG4N    Trequire_yaml_extensionfilenamer(   c                   | xs dj                         }|st        dd      d|v s|j                  d      r2t               }|j	                  dd| d	|i
       t        dd|i
      t        j                  d|      st        dd      |r|j                  d      st        dd      t        |      j                  S )zASanitize workflow filenames and guard against traversal attempts. zFilename cannot be emptyr)   fieldz..)/\PATH_TRAVERSAL_ATTEMPTzSuspicious filename detected: received_filenamedetailszInvalid filename formatz^[a-zA-Z0-9._-]+$zRInvalid filename: only letters, digits, dots, underscores, and hyphens are allowed)z.yamlz.ymlz$Filename must end with .yaml or .yml)r   r
   
startswithr   log_security_eventr	   r   r    r   r   name)r)   r(   valueloggers       r$   validate_workflow_filenamer9   %   s     ^""$E8
KKu}((5"$!!$,UG4(%0 	" 	

 5
E?RSS88(%0`
 	

 enn5F&GDJWW;r&   c                 P   t        | d      }	 t        j                  |      }|t        dd      t	        |      }|rt        d| d      	 ||fS # t        j
                  $ r=}t               }|j                  ddt        |      i	       t        d
| d      d }~ww xY w)NTr'   zYAML content is emptyr   r,   zYAML validation errors:
zInvalid YAML content in uploaderrorr2   zInvalid YAML syntax: )	r9   yaml	safe_loadr
   r   	YAMLErrorr   warningstr)r)   r   safe_filenameyaml_contenterrorsexcr8   s          r$   validate_workflow_contentrE   A   s    .xPTUMN~~g.!"9KKl+!$=fX"FiXX  ,&& >> N"$7'3s8ATU 5cU;9MMNs   AA B%(8B  B%rA   rB   action	directoryc                    || z  }t               }	 |j                  |d       |j                  dt        j                  | |       y # t        $ r)}|j                  |d|         t	        dd| i      d }~ww xY w)	Nutf-8encodingzFailed to save workflow file zFailed to save workflow filer)   r2   zWorkflow file persisted)log_typer)   rF   )r   
write_text	Exceptionlog_exceptionr   infor   WORKFLOW)rA   r   rB   rF   rG   	save_pathr8   rD   s           r$   persist_workflowrS   T   s     M)I F
Ww7 KK!!!	    
S$A-"QR$*Z4O
 	

s   A 	A:$A55A:source_filenametarget_filenamec                   t        | d      }t        |d      }||k(  rt        dd      ||z  }||z  }|j                         r|j                         st	        dd|      |j                         rt        d	d|      t               }	 |j                  |       	 t        |      j                  }	|j                  d      }
t        |
|	      }||
k7  r|j                  |d       |j!                  dt"        j$                  ||d       y # t        $ r-}|j                  |d
| d|        t        d||d      d }~ww xY w# t        $ r)}|j                  |d|        t        dd|i      d }~ww xY w)NTr'   -Source and target filenames must be differentnew_filenamer,   Workflow file not foundworkflowresource_typeresource_idTarget workflow already existszFailed to rename workflow file  to zFailed to rename workflow filesourcetargetr2   rI   rJ   z-Failed to update workflow id after rename to z)Failed to update workflow id after renamerb   zWorkflow file renamedrenamerL   ra   rb   rF   )r9   r
   existsis_filer   r   r   rc   rN   rO   r   r   stem	read_textr%   rM   rP   r   rQ   )rT   rU   rG   source_safetarget_safesource_pathtarget_pathr8   rD   new_workflow_idr   r#   s               r$   rename_workflowrn   o   s   ,_UYZK,_UYZKk!MUcddk)Kk)K{':':'<#%$#
 	
 #,$#
 	
  F
;'
{+00'''9%g?g""7W"= KK!!  )  
S$CK=PTU`Ta"bc$,*kB
 	

  
S$QR]Q^"_`$7{+
 	

s1   D  AE	 	E(EE		E;$E66E;c                   t        | d      }t        |d      }||k(  rt        dd      ||z  }||z  }|j                         r|j                         st	        dd|      |j                         rt        d	d|      t               }	 |j                  |j                  d
      d
       |j                  dt        j                  ||d       y # t        $ r-}|j                  |d| d|        t        d||d      d }~ww xY w)NTr'   rW   rX   r,   rY   rZ   r[   r^   rI   rJ   zFailed to copy workflow file r_   zFailed to copy workflow filer`   r2   zWorkflow file copiedcopyrd   )r9   r
   re   rf   r   r   r   rM   rh   rN   rO   r   rP   r   rQ   )	rT   rU   rG   ri   rj   rk   rl   r8   rD   s	            r$   copy_workflowrq      s;   ,_UYZK,_UYZKk!MUcddk)Kk)K{':':'<#%$#
 	
 #,$#
 	
  F
{44g4FQXY KK!!    
S$A+dS^R_"`a$**kB
 	

s   #C 	D(DD)__doc__r   pathlibr   typingr   r   r<   check.checkr   utils.exceptionsr   r   r	   r
   r   utils.structured_loggerr   r   r@   r%   boolr9   rE   rS   rn   rq    r&   r$   <module>rz      s   B 	    $  ? 3 3 " QU   Y\ 8' 'c 'eCHo '& 
   
65S 53 5d 5W[ 5p(3 ( (D (UY (r&   