
    kKj                    2   d Z ddlmZ ddlmZ ddl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 dd	lmZmZ dd
lmZ ddlmZ erddlmZ ddl	mZ ddlmZ  ee      Z	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ y)a   Task subscription helpers for sending MCP notifications (SEP-1686).

Subscribes to Docket execution state changes and sends notifications/tasks/status
to clients when their tasks change state.

This module requires fastmcp[tasks] (pydocket). It is only imported when docket is available.
    )annotations)suppress)datetimetimezone)TYPE_CHECKING)ExecutionState)TaskStatusNotificationTaskStatusNotificationParams)DEFAULT_TTL_MS)parse_task_keytask_redis_prefix)DOCKET_TO_MCP_STATE)
get_logger)Docket)	Execution)ServerSessionc           	     0  K   	 |j                  |       d{   }|t        j                  d|         yt        j                  t        j
                  t        j                  h}|j                         2 3 d{   }|d   dk(  r.t        |d         }t        || ||||       d{    ||v s= y|d   dk(  sHt        || ||||       d{    b7 7 _7 27 6 y# t        $ r'}	t        j                  d|  d	|	 d
       Y d}	~	yd}	~	ww xY ww)ao  Subscribe to Docket execution events and send MCP notifications.

    Per SEP-1686 lines 436-444, servers MAY send notifications/tasks/status
    when task state changes. This is an optional optimization that reduces
    client polling frequency.

    Args:
        task_id: Client-visible task ID (server-generated UUID)
        task_key: Internal Docket execution key (includes session, type, component)
        session: MCP ServerSession for sending notifications
        docket: Docket instance for subscribing to execution events
        poll_interval_ms: Poll interval in milliseconds to include in notifications
    NzNo execution found for task typestate)sessiontask_idtask_keydocketr   poll_interval_msprogress)r   r   r   r   	executionr   zSubscription task failed for z: T)exc_info)get_executionloggerwarningr   	COMPLETEDFAILED	CANCELLED	subscribe_send_status_notification_send_progress_notification	Exception)
r   r   r   r   r   r   terminal_stateseventr   es
             s/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/server/tasks/subscriptions.pysubscribe_to_task_updatesr,      sB    ('V ..x88	NN9'CD $$!!$$

 %..0 	%V}'&uW~6/##%!%5   O+v*,1##%!'%5  9 9	# 14  V6wir!EPTUUVs   DC# CC# D?C# 7C!;C<C!?+C# *C+C# 4C# 5D6C# ?C# CC# C!C# C# !C# "D#	D,D	DDDc                  K   t         }|j                  |d      }t        |      }|d   }	|j                  t	        |	       d| d      }
|j                         4 d{   }|j                  |
       d{   }ddd      d{    r|j                  d      n0t        j                  t        j                        j                         }d}|t        j                  k(  rd}n+|t        j                  k(  rd}n|t        j                  k(  rd	}|||t        j                  t        j                        j                         t         |d
}|r||d<   t#        t%        j&                  |            }t)        t*              5  | j-                  |       d{    ddd       y7 I7 37 &# 1 d{  7  sw Y   7xY w7 ,# 1 sw Y   yxY ww)a  Send notifications/tasks/status to client.

    Per SEP-1686 line 454: notification SHOULD NOT include related-task metadata
    (taskId is already in params).

    Args:
        session: MCP ServerSession
        task_id: Client-visible task ID
        task_key: Internal task key (for metadata lookup)
        docket: Docket instance
        state: Docket execution state (enum)
        poll_interval_ms: Poll interval in milliseconds
    failed
task_scope::created_atNutf-8zTask completed successfullyzTask failedzTask cancelled)taskIdstatus	createdAtlastUpdatedAtttlpollIntervalstatusMessageparams)r   getr   keyr   redisdecoder   nowr   utc	isoformatr   r!   r"   r#   r   r	   r
   model_validater   r'   send_notification)r   r   r   r   r   r   	state_map
mcp_status	key_partsr/   created_at_keyr>   created_at_bytes
created_atstatus_messageparams_dictnotifications                    r+   r%   r%   ]   s    , $Iuh/J x(I<(JZZ#4Z#@"A7); WXN||~~!&>!:: ~
  	(\\(,,'113  N(((6	.''	'&	.**	*) !hll3==?(K '5O$ *+::;GL
 
)	''555 
	I : ~~~J 	6 
	s   AGF( G#F18F+9F1=GF.	C<GG	GG	
G+F1.G1G7F:8G?GG		GGc                  K   |j                          d{    |j                  r|j                  j                  syt        }|j	                  |j
                  d      }t        |      }|d   }	|j                  t        |	       d| d      }
|j                         4 d{   }|j	                  |
       d{   }ddd      d{    r|j                  d      n0t        j                  t        j                        j                         }|||t        j                  t        j                        j                         t         ||j                  j                  d}t#        t%        j&                  |            }t)        t*              5  | j-                  |       d{    ddd       y7 7 7 7 # 1 d{  7  sw Y   xY w7 .# 1 sw Y   yxY ww)	aG  Send notifications/tasks/status when progress updates.

    Args:
        session: MCP ServerSession
        task_id: Client-visible task ID
        task_key: Internal task key
        docket: Docket instance
        execution: Execution object with current progress
        poll_interval_ms: Poll interval in milliseconds
    Nr.   r/   r0   r1   r2   )r3   r4   r5   r6   r7   r8   r9   r:   )syncr   messager   r<   r   r   r=   r   r>   r?   r   r@   r   rA   rB   r   r	   r
   rC   r   r'   rD   )r   r   r   r   r   r   rE   rF   rG   r/   rH   r>   rI   rJ   rL   rM   s                   r+   r&   r&      s    & ..
 Y%7%7%?%? $Iy9J x(I<(JZZ#4Z#@"A7); WXN||~~!&>!:: ~
  	(\\(,,'113  !hll3==?("++33K *+::;GL 
)	''555 
	O  : ~~~2 	6 
	s   G'F8BG'$F;%G'(G=F>>GG'GCG'G*G+G/
G';G'>GG'G	G
GG'GG$ G'N)i  )r   strr   rQ   r   r   r   r   r   intreturnNone)r   r   r   rQ   r   rQ   r   r   r   r   r   rR   rS   rT   )r   r   r   rQ   r   rQ   r   r   r   r   r   rR   rS   rT   )!__doc__
__future__r   
contextlibr   r   r   typingr   docket.executionr   	mcp.typesr	   r
   fastmcp.server.tasks.configr   fastmcp.server.tasks.keysr   r   fastmcp.server.tasks.requestsr   fastmcp.utilities.loggingr   r   r   r   mcp.server.sessionr   __name__r   r,   r%   r&        r+   <module>rc      s+   #  '   + J 6 G = 0*0	H	 !;V;V;V ;V 	;V
 ;V 
;VH !C6C6C6 C6 	C6
 C6 C6 
C6X !;6;6;6 ;6 	;6
 ;6 ;6 
;6rb   