
    jKj+                       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	m
Z
mZ dZdZdZd	Zd
Zd
ZdZdZdZdZdZdefdefdefdefdefdeffZdZeeef	 	 	 	 	 	 	 	 	 d%dZ	 	 	 	 	 	 	 	 	 	 	 	 d&dZ	 	 	 	 	 	 	 	 	 	 	 	 d'dZ	 	 	 	 	 	 	 	 	 	 	 	 d(dZd)dZd*dZd+dZd,dZ d-dZ!d.dZ"	 	 	 	 	 	 	 	 d/dZ#d0d Z$d1d!Z%d2d"Z&d3d#Z'd3d$Z(y)4a  Layered truncation so an event fits within a byte budget before capture:

1. Field-level string limits (user_intent, resource_name, metadata fields).
2. Error frame limiting + message caps on the ``$exception_list`` shape.
3. Response content text limits (32KB per text block).
4. Recursive normalization of user-controlled fields (depth/breadth/string caps).
5. Size-targeted truncation: progressive depth reduction, then trimming the
   largest string fields until under MAX_EVENT_BYTES.
    )annotationsN)datetime)AnyDictListOptional
   d   i   i  i      2   ...user_intentresource_nameserver_nameserver_versionclient_nameclient_version)
parametersresponseidentify_actor_dataerrorc                0    t        | |||t                     S )zRecursively normalize a value: cap strings, coerce non-serializable
    values, convert datetimes, detect cycles, and bound depth/breadth.)_visitset)valuedepthmax_breadthmax_string_lengths       h/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/mcp/_truncation.py	normalizer    4   s     %->FF    c                `   | y t        | t              r| S t        | t        t        f      rFt        | t              r4t	        j
                  |       ryt	        j                  |       r	| dkD  rdS dS | S t        | t              rt        |       |kD  r| d | t        z   S | S t        | t              r| j                         S t        |       rdt        | dd      xs d d	S t        | t        t        f      rUt!        |       }||v ry
|dk  ry|j#                  |       t%        t        |       |dz
  |||      }|j'                  |       |S t        | t(              rLt!        |       }||v ry
|dk  ry|j#                  |       t+        | |dz
  |||      }|j'                  |       |S t        |       S )Nz[NaN]r   z
[Infinity]z[-Infinity]z[Function: __name__ z<anonymous>]z[Circular ~]z[Array]   z[Object])
isinstanceboolintfloatmathisnanisinfstrlen_TRUNCATION_SUFFIXr   	isoformatcallablegetattrlisttupleidadd_visit_arraydiscarddict_visit_object)r   remaining_depthr   r   memooidresults          r   r   r   ?   s    }%%#u&eU#zz% zz% ',qy|CmC%u:))++,/AAA%"  WUJ;L}MQOO%$'i$;!a"K1,k;Ld
 	S%i$;!a?Q&5F
 	Su:r!   c           
         g }t        |       D ]<  \  }}||k\  r|j                  d        |S |j                  t        |||||             > |S )N[MaxProperties ~])	enumerateappendr   )arrr<   r   r   r=   r?   iitems           r   r8   r8   w   s`     FS>4MM-. M 	4+7H$O	
	 " Mr!   c                    i }d}| j                         D ])  \  }}||k\  rd|d<    |S t        |||||      ||<   |dz  }+ |S )Nr   rA   r   r&   )itemsr   )	objr<   r   r   r=   r?   countkeyvals	            r   r;   r;      sg      FEIIKSK/F5M M S/;@QSWXs
   Mr!   c                ^    t        | t              s| S t        |       |k  r| S | d | t        z   S N)r'   r.   r/   r0   )r   
max_lengths     r   _truncate_stringrP      s5    eS!
5zZ* 222r!   c                X    | rt        |       t        k  r| S t        dz  }| d | | | d  z   S )N   )r/   _MAX_STACK_FRAMES)frameshalfs     r   _truncate_stack_framesrV      s9    S[$55!D%4=64%&>))r!   c                   | j                  d      }t        |t              s| S i | }g }|D ]  }i |}t        |j                  d      t              rt	        |d   t
              |d<   |j                  d      }t        |t              r(|j                  d      ri |dt        |d         i|d<   |j                  |        ||d<   |S )Nz$exception_listr   
stacktracerT   )	getr'   r4   r.   rP   _MAX_ERROR_MESSAGE_LENGTHr:   rV   rC   )r   exception_listr?   	truncated	exceptionnxtrX   s          r   _truncate_exception_listr_      s    YY01Nnd+YFI#	mcggg&,+CL:STCLWW\*
j$'JNN8,D!!0H1EF!C 	 $ !*FMr!   c                   t        | t              s| S i | }|j                  d      }t        |t              rg }|D ]  }t        |t              rq|j                  d      dk(  r]t        |j                  d      t              r>t        |d         t        kD  r)|j                  i |d|d   d t         t        z   i       |j                  |        ||d<   |S )Ncontenttypetext)	r'   r:   rY   r4   r.   r/   _MAX_CONTENT_TEXT_LENGTHrC   r0   )r   r?   ra   new_contentblocks        r   _truncate_response_contentrg      s    h%\Fjj#G'4 E5$'IIf%/uyy0#6f&)AA""f.G/G H,!- ""5)   (yMr!   c                X    t        | t              r| j                         S t        |       S rN   )r'   r   r1   r.   )rI   s    r   _json_defaultri      s!    #x }}s8Or!   c                j    t        t        j                  | t        d      j	                  d            S )N),:)default
separatorszutf-8)r/   jsondumpsri   encode)r   s    r   _json_byte_sizerr      s*    

