ó
    ±"³j8  ã                  ó|  • S r SSKJr  SSKJr  SSKJrJr  SSKJ	r	J
r
Jr  SSKJr  SSKJrJrJr  \	(       a  SS	KJr      SS
 jr        SS jr          SS jr        SS jr            SS jr        SS jrSS jrSS jrS S jr      S!S jr\" S\\
   S9r      S"S jrg)#zBTopological sorting of capabilities based on ordering constraints.é    )Úannotations)ÚSequence)Ú
CycleErrorÚTopologicalSorter)ÚTYPE_CHECKINGÚAnyÚTypeVar)Ú	UserErroré   )ÚAbstractCapabilityÚCapabilityOrderingÚCapabilityRef)ÚCapabilityPositionc           
     ó^  • [        U 5      n[        U5      nUS::  a  U$ U Vs/ s H  n[        U5      PM     nnU Vs/ s H  n[        U5      PM     nnU VVs/ s H  oU Vs1 s H  n[	        U5      iM     snPM      nnn[        XU5        [        XX„5      $ s  snf s  snf s  snf s  snnf )z¹Sort capabilities to satisfy ordering constraints.

Preserves the original order as a tiebreaker when constraints allow.
Raises `UserError` on conflicts (missing requirements, cycles).
r   )ÚlistÚlenÚcollect_leavesÚ_effective_orderingÚtypeÚ_validate_requiresÚ
_topo_sort)	ÚcapabilitiesÚcapsÚnÚcapÚ
cap_leavesÚleavesÚ	orderingsÚleafÚ
leaf_typess	            Ú_/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pydantic_ai/capabilities/_ordering.pyÚsort_capabilitiesr"      sª   € ô �Ó€DÜˆD‹	€AØˆAƒvØˆáVZÓ6[ÒVZÈs´~ÀcÖ7JÑVZ€JÐ6[Ù\fÓ1gÒ\fÐRXÔ2EÀfÖ2MÑ\f€IÐ1gÙQ[Ô"\ÒQ[Àv¸6Ó#Bº6°4¤D¨¦J¹6Ô#BÑQ[€JÑ"\ä�t¨
Ô3ä�d zÓ>Ð>ùò 7\ùÚ1gùÚ#BùÓ"\s"   £B¾BÁ	B)Á#B$Á8B)Â$B)c           	     ó`  ^• [         [           " 5       R                  " U6 n[        U5       H  u  pEU(       d  M  UR                  (       d  M!  UR                   HN  m[        U4S jU 5       5      (       a  M  [        S[        X   5      R                   STR                   S35      e   M�     g)zValidate required dependencies.c              3  ó<   >#   • U  H  n[        UT5      v •  M     g 7f©N©Ú
issubclass)Ú.0ÚtÚreq_types     €r!   Ú	<genexpr>Ú%_validate_requires.<locals>.<genexpr>1   s   øé € ÐKºN°qœ: a¨×2Ð2ºNùó   ƒÚ`z` requires `z.` but it was not found among the capabilities.N)Úsetr   ÚunionÚ	enumerateÚrequiresÚanyr
   Ú__name__)r   r   r    Úall_leaf_typesÚiÚorderingr*   s         @r!   r   r   '   s˜   ø€ ô !$¤D¢	£× 1Ò 1°:Ð >€NÜ  Ö+‰ˆßˆ8˜×)×)Ñ)Ø$×-Ô-�ÜÔK¹NÓK×KÓKÜ#ØœD ¡›M×2Ñ2Ð3°<À×@QÑ@QÐ?Rð SGð Hóð ó .ò ,ó    c                ó>  • [        U 5      n[        5       n[        U5       H  nUR                  U5        M     [	        XTU5        [        XTXU5         [        UR                  5       5      nU Vs/ s H  o`U   PM	     sn$ ! [         a    [        S5      ef = fs  snf )z·Topological sort using graphlib.TopologicalSorter.

Edges go from outer (earlier) to inner (later). TopologicalSorter
preserves insertion order as tiebreaker for unconstrained nodes.
z0Circular ordering constraints among capabilities)
r   r   ÚrangeÚaddÚ_add_position_edgesÚ_add_relative_edgesr   Ústatic_orderr   r
   )r   r   r    r   r   Útsr6   Úsorted_indicess           r!   r   r   8   s›   € ô 	ˆD‹	€AÜ!2Ó!4€Bô �1ŽXˆØ
