
    i=                         d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZmZmZmZmZ e G d d             Z G d	 d
      Zy)zFArtifact event queue utilities used to expose workflow-produced files.    N)deque)	dataclassfield)Path)AnyDequeDictIterableListOptionalSequencec            	       X   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d       Z	e
ed<    ed       Zeed<   dZeed<   dZeed<    ee      Zeeef   ed<   deeef   fdZdddddeee      deee      dee   defdZy)ArtifactEventz;Represents a single file artifact surfaced to the frontend.node_idattachment_id	file_namerelative_pathworkspace_path	mime_typesizesha256data_uric                  *    t        j                          S N)time     L/Users/bowang/.openclaw/workspace/ChatDev/server/services/artifact_events.py<lambda>zArtifactEvent.<lambda>   s
    diikr   )default_factory
created_atc                  >    t        j                         j                  S r   )uuiduuid4hexr   r   r   r   zArtifactEvent.<lambda>   s    $**,2B2Br   event_idr   sequencecreatedchange_typeextrareturnc                 <   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  dS )Nr&   r'   r   r   r   r   r   r   r   r   r   r!   r)   r*   r-   selfs    r   to_dictzArtifactEvent.to_dict   sv    ||!//!//"11IIkk//++ZZ
 	
r   Ninclude_mimeinclude_extmax_sizer2   r3   r4   c                   || j                   | j                   |kD  ry|rB| j                  xs dj                         rt        fd|D              rnd |D        v rny|rtt	        | j
                        j                  j                         }|j                  d      r|dd  }|D ch c]!  }|j                         j                  d      # }}||vryyc c}w )NF c              3   \   K   | ]#  }j                  |j                                % y wr   )
startswithlower).0prefixmimes     r   	<genexpr>z/ArtifactEvent.matches_filter.<locals>.<genexpr>=   s!     W,DOOFLLN;,s   ),c              3   <   K   | ]  }|j                           y wr   )r9   )r:   ms     r   r=   z/ArtifactEvent.matches_filter.<locals>.<genexpr>?   s     :\!'')\s   .   T)	r   r   r9   anyr   r   suffixr8   lstrip)r/   r2   r3   r4   rC   extinclude_ext_normalizedr<   s          @r   matches_filterzArtifactEvent.matches_filter1   s     DII$9dii(>RNN(b//1DW,WW:\::$..)00668F  %IT%U#ciik&8&8&="%U33	 &Vs   -&C)__name__
__module____qualname____doc__str__annotations__r   intr   r!   floatr&   r'   r)   dictr*   r	   r   r0   r   boolrG   r   r   r   r   r      s    ELN}
3-SMsm.ABJB*BCHcCHc K !$7E4S>7
c3h 
* 15/3"& x}- hsm,	
 3- 
r   r   c                      e Zd ZdZdddeddfdZdee   ddfd	Zddddd
dde	e   de	e
e      de	e
e      de	e   dedeee   ef   fdZde	e   de	e
e      de	e
e      de	e   dededeee   eef   fdZedefd       Zy)ArtifactEventQueuez7Thread-safe bounded queue that supports blocking waits.i  )
max_eventsrT   r+   Nc                ~    t               | _        t        j                         | _        || _        d| _        d| _        y )Nr   rA   )r   _events	threading	Condition
_condition_max_events_last_sequence_min_sequence)r/   rT   s     r   __init__zArtifactEventQueue.__init__R   s3    -2W#--/%r   eventsc                 x   |D cg c]  }||	 }}|sy | j                   5  |D ]C  }| xj                  dz  c_        | j                  |_        | j                  j	                  |       E t        | j                        | j                  kD  r{| j                  j                          t        | j                  | j                  t        | j                        z
  dz         | _	        t        | j                        | j                  kD  r{| j                   j                          d d d        y c c}w # 1 sw Y   y xY w)NrA   )rY   r[   r'   rV   appendlenrZ   popleftmaxr\   
notify_all)r/   r^   eventmaterializeds       r   append_manyzArtifactEventQueue.append_manyY   s    +1G6%U5F6G__%##q(#!%!4!4##E* & dll#d&6&66$$&%(););T=P=PSVW[WcWcSd=dgh=h%i" dll#d&6&66 OO&&( _ H _s   D+D+C%D0D00D92   afterr2   r3   r4   limitrj   r2   r3   r4   rk   c                P   t        dt        |d            }||nd}t        || j                  dz
        }g }|}| j                  D ]T  }	|	j                  |k  r|	j                  }|	j                  |||      s4|j                  |	       t        |      |k\  sT n ||k  r|}||fS )NrA      r   r1   )rc   minr\   rV   r'   rG   r`   ra   )
r/   rj   r2   r3   r4   rk   	start_seqr^   next_cursorre   s
             r   snapshotzArtifactEventQueue.snapshotg   s     As5#'".EA		4#5#5#9:	&(\\E~~*..K##)'! $ 
 e$v;%' " "#K{""r   timeoutc                   t        j                          t        d|      z   }| j                  5  | j                  |||||      \  }}	|st        j                          |k  rl|t        j                          z
  }
|
dk  rnO| j                  j	                  |
       | j                  |||||      \  }}	|st        j                          |k  rl| }||	xs |xs d|fcddd       S # 1 sw Y   yxY w)zwBlock until matching events appear or timeout expires.

        Returns (events, next_cursor, timeout_reached)
        g        ri   r   )rr   N)r   rc   rY   rq   wait)r/   rj   r2   r3   r4   rk   rr   deadliner^   rp   	remaining	timed_outs               r   wait_for_eventsz"ArtifactEventQueue.wait_for_events   s     99;S'!22__"&--)'! #0 #FK x!7$tyy{2	>$$Y$7&*mm!- +% '4 '# x!7 #
I;65:A	A+ __s   BC&C&&C/c                     | j                   S r   )r[   r.   s    r   last_sequencez ArtifactEventQueue.last_sequence   s    """r   )rH   rI   rJ   rK   rN   r]   r
   r   rg   r   r   rL   tupler   rq   rO   rQ   rx   propertyrz   r   r   r   rS   rS   O   sH   A,0 c T )(="9 )d )"  $04/3"&# }# x}-	#
 hsm,# 3-# # 
tM"C'	(#>$B }$B x}-	$B
 hsm,$B 3-$B $B $B 
tM"C-	.$BL #s # #r   rS   )rK   rW   r   r#   collectionsr   dataclassesr   r   pathlibr   typingr   r   r	   r
   r   r   r   r   rS   r   r   r   <module>r      sI    L     (  G G G ? ? ?D_# _#r   