
    i;              	         d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZ  G d dee      Z G d d	ee      Z G d
 dee      Z G d dee      Z G d dee      Z G d dee      Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d  d!             Ze G d" d#             Ze G d$ d%             Ze G d& d'             Ze G d( d)             Ze G d* d+             Z e G d, d-             Z!e G d. d/             Z"e G d0 d1             Z#eeeeee e!e"e#f   Z$d4d2Z%y3)5a  Edge Proxy WebSocket message definitions.

This module defines the message types and dataclasses for communication
with the robot Edge Proxy over WebSocket, following the Edge Proxy Design spec.
See: /home/nelsen/Projects/HRI/docs/plans/2026-02-04-edge-proxy-design.md
    )annotations)	dataclass)Enum)AnyDictListOptionalUnionc                  D    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZy)MessageTypezpEdge Proxy message types.

    These correspond to the message types defined in the Edge Proxy Design spec.
    
nav_statusrobot_statewaypoint_listerrorpongframe_responsefr_detections	event_lognavigatecancel_navigation	get_statepingcapture_frameN)__name__
__module____qualname____doc__
NAV_STATUSROBOT_STATEWAYPOINT_LISTERRORPONGFRAME_RESPONSEFR_DETECTIONS	EVENT_LOGNAVIGATECANCEL_NAVIGATION	GET_STATEPINGCAPTURE_FRAME     G/home/nelsen/Projects/kognitive/orchestrator/src/edge_proxy/messages.pyr   r      sM     JK#MED%N#MI H+ID#Mr,   r   c                  $    e Zd ZdZdZdZdZdZdZy)	NavStatusz)Navigation status values from Edge Proxy.accepted
navigatingarrivedfailed	cancelledN)	r   r   r   r   ACCEPTED
NAVIGATINGARRIVEDFAILED	CANCELLEDr+   r,   r-   r/   r/   '   s    3HJGFIr,   r/   c                  $    e Zd ZdZdZdZdZdZdZy)NavErrorCodez'Navigation error codes from Edge Proxy.NAV_BLOCKEDNAV_TIMEOUTNAV_LOCALIZATION_LOSTNAV_INVALID_GOALNAV_WAYPOINT_NOT_FOUNDN)	r   r   r   r   r<   r=   r>   r?   r@   r+   r,   r-   r;   r;   1   s!    1KK3)5r,   r;   c                      e Zd ZdZdZdZdZy)SpeedzNavigation speed settings.slownormalfastN)r   r   r   r   SLOWNORMALFASTr+   r,   r-   rB   rB   ;   s    $DFDr,   rB   c                      e Zd ZdZdZdZdZy)GoalTypez"Goal type for navigation commands.waypointposerelativeN)r   r   r   r   WAYPOINTPOSERELATIVEr+   r,   r-   rJ   rJ   C   s    ,HDHr,   rJ   c                       e Zd ZdZdZdZdZdZy)RelativeDirectionz"Direction for relative navigation.forwardbackwardleftrightN)r   r   r   r   FORWARDBACKWARDLEFTRIGHTr+   r,   r-   rR   rR   K   s    ,GHDEr,   rR   c                     e Zd ZU dZej
                  Zded<   dZded<   dZ	ded<   e
j                  Zded	<   d
 ZddZede
j                  fdd       Zedde
j                  f	 	 	 	 	 dd       Zede
j$                  f	 	 	 	 	 dd       Zy)NavigateCommandzkNavigate command message (Orchestrator -> Edge Proxy).

    Spec: Section 4.1-4.3 of Edge Proxy Design
    strtype 
request_idNDict[str, Any]goalspeedc                ,    | j                   i | _         y y N)rb   selfs    r-   __post_init__zNavigateCommand.__post_init__e   s    99DI r,   c                `    | j                   | j                  | j                  | j                  dS )-Convert to dictionary for JSON serialization.r^   r`   rb   rc   rk   rf   s    r-   to_dictzNavigateCommand.to_dicti   s*     II//IIZZ	
 	
