
    jKj                    l   U d Z ddlm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mZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZmZ  G d d      Ze	 G d d             ZdZ ej6                         Zded<   ddZddZddZ 	 	 	 	 	 	 ddZ!ddZ"	 d 	 	 	 	 	 	 	 	 	 d!dZ#	 d 	 	 	 	 	 	 	 d"dZ$d#dZ%y)$a  Per-server tracking state, the bounded identity LRU, and identity resolution.

Per-server state lives in a module-level ``weakref.WeakKeyDictionary`` keyed by
the server object, so state is isolated per server and garbage-collected with it
(the Python equivalent of the TS ``WeakMap``).
    )annotationsN)OrderedDict)	dataclassfield)datetimetimezone)AnyDictOptional   )log)McpEventSink)MCPAnalyticsOptionsUserIdentityc                  :    e Zd ZdZdd	dZd
dZddZddZddZy)IdentityCachezmBounded LRU of session identities, isolated per server so identities never
    bleed across server instances.c                0    t               | _        || _        y N)r   _cache	_max_size)selfmax_sizes     f/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/mcp/_internal.py__init__zIdentityCache.__init__   s    8C!    c                x    | j                   j                  |      }|y | j                   j                  |       |S r   )r   getmove_to_endr   
session_ididentitys      r   r   zIdentityCache.get#   s4    ;;??:.
+r   c                    || j                   v r| j                   |= n>t        | j                         | j                  k\  r| j                   j                  d       || j                   |<   y NF)last)r   lenr   popitemr   s      r   setzIdentityCache.set*   sR    $J'/KKU+"*Jr   c                    || j                   v S r   )r   r   r    s     r   haszIdentityCache.has1   s    T[[((r   c                ,    t        | j                        S r   )r%   r   )r   s    r   sizezIdentityCache.size4   s    4;;r   N)  )r   intreturnNone)r    strr/   Optional[UserIdentity])r    r1   r!   r   r/   r0   )r    r1   r/   bool)r/   r.   )	__name__
__module____qualname____doc__r   r   r'   r*   r,    r   r   r   r      s     &"+) r   r   c                  6   e Zd ZU 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       Z
ded<    e	e      Zded<    e	e      Zded<    e	e      Zded<    e	e      Zded<   dZded<   dZded<    e	ej*                        Zded<   ddZy)MCPAnalyticsDatazAll per-server tracking state.r   optionsNzOptional[McpEventSink]sink r1   r    	generatedsession_sourcezOptional[str]last_mcp_session_idc                 H    t        j                  t        j                        S r   )r   nowr   utcr8   r   r   <lambda>zMCPAnalyticsData.<lambda>A   s    HLL<Vr   )default_factoryr   last_activityr   identified_sessionszDict[str, str]tool_categoriestool_descriptionsz'OrderedDict[str, None]'initialized_sessionsserver_nameserver_versionzasyncio.Locksession_lockc                    d | j                   |<   t        | j                         t        kD  r:| j                   j                  d       t        | j                         t        kD  r9y y r#   )rJ   r%   _MAX_INITIALIZED_SESSIONSr&   r)   s     r   mark_session_initializedz)MCPAnalyticsData.mark_session_initializedL   sS    04!!*-$++,/HH%%--5-9 $++,/HHr   )r    r1   r/   r0   )r4   r5   r6   r7   __annotations__r<   r    r?   r@   r   rF   r   rG   dictrH   rI   r   rJ   rK   rL   asyncioLockrM   rP   r8   r   r   r:   r:   8   s    (  #'D
 'J%NC%)--#4VWM8W).})MM&+D&AO^A(-d(C~C 6;;5W2W!%K%$(NM(!&w||!DL,D:r   r:   r-   z2'weakref.WeakKeyDictionary[Any, MCPAnalyticsData]'_server_trackingc                ,    t         j                  |       S r   )rU   r   )servers    r   get_server_tracking_datarX   Z   s    ''r   c                    |t         | <   y r   )rU   )rW   datas     r   set_server_tracking_datar[   ^   s    #Vr   c                   | j                   |j                   k7  ryt        j                  | j                  xs i d      t        j                  |j                  xs i d      k7  ry| j                  xs i }|j                  xs i }t        |j                               t        |j                               k7  ry|D ]C  }t        j                  ||   dt              t        j                  ||   dt              k7  sC y y)NFT)	sort_keys)r]   default)distinct_idjsondumpsgroups
