Ë
    tPêjtb  ã                   óä  — U d dl Z d dlZd dlZd dlmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZm Z m!Z! erd dl"m#Z$  G d„ de«      Z% G d„ de«      Z& G d„ de«      Z' G d„ de«      Z(dede(fd„Z)deddfd„Z*dee+e,f   de-e+e,f   fd„Z. G d„ de«      Z/ G d„ d«      Z0 e0«       Z1ee2d <    e jf                  «       Z4ee2d!<   y)"é    N)ÚCallableÚIteratorÚMappingÚSequence)ÚdatetimeÚtimezone)ÚMappingProxyType)ÚTYPE_CHECKINGÚFinalÚ
NamedTupleÚProtocolÚ	TypedDict)Ú
safe_dumps)Ú&handle_update_object_permission_common)ÚPrismaClient)ÚTableActions)ÚAgentsRepositoryÚObjectPermissionRepository)ÚAgentConfigÚAgentResponseÚPatchAgentRequest)Úmodelsc                   ó8   — e Zd Zdeeef   fd„Zdeeef   fd„Zy)ÚAgentObjectPermissionRecordÚreturnc                  ó   — y ©N© ©Úselfs    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/agent_endpoints/agent_registry.pyÚ
model_dumpz&AgentObjectPermissionRecord.model_dump   ó   � ó    c                  ó   — y r   r   r   s    r!   Údictz AgentObjectPermissionRecord.dict   r#   r$   N)Ú__name__Ú
__module__Ú__qualname__r&   ÚstrÚobjectr"   r   r$   r!   r   r      s$   „ Ø2˜D  f Ñ-Ó2à,�d˜3 ˜;Ñ'Ô,r$   r   c                   ó  — e Zd ZU eed<   eed<   eeef   dz  ed<   eeef   ed<   eeef   dz  ed<   ee   dz  ed<   eeef   dz  ed<   eed	<   e	dz  ed
<   e	dz  ed<   e	dz  ed<   e	dz  ed<   e
ed<   e
ed<   edz  ed<   edz  ed<   y)ÚAgentRecordDumpÚagent_idÚ
agent_nameNÚlitellm_paramsÚagent_card_paramsÚstatic_headersÚextra_headersÚobject_permissionÚspendÚ	tpm_limitÚ	rpm_limitÚsession_tpm_limitÚsession_rpm_limitÚ
created_atÚ
updated_atÚ
created_byÚ
updated_by)r'   r(   r)   r*   Ú__annotations__r&   r+   ÚlistÚfloatÚintr   r   r$   r!   r-   r-      s²   … ØƒMØƒOØ˜˜f˜Ñ%¨Ñ,Ó,Ø˜C ˜KÑ(Ó(Ø˜˜c˜‘N TÑ)Ó)Ø˜‘9˜tÑ#Ó#Ø˜C ˜KÑ(¨4Ñ/Ó/ØƒLØ�T‰zÓØ�T‰zÓØ˜T‘zÓ!Ø˜T‘zÓ!ØÓØÓØ�d‘
ÓØ�d‘
Ôr$   r-   c                   ó®   — e Zd Zedefd„«       Zedefd„«       Zededz  fd„«       Zededz  fd„«       Z	ede
fd„«       Zdefd„Zdeeeef      fd	„Zy)
ÚAgentRecordr   c                  ó   — y r   r   r   s    r!   r.   zAgentRecord.agent_id1   s   € Ø"r$   c                  ó   — y r   r   r   s    r!   r/   zAgentRecord.agent_name4   s   € Ø!$r$   Nc                  ó   — y r   r   r   s    r!   Úobject_permission_idz AgentRecord.object_permission_id7   s   € Ø25r$   c                  ó   — y r   r   r   s    r!   r4   zAgentRecord.object_permission:   s   € ØGJr$   c                  ó   — y r   r   r   s    r!   r5   zAgentRecord.spend=   s   € Ø!r$   c                  ó   — y r   r   r   s    r!   r"   zAgentRecord.model_dump@   r#   r$   c                  ó   — y r   r   r   s    r!   Ú__iter__zAgentRecord.__iter__B   r#   r$   )r'   r(   r)   Úpropertyr*   r.   r/   rG   r   r4   r@   r5   r-   r"   r   Útupler+   rL   r   r$   r!   rC   rC   0   s‰   „ ØØ"˜#Ò"ó Ø"àØ$˜CÒ$ó Ø$àØ5 c¨D¡jÒ5ó Ø5àØJÐ#>ÀÑ#EÒJó ØJàØ!�uÒ!ó Ø!à0˜OÓ0à;˜( 5¨¨f¨Ñ#5Ñ6Ô;r$   rC   c            
       óJ  — e Zd Z	 ddeeef   deeef   dz  defd„Z	 ddeeef   deeef   dz  dedz  fd„Z	 	 	 ddeeef   dz  deeef   dz  deeef   dz  de	e   fd	„Z
	 ddeeef   deeef   deeef   dz  dedz  fd
