
    i$                        d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ e G d
 d             Ze G d d             Ze G d d             Z G d d      Zy)z9Hook that scans a node workspace for newly created files.    N)	dataclass)Path)CallableDictListOptionalSequenceSetTuple)Node)MessageBlockType)AttachmentRecordAttachmentStore)PromptChannelc                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   ee   ed<   ee   ed<   ee   ed	<   ee   ed
<   eed<   eed<   e	ee
f   ed<   y)WorkspaceArtifactz:Represents a file artifact detected by the workspace hook.node_idattachment_id	file_namerelative_pathabsolute_path	mime_typesizesha256data_uri
created_atchange_typeextraN)__name__
__module____qualname____doc__str__annotations__r   intfloatr   object     N/Users/bowang/.openclaw/workspace/ChatDev/workflow/hooks/workspace_artifact.pyr   r      sd    DLN}
3-SMsmVr)   r   c                   "    e Zd ZU eed<   eed<   y)_FileSignaturer   r   N)r   r    r!   r#   r$   r%   r(   r)   r*   r,   r,   $   s    K
Ir)   r,   c                   \    e Zd ZU eed<   eed<   eed<   ee   ed<   ee   ed<   ee   ed<   y)_TrackedEntryr   r   r   r   r   r   N)r   r    r!   r#   r$   r   r%   r(   r)   r*   r.   r.   *   s1    K}
3-smr)   r.   c                   P   e Zd ZdZdddddddedeee   gdf   dee	e
      d	ee	e
      d
ededee   ddfdZdedefdZdee   fdZdededdfdZdedededdfdZdedeee
ef   ef   fdZdedefdZdddedededee
   def
dZdedededede
defd Zd!ede
fd"Zy)#WorkspaceArtifactHookz7Detects workspace file changes for selected node types.Ni  i  @)
node_typesexclude_dirsmax_files_scannedmax_bytes_scannedprompt_channelattachment_storeemit_callbackr1   r2   r3   r4   r5   returnc                    || _         || _        t        |xs ddh      | _        t        |xs ddh      | _        || _        || _        t        j                  t              | _
        i | _        i | _        || _        y )Npythonagentattachments__pycache__)r6   r7   setr1   r2   r3   r4   logging	getLoggerr   logger