r,   c                X     | t         j                  |t        j                  |d|      S )z%Create a waypoint navigation command.)r^   namerk   )r   r&   rJ   rN   )clsrn   r`   rc   s       r-   to_waypointzNavigateCommand.to_waypointr   s.     %%!"++T:	
 	
r,           c           	     \     | t         j                  |t        j                  |||d|      S )z!Create a pose navigation command.)r^   xythetark   )r   r&   rJ   rO   )ro   rs   rt   ru   r`   rc   s         r-   to_posezNavigateCommand.to_pose|   s0     %%!"--aa%H	
 	
r,   c                Z     | t         j                  |t        j                  ||d|      S )z%Create a relative navigation command.)r^   	directiondistancerk   )r   r&   rJ   rP   )ro   rx   ry   r`   rc   s        r-   to_relativezNavigateCommand.to_relative   s1     %%!"++)QYZ	
 	
r,   returnra   )rn   r]   r`   r]   rc   r]   r|   r\   )rs   floatrt   r}   ru   r}   r`   r]   rc   r]   r|   r\   )
rx   r]   ry   r}   r`   r]   rc   r]   r|   r\   )r   r   r   r   r   r&   r^   __annotations__r`   rb   rB   rG   rc   rh   rl   classmethodrp   rv   rF   rz   r+   r,   r-   r\   r\   Y   s    
 $$D#$JD.E3
 68u|| 
 
 8;"$5<<

-0
DS
 
 %'ejj
"
03
ET
 
r,   r\   c                  X    e Zd ZU dZej
                  Zded<   dZded<   dZ	ded<   d	dZ
y)
CancelNavigationCommandzSCancel navigation command message.

    Spec: Section 4.4 of Edge Proxy Design
    r]   r^   r_   r`   reasonc                J    | j                   | j                  | j                  dS )rj   r^   r`   r   r   rf   s    r-   rl   zCancelNavigationCommand.to_dict   s#     II//kk
 	
r,   Nr{   )r   r   r   r   r   r'   r^   r~   r`   r   rl   r+   r,   r-   r   r      s2    
 --D#-JFC
r,   r   c                  J    e Zd ZU dZej
                  Zded<   dZded<   ddZ	y)	GetStateCommandzORequest state command message.

    Spec: Section 4.5 of Edge Proxy Design
    r]   r^   r_   r`   c                4    | j                   | j                  dS rj   r^   r`   r   rf   s    r-   rl   zGetStateCommand.to_dict   s     II//
 	
r,   Nr{   )
r   r   r   r   r   r(   r^   r~   r`   rl   r+   r,   r-   r   r      s(    
 %%D#%J
r,   r   c                  <    e Zd ZU dZej
                  Zded<   ddZy)PingMessagezLPing message for keepalive.

    Spec: Section 4.6 of Edge Proxy Design
    r]   r^   c                    d| j                   iS )rj   r^   )r^   rf   s    r-   rl   zPingMessage.to_dict   s    		""r,   Nr{   )	r   r   r   r   r   r)   r^   r~   rl   r+   r,   r-   r   r      s    
   D# #r,   r   c                  J    e Zd ZU dZej
                  Zded<   dZded<   ddZ	y)	CaptureFrameCommandzRequest the Edge Proxy to capture a camera frame.

    The Edge Proxy will respond with a FrameResponseMessage containing the
    base64-encoded JPEG or an error field.
    r]   r^   r_   r`   c                4    | j                   | j                  dS r   r   rf   s    r-   rl   zCaptureFrameCommand.to_dict   s    		AAr,   Nr{   )
r   r   r   r   r   r*   r^   r~   r`   rl   r+   r,   r-   r   r      s)     ))D#)JBr,   r   c                      e Zd ZU dZej
                  Zded<   dZded<   dZ	ded<   dZ
ded<   dZd	ed
<   dZded<   dZded<   dZded<   edd       Zy)NavStatusMessagezoNavigation status update message (Edge Proxy -> Orchestrator).

    Spec: Section 5.1 of Edge Proxy Design
    r]   r^   r_   r`   statusdestinationrq   r}   progressNzOptional[float]eta_secOptional[str]r   