„Z	 ddeeef   deeef   dz  dedz  fd„Zy)ÚAgentTableClientNÚdataÚincluder   c              ƒ   ó   K  — y ­wr   r   )r    rQ   rR   s      r!   ÚcreatezAgentTableClient.createF   s   è ø€ ð ùó   ‚Úwherec              ƒ   ó   K  — y ­wr   r   ©r    rV   rR   s      r!   Úfind_uniquezAgentTableClient.find_uniqueL   ó   è ø€ ð !ùrU   Úorderc              ƒ   ó   K  — y ­wr   r   )r    rV   r[   rR   s       r!   Ú	find_manyzAgentTableClient.find_manyR   s   è ø€ ð
 !$ùrU   c              ƒ   ó   K  — y ­wr   r   )r    rQ   rV   rR   s       r!   ÚupdatezAgentTableClient.updateY   s   è ø€ ð
 !ùrU   c              ƒ   ó   K  — y ­wr   r   rX   s      r!   ÚdeletezAgentTableClient.delete`   rZ   rU   r   )NNN)r'   r(   r)   r   r*   r+   rC   rT   rY   r   r]   r_   ra   r   r$   r!   rP   rP   E   s}  „ ð 04ñà�c˜6�kÑ"ðð ˜˜f˜Ñ%¨Ñ,ðð 
ó	ð 04ñ!à�s˜F�{Ñ#ð!ð ˜˜f˜Ñ%¨Ñ,ð!ð 
�tÑ	ó	!ð .2Ø*.Ø/3ñ	$à�s˜F�{Ñ# dÑ*ð$ð �s˜C�xÑ  4Ñ'ð$ð ˜˜f˜Ñ%¨Ñ,ð	$ð
 
�+Ñ	ó$ð 04ñ	!à�c˜6�kÑ"ð!ð �s˜F�{Ñ#ð!ð ˜˜f˜Ñ%¨Ñ,ð	!ð
 
�tÑ	ó!ð 04ñ!à�s˜F�{Ñ#ð!ð ˜˜f˜Ñ%¨Ñ,ð!ð 
�tÑ	ô	!r$   rP   Úprisma_clientr   c                 ó0   — t        | «      j                  }|S r   )r   Útable©rb   rd   s     r!   Úagents_tablerf   g   s   € Ü%5°mÓ%D×%JÑ%J€EØ€Lr$   ú9TableActions[prisma_models.LiteLLM_ObjectPermissionTable]c                 ó0   — t        | «      j                  }|S r   )r   rd   re   s     r!   Úobject_permission_tableri   l   s#   € ô OiØóOç�eð 
ð €Lr$   Úrawc                 óL   — t        | dd «      }|� |«       S | rt        | «      S i S )Nr"   )Úgetattrr&   )rj   r"   s     r!   Ú_dump_agent_paramsrm   u   s0   € Ü@GÈÈ\Ð[_Ó@`€JØÐÙ‹|ÐÙŒ4�‹9Ð# Ð#r$   c                   ó"   — e Zd ZU eed<   eed<   y)ÚGrantMigrationResultÚ	rewrittenÚmissedN)r'   r(   r)   rA   r>   r   r$   r!   ro   ro   |   s   … ØƒNØ„Kr$   ro   c                   óè  — e Zd Zd„ Zd„ Zdefd„Zdefd„Zd#de	e   dz  d	e
ed
f   fd„Zd	e
ed
f   fd„Zded	efd„Zded	efd„Zded	ee   fd„Zded	efd„Zd#de	e   dz  fd„Z	 	 d$de	e   dz  de	eeef      dz  fd„Zddd	efd„Z	 d#dededededz  d	ef
d„Zdeded	eeef   fd„Zdedededed	ef
d„Zdedededed	ef
d„Zeded	e e!eef      fd „«       Z"ded	edz  fd!„Z#ded	edz  fd"„Z$y)%ÚAgentRegistryc                 ó@   — g | _         d| _        t        i «      | _        y )Nr   )Ú
agent_listÚconfig_agentsr	   Úconfig_agent_legacy_idsr   s    r!   Ú__init__zAgentRegistry.__init__‚   s   € Ø/1ˆŒØ68ˆÔÜ:JÈ2Ó:NˆÕ$r$   c                 ó   — g | _         y r   )ru   r   s    r!   Úreset_agent_listzAgentRegistry.reset_agent_list‡   s	   € Øˆ�r$   Úagent_configc                 ó:   — | j                   j                  |«       y r   )ru   Úappend©r    r{   s     r!   Úregister_agentzAgentRegistry.register_agentŠ   s   € Ø�‰×Ñ˜|Õ,r$   r/   c                 ól   — | j                   D �cg c]  }|j                  |k7  sŒ|‘Œ c}| _         y c c}w r   )ru   r/   )r    r/   Úagents      r!   Úderegister_agentzAgentRegistry.deregister_agent�   s)   € Ø.2¯o©oÖ` UÀ×AQÑAQÐU_ÓA_š5Ò`ˆ�ùÒ`s   �1¤1NÚagent_namesr   .c                 ón   ‡— ‰�t        ˆfd„| j                  D «       «      S t        | j                  «      S )Nc              3   ó@   •K  — | ]  }|j                   ‰v sŒ|–— Œ y ­wr   ©r/   )Ú.0r�   rƒ   s     €r!   ú	<genexpr>z/AgentRegistry.get_agent_list.<locals>.<genexpr>’   s   øè ø€ Ò_ 5¸u×?OÑ?OÐS^Ò?^œÑ_ùs   ƒ—)rN   ru   )r    rƒ   s    `r!   Úget_agent_listzAgentRegistry.get_agent_list�   s-   ø€ ØÐ"ÜÓ_¨D¯O©OÔ_Ó_Ð_Ü�T—_‘_Ó%Ð%r$   c                 ój   ‡ ‡— t         j                  Š‰€yt        ˆˆ fd„‰ j                  D «       «      S )Nr   c              3   óx   •K  — | ]1  }‰j                  |j                  «      j                  ‰«      rŒ.|–— Œ3 y ­wr   )Úids_for_agentr.   Ú
isdisjoint)r‡   r�   Úpublic_agent_groupsr    s     €€r!   rˆ   z6AgentRegistry.get_public_agent_list.<locals>.<genexpr>™   s3   øè ø€ ò 
Ø°d×6HÑ6HÈÏÉÓ6X×6cÑ6cÐdwÕ6xŒEñ
ùs   ƒ/:³:)ÚlitellmrŽ   rN   ru   )r    rŽ   s   `@r!   Úget_public_agent_listz#AgentRegistry.get_public_agent_list•   s6   ù€ Ü%,×%@Ñ%@ÐØÐ&ØÜô 
Ø#Ÿ™ô
ó 
ð 	
r$   c                 ój   — t        j                  |d   j                  «       «      j                  «       S )Nr/   )ÚhashlibÚsha256ÚencodeÚ	hexdigestr~   s     r!   Ú_create_agent_idzAgentRegistry._create_agent_id�   s(   € Ü�~‰~˜l¨<Ñ8×?Ñ?ÓAÓB×LÑLÓNÐNr$   c                 óŽ   — t        j                  t        j                  |d¬«      j	                  «       «      j                  «       S )NT)Ú	sort_keys)r’   r“   ÚjsonÚdumpsr”   r•   r~   s     r!   Ú_create_legacy_agent_idz%AgentRegistry._create_legacy_agent_id    s.   € Ü�~‰~œdŸj™j¨ÀÔF×MÑMÓOÓP×ZÑZÓ\Ð\r$   r.   c                 ób   ‡— t        ‰hˆfd„| j                  j                  «       D «       £«      S )Nc              3   ó4   •K  — | ]  \  }}|‰k(  sŒ|–— Œ y ­wr   r   )r‡   ÚlegacyÚstabler.   s      €r!   rˆ   z.AgentRegistry.ids_for_agent.<locals>.<genexpr>¥   s   øè ø€ Òq¡N F¨FÐ^dÐhpÓ^pœÑqùs   ƒ‘)Ú	frozensetrw   Úitems©r    r.   s    `r!   rŒ   zAgentRegistry.ids_for_agent£   s0   ø€ ÜØÐrÓq°d×6RÑ6R×6XÑ6XÓ6ZÔqÐró
ð 	
r$   c                 ó:   — | j                   j                  ||«      S r   )rw   Úgetr¢   s     r!   Ústable_agent_idzAgentRegistry.stable_agent_id¨   s   € Ø×+Ñ+×/Ñ/°¸(ÓCÐCr$   c           	      ó@  ‡— |€y|D ]  }t        |t        «      rŒt        d«      ‚ t        |«      | _        t        |D �ci c]E  }|j                  d«      r2|j                  d«      r!| j                  |«      | j                  |«      “ŒG c}«      | _	        |D ]  }|j                  d«      Š|j                  d«      }t        ‰|g«      sŒ3t        ˆfd„| j                  D «       «      rŒR| j                  |«      }| j                  t        dd|i|¤Ž¬«       Œ� yc c}w )	a3  
        Register the agents declared in config.yaml and remember them for later rebuilds.

        A config entry is skipped when its ``agent_name`` is already registered, so a
        database record always wins over a config entry that reuses its name and the
        registry never holds two agents under one name. Enforcing that here rather than
        in the caller keeps the guarantee independent of the order the two sources load
        in. Passing ``None`` leaves the remembered agents untouched; passing an empty
        sequence clears them.
        Nz+agent_config must be a list of dictionariesr/   r1   c              3   ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wr   r†   )r‡   r�   r/   s     €r!   rˆ   z8AgentRegistry.load_agents_from_config.<locals>.<genexpr>Ì   s   øè ø€ ÒO°e�5×#Ñ# zÕ1ÑOùs   ƒr.   ©r{   r   )Ú