propertiesr'   keysr1   )aba_propsb_propskeys        r   are_identities_equalrj   b   s    }}%zz!((.bD1TZZ	B$6  ll bGll bG
7<<>c',,.11::gcldC@DJJCLD#E
 
 	 
 r   c                    | |S t        |j                  i | j                  xs i |j                  xs i |j                  |j                        S | j                        S )N)r_   rc   rb   )r   r_   rc   rb   )previousnxts     r   merge_identitiesrn   u   sh     
OOLx**0bLcnn6JL ZZ3szz  :B r   c                z   K   t        j                  |       st        j                  |       r
|  d {   S | S 7 wr   )rS   iscoroutineisfuture)values    r   _maybe_awaitrs      s3     5!W%5%5e%<{L s   0;9;c                  K   | j                   j                  sy	 | j                   j                  }t        |t              r|}nt	         |||             d{   }|st        d|        y| j                  j                  |      }t        ||      }|xr t        ||       }| j                  j                  ||       |rSddlm}	 t        d|        |t        |      |	j                  ||dt        j                   t"        j$                        dS 	 y7 # t&        $ r}
t        d| d	|
        Y d}
~
yd}
~
ww xY ww)
zResolve the optional ``identify`` callback, dedupe against the identity
    cache, and return an ``$identify`` event to emit only when the identity has
    materially changed (otherwise ``None``).Nz>Warning: Supplied identify function returned null for session r   )MCPAnalyticsEventTypezIdentified session )requestextra)r    resource_name
event_type
parameters	timestampz9Error: identify function threw while identifying session z - )r;   identify
isinstancer   rs   r   rG   r   rn   rj   r'   _event_typesru   _get_request_resource_nameIDENTIFYr   rB   r   rC   	Exception)rZ   r    rv   rw   r|   identity_resultrl   mergedhas_changedru   errors              r   handle_identifyr      sJ     <<   
<<((h-6>O$0'51I$JJOPQ[P\] ++//
;!(O<#N(<Xv(NO  $$Z8;%j\23(!;G!D3<<*1EB%\\(,,7 	  9 K0  
G
|SVW\V]^	
 	
 	
sS   E>D DD .E/B(D EED 	E %D;6E;E  Ec                   K   | j                   j                  sy 	 t        | j                   j                  ||             d {   xs d S 7 # t        $ r}t	        d|        Y d }~y d }~ww xY ww)Nz!event_properties callback error: )r;   event_propertiesrs   r   r   )rZ   rv   rw   es       r   resolve_event_propertiesr      sg     
 <<((!$,,"?"?"OPPXTXXP /s34s@   A2(A AA A2A 	A/A*%A2*A//A2c                    t        | t              sy| j                  d      }t        |t              sy|j                  d      }t        |t              r|S dS )NUnknownparamsname)r}   rR   r   r1   )rv   r   r   s      r   r   r      sL    gt$[["Ffd#::fDdC(47i7r   )rW   r	   r/   zOptional[MCPAnalyticsData])rW   r	   rZ   r:   r/   r0   )re   r   rf   r   r/   r3   )rl   r2   rm   r   r/   r   )rr   r	   r/   r	   r   )
rZ   r:   r    r1   rv   Dict[str, Any]rw   Optional[Dict[str, Any]]r/   r   )rZ   r:   rv   r   rw   r   r/   r   )rv   r	   r/   r1   )&r7   
__future__r   rS   r`   weakrefcollectionsr   dataclassesr   r   r   r   typingr	   r
   r   loggerr   _sinkr   typesr   r   r   r:   rO   WeakKeyDictionaryrU   rQ   rX   r[   rj   rn   rs   r   r   r   r8   r   r   <module>r      s  
 #    # ( ' & &   4   : : : :2 !  G D 
($&	$	+7		 '+	-
-- - $	-
 -f '+
 $ 	8r   