error_codec                J    | |j                  dt        j                        |j                  dd      |j                  dd      |j                  dd      t        |j                  dd            |j                  d      |j                  d	      |j                  d
            S )Create from dictionary.r^   r`   r_   r   r   r   rq   r   r   r   )r^   r`   r   r   r   r   r   r   )getr   r   r}   ro   datas     r-   	from_dictzNavStatusMessage.from_dict   s     &+"8"89xxb188Hb)3488J45HHY'88H%xx-	
 		
r,   )r   ra   r|   r   )r   r   r   r   r   r   r^   r~   r`   r   r   r   r   r   r   r   r   r+   r,   r-   r   r      sq    
 &&D#&JFCKHe#G_# FM  $J$
 
r,   r   c                  N    e Zd ZU dZdZded<   dZded<   dZded<   ed	d       Z	y)
PosezRobot pose.rq   r}   rs   rt   ru   c           
          | t        |j                  dd            t        |j                  dd            t        |j                  dd                  S )r   rs   rq   rt   ru   )rs   rt   ru   )r}   r   r   s     r-   r   zPose.from_dict  sJ     DHHS#&'DHHS#&'#./
 	
r,   N)r   ra   r|   r   )
r   r   r   r   rs   r~   rt   ru   r   r   r+   r,   r-   r   r      s3    AuNAuNE5
 
r,   r   c                  @    e Zd ZU dZdZded<   dZded<   ed
d       Zy	)BatteryzBattery state.d   intlevelFboolchargingc           	     z     | t        |j                  dd            t        |j                  dd                  S )r   r   r   r   F)r   r   )r   r   r   r   s     r-   r   zBattery.from_dict  s7     dhhw,-$((:u56
 	
r,   N)r   ra   r|   r   )	r   r   r   r   r   r~   r   r   r   r+   r,   r-   r   r     s+    E3Hd
 
r,   r   c                      e Zd ZU dZej
                  Zded<   dZded<   dZ	ded	<   d
Z
ded<   dZded<   d
Zded<   dZded<   d
Zded<   d Zedd       Zy)
RobotStatezbRobot state message (Edge Proxy -> Orchestrator).

    Spec: Section 5.2 of Edge Proxy Design
    r]   r^   rq   r}   	timestampNr   rL   r_   locationr   battery	nav_statenav_progressnav_destinationc                r    | j                   t               | _         | j                  t               | _        y y re   )rL   r   r   r   rf   s    r-   rh   zRobotState.__post_init__-  s-    99DI<<"9DL  r,   c                    | |j                  dt        j                        t        |j                  dd            t        j                  |j                  di             |j                  dd      t        j                  |j                  di             |j                  dd      t        |j                  d	d            |j                  d
d            S )r   r^   r   rq   rL   r   r_   r   r   r   r   )r^   r   rL   r   r   r   r   r   )r   r   r   r}   r   r   r   r   s     r-   r   zRobotState.from_dict3  s     &+"9"9:DHH[#67 45XXj"-%%dhhy"&=>hh{B/txx<= HH%6;	
 		
r,   )r   ra   r|   r   )r   r   r   r   r   r   r^   r~   r   rL   r   r   r   r   r   rh   r   r   r+   r,   r-   r   r     sx    
 ''D#'IuD$HcGWIsL%OS% 
 
r,   r   c                  \    e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   e	dd
       Z
y)WaypointzOA waypoint in the robot's map.

    Spec: Section 5.3 of Edge Proxy Design
    r_   r]   rn   rq   r}   rs   rt   ru   c                     | |j                  dd      t        |j                  dd            t        |j                  dd            t        |j                  dd                  S )r   rn   r_   rs   rq   rt   ru   )rn   rs   rt   ru   )r   r}   r   s     r-   r   zWaypoint.from_dictN  sX     &"%DHHS#&'DHHS#&'#./	
 	
r,   N)r   ra   r|   r   )r   r   r   r   rn   r~   rs   rt   ru   r   r   r+   r,   r-   r   r   B  s@    
 D#NAuNAuNE5
 
r,   r   c                  Z    e Zd ZU dZej
                  Zded<   dZded<   d Z	e
d	d       Zy)
WaypointListMessagezdWaypoint list message (Edge Proxy -> Orchestrator).

    Spec: Section 5.3 of Edge Proxy Design
    r]   r^   NzList[Waypoint]	waypointsc                ,    | j                   g | _         y y re   )r   rf   s    r-   rh   z!WaypointListMessage.__post_init__c  s    >>!DN "r,   c                    |j                  dg       }|D cg c]  }t        j                  |       }} | |j                  dt        j                        |      S c c}w )r   r   r^   )r^   r   )r   r   r   r   r    )ro   r   waypoints_datawpr   s        r-   r   zWaypointListMessage.from_dictg  s\     +r26DEX''+E	E&+";";<
 	
 Fs   A)r   ra   r|   r   )r   r   r   r   r   r    r^   r~   r   rh   r   r   r+   r,   r-   r   r   Y  s<    
 ))D#) $I~$  
 
r,   r   c                  p    e Zd ZU dZej
                  Zded<   dZded<   dZ	ded<   dZ
ded<   ed
d       Zy	)ErrorMessagezOError message from Edge Proxy.

    Spec: Section 5.4 of Edge Proxy Design
    r]   r^   r_   r`   r   messagec           	          | |j                  dt        j                        |j                  dd      |j                  dd      |j                  dd            S )r   r^   r`   r_   r   r   )r^   r`   r   r   )r   r   r!   r   s     r-   r   zErrorMessage.from_dict~  sO     &+"3"34xxb1((7B'HHY+	
 	
r,   N)r   ra   r|   r   )r   r   r   r   r   r!   r^   r~   r`   r   r   r   r   r+   r,   r-   r   r   r  sH    
 !!D#!JE3OGS
 
r,   r   c                  T    e Zd ZU dZej
                  Zded<   dZded<   e	dd       Z
y)	PongMessagez[Pong message (Edge Proxy -> Orchestrator).

    Spec: Section 5.5 of Edge Proxy Design
    r]   r^   r_   statec                r     | |j                  dt        j                        |j                  dd            S )r   r^   r   r_   )r^   r   )r   r   r"   r   s     r-   r   zPongMessage.from_dict  s3     &+"2"23((7B'
 	
r,   N)r   ra   r|   r   )r   r   r   r   r   r"   r^   r~   r   r   r   r+   r,   r-   r   r     s4    
   D# E3O
 
r,   r   c                  p    e Zd ZU dZej
                  Zded<   dZded<   dZ	ded<   dZ
ded	<   edd
       Zy)FrameResponseMessagezFrame response from Edge Proxy containing a captured JPEG or an error.

    Sent in response to a CaptureFrameCommand.  Either ``jpeg_b64`` or
    ``error`` will be set, never both.
    r]   r^   r_   r`   Nr   jpeg_b64r   c                     | |j                  dt        j                        |j                  dd      |j                  d      |j                  d            S )r   r^   r`   r_   r   r   )r^   r`   r   r   )r   r   r#   r   s     r-   r   zFrameResponseMessage.from_dict  sK     &+"<"<=xxb1XXj)((7#	
 	