isinstancer&   Ú
ValueErrorrN   rv   r	   r¤   r›   r–   rw   ÚallÚanyru   r   r   )r    r{   Úagent_config_itemr1   Úconfig_hashr/   s        @r!   Úload_agents_from_configz%AgentRegistry.load_agents_from_config«   s8  ø€ ð ÐØà!-ò 	PÐÜÐ/´Õ6Ü Ð!NÓOÐOð	Pô # <Ó0ˆÔÜ'7ð *6öà%Ø$×(Ñ(¨Ô6Ð;L×;PÑ;PÐQdÔ;eð ×,Ñ,Ð->Ó?À×AVÑAVÐWhÓAiÑiòó(
ˆÔ$ð ".ò 	gÐØ*×.Ñ.¨|Ó<ˆJØ 1× 5Ñ 5Ð6IÓ JÐÜ˜
Ð$5Ð6Ô7ØäÓO¸t¿¹ÔOÔOØð ×/Ñ/Ð0AÓBˆKà×Ñ¬]Ñ-eÀKÐ-eÐSdÑ-eÐÕfñ	gùòs   Á A
DÚ	db_agentsc                 ó
  — | j                  «        |rG|D ]B  }t        |t        «      st        d«      ‚| j	                  t        j                  |«      ¬«       ŒD | j                  |�|n| j                  «       | j                  S )a‚  
        Rebuild the registry from the DB rows plus the agents declared in config.yaml.

        ``agent_config`` defaults to the agents remembered by the last
        ``load_agents_from_config`` call, so a periodic DB reload does not drop
        config-defined agents.

        The DB rows are registered first so that a config entry reusing one of their
        names is dropped by ``load_agents_from_config``, mirroring how config-declared
        MCP servers are unioned under the database registry. Name lookups and
        deregistration both address a single agent, so the registry must never hold two
        under one name.
        z(db_agents must be a list of dictionariesr¨   )
