
    iN                        U d dl mZ d dlmZ d dlmZ d dlZd dlmZm	Z	m
Z
mZmZ  G d dee      Z G d d	e      Z ed
       G d d             Ze	egdf   Zej&                  dej(                  iej(                  ej*                  ej,                  dej*                  ej.                  ej,                  dej.                  ej0                  ej&                  ej(                  dej0                  ej,                  ej,                  ej(                  dej2                  ej,                  ej(                  dej,                  ej&                  ej(                  diZded<   dej&                  iZded<    G d d      Zy)    )annotations)	dataclass)EnumN)AnyCallableDictListOptionalc                  (    e Zd ZdZdZdZdZdZdZdZ	y)	OrchestratorStateIDLE	LISTENING
PROCESSINGAWAITING_CONFIRMEXECUTING_ACTIONSACTINGSPEAKINGN)
__name__
__module____qualname__r   r   r   r   r   r   r        ;/home/nelsen/Projects/HRI/orchestrator/src/state_machine.pyr   r   	   s'    DIJ)+FHr   r   c                      e Zd Zy)InvalidTransitionN)r   r   r   r   r   r   r   r      s    r   r   T)frozenc                  D    e Zd ZU ded<   ded<   ded<   ded<   dZd	ed
<   y)TransitionRecordfloat	timestampr   previousstreventnextNOptional[Dict[str, Any]]payload)r   r   r   __annotations__r&   r   r   r   r   r      s$    J
(,G%,r   r   wake_word_detected)final_transcripttimeout)llm_responseprocessing_failed)user_confirmeduser_rejectedbarge_in)actions_completeactions_failedr/   )action_completer/   )tts_completer/   z5Dict[OrchestratorState, Dict[str, OrchestratorState]]DEFAULT_TRANSITIONSresetzDict[str, OrchestratorState]GLOBAL_TRANSITIONSc                  t    e Zd Zej                  df	 	 	 	 	 d	dZed
d       ZddZddZ	ddZ
dddZddZy)OrchestratorStateMachineNc                L    || _         |xs t        | _        g | _        g | _        y N)_stater4   _transitions_history
_listeners)selfinitial_statetransitionss      r   __init__z!OrchestratorStateMachine.__init__I   s'    
 $'>+>0246r   c                    | j                   S r:   )r;   r?   s    r   statezOrchestratorStateMachine.stateS   s    {{r   c                :    | j                   j                  |       y r:   )r>   append)r?   listeners     r   add_listenerz%OrchestratorStateMachine.add_listenerW   s    x(r   c                    |j                         }|| j                  j                  | j                  i       v xs |t        v S r:   )stripr<   getr;   r6   )r?   r#   	event_keys      r   
can_handlez#OrchestratorStateMachine.can_handleZ   s:    KKM	D--11$++rBBeiSeFeer   c           	         t        | j                  j                  | j                  i       j	                               }t        t        |t        t        j	                               z               S r:   )listr<   rL   r;   keyssortedsetr6   )r?   locals     r   valid_eventsz%OrchestratorStateMachine.valid_events^   sP    T&&**4;;;@@BCc%$'9'>'>'@"AABCCr   c                   |j                         }| j                  j                  | j                  i       j                  |      }|t        j                  |      }|&t        d| d| j                  j                   d      | j                  }|| _        t        t        j                         ||||      }| j                  j                  |       t        | j                        D ]
  } ||        | j                  S )NzCannot handle event 'z' from state .)r    r!   r#   r$   r&   )rK   r<   rL   r;   r6   r   valuer   timer=   rG   rP   r>   )r?   r#   r&   rM   targetr!   recordrH   s           r   handle_eventz%OrchestratorStateMachine.handle_eventb   s    KKM	""&&t{{B7;;IF>'++I6F>#'	{-@Q@Q?RRST  ;;!iik
 	V$T__- 	HV	{{r   c                ,    t        | j                        S r:   )rP   r=   rD   s    r   historyz OrchestratorStateMachine.historyz   s    DMM""r   )r@   r   rA   z?Optional[Dict[OrchestratorState, Dict[str, OrchestratorState]]]returnNone)r_   r   )rH   TransitionListenerr_   r`   )r#   r"   r_   bool)r_   z	List[str]r:   )r#   r"   r&   r%   r_   r   )r_   zList[TransitionRecord])r   r   r   r   r   rB   propertyrE   rI   rN   rU   r\   r^   r   r   r   r8   r8   H   sa     ,=+A+AW[7(7 U7 
	7  )fD0#r   r8   )
__future__r   dataclassesr   enumr   rY   typingr   r   r   r	   r
   r"   r   RuntimeErrorr   r   ra   r   r   r   r   r   r   r   r4   r'   r6   r8   r   r   r   <module>ri      s   " !   6 6T 	 	 $- - - /0$67  /99 -88$--"   )::.77# &&+==*//%//)
 ''-66+44%//*
 ,55%// )..%//!5N J B ##4 0 
3# 3#r   