
    i	                     T    d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	  G d d      Z
y)	z>Utilities to distribute artifact events to internal consumers.    N)Sequence)ArtifactEvent)WorkflowSessionStore)WorkspaceArtifactc                   d    e Zd ZdZ	 ddededdfdZdee   ddfdZ	d	ee
   ddfd
Zdede
fdZy)ArtifactDispatcherzJPersists artifact events and optionally mirrors them to WebSocket clients.N
session_idsession_storereturnc                 j    || _         || _        || _        t        j                  t
              | _        y N)r	   r
   websocket_managerlogging	getLogger__name__logger)selfr	   r
   r   s       P/Users/bowang/.openclaw/workspace/ChatDev/server/services/artifact_dispatcher.py__init__zArtifactDispatcher.__init__   s-     %*!2''1    	artifactsc                 r    |sy |D cg c]  }| j                  |       }}| j                  |       y c c}w r   )_workspace_to_eventemit)r   r   artifacteventss       r   emit_workspace_artifactsz+ArtifactDispatcher.emit_workspace_artifacts   s9    ENOY$**84YO		& Ps   4r   c                    |sy | j                   j                  | j                        }|s'| j                  j	                  d| j                         y |j                  |       | j                  rVd| j                  |D cg c]  }|j                          c}dd}	 | j                  j                  | j                  |       y y c c}w # t        $ r&}| j                  j                  d|       Y d }~y d }~ww xY w)Nz%Artifact queue missing for session %sartifact_created)r	   r   )typedataz'Failed to broadcast artifact events: %s)r
   get_artifact_queuer	   r   debugappend_manyr   to_dictsend_message_sync	Exceptionwarning)r   r   queueeventpayloadexcs         r   r   zArtifactDispatcher.emit   s    ""55dooFKKEtW&!!!*"&//<BCF5u}}FCGT&&88'R "
 D
  T##$MsSSTs   ?C&C 	C:C55C:r   c                     t        |j                  |j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                        S )N)node_idattachment_id	file_namerelative_pathworkspace_path	mime_typesizesha256data_uri
created_atchange_typeextra)r   r.   r/   r0   r1   absolute_pathr3   r4   r5   r6   r7   r8   r9   )r   r   s     r   r   z&ArtifactDispatcher._workspace_to_event4   su    $$"00(("00#11((??&&** ,,..
 	
r   r   )r   
__module____qualname____doc__strr   r   r   r   r   r   r   r    r   r   r   r      st    T 		2	2 ,	2
 
	2(;L2M RV T8M2 Tt T*
,= 
- 
r   r   )r=   r   typingr   server.services.artifact_eventsr   server.services.session_storer   !workflow.hooks.workspace_artifactr   r   r?   r   r   <module>rD      s!    D   9 > ?7
 7
r   