rz   r©   r&   rª   r   r   Úmodel_validater¯   rv   ru   )r    r{   r°   Údb_agents       r!   Úload_agents_from_db_and_configz,AgentRegistry.load_agents_from_db_and_configÔ   s~   € ð$ 	×ÑÔáØ%ò Y�Ü! (¬DÔ1Ü$Ð%OÓPÐPà×#Ñ#´×1MÑ1MÈhÓ1WÐ#ÕXð	Yð 	×$Ñ$°\Ð5M¡\ÐSW×SeÑSeÔfØ�‰Ðr$   rd   rg   c              ƒ   óz  ‡ ‡K  — t        d„ ‰ j                  j                  «       D «       «      }|st        dd¬«      S ‰j	                  dd|ii¬«      ƒ d{  –—† }t        ˆ fd„|D «       «      }t        j                  ˆfd	„|D «       Ž ƒ d{  –—† }t        |«      }t        |t        |«      |z
  ¬«      S 7 Œ_7 Œ*­w)
aó  
        Rewrite object_permission.agents rows holding a legacy full-entry hash to the
        stable name-derived id.

        Only the running proxy can do this: the legacy hash is computed from the
        resolved config entry (secrets included), so no SQL migration can know it.
        Persisting the stable id here is what keeps a grant alive across a later
        secret rotation, which re-mints the legacy hash and would otherwise orphan
        the stored value. Idempotent; runs of it after the first find no rows.

        Each write is a compare-and-swap against the agents array read above, so a
        grant edited concurrently is left untouched; the runtime alias keeps covering
        it and the next boot retries the rewrite.
        c              3   ó2   K  — | ]  \  }}||k7  sŒ|–— Œ y ­wr   r   )r‡   rž   rŸ   s      r!   rˆ   z9AgentRegistry.migrate_legacy_grant_ids.<locals>.<genexpr>  s   è ø€ Ò!x©^¨V°VÐgmÐqwÓgw¤&Ñ!xùs   ‚�r   )rp   rq   ÚagentsÚhas_some©rV   Nc           
   3   óÐ   •K  — | ]]  }|j                   t        |j                  xs d «      t        t        j	                  ˆfd„|j                  xs d D «       «      «      f–— Œ_ y­w)r   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )r¥   )r‡   r.   r    s     €r!   rˆ   zCAgentRegistry.migrate_legacy_grant_ids.<locals>.<genexpr>.<genexpr>  s   øè ø€ Ò#dÀx D×$8Ñ$8¸×$BÑ#dùs   ƒN)rG   rN   r·   r&   Úfromkeys)r‡   Úrowr    s     €r!   rˆ   z9AgentRegistry.migrate_legacy_grant_ids.<locals>.<genexpr>  s[   øè ø€ ò 