r,   )r   ra   r|   z'FrameResponseMessage')r   r   r   r   r   r#   r^   r~   r`   r   r   r   r   r+   r,   r-   r   r     sI     **D#*J"Hm"E=
 
r,   r   c                  j    e Zd ZU dZej
                  Zded<   dZded<   dZ	ded	<   dd
Z
edd       Zy)FRDetectionsMessagea*  Face recognition detections broadcast from the edge proxy FR loop.

    Attributes:
        type: Always ``"fr_detections"``.
        detections: List of detection dicts, each with at least ``identity``
            and ``confidence`` keys.
        timestamp: Unix epoch seconds of the capture.
    r]   r^   NzList[Dict[str, Any]]
detectionsrq   r}   r   c                ,    | j                   g | _         y y re   )r   rf   s    r-   rh   z!FRDetectionsMessage.__post_init__  s    ??" DO #r,   c                     | |j                  dt        j                        |j                  dg       |j                  dd            S )r   r^   r   r   rq   )r^   r   r   )r   r   r$   r   s     r-   r   zFRDetectionsMessage.from_dict  sA     &+";";<xxb1hh{C0
 	
r,   r|   None)r   ra   r|   z'FRDetectionsMessage')r   r   r   r   r   r$   r^   r~   r   r   rh   r   r   r+   r,   r-   r   r     sG     ))D#)'+J$+Iu! 
 