_snapshots_last_emittedr5   )selfr6   r7   r1   r2   r3   r4   r5   s           r*   __init__zWorkspaceArtifactHook.__init__7   sz     !1*$'
(Ix6I$J N0NO!2!2''1@B79,r)   nodec                 2    |j                   | j                  v S N)	node_typer1   )rD   rF   s     r*   
can_handlez WorkspaceArtifactHook.can_handleM   s    ~~00r)   c                     | j                   S rH   )r5   )rD   s    r*   get_prompt_channelz(WorkspaceArtifactHook.get_prompt_channelP   s    """r)   	workspacec                     | j                  |      sy | j                  |      \  }}|| j                  |j                  <   y rH   )rJ   	_snapshotrB   id)rD   rF   rM   snapshot_s        r*   before_nodez!WorkspaceArtifactHook.before_nodeS   s5    t$nnY/!#+ r)   successc                   |r| j                  |      s'| j                  j                  |j                  d        y | j                  j                  |j                  i       }| j	                  |      \  }}|s| j
                  sy |j                         D cg c]0  \  }}||vs||   j                  |j                  k7  rt        |      2 }	}}g }
|	D ]8  }|t        |         }||z  }|j                         r|j                         s8	 | j
                  j                  t        |            }|dnd}| j                  ||||r|j                  nd       }|
j%                  | j'                  |||||             t)        |j                  |j*                  j                  xs dt        |      |j*                  j,                  |j*                  j.                  |j*                  j0                        | j
                  t        |      <   ; |st3        | j
                  j5                               D cg c]  }||vr|
 }}|D ]  }| j
                  j                  |d       }|s"|
j%                  t7        |j                  |j                  t        |      j8                  ||j:                  |j,                  |j.                  |j                  |j0                  t=        j<                         dd	|d
              |
r| j?                  |
       y y c c}}w # t        $ r3}| j                   j#                  d||j                  |       Y d }~~d }~ww xY wc c}w )Ncreatedupdatedr   z.Failed to register artifact %s for node %s: %s)r    )r   r   r   r   r   r   deletedworkspace_scan)hookr   r   r   r   r   r   r   r   r   r   r   r   r   ) rJ   rB   poprP   rO   rC   itemsr   r   r#   existsis_fileget_register_artifactr   	ExceptionrA   warningappend_to_artifactr.   refr   r   r   listkeysr   namer   timer7   )rD   rF   rM   rT   beforeafter	truncatedpath_str	signaturechanged_paths	artifactsr   	full_pathtrackedr   recordexcdeleted_pathss                     r*   
after_nodez WorkspaceArtifactHook.after_nodeY   s)    dood3OO.$$TWWb1>>)4yT// (-{{}
'4#)v%)9)@)@IDTDT)T N'4 	 
 .0	*Mc-01I!M1I##%Y->->-@,,00]1CD+2?i	00!;B'"7"7	 1  !!! + "  6C ''$jj66<"!)n **..ZZ__,,6Ds=12? +P  &*$*<*<*A*A*C%D%DM - %D  
 "/,,00E  % $&-&;&;"&}"5":":&3&-&;&;")"3"3$\\&~~!(!1!1#'99;$-$4-:	 "/0 y) [
*  ##D!GG	 6s%   5LAL6M	M#(MMc                    i }d}d}t        j                  |      D ]  \  }}}t        |      j                  |      }|D 	cg c]  }	| j	                  ||	z        r|	 c}	|d d  |D ]  }
||
z  }| j	                  |      rt        |      |
z  }	 |j                         }| j                  |      }|dz  }||j                  z  }t        ||j                        |t        |      <   || j                  k\  s|| j                  k\  s| j                  j                  d||       |dfc c S   |dfS c c}	w # t        $ r Y w xY w)Nr      )r   r   zAWorkspace scan truncated (files=%s total_bytes=%s) for session %sTF)oswalkr   relative_to_is_excludedstat
_hash_fileOSErrorst_sizer,   r#   r3   r4   rA   re   )rD   rM   entriestotal_bytes
file_countrootdirsfilesrel_rootdfilenamerel_pathrt   r   r   s                  r*   rO   zWorkspaceArtifactHook._snapshot   sT   -/
!#!3D$Dz--i8H"&N$Qd.?.?1.Mq$NDG!#h.$$X. J1	$>>+D!__Y7F a
t||+)7vDLL)YH&!7!77;$J`J`;`KK''["#
 #D=(' " "4. ~+ O  s   D5D5!D::	EEr   c                 R    |j                   sy|j                   d   | j                  v S )NFr   )partsr2   )rD   r   s     r*   r   z"WorkspaceArtifactHook._is_excluded   s&    ~~~~a D$5$555r)   rX   rt   r   r   c                    t        j                  |j                        d   xs d}| j                  j	                  |t        j                  |      ||j                  ddd||j                  t        |      dd	      S )Nr   zapplication/octet-streamFTr[   )r   r   r\   )kindr   display_name	copy_filepersistdeduplicater   r   )		mimetypes
guess_typerk   r6   register_filer   from_mime_typerP   r#   )rD   rt   r   rF   r   r   s         r*   rc   z(WorkspaceArtifactHook._register_artifact   s     ((););<Q?]C]	$$22!00;"'77!$]!3( 3 
 	
r)   rv   r   c                f   |j                   }t        |j                  |j                  xs d|j                  xs |j                  t        |      t        |      |j                  |j                  |j                  |j                  t        j                         |t        |j                              S )NrY   r]   )rh   r   rP   r   rk   r#   r   r   r   r   rl   dictr   )rD   rv   rF   r   rt   r   rh   s          r*   rg   z"WorkspaceArtifactHook._to_artifact   s     jj GG++1rhh0)..m,i.mm::\\yy{#v||$
 	
r)   pathc                    t        j                         }|j                  d      5 t        fdd      D ]  }|j	                  |        	 d d d        |j                         S # 1 sw Y   |j                         S xY w)Nrbc                  &     j                  d      S )Ni   )read)handles   r*   <lambda>z2WorkspaceArtifactHook._hash_file.<locals>.<lambda>  s    fkk+&>r)   r)   )hashlibr   openiterupdate	hexdigest)rD   r   hasherchunkr   s       @r*   r   z WorkspaceArtifactHook._hash_file  sh    !YYt_>De$ E  !!  !!s   &A&&A>)r   r    r!   r"   r   r   r   r   r   r	   r#   r%   r   rE   r   boolrJ   rL   r   rS   ry   r   r   r,   rO   r   r   rc   rg   r   r(   r)   r*   r0   r0   4   s   A /304!$!226- *-  &7!8 94 ?@	-
 Xc]+- x}-- - - !/- 
-,1t 1 1#H]$; #, , ,$ ,^*^* ^*
 ^* 
^*@4 E$sN7J2KT2Q,R :6T 6d 6 (,

 
 	
  }
 

2
 
 
 	

 
 
 

2"t " "r)   r0   )r"   r   r?   r   r|   rl   dataclassesr   pathlibr   typingr   r   r   r   r	   r
   r   entity.configsr   entity.messagesr   utils.attachmentsr   r   utils.human_promptr   r   r,   r.   r0   r(   r)   r*   <module>r      s    ?    	  !  G G G  , ? ,   "   
   ^" ^"r)   