ð ð	 ×(Ñ(Ü�c—j‘jÒ& BÓ'Ü”d—m‘mÓ#dÐSV×S]ÑS]ÒScÐacÔ#dÓdÓeôñ
ùs   ƒA#A&c              3   óZ   •K  — | ]"  \  }}}‰j                  |d |idœd|i¬«      –— Œ$ y­w)Úequals)rG   r·   r·   )rV   rQ   N)Úupdate_many)r‡   rG   Úsnapshot_agentsÚtranslated_agentsrd   s       €r!   rˆ   z9AgentRegistry.migrate_legacy_grant_ids.<locals>.<genexpr>  sL   øè ø€ ò ñ
 MÐ(¨/Ð;Lð	 ×!Ñ!Ø3GÐT\Ð^mÐSnÑoØ"Ð$5Ð6ð "÷ ñùs   ƒ(+)	rN   rw   r¡   ro   r]   ÚasyncioÚgatherÚsumÚlen)r    rd   Ú
legacy_idsÚrowsÚupdatesÚcountsrp   s   ``     r!   Úmigrate_legacy_grant_idsz&AgentRegistry.migrate_legacy_grant_idsò   sÁ   ùè ø€ ô" "Ñ!x¸t×?[Ñ?[×?aÑ?aÓ?cÔ!xÓxˆ
ÙÜ'°!¸AÔ>Ð>Ø!ŸO™O°8¸jÈ*Ð=UÐ2V˜OÓW×WˆÜó 
ð ô
ó 
ˆô &Ÿn™nóð
 QXôð
÷ 
ˆô ˜v›;ˆ	Ü#¨iÄÀGÃÈyÑ@XÔYÐYð' Xøð
ús$   „AB;ÁB7Á6B;ÂB9Â)B;Â9B;r�   rb   r<   c           	   ƒ   ó.  K  — 	 |j                  d«      }|j                  di «      }t        |«      }t        |«      }|j                  di «      }	t        |	«      }
t        |
«      }d}|j                  d«      � t        |«      }t	        |d|«      ƒ d{  –—† }|j                  d«      }|rt        t        |«      «      nd}|j                  d«      }|||||t        j                  t        j                  «      t        j                  t        j                  «      dœ}|�||d	<   |�||d<   |�||d<   |�||d
<   dD ]  }|j                  |«      }|€Œ|||<   Œ t        |«      j                  |ddi¬«      ƒ d{  –—† }|j                  «       }|j                  �	 |j                  j                  «       |d<   t        di |¤ŽS 7 �Œ27 ŒL# t        $ r  |j                  j                  «       |d<   Y Œ8w xY w# t        $ r}t        d|› �«      ‚d}~ww xY w­w)aY  
        Add an agent to the database.

        If ``agent_id`` is provided, it is used as the primary key for the new
        row (otherwise the DB generates a UUID). Callers pass an explicit ID
        when the agent_card_params must reference the agent's own URL before
        the row exists, e.g. the A2A merge in ``create_agent``.
        r/   r0   r1   Nr4   r2   r3   )r/   r0   r1   r<   r=   r:   r;   r.   rG   ©r6   r7   r8   r9   T)rQ   rR   zError adding agent to DB: r   )r¤   rm   r   r&   r   r   Únowr   Úutcrf   rT   r"   r4   Ú	Exceptionr   )r    r�   rb   r<   r.   r/   Úlitellm_params_objÚlitellm_params_dictr0   Úagent_card_params_objÚagent_card_params_dictr1   rG   Ú