r,   r   c                      e Zd ZU dZej
                  Zded<   dZded<   dZ	ded<   dZ
ded<   dZded<   d	Zd
ed<   dZded<   dZded<   ddZedd       Zy)EventLogMessagez3Replay-safe edge event log message from Edge Proxy.r]   r^   r_   event_id
event_typer`   r   rq   r}   r   Fr   replayNra   payloadc                ,    | j                   i | _         y y re   )r   rf   s    r-   rh   zEventLogMessage.__post_init__  s    <<DL  r,   c                b    | |j                  dt        j                        |j                  dd      |j                  dd      |j                  dd      |j                  dd      t        |j                  dd            t	        |j                  d	d
            |j                  di             S )Nr^   r   r_   r   r`   r   r   rq   r   Fr   )r^   r   r   r`   r   r   r   r   )r   r   r%   r}   r   r   s     r-   r   zEventLogMessage.from_dict  s    &+"7"78XXj"-xxb1xxb188Hb)DHH[#67512HHY+	
 		
r,   r   )r   ra   r|   z'EventLogMessage')r   r   r   r   r   r%   r^   r~   r   r   r`   r   r   r   r   rh   r   r   r+   r,   r-   r   r     st    =%%D#%HcJJFCIuFD"G^" 

 

r,   r   c                   | j                  d      }|st        d      |}|t        j                  k(  rt        j                  |       S |t        j                  k(  rt        j                  |       S |t        j                  k(  rt        j                  |       S |t        j                  k(  rt        j                  |       S |t        j                  k(  rt        j                  |       S |t        j                  k(  rt        j                  |       S |t        j                   k(  rt"        j                  |       S |t        j$                  k(  rt&        j                  |       S y)a  Parse an incoming Edge Proxy message.

    Args:
        data: Dictionary parsed from JSON message.

    Returns:
        The appropriate message dataclass or None if the message type is unknown.

    Raises:
        ValueError: If message data is invalid (missing type field).
    r^   zMissing 'type' field in messageN)r   
ValueErrorr   r   r   r   r   r   r    r   r!   r   r"   r   r#   r   r$   r   r%   r   )r   msg_type_strmsg_types      r-   parse_edge_messager      s#    88F#L:;;H;)))))$//;***##D));,,,",,T22;$$$%%d++;###$$T**;---#--d33;,,,",,T22;(((((.. r,   N)r   ra   r|   zOptional[IncomingMessage])&r   
__future__r   dataclassesr   enumr   typingr   r   r   r	   r
   r]   r   r/   r;   rB   rJ   rR   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   IncomingMessager   r+   r,   r-   <module>r      s3   # !  3 3$#t $0T 63 6C sD T  6
 6
 6
r 
 
 
& 
 
 
" 
# 
# 
# B B B( 
 
 
< 
 
 
" 
 
 
 !
 !
 !
H 
 
 
, 
 
 
0 
 
 
, 
 
 
$ 
 
 
. 
 
 
8 
 
 
D 	*r,   