�‰ˆqŽ	ñ ô ˜˜yÔ)Ü˜˜y°jÔAðLÜ˜bŸo™oÓ/Ó0ˆñ ,Ó,š^˜�ŒG™^Ñ,Ð,øô ó LÜÐJÓKÐKðLüò -s   ÁB Á0BÂBc                óì  • [        U5       VVs1 s H"  u  p4U(       d  M  UR                  S:X  d  M   UiM$     nnn[        U5       VVs1 s H"  u  p4U(       d  M  UR                  S:X  d  M   UiM$     nnnU H4  n[        U5       H"  nX‡:w  d  M
  X…;  d  M  U R                  X‡5        M$     M6     U H4  n	[        U5       H"  nX‰:w  d  M
  X†;  d  M  U R                  X˜5        M$     M6     g s  snnf s  snnf )NÚ	outermostÚ	innermost)r1   Úpositionr:   r;   )
r?   r   r   r6   ÚorB   rC   ÚoiÚjÚiis
             r!   r<   r<   U   sÃ   € ô
  )¨Ô3ÔWÒ3‘t�q´q“¸Q¿Z¹ZÈ;Ñ=V—Ñ3€IÑWÜ(¨Ô3ÔWÒ3‘t�q´q“¸Q¿Z¹ZÈ;Ñ=V—Ñ3€IÑWó ˆÜ�q–ˆAØ�w˜1Õ-Ø—‘�q–ó ñ ó ˆÜ�q–ˆAØ�w˜1Õ-Ø—‘�r–ó ò ùó XùÛWs!   �C* C*²C*Á	C0ÁC0Á,C0c           	     ó’  • [        U5       H¸  u  pVU(       d  M  UR                   HE  n[        U5       H3  nXX:w  d  M
  [        XsU   XH   5      (       d  M"  U R	                  X…5        M5     MG     UR
                   HE  n[        U5       H3  nXX:w  d  M
  [        XsU   XH   5      (       d  M"  U R	                  XX5        M5     MG     Mº     g r%   )r1   Úwrapsr:   Ú_ref_matchesr;   Ú
wrapped_by)	r?   r   r   r    r   r6   r7   ÚrefrG   s	            r!   r=   r=   j   s›   € ô ! Ö+‰ˆÞÙà—>”>ˆCÜ˜1–X�Ø•6œl¨3¸1±¸z¹}×MÓMØ—F‘F˜1–Ló ñ "ð
 ×&Ô&ˆCÜ˜1–X�Ø•6œl¨3¸1±¸z¹}×MÓMØ—F‘F˜1–Ló ó 'ò ,r8   c                ó‚   ^ • [        T [        5      (       a  [        U 4S jU 5       5      $ [        U 4S jU 5       5      $ )zŒCheck if a capability ref matches any leaf in a capability group.

Type refs match via `issubclass`; instance refs match via `is` identity.
c              3  ó<   >#   • U  H  n[        UT5      v •  M     g 7fr%   r&   )r(   r)   rM   s     €r!   r+   Ú_ref_matches.<locals>.<genexpr>Š   s   øé € Ð:ªz¨!”:˜a ×%Ð%ªzùr-   c              3  ó*   >#   • U  H  oTL v •  M
     g 7fr%   © )r(   r   rM   s     €r!   r+   rP   ‹   s   øé € Ð.¢v˜t�s�{¢vùs   ƒ)Ú
isinstancer   r3   )rM   r    r   s   `  r!   rK   rK   €   s4   ø€ ô �#”t×ÑÜÔ:©zÓ:Ó:Ð:ÜÔ.¡vÓ.Ó.Ð.r8   c                ó²  • Sn/ n/ n/ nSnU  H´  nUR                  5       nUc  M  SnUR                  b<  Ub-  XR                  :w  a  [        SU< SUR                  < S35      eUR                  nUR                  UR                  5        UR                  UR
                  5        UR                  UR                  5        M¶     U(       d  g[        UUUUS9$ )zôGet the effective ordering for a capability, merging from all its leaves.

For plain capabilities (single leaf), returns `get_ordering()` directly.
For containers (`CombinedCapability`, `WrapperCapability`), merges
constraints from all leaves.
NFTz+Conflicting positions among nested leaves: z and zH. Wrap each tier in its own capability or expose the leaves as siblings.)rD   rJ   rL   r2   )Úget_orderingrD   r
   ÚextendrJ   rL   r2   r   )r   Úmerged_positionÚmerged_wrapsÚmerged_wrapped_byÚmerged_requiresÚhas_anyr   r7   s           r!   r   r   Ž   sú   € ð 26€OØ(*€LØ-/ÐØ;=€OØ€GãˆØ×$Ñ$Ó&ˆØÑÙØˆØ×ÑÑ(ØÑ*¨×BSÑBSÓ/SÜØAÀ/ÑATÐTYÐZb×ZkÑZkÑYnð o]ð ^óð ð '×/Ñ/ˆOØ×Ñ˜HŸN™NÔ+Ø× Ñ  ×!4Ñ!4Ô5Ø×Ñ˜x×0Ñ0Ö1ñ ö  ØÜØ ØØ$Ø ñ	ð r8   c                ó^   • [        [        U 5      5      nUSL=(       a    UR                  S:H  $ )z]Whether a capability (merging the orderings of its nested leaves) is in the `innermost` tier.NrC   )r   r   rD   )r   r7   s     r!   Úis_innermostr]   µ   s,   € ä"¤>°#Ó#6Ó7€HØ˜4Ð×D H×$5Ñ$5¸Ñ$DÐDr8   c                ó@   • / nU R                  UR                  5        U$ )z@Collect all leaf capabilities using the `apply` visitor pattern.)ÚapplyÚappend)r   r   s     r!   r   r   »   s   € à,.€FØ‡I�Iˆf�m‰mÔØ€Mr8   c                ó.   ^• [        U4S jU  5       5      $ )zRCheck whether any leaf in a capability list/tree is an instance of the given type.c              3  ób   >#   • U  H$  n[        U5        H  n[        UT5      v •  M     M&     g 7fr%   ©r   rS   )r(   r   r   Úcap_types      €r!   r+   Ú&has_capability_type.<locals>.<genexpr>Ç   s+   øé € Ðb²\¨cÌnÐ]`×NaÀdŒz˜$ ×)Ð)ÑNaÑ)²\ùs   ƒ,/)r3   )r   rd   s    `r!   Úhas_capability_typerf   Â   s   ø€ ô
 Ôb±\ÓbÓbÐbr8   ÚCapabilityT)Úboundc                óf   • U  H+  n[        U5       H  n[        X15      (       d  M  Us  s  $    M-     g)z_Return the first leaf in a capability list/tree that is an instance of `cap_type`, else `None`.Nrc   )r   rd   r   r   s       r!   Úfind_capabilityrj   Í   s2   € ó
 ˆÜ" 3Ö'ˆDÜ˜$×)Ó)Ø”ó (ñ ð r8   N)r   ú!Sequence[AbstractCapability[Any]]Úreturnúlist[AbstractCapability[Any]])r   rm   r   úlist[CapabilityOrdering | None]r    úlist[set[type]]rl   ÚNone)
r   rm   r   rn   r    ro   r   ú#list[list[AbstractCapability[Any]]]rl   rm   )r?   úTopologicalSorter[int]r   Úintr   rn   rl   rp   )r?   rr   r   rs   r   rn   r    ro   r   rq   rl   rp   )rM   r   r    z	set[type]r   rm   rl   Úbool)r   rm   rl   zCapabilityOrdering | None)r   úAbstractCapability[Any]rl   rt   )r   ru   rl   rm   )r   rk   rd   ztype[AbstractCapability[Any]]rl   rt   )r   rk   rd   ztype[CapabilityT]rl   zCapabilityT | None)Ú__doc__Ú
__future__r   Úcollections.abcr   Úgraphlibr   r   Útypingr   r   r	   Úpydantic_ai.exceptionsr
   Úabstractr   r   r   r   r"   r   r   r<   r=   rK   r   r]   r   rf   rg   rj   rR   r8   r!   Ú<module>r}      s�  ðÙ Hå "å $ß 2ß .Ñ .å ,ç KÑ KæÝ,ð?Ø3ð?à"ô?ð,Ø
'ðà.ðð  ðð 
ô	ð"-Ø
'ð-à.ð-ð  ð-ð 4ð	-ð
 #ô-ð:Øðà
ðð /ðð 
ô	ð*!Øð!à
ð!ð /ð!ð  ð	!ð
 4ð!ð 
ô!ð,/Ø	ð/àð/ð *ð/ð 
ô	/ô$ôNEôðcØ3ðcà+ðcð 
ôcñ �mÐ+=¸cÑ+BÑC€ð	Ø3ð	àð	ð õ	r8   