agent_copyÚstatic_headers_objÚstatic_headers_valÚextra_headers_valÚcreate_dataÚ
rate_fieldÚ_valÚcreated_agentÚcreated_agent_dictÚes                          r!   Úadd_agent_to_dbzAgentRegistry.add_agent_to_db  sf  è ø€ ðC	>Ø %§	¡	¨,Ó 7ˆJð ).¯	©	Ð2BÀBÓ(GÐÜ<NÐOaÓ<bÐÜ)3Ð4GÓ)HˆNð ,1¯9©9Ð5HÈ"Ó+MÐ!Ü?QÐRgÓ?hÐ"Ü,6Ð7MÓ,NÐð 04Ð Ø�y‰yÐ,Ó-Ð9Ü$(¨£K�
Ü-SÐT^Ð`dÐfsÓ-t×'tÐ$ð ).¯	©	Ð2BÓ(CÐÙ\n´J¼tÐDVÓ?WÔ4XÐtxÐà',§y¡y°Ó'AÐð )Ø"0Ø%6Ø(Ø(Ü&Ÿl™l¬8¯<©<Ó8Ü&Ÿl™l¬8¯<©<Ó8ñ5ˆKð Ð#Ø*2�˜JÑ'Ø!Ð-Ø0B�Ð,Ñ-Ø Ð,Ø/@�˜OÑ,Ø#Ð/Ø6J�Ð2Ñ3ðò 3�
ð —y‘y Ó,�ØÑ#Ø.2�K 
Ò+ð3ô *6°mÓ)D×)KÑ)KØ Ø,¨dÐ3ð *Ló *÷ $ˆMð
 )6×(@Ñ(@Ó(BÐØ×.Ñ.Ð:ðeØ>K×>]Ñ>]×>hÑ>hÓ>jÐ&Ð':Ñ;ô !Ñ6Ð#5Ñ6Ð6ða (uùðJ$ùô !ò eØ>K×>]Ñ>]×>bÑ>bÓ>dÐ&Ð':Ó;ðeûô ò 	>ÜÐ8¸¸Ð<Ó=Ð=ûð	>üsx   ‚H„BG6 ÂGÂB>G6 Å(G6 Å;GÅ< G6 ÆG
 Æ:
G6 ÇHÇG6 ÇG6 Ç
&G3Ç0G6 Ç2G3Ç3G6 Ç6	HÇ?HÈHÈHc              ƒ   óÎ   K  — 	 t        |«      j                  d|i¬«      ƒ d{  –—† }|€t        d|› �«      ‚t        |«      S 7 Œ# t        $ r}t	        d|› �«      ‚d}~ww xY w­w)z3
        Delete an agent from the database
        r.   r¹   Nú!Agent not found, passed agent_id=zError deleting agent from DB: )rf   ra   rª   r&   rÐ   )r    r.   rb   Údeleted_agentrÞ   s        r!   Údelete_agent_from_dbz"AgentRegistry.delete_agent_from_dbr  s~   è ø€ ð	BÜ)5°mÓ)D×)KÑ)KÐS]Ð_gÐRhÐ)KÓ)i×#iˆMØÐ$Ü Ð#DÀXÀJÐ!OÓPÐPÜ˜Ó&Ð&ð $jùô ò 	BÜÐ<¸Q¸CÐ@ÓAÐAûð	Büs8   ‚A%„ A ¤A¥A ÁA%ÁA Á	A"ÁAÁA"Á"A%r=   c              ƒ   ó  K  — 	 t        |«      j                  j                  d|i¬«      ƒ d{  –—† }|€t        d|› d�«      ‚t	        |«      }i |¥|¥}i }|j                  d«      r|j                  d«      |d<   |j                  d«      rt        |j                  d«      «      |d<   |j                  d«      rt        |j                  d«      «      |d<   d	D ]  }	|	|v sŒ|j                  |	«      ||	<   Œ d
|v r,|j                  d
«      }
t        |
�t	        |
«      ni «      |d
<   d|v r|j                  d«      }|�|ng |d<   |j                  d«      �8t	        |«      }|j                  d«      }t        |||«      ƒ d{  –—† }|�||d<   t        |«      j                  d|ii |¥|t        j                  t        j                  «      dœ¥ddi¬«      ƒ d{  –—† }|€t        d|› �«      ‚|j                  «       }|j                   �	 |j                   j                  «       |d<   t#        di |¤ŽS 7 �Œ7 Œ´7 Œ^# t        $ r  |j                   j	                  «       |d<   Y Œ:w xY w# t        $ r}t        d|› �«      ‚d}~ww xY w­w)a¦  
        Patch an agent in the database.

        Get the existing agent from the database and patch it with the new values.

        Args:
            agent_id: The ID of the agent to patch
            agent: The new agent values to patch
            prisma_client: The Prisma client to use
            updated_by: The user ID of the user who is patching the agent

        Returns:
            The patched agent
        r.   r¹   NzAgent with ID z
 not foundr/   r0   r1   rÍ   r2   r3   r4   rG   )r=   r;   T©rV   rQ   rR   rá   zError patching agent in DB: r   )r   rd   rY   rÐ   r&   r¤   r   r   rf   r_   r   rÎ   r   rÏ   rª   r"   r4   r   )r    r.   r�   rb   r=   Úexisting_rowÚexisting_agentÚaugment_agentÚupdate_datarÚ   Úheaders_valueÚextra_headers_valuerÕ   Úexisting_object_permission_idrG   Úpatched_agentÚpatched_agent_dictrÞ   s                     r!   Úpatch_agent_in_dbzAgentRegistry.patch_agent_in_db~  sû  è ø€ ð*=	@Ü(8¸Ó(G×(MÑ(M×(YÑ(YØ! 8Ð,ð )Zó )÷ #ˆLð Ð#Ü .°°
¸*Ð EÓFÐFÜ$(¨Ó$6ˆNà#> nÐ#>¸Ð#>ˆMØ46ˆKØ× Ñ  Ô.Ø,9×,=Ñ,=¸lÓ,K�˜LÑ)Ø× Ñ Ð!1Ô2Ü0:¸=×;LÑ;LÐM]Ó;^Ó0_�Ð,Ñ-Ø× Ñ Ð!4Ô5Ü3=¸m×>OÑ>OÐPcÓ>dÓ3e�Ð/Ñ0ðò D�
ð  Ò&Ø.3¯i©i¸
Ó.C�K 
Ò+ðDð   5Ñ(Ø',§y¡yÐ1AÓ'B�Ü0:ÐR_ÐRk¼4ÀÔ;NÐqsÓ0t�Ð,Ñ-Ø %Ñ'Ø-2¯Y©Y°Ó-GÐ#ØFYÐFeÑ/BÐkm�˜OÑ,Ø�y‰yÐ,Ó-Ð9Ü$(¨Ó$7�
Ø7E×7IÑ7IÐJ`Ó7aÐ-Ü4ZØØ1Ø!ó5÷ /Ð$ð
 (Ð3Ø:N�KÐ 6Ñ7ä)5°mÓ)D×)KÑ)KØ! 8Ð,ðØ!ðà",Ü"*§,¡,¬x¯|©|Ó"<òð
 -¨dÐ3ð *Ló *÷ $ˆMð Ð$Ü Ð#DÀXÀJÐ!OÓPÐPØ(5×(@Ñ(@Ó(BÐØ×.Ñ.Ð:ðeØ>K×>]Ñ>]×>hÑ>hÓ>jÐ&Ð':Ñ;ô !Ñ6Ð#5Ñ6Ð6ðu#ùðB/øð$ùô !ò eØ>K×>]Ñ>]×>bÑ>bÓ>dÐ&Ð':Ó;ðeûô ò 	@ÜÐ:¸1¸#Ð>Ó?Ð?ûð	@üs‰   ‚J„*I( ®H5¯B2I( Ã"B!I( ÆH8ÆAI( ÇH:Ç0I( ÈH< È*
