Ë
    áß²jP  ã                  ól   — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 e
rddlmZ d
d„Z G d„ d	«      Zy)z<Locked credential-pool administration and target resolution.é    )ÚannotationsN)Úreplace)ÚAnyÚOptionalÚTupleÚTYPE_CHECKING)ÚPooledCredentialc                óÆ   — ddl m} t        | fi |¤d t        j                  «       | j                  j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}dœ¤ŽS c c}}w )Nr   ©Ú_CLEAR_STATUSÚfailure_reason)Úmodel_cooldownsÚstatus_cleared_atÚextra)Úagent.credential_poolr   r   Útimer   Úitems)Úentryr   ÚkÚvs       ú@/home/ubuntu/.hermes/hermes-agent/agent/credential_pool_admin.pyÚ_cleared_status_copyr      sb   € Ý3ô �5ñ Z˜Mð Z¸4ÔSW×S\ÑS\ÓS^Ø+0¯;©;×+<Ñ+<Ó+>×X¡4 1 aÀ!ÐGWÓBW˜!˜Q™$ÓXóZð ZùÛXs   ÁAÁAc                  ó<   — e Zd Zdd„Zd	d„Zd
d„Zdd„Zdd„Zdd„Zy)ÚCredentialPoolAdminMixinc                ó   ‡— | j                   5  | j                  ˆfd„«      }|€
	 ddd«       yt        |«      }| j                  ||«       | j	                  |j
                  g¬«       |cddd«       S # 1 sw Y   yxY w)zHClear only the target's local error state, preserving sibling cooldowns.c                ó"   •— | j                   ‰k(  S ©N©Úid©ÚeÚcredential_ids    €r   ú<lambda>z7CredentialPoolAdminMixin.reset_status.<locals>.<lambda>   ó   ø€ ¨¯©°Ñ)>€ ó    N©Ústatus_cleared_ids)Ú_lockÚ_findr   Ú_replace_entryÚ_persistr   )Úselfr"   r   Úcleareds    `  r   Úreset_statusz%CredentialPoolAdminMixin.reset_status   ss   ø€ à�Z‰Zñ 	Ø—J‘JÓ>Ó?ˆEØˆ}Ø÷	ð 	ô +¨5Ó1ˆGØ×Ñ  wÔ/Ø�M‰M¨g¯j©j¨\ˆMÔ:Ø÷	÷ 	ò 	ús   ŽA4¯;A4Á4A=c                ó  — ddl m} | j                  5  | j                  D �cg c]@  }|j                  s0|j
                  s$|j                  s|j                  s|j                  r|‘ŒB }}|rl|D �ch c]  }|j                  ’Œ }}| j                  D �cg c]  }|j                  |v rt        |«      n|‘Œ c}| _        | j                  t        |«      ¬«       t        |«      cddd«       S c c}w c c}w c c}w # 1 sw Y   yxY w)a†  Clear exhaustion state on every entry. Returns how many were cleared.

        ``failure_reason`` lives in ``extra``, not a dataclass field, so it is
        stripped explicitly. The persist declares the cleared ids because the
        disk-recency merge reads a cleared ``last_status_at`` (None -> epoch 0)
        as a stale snapshot and would copy a still-binding cooldown back.
        r   r   r&   N)r   r   r(   Ú_entriesÚlast_statusÚlast_status_atÚlast_error_coder   r   r   r   r+   ÚlistÚlen)r,   r   r!   ÚstaleÚ	stale_idss        r   Úreset_statusesz'CredentialPoolAdminMixin.reset_statuses    sí   € õ 	8à�Z‰Zñ 	àŸ=™=öØØ—=’= A×$4Ò$4¸×8IÒ8IÈQ×M]ÒM]Ðab×arÒarò ðˆEð ñ Ø+0Ö1 a˜QŸT›TÐ1�	Ð1ð "Ÿ]™]ö!àð 01¯t©t°yÑ/@Ô(¨Ô+ÀaÑGò!�”ð —‘´°i³�ÔAÜ�u“:÷	ñ 	ùòùò
 2ùò!÷	ð 	ús5   “C:¢AC+Á'C:Á/C0ÂC:Â"C5Â4-C:Ã+C:Ã:Dc           	     ó2  — ddl m} | j                  5  |dk  s|t        | j                  «      kD  r
	 d d d «       y | j                  j                  |dz
  «      }t        | j                  «      D ��cg c]  \  }}t        ||¬«      ‘Œ c}}| _         || j                  | j                  D �cg c]  }|j                  «       ‘Œ c}|j                  g¬«       | j                  |j                  k(  rd | _        |cd d d «       S c c}}w c c}w # 1 sw Y   y xY w)Nr   )Úpersist_pool_entriesé   ©Úpriority)Úremoved_ids)r   r:   r(   r5   r0   ÚpopÚ	enumerater   ÚproviderÚto_dictr   Ú_current_id)r,   Úindexr:   ÚremovedÚpr!   r   s          r   Úremove_indexz%CredentialPoolAdminMixin.remove_index8   sä   € Ý>à�Z‰Zñ 	Ø�qŠy˜E¤C¨¯©Ó$6Ò6Ø÷	ð 	ð —m‘m×'Ñ'¨°©	Ó2ˆGÜ@IÈ$Ï-É-Ó@X×Y¹¸¸1œW Q°Ö3ÓYˆDŒMÙ Ø—‘Ø.2¯m©mÖ< U�—‘•Ò<Ø$ŸZ™Z˜Lõð
 ×Ñ 7§:¡:Ò-Ø#'�Ô Ø÷	ñ 	ùó Zùò =÷	ð 	ús.   “D»6DÁ1DÂ$DÂ,DÃ5DÄDÄDc                óP  ‡— ddl m} | j                  5  | j                  ˆfd„«      }|€
	 ddd«       y| j                  D �cg c]  }|j
                  ‰k7  sŒ|‘Œ }}|j                  t        dt        t        |«      t        |«      «      «      |«       t        |«      D ��cg c]  \  }}t        ||¬«      ‘Œ }}} || j                  |«       t        |d„ ¬«      | _        | j                  «        | j                  ˆfd„«      cddd«       S c c}w c c}}w # 1 sw Y   yxY w)	zRPlace an entry at a clamped zero-based position and persist contiguous priorities.r   )Ú_normalize_pool_prioritiesc                ó"   •— | j                   ‰k(  S r   r   r    s    €r   r#   z5CredentialPoolAdminMixin.move_entry.<locals>.<lambda>N   r$   r%   Nr<   c                ó   — | j                   S r   r<   )r!   s    r   r#   z5CredentialPoolAdminMixin.move_entry.<locals>.<lambda>V   s
   € ¸!¿*¹*€ r%   )Úkeyc                ó"   •— | j                   ‰k(  S r   r   r    s    €r   r#   z5CredentialPoolAdminMixin.move_entry.<locals>.<lambda>X   s   ø€ ¨¯©°Ñ(=€ r%   )r   rI   r(   r)   r0   r   ÚinsertÚmaxÚminÚintr5   r@   r   rA   Úsortedr+   )	r,   r"   r=   rI   r   r!   ÚothersrF   Úentriess	    `       r   Ú
move_entryz#CredentialPoolAdminMixin.move_entryI   sï   ø€ åDà�Z‰Zñ 	?Ø—J‘JÓ>Ó?ˆEØˆ}Ø÷	?ð 	?ð "&§¡ÖH˜A°!·$±$¸-Ó2G’aÐHˆFÐHØ�M‰Mœ#˜a¤¤S¨£]´C¸³KÓ!@ÓAÀ5ÔIÜ:CÀFÓ:K×L±$°!°Q”w˜q¨1Ö-ÐLˆGÑLá& t§}¡}°gÔ>Ü" 7Ñ0DÔEˆDŒMØ�M‰MŒOØ—:‘:Ó=Ó>÷	?ñ 	?ùò IùãL÷	?ð 	?ús6   ”DµDÁDÁDÁADÂ$DÂ;ADÄDÄD%c                óP  — t        |xs d«      j                  «       }|sy| j                  5  t        | j                  d¬«      D ]$  \  }}|j
                  |k(  sŒ||d fc cd d d «       S  t        | j                  d¬«      D ��cg c]B  \  }}|j                  j                  «       j                  «       |j                  «       k(  r||f‘ŒD }}}t        |«      dk(  r|d   d   |d   d   d fcd d d «       S t        |«      dkD  rd d d|› d�fcd d d «       S |j                  «       r\t        |«      }d|cxk  rt        | j                  «      k  r!n n|| j                  |dz
     d fcd d d «       S d d d|› d	�fcd d d «       S d d d
|› d�fcd d d «       S c c}}w # 1 sw Y   y xY w)NÚ )NNzNo credential target provided.r;   )Ústartr   zAmbiguous credential label "z-". Use the numeric index or entry id instead.zNo credential #ú.zNo credential matching "z".)ÚstrÚstripr(   r@   r0   r   ÚlabelÚlowerr5   ÚisdigitrQ   )r,   ÚtargetÚrawÚidxr   Úlabel_matchesrD   s          r   Úresolve_targetz'CredentialPoolAdminMixin.resolve_targetZ   sÏ  € Ü�&’,˜BÓ×%Ñ%Ó'ˆÙØ?à�Z‰Zñ 	BÜ'¨¯©¸QÔ?ò ,‘
��UØ—8‘8˜s“?Ø  tÐ+Ñ+÷	Bñ 	Bð,ô #,¨D¯M©MÀÔ"C÷á�C˜Ø—;‘;×$Ñ$Ó&×,Ñ,Ó.°#·)±)³+Ò=ð �e’ðˆMñ ô
 �=Ó! QÒ&Ø$ QÑ'¨Ñ*¨M¸!Ñ,<¸QÑ,?ÀÐE÷	Bñ 	Bô �=Ó! AÒ%Ø˜TÐ%AÀ#ÀÐFsÐ#tÐt÷	Bñ 	Bð �{‰{Œ}Ü˜C›�Ø˜Ô3¤ T§]¡]Ó!3Õ3Ø  $§-¡-°¸±	Ñ":¸DÐ@÷#	Bñ 	Bð$ ˜T _°U°G¸1Ð#=Ð=÷%	Bñ 	Bð& ˜Ð!9¸#¸¸bÐAÐA÷'	Bñ 	Bùó
÷	Bð 	BúsC   ­-FÁFÁ+FÂAFÃ!FÃ8FÄAFÅ2FÆFÆFÆF%c           	     ó
  — ddl m}m} | j                  5  t	        | || j
                  «      ¬«      }| j
                  j                  |«       t        | dd «      }|rw| j
                  D �cg c]  }|j                  |vsŒ|‘Œ c}| _         || j                  | j
                  D �cg c]  }|j                  «       ‘Œ c}«       t        «       | _        n| j                  «        |cd d d «       S c c}w c c}w # 1 sw Y   y xY w)Nr   )Ú_next_priorityÚwrite_credential_poolr<   Ú_borrowed_root_ids)r   re   rf   r(   r   r0   ÚappendÚgetattrr   rA   rB   Úsetrg   r+   )r,   r   re   rf   Úborrowed_idsr!   s         r   Ú	add_entryz"CredentialPoolAdminMixin.add_entryt   sÄ   € ßOà�Z‰Zñ 	Ü˜E©N¸4¿=¹=Ó,IÔJˆEØ�M‰M× Ñ  Ô'Ü" 4Ð)=¸tÓDˆLÙð -1¯M©MÖ V q¸Q¿T¹TÈÒ=U¢Ò V�”Ù% d§m¡mÈ4Ï=É=Ö5YÀa°a·i±iµkÒ5YÔZÜ*-«%�Õ'à—‘”Ø÷	ñ 	ùò !WùÚ5Y÷	ð 	ús0   •AC9Á+C/Á?C/Â#C9Â&C4Â=(C9Ã/
C9Ã9DN)r"   rZ   ÚreturnúOptional[PooledCredential])rm   rQ   )rD   rQ   rm   rn   )r"   rZ   r=   rQ   rm   rn   )r_   r   rm   z?Tuple[Optional[int], Optional[PooledCredential], Optional[str]]©r   r	   rm   r	   )	Ú__name__Ú
__module__Ú__qualname__r.   r8   rG   rU   rc   rl   © r%   r   r   r      s!   „ ó	óó0ó"?ó"Bô4r%   r   ro   )Ú__doc__Ú
__future__r   r   Údataclassesr   Útypingr   r   r   r   r   r	   r   r   rs   r%   r   ú<module>rx      s/   ðÙ BÝ "ã Ý ß 6Ó 6áÝ6óZ÷qò qr%   