5-JGNNwW r!   c                   t        | t              r5t        |       dkD  r&|j                  t	        |      t        |       d       y t        | t              r.t        |       D ]  \  }}t        ||t        |      gz   |       ! y t        | t              r3| j                         D ]  \  }}t        ||t        |      gz   |       ! y y )Nr
   )pathlength)	r'   r.   r/   rC   r4   rB   _collect_string_pathsr:   rH   )rI   current_pathresultsrE   rF   rK   r   s          r   rv   rv      s     #ss8c>NND$6#c(KL#t ~GAt!$Ax(?I &#t))+JC!%S
)BGL & r!   c                    | }|D ]D  }t        |t              r|t        |         }"t        |t              r|j	                  |      }D y  |S rN   r'   r4   r)   r:   rY   )rI   rt   currentrK   s       r   _get_nested_valuer|      sK    Ggt$c#h'G&kk#&G  Nr!   c                   | }|d d D ]D  }t        |t              r|t        |         }"t        |t              r|j	                  |      }D y  |d   }t        |t              r||t        |      <   y t        |t              r|||<   y y )Nrz   )rI   rt   r   r{   rK   	final_keys         r   _set_nested_valuer     s    GCRygt$c#h'G&kk#&G  RI'4 "'I	GT	""	 
#r!   c           	        t        j                  |       }t        d      D ]  }t        |      }||k  r|c S ||z
  }g }t	        |g |       |j                  d d       |s |S |dz   }d}|D ]i  }	|dk  r nb|	d   }
t        ||
d	z        }|dk  r$|
|z
  }t        ||	d
         }t        |t              sIt        ||	d
   |d | t        z          ||z  }d}k |r |S  |S )Nr	   c                    | d   S )Nru    )ps    r   <lambda>z*_truncate_largest_fields.<locals>.<lambda>#  s    (r!   T)rK   reverse   Fr   ru   rR   rt   )copydeepcopyrangerr   rv   sortminr|   r'   r.   r   r0   )rI   	max_bytesr?   _current_sizeexcessstring_paths	remainingr\   entryru   	reduction
new_lengthcurrent_values                 r   _truncate_largest_fieldsr     s&   ]]3F2Y&v.9$M	)-/fb,73TB0 M- SL		!EA~8_FIv{3I2~)+J-feFmDMmS1f}[j'ADV'V "II "" ME D Mr!   c                t   t        |       t        k  r| S t        t        dz
  dd      D ]K  }i | }t        D ]&  }|j                  |      t        ||   |      ||<   ( t        |      t        k  sI|c S  i | }t        D ]&  }|j                  |      t        ||   d      ||<   ( t        |t              S )Nr&   r   r~   )rr   MAX_EVENT_BYTESr   	MAX_DEPTH_NORMALIZED_FIELDSrY   r    r   )eventr   reducedfieldminimals        r   _truncate_to_sizer   @  s    u0y1}a,U)'E{{5!-!*75>5!A ( 7#6N - iG#;;u)&wu~q9GEN $ $G_==r!   c                   i | }t         D ]7  \  }}t        |j                  |      t              s&t	        ||   |      ||<   9 t        |j                  d      t
              rt        |d         |d<   |j                  d      t        |d         |d<   t        D ]%  }|j                  |      t        ||         ||<   ' t        |      S )Nr   r   )_METADATA_FIELDSr'   rY   r.   rP   r:   r_   rg   r   r    r   )r   r?   rK   rO   r   s        r   truncate_eventr   S  s    YF ,Zfjjos+*6#;
CF3K , &**W%t,26'?Cwzz*)7z8JKz $::e(%fUm4F5M $
 V$$r!   )
r   r   r   r)   r   r)   r   r)   returnr   )r   r   r<   r)   r   r)   r   r)   r=   r   r   r   )rD   	List[Any]r<   r)   r   r)   r   r)   r=   r   r   r   )rI   Dict[Any, Any]r<   r)   r   r)   r   r)   r=   r   r   r   )r   Optional[str]rO   r)   r   r   )rT   Optional[List[Any]]r   r   )r   Dict[str, Any]r   r   )r   r   r   r   )rI   r   r   r   )r   r   r   r)   )rI   r   rw   	List[str]rx   zList[Dict[str, Any]]r   None)rI   r   rt   r   r   r   )rI   r   rt   r   r   r   r   r   )rI   r   r   r)   r   r   )r   r   r   r   ))__doc__
__future__r   r   ro   r+   r   typingr   r   r   r   r   MAX_BREADTHMAX_STRING_LENGTHr   _MAX_USER_INTENT_LENGTHrZ   _MAX_RESOURCE_NAME_LENGTH_MAX_METADATA_LENGTHrS   rd   r0   r   r   r    r   r8   r;   rP   rV   r_   rg   ri   rr   rv   r|   r   r   r   r   r   r!   r   <module>r      s  
 #     , ,	       !   +,/0()+,()+,  P  ".	GGG G 	G
 	G555 5 	5
 5 	5p	  	
  $	  	
  *3**<M	M%M0DM	M 	# %P>&%r!   