I( È4JÈ5I( È8I( È:I( È<&I%É"I( É$I%É%I( É(	JÉ1I?É?JÊJc           	   ƒ   ój  K  — 	 |j                  d«      }|j                  di «      }t        |«      }t        |«      }|j                  di «      }	t        |	«      }
t        |
«      }|j                  d«      }|�t        t        |«      «      n
t        i «      }|j                  d«      xs g }||||||t	        j
                  t        j                  «      dœ}dD ]  }|j                  |«      }|€Œ|||<   Œ |j                  d	«      �\t        |«      j                  d
|i¬«      ƒ d{  –—† }|�|j                  nd}t        |«      }t        |||«      ƒ d{  –—† }|�||d<   t        |«      j                  d
|i|d	di¬«      ƒ d{  –—† }|€t        d|› �«      ‚|j                  «       }|j                  �	 |j                  j                  «       |d	<   t#        di |¤ŽS 7 Œ¹7 Œ‹7 Œ]# t         $ r  |j                  j                  «       |d	<   Y Œ9w xY w# t         $ r}t!        d|› �«      ‚d}~ww xY w­w)z1
        Update an agent in the database
        r/   r0   r1   r2   Nr3   )r/   r0   r1   r2   r3   r=   r;   rÍ   r4   r.   r¹   rG   Trå   rá   zError updating agent in DB: r   )r¤   rm   r   r&   r   rÎ   r   rÏ   rf   rY   rG   r   r_   rª   r"   r4   rÐ   r   )r    r.   r�   rb   r=   r/   rÑ   rÒ   r0   rÓ   rÔ   r1   Ústatic_headers_obj_uÚstatic_headers_val_uÚextra_headers_val_uré   rÚ   rÛ   rç   rì   rÕ   rG   Úupdated_agentÚupdated_agent_dictrÞ   s                            r!   Úupdate_agent_in_dbz AgentRegistry.update_agent_in_dbÒ  sš  è ø€ ðG	@Ø %§	¡	¨,Ó 7ˆJð ).¯	©	Ð2BÀBÓ(GÐÜ<NÐOaÓ<bÐÜ)3Ð4GÓ)HˆNð ,1¯9©9Ð5HÈ"Ó+MÐ!Ü?QÐRgÓ?hÐ"Ü,6Ð7MÓ,NÐð +0¯)©)Ð4DÓ*EÐ à:NÐ:Z”
œ4Ð 4Ó5Ô6Ô`jÐkmÓ`nð !ð */¯©°?Ó)CÒ)IÀrÐð )Ø"0Ø%6Ø"6Ø!4Ø(Ü&Ÿl™l¬8¯<©<Ó8ñ5ˆKðò 3�
ð —y‘y Ó,�ØÑ#Ø.2�K 
Ò+ð3ð �y‰yÐ,Ó-Ð9Ü.:¸=Ó.I×.UÑ.UÐ]gÐiqÐ\rÐ.UÓ.s×(s�à;IÐ;U�N×7Ò7Ð[_ð .ô %)¨£K�
Ü4ZØØ1Ø!ó5÷ /Ð$ð
 (Ð3Ø:N�KÐ 6Ñ7ô *6°mÓ)D×)KÑ)KØ! 8Ð,Ø Ø,¨dÐ3ð *Ló *÷ $ˆMð Ð$Ü Ð#DÀXÀJÐ!OÓPÐPØ(5×(@Ñ(@Ó(BÐØ×.Ñ.Ð:ðeØ>K×>]Ñ>]×>hÑ>hÓ>jÐ&Ð':Ñ;ô !Ñ6Ð#5Ñ6Ð6ð9 )tøð
/øð$ùô !ò eØ>K×>]Ñ>]×>bÑ>bÓ>dÐ&Ð':Ó;ðeûô ò 	@ÜÐ:¸1¸#Ð>Ó?Ð?ûð	@üs‰   ‚H3„C+H Ã08H Ä(G"Ä)/H ÅG$Å/H ÆG&Æ	0H Æ:G( Ç
H Ç!H3Ç"H Ç$H Ç&H Ç(&HÈH ÈHÈH È	H0ÈH+È+H0È0H3c              ƒ   ó˜  K  — 	 t        | «      j                  ddiddi¬«      ƒ d{  –—† }g }|D ]H  }t        |«      }|j                  �	 |j                  j	                  «       |d<   |j                  |«       ŒJ |S 7 ŒU# t
        $ r  |j                  j                  «       |d<   Y Œ?w xY w# t
        $ r}t        d|› �«      ‚d}~ww xY w­w)z2
        Get all agents from the database
        r:   Údescr4   T)r[   rR   NzError getting agents from DB: )rf   r]   r&   r4   r"   rÐ   r}   )rb   Úagents_from_dbr·   r�   Ú
agent_dictrÞ   s         r!   Úget_all_agents_from_dbz$AgentRegistry.get_all_agents_from_db%  só   è ø€ ð	BÜ*6°}Ó*E×*OÑ*OØ# VÐ,Ø,¨dÐ3ð +Pó +÷ %ˆNð
 68ˆFØ'ò *�Ü! %›[�
