
    yj[                         d Z ddlmZmZ ddlmZ ddlmZ  G d de          Z G d de          Z	 G d	 d
e          Z
g dZdS )zQ
API events for Honcho telemetry.

These events track user-facing API operations
    )ClassVarLiteral)Field)	BaseEventc                   R   e Zd ZU dZdZee         ed<   dZee	         ed<   dZ
ee         ed<    edd	
          Zeed<    edd
          Zeed<    edd
          Ze	ed<    edd
          Ze	ed<    edd          Zed         ed<    edd
          Zeed<   defdZdS )MessageCreatedEventaY  Emitted when one or more messages are created.

    This is the canonical API event for counting created messages, including
    messages created from file uploads. The resource_id keys on
    `last_message_id` (the trailing message's public nanoid) so two batches
    of the same size in the same session+source produce distinct event ids.
    zmessage.created_event_type   _schema_versionapi	_category.Workspace namedescriptionworkspace_nameSession namesession_namezNumber of messages createdmessage_countz$Total tokens across created messagestotal_tokenszSource of the created messagesdefaultr   )r   file_uploadsourceuk   public_id (nanoid) of the trailing message in the batch — used as the stable unique key for this emissionlast_message_idreturnc                 D    | j          d| j         d| j         d| j         S )zResource ID keys on the trailing message's public_id so two batches
        of the same size in the same session+source produce distinct event ids.
        :)r   r   r   r   selfs    @/DATA/AppData/hermes/projects/honcho/src/telemetry/events/api.pyget_resource_idz#MessageCreatedEvent.get_resource_id'   sG    
 " 4 4T%6 4 4{4 4!14 4	
    N)__name__
__module____qualname____doc__r	   r   str__annotations__r   intr   r   r   r   r   r   r   r   r   r!    r"   r    r   r      s]          "3K#222%&OXc]&&&$Ix}$$$%1ABBBNCBBBc~>>>L#>>>s0LMMMM3MMMc/UVVVL#VVV,1E#C- - -FG()    !5 B  OS   

 
 
 
 
 
 
r"   r   c                      e Zd ZU dZdZee         ed<   dZee	         ed<   dZ
ee         ed<    edd	
          Zeed<    edd
          Zeed<    edd
          Zeed<    edd
          Zeed<    edd          Zedz  ed<    edd          Zedz  ed<    edd          Ze	dz  ed<    edd
          Ze	ed<    edd
          Ze	ed<   defdZdS ) FileUploadedEventzEmitted when an uploaded file is converted into messages.

    This captures file-side metadata. Message creation counts should use
    MessageCreatedEvent to avoid double-counting file uploads.
    zfile.uploadedr	   r
   r   r   r   .r   r   r   r   r   zPeer that uploaded the file	peer_namezGenerated file identifierfile_idNzUploaded filenamer   filenamezUploaded content typecontent_typezUploaded file size in bytesfile_size_bytesz(Number of messages created from the filer   z2Total tokens across messages created from the filer   r   c                 4    | j          d| j         d| j         S )z?Resource ID includes workspace, session, and generated file ID.r   )r   r   r.   r   s    r    r!   z!FileUploadedEvent.get_resource_idL   s&    %JJ(9JJDLJJJr"   )r#   r$   r%   r&   r	   r   r'   r(   r   r)   r   r   r   r   r-   r.   r/   r0   r1   r   r   r!   r*   r"   r    r,   r,   1   s          "1K#000%&OXc]&&&$Ix}$$$%1ABBBNCBBBc~>>>L#>>>U3,IJJJIsJJJ5*EFFFGSFFF 5;NOOOHcDjOOO$uT?VWWWL#*WWW"'%"?# # #OS4Z    C  M3    M  L#   K K K K K K Kr"   r,   c                   \   e Zd ZU dZdZee         ed<   dZee	         ed<   dZ
ee         ed<    edd	
          Zeed<    edd
          Zed         ed<    edd          Zedz  ed<    edd          Zedz  ed<    edd          Zedz  ed<    edd          Ze	dz  ed<    edd          Ze	ed<    edd          Zeed<    edd          Zeed <    edd!          Zeed"<    edd#          Zeed$<    edd%          Ze	dz  ed&<    edd'          Zedz  ed(<    edd)          Zedz  ed*<    edd+          Ze	dz  ed,<    edd-          Zedz  ed.<    edd/          Zeed0<    edd1          Z eed2<    edd3
          Z!eed4<   d5efd6Z"dS )7GetContextEventz8Emitted when context is retrieved for a session or peer.zcontext.retrievedr	   r
   r   r   r   .r   r   r   zContext endpoint scope)sessionpeercontext_scopeNz'Session name for session-scoped contextr   r   zObserver peer namer-   zObserved peer nametarget_namezHCaller-supplied tokens query parameter (None = endpoint default applied)tokens_requestedr   z&Number of messages returned in contextr   FzWhether a summary was returnedhas_summaryz%Whether a representation was returnedhas_representationz Whether a peer card was returnedhas_peer_cardz/Whether semantic search query text was providedsearch_query_providedz6Caller-supplied search_top_k (None = endpoint default)search_top_kz=Caller-supplied search_max_distance (None = endpoint default)search_max_distancezsCaller-supplied include_most_frequent (None = endpoint default; defaults differ between peer and session endpoints)include_most_frequentz9Caller-supplied max_conclusions (None = endpoint default)max_conclusionszJWhether summary inclusion was requested; None when unsupported by endpointinclude_summaryz4Whether representation retrieval was session-limitedlimit_to_sessionz9Whether peer_perspective was supplied for session contextpeer_perspective_providedzTotal processing timetotal_duration_msr   c                     | j         | j         nd}| j        | j        nd}| j        dk    r| j         d| j         d| d| S | j         d| d| S )u   Resource ID identifies the requested context scope.

        Uses empty string (illegal in peer names — nanoid-derived) as the
        absent-peer sentinel so that a peer literally named "none" does not
        collide with the absent-peer case.
        N r5   z	:session:r   z:peer:)r-   r8   r7   r   r   )r   r-   r8   s      r    r!   zGetContextEvent.get_resource_id   s     '+n&@DNNb	*.*:*Fd&&B**& - -1B - -- -*- - %FFYFFFFFr"   )#r#   r$   r%   r&   r	   r   r'   r(   r   r)   r   r   r   r7   r   r   r-   r8   r9   r   r:   boolr;   r<   r=   r>   r?   floatr@   rA   rB   rC   rD   rE   r!   r*   r"   r    r4   r4   Q   s        BB!4K#444%&OXc]&&&$Ix}$$$%1ABBBNCBBB0511 1 1M7,-     %u"K     L#*    "E$<PQQQIsTzQQQ#eD>RSSSKtSSS#(5^$ $ $cDj    G  M3    #C  K     %u#J          %#E  M4    #(%#T# # #4     %uL     L#*    ).S) ) )    */ J* * *4$;    #(%O# # #OS4Z    $)5`$ $ $OTD[    #UJ  d    ',eO' ' 't     %uS6MNNNuNNNG G G G G G Gr"   r4   )r,   r4   r   N)r&   typingr   r   pydanticr   src.telemetry.events.baser   r   r,   r4   __all__r*   r"   r    <module>rN      s     % $ $ $ $ $ $ $       / / / / / / 
  
  
  
  
)  
  
  
FK K K K K	 K K K@OG OG OG OG OGi OG OG OGd  r"   