à×*Ñ*Ð6ðYØ:?×:QÑ:Q×:\Ñ:\Ó:^˜
Ð#6Ñ7ð —‘˜jÕ)ð*ð ˆMð!%ùô %ò YØ:?×:QÑ:Q×:VÑ:VÓ:X˜
Ð#6Ó7ðYûô
 ò 	BÜÐ<¸Q¸CÐ@ÓAÐAûð	Büs\   ‚C
„#B+ §A=¨"B+ ÁA?Á(B+ Á<C
Á=B+ Á?&B(Â%B+ Â'B(Â(B+ Â+	CÂ4CÃCÃC
c                 ó  — 	 | j                   D ]  }|j                  |k(  sŒ|c S  | j                  j                  |«      }|€y| j                   D ]  }|j                  |k(  sŒ|c S  y# t        $ r}t	        d|› �«      ‚d}~ww xY w)z:
        Get an agent by its ID from the database
        NúError getting agent from DB: )ru   r.   rw   r¤   rÐ   )r    r.   r�   Útranslated_idrÞ   s        r!   Úget_agent_by_idzAgentRegistry.get_agent_by_idA  s›   € ð	AØŸ™ò !�Ø—>‘> XÓ-Ø ’Lð!ð $(×#?Ñ#?×#CÑ#CÀHÓ#MˆMØÐ$ØàŸ™ò !�Ø—>‘> ]Ó2Ø ’Lð!ð øÜò 	AÜÐ;¸A¸3Ð?Ó@Ð@ûð	Aús3   ‚A) ¡A) ¥A) ÁA) Á#A) Á'A) Á)	BÁ2B Â Bc                 óŒ   — 	 | j                   D ]  }|j                  |k(  sŒ|c S  y# t        $ r}t        d|› �«      ‚d}~ww xY w)z<
        Get an agent by its name from the database
        Nrý   )ru   r/   rÐ   )r    r/   r�   rÞ   s       r!   Úget_agent_by_namezAgentRegistry.get_agent_by_nameY  sX   € ð	AØŸ™ò !�Ø×#Ñ# zÓ1Ø ’Lð!ð øÜò 	AÜÐ;¸A¸3Ð?Ó@Ð@ûð	Aús   ‚' ¡' ¥' §	A°>¾Ar   )NN)%r'   r(   r)   rx   rz   r   r   r*   r‚   r   rN   r‰   r�   r   r–   r›   r    rŒ   r¥   r¯   r   r+   r´   ro   rË   r   rß   rã   r   rï   rö   Ústaticmethodr?   r&   rû   rÿ   r  r   r$   r!   rs   rs   �   s�  „ òOò
ð-¨=ó -ða¨3ó añ&¨(°3©-¸$Ñ*>ð &È%ÐP]Ð_bÐPbÑJcó &ð

 u¨]¸CÐ-?Ñ'@ó 
ðO¨[ð O¸Só Oð]°Kð ]ÀCó ]ð
 cð 
¨i¸©nó 
ð
D¨ð D°ó Dñ'g°H¸[Ñ4IÈDÑ4Pó 'gðV 6:Ø;?ñà˜{Ñ+¨dÑ2ðð ˜G C¨ KÑ0Ñ1°DÑ8óð<'ZØPð'Zà	ó'Zðb  $ñR>àðR>ð $ðR>ð ð	R>ð
 ˜‘*ðR>ð 
óR>ðh
B°3ð 
BÀ|ð 
BÐX_Ð`cÐekÐ`kÑXló 
BðR@àðR@ð !ðR@ð $ð	R@ð
 ðR@ð 
óR@ðhQ@àðQ@ð ðQ@ð $ð	Q@ð
 ðQ@ð 
óQ@ðf ðBØ#ðBà	ˆd�3˜�;ÑÑ	 òBó ðBð6AàðAð 
˜Ñ	óAð0A¨Cð A°MÀDÑ4Hô Ar$   rs   Úglobal_agent_registryÚAGENT_RECONCILE_LOCK)5rÃ   r’   r™   Úcollections.abcr   r   r   r   r   r   Útypesr	   Útypingr
   r   r   r   r   r�   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Ú8litellm.proxy.management_helpers.object_permission_utilsr   Úlitellm.proxy.utilsr   Ú%litellm.repositories.prisma_protocolsr   Ú'litellm.repositories.table_repositoriesr   r   Úlitellm.types.agentsr   r   r   Úprismar   Úprisma_modelsr   r-   rC   rP   rf   ri   r*   r+   r&   rm   ro   rs   r  r>   ÚLockr  r   r$   r!   ú<module>r     sþ   ðÜ Û Û ß AÓ Aß 'Ý "ß HÕ Hã Ý Aõõ -Ý >ß `ß NÑ NáÝ.ô- (ô -ô�iô ô&<�(ô <ô*!�xô !ðD ð Ð1Aó ð
Øðà@óð$˜G C¨ KÑ0ð $°T¸#¸v¸+Ñ5Fó $ô˜:ô ÷
cAñ cAñL  -›Ð �uÓ .Ø*˜gŸl™l›nÐ �eÔ ,r$   