+
    kHàj.J  ã                  óÜ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	t^ RI
HtHt ^ RIHtHt ^ RIHtHt ^RIHtHt ]P0                  ! ]4      t^xt^tR R ltR	 R
 ltR R ltR R lt R R lt!R\R R llt"R R lt#R R lt$R R lt%R R lt&R R lt'R R lt(R R  lt)R!t*R"]*R#]*R$R%/t+R& R' lt,R( R) lt-R\R* R+ llt.R, R- lt/R. R/ lt0R]R0 R1 llt1R2 R3 lt2R4 R5 lt3R6],R7R8]3! R94      /R8.3R:]-R;R<]3! R=4      R>]3! R?4      R@]3! RA4      /R<R>.3RB].RC/ . 3RD]/RER@]3! RF4      RGRHRIRJRK//R@.3RL]2RMRN]3! RO4      R>]3! RP4      RQRHRRRS. R^ORJRT/R@]3! RU4      /RNR>.3/t4RV]5RW&   RX RY lt6RZ R[ lt7R# )_a(  A2A client tools (``a2a`` toolset): a2a_discover/call/list/history/orchestrate talk to *other*
agents. Peers come from config.yaml ``a2a_agents: {name: {url, auth: {type: bearer, token}, timeout,
capabilities}}``. Stdlib urllib; wire format is A2A v1.0 ``SendMessage`` (v0.3 replies still parse).)ÚannotationsN)ÚThreadPoolExecutorÚas_completed)ÚAnyÚOptional)Úcoerce_portÚget_scoped_secret)ÚprotocolÚsecurityc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚdict© )Úformats   "Ú@/home/ubuntu/.hermes/hermes-agent/plugins/platforms/a2a/tools.pyÚ__annotate__r      s   € ÷ (ñ (�dñ (ó    c                 ó0   € ^ RI Hp  V ! 4       ;'       g    / # )zORead-only view of config.yaml; peers are only read, never mutated (cache-safe).©Úload_config_readonly)Úhermes_cli.configr   r   s    r   Ú_load_configr      s   € å6ÙÓ!×'Ð' RÐ'r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r      s   € ÷ 2ñ 2˜4ñ 2r   c                 óH   € \        4       P                  R 4      ;'       g    / # )Ú
a2a_agents)r   Úgetr   r   r   Ú_configured_peersr      s   € Ü‹>×Ñ˜lÓ+×1Ð1¨rÐ1r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úentryr   Úextrar   r   r   )r   s   "r   r   r   #   s&   € ÷ Mñ M˜Dð M¨3ð M°4ñ Mr   c                ó¤   € R V P                  R R4      RV P                  R/ 4      ;'       g    / R\        V P                  R\        4      4      /VC# )ÚurlÚ ÚauthÚtimeout)r   ÚintÚ_DEFAULT_TIMEOUT)r    r!   s   &,r   Ú_peer_from_entryr)   #   sT   € Ø�5—9‘9˜U BÓ'¨°·±¸6À2Ó1F×1LÐ1LÈ"Ø”s˜5Ÿ9™9 YÔ0@ÓAÓBðMØFKðMð Mr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚagentÚstrr   úOptional[dict]r   )r   s   "r   r   r   (   s   € ÷ Hñ H˜ð H ñ Hr   c                ó   € V P                  R	4      '       d   RV R/ R\        R. /# \        4       P                  V 4      pV'       d8   \	        YP                  R. 4      ;'       g    . VP                  RR4      R7      # R# )
zUPeer name -> {url, auth, timeout, capabilities, tenant}, or treat ``agent`` as a URL.r#   r%   r&   ÚcapabilitiesÚtenantr$   )r/   r0   N)zhttp://zhttps://)Ú
startswithr(   r   r   r)   )r+   r    s   & r   Ú_resolve_peerr2   (   s„   € à×ÑÐ/×0Ò0Ø�u˜f b¨)Ô5EÀ~ÐWYÐZÐZÜÓ×#Ñ# EÓ*€Eßx}Ô˜E·	±	¸.È"Ó0M×0SÐ0SÐQSÐ\a×\eÑ\eÐfnÐprÓ\sÔtð  Hð  DHð  Hr   c               ó    € V ^8„  d   QhRRRR/# )r   r%   r   r   r   )r   s   "r   r   r   0   s   € ÷ ñ �tð  ñ r   c                óŒ   € V '       d<   V P                  R 4      R8X  d&   V P                  R4      '       d   RRV R,           2/# / # )ÚtypeÚbearerÚtokenÚAuthorizationzBearer ©r   )r%   s   &r   Ú_auth_headerr:   0   sC   € ß;?ÀDÇHÁHÈVÓDTÐX`ÔD`Ðei×emÑemÐnu×evÒevˆO˜w t¨G¥} oÐ6Ð7Ð~Ð|~Ð~r   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   r#   r,   Úheadersr   r&   r'   ÚmethodÚdatazOptional[bytes]r   r   )r   s   "r   r   r   4   s7   € ÷ 7ñ 7�Cð 7 $ð 7°ð 7¸cð 7Èð 7Ðdhñ 7r   c                ó8  € \         P                  P                  WWR 7      p\         P                  P                  WRR7      ;_uu_ 4       p\        P
                  ! VP                  4       P                  R4      4      uuRRR4       #   + '       g   i     R# ; i))r>   r<   r=   )r&   úutf-8N)ÚurllibÚrequestÚRequestÚurlopenÚjsonÚloadsÚreadÚdecode)r#   r<   r&   r=   r>   ÚreqÚresps   &&&&&  r   Ú
_http_jsonrK   4   sa   € Ü
�.‰.×
 Ñ
  ¸Ð
 Ó
P€CÜ	�‰×	Ñ	 Ð	×	5Ô	5¸Ü�zŠz˜$Ÿ)™)›+×,Ñ,¨WÓ5Ó6÷ 
6×	5×	5Ó	5ús   Á
3BÂB	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r#   r,   r<   r   r&   r'   r   r   )r   s   "r   r   r   :   s(   € ÷ 4ñ 4˜ð 4 dð 4°Sð 4¸Tñ 4r   c                ó   € \        WVR 4      # )ÚGET)rK   )r#   r<   r&   s   &&&r   Ú_http_get_jsonrO   :   s   € Ü�c G¨UÓ3Ð3r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r#   r,   Úbodyr   r<   r&   r'   r   r   )r   s   "r   r   r   >   s6   € ÷ Tñ T˜ð T Dð T°4ð TÀ#ð TÈ$ñ Tr   c           	     ó�   € R RR\         P                  /VCp\        WVR\        P                  ! V4      P                  R4      4      # )zContent-Typezapplication/jsonzA2A-VersionÚPOSTr@   )r	   ÚPROTOCOL_VERSIONrK   rE   ÚdumpsÚencode)r#   rQ   r<   r&   Úhdrss   &&&& r   Ú_http_post_jsonrX   >   sB   € ØÐ.°¼x×?XÑ?XÐdÐ\cÐd€DÜ�c ¨&´$·*²*¸TÓ2B×2IÑ2IÈ'Ó2RÓSÐSr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úbase_urlr,   r<   r   r&   r'   r   r   )r   s   "r   r   r   C   s.   € ÷ Nñ N˜#ð N¨ð N°sð N¸tñ Nr   c                óî   € V P                  R4      p \        VR,           W4      #   \        P                  P                   d   pTP
                  R8w  d   h  Rp?MRp?ii ; i\        TR,           Y4      # )zLGET the v1.0 agent-card.json; on 404 fall back to the v0.2 agent.json alias.Ú/z/.well-known/agent-card.jsoni”  Nz/.well-known/agent.json)ÚrstriprO   rA   ÚerrorÚ	HTTPErrorÚcode)rZ   r<   r&   ÚbaseÚes   &&&  r   Ú_fetch_cardrc   C   sj   € à�?‰?˜3Ó€DðÜ˜dÐ%CÕCÀWÓVÐVøÜ�<‰<×!Ñ!ô Ø�6‰6�SŒ=Øô ûðúô ˜$Ð!:Õ:¸GÓMÐMs   “& ¦A!ÁAÁA!c               ó    € V ^8„  d   QhRRRR/# )r   Úcardr-   r   r   )r   s   "r   r   r   N   s   € ÷ ñ  Nð °~ñ r   c                ó  € \        V \        4      '       do   V P                  R . 4      ;'       g    .  FN  p\        V\        4      '       g   K  VP                  R4      R8X  g   K3  VP                  R4      '       g   KL  Vu # 	  R# )ÚsupportedInterfacesÚprotocolBindingÚJSONRPCr#   N©Ú
isinstancer   r   )re   Úifaces   & r   Ú_select_jsonrpc_interfacerm   N   sj   € Ü�$œ×ÒØ—X‘XÐ3°RÓ8×>Ð>¸BÒ>ˆEÜ˜%¤×&Ô&¨5¯9©9Ð5FÓ+GÈ9Ö+TÐY^×YbÑYbÐch×YiÔYiØ’ñ ?ñ r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rZ   r,   re   r-   r   r   )r   s   "r   r   r   V   s!   € ÷  ñ  �sð   .ð  °Sñ  r   c                ó  € \        V4      ;p'       d   \        VR,          4      # \        V\        4      '       d>   \        VP	                  R4      \        4      '       d   VR,          '       d
   VR,          # V P                  R4      # )zYCard's JSONRPC interface (v1.0 supportedInterfaces) > card's legacy top-level url > base.r#   r\   )rm   r,   rk   r   r   r]   )rZ   re   rl   s   && r   Ú_rpc_urlrp   V   sc   € ä)¨$Ó/Ð/€uÖ/Ü�5˜•<Ó Ð Ü�$œ×Ò¤*¨T¯X©X°e«_¼c×"BÒ"BÀtÈEÇ{Ä{Ø�E�{ÐØ�?‰?˜3ÓÐr   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Úagent_labelr,   Úpeerr   ÚmessageÚ
context_idr   ztuple[str, str, str]r   )r   s   "r   r   r   _   s0   € ÷ !#ñ !#˜Cð !# tð !#°cð !#Àsð !#ÐOcñ !#r   c                óâ  € VP                  RR4      p\        VP                  R/ 4      ;'       g    / 4      p\        VP                  R\        4      4      p \	        WE\        V^4      4      pT;'       g    \        P                  ! 4       p\        P                  ! V4      p	RRR\        P                  ! 4       R	R
RR\        P                  ! \        P                  W˜R7      //p
\        V4      pV'       d*   VP                  R4      '       d   \        VR,          4      M#\        VP                  R4      ;'       g    R4      pV'       d   WÊR,          R&   \        P                   ! RW
R,          V	4       \        P"                  ! VRWšR,          4       \        P$                  ;P&                  ^,          un        \)        \+        WG4      W¥V4      pRV9   d0   \-        RV  RVR,          P                  RVR,          4       24      h\        P.                  ! VP                  R/ 4      4      p\1        V4      pTRpp\3        V\4        4      '       d>   VP                  RV4      pVP                  R4      ;'       g    / P                  RR4      p\        P"                  ! VRWúR,          4       \        P$                  ;P6                  ^,          un        VVV3#   \         d    Rp ELi ; i)z©One SendMessage to a peer -> (reply_text, context_id, state). Raises urllib errors /
ValueError for the caller to format; handles redaction, audit, persistence, metrics.r#   r$   r%   r&   NÚjsonrpcz2.0Úidr=   ÚSendMessageÚparamsrt   )ru   r0   ÚoutboundÚuserr^   zPeer 'z' returned an error: ÚresultÚ	contextIdÚstatusÚstater+   )r   r:   r'   r(   rc   ÚminÚ	Exceptionr	   Únew_context_idr
   Úredact_outboundÚnew_task_idÚtext_messageÚ	ROLE_USERrm   r,   ÚauditÚpersist_messageÚmetricsÚoutbound_totalrX   rp   Ú
ValueErrorÚunwrap_send_message_responseÚ_reply_text_from_resultrk   r   Úinbound_total)rr   rs   rt   ru   rZ   r<   r&   re   ÚctxÚsafe_messageÚrpc_bodyrl   r0   rJ   ÚpayloadÚreplyÚ	reply_ctxr€   s   &&&&              r   Ú
_send_taskr–   _   sa  € ð �x‰x˜˜rÓ"€HÜ˜4Ÿ8™8 F¨BÓ/×5Ð5°2Ó6€GÜ�$—(‘(˜9Ô&6Ó7Ó8€GðÜ˜8¬c°'¸2Ó.>Ó?ˆð ×
1Ð
1œ×/Ò/Ó1€CÜ×+Ò+¨GÓ4€Là˜5 $¬×(<Ò(<Ó(>ÀÈ-Ø˜9¤h×&;Ò&;¼H×<NÑ<NÐP\Ô&mÐnðp€Hä% dÓ+€Eß%*¨u¯y©y¸×/BÒ/BŒS��x•Ô!ÌÈDÏHÉHÐU]ÓL^×LdÐLdÐbdÓHe€FßØ'-�Õ˜8Ñ$Ü‡N‚N�:˜{°T­N¸LÔIÜ×Ò˜S &¨,À½ÔGÜ×Ñ×#Ò# qÕ(Õ#Üœ8 HÓ3°XÈÓP€DØ�$„Ü˜6 + Ð.CÀDÈÅM×DUÑDUÐV_ÐaeÐfmÕanÓDoÐCpÐqÓrÐrÜ×3Ò3°D·H±H¸XÀrÓ4JÓK€GÜ# GÓ,€EØ˜Bˆu€IÜ�'œ4× Ò Ø—K‘K ¨SÓ1ˆ	Ø—‘˜XÓ&×,Ð,¨"×1Ñ1°'¸2Ó>ˆÜ×Ò˜Y¨°À½ÔGÜ×Ñ×"Ò" aÕ'Õ"Ø�)˜UÐ"Ð"øô3 ô Ø‹ðús   ÁK ËK.Ë-K.c               ó    € V ^8„  d   QhRRRR/# )r   r}   r   r   r,   r   )r   s   "r   r   r   ƒ   s   € ÷ 	\ñ 	\ Cð 	\¨Cñ 	\r   c                óŒ  € \         P                  ! V 4      p \        V \        4      '       g   \	        V 4      # V P                  R . 4      ;'       g    .  F%  p\         P                  ! V4      pV'       g   K#  Vu # 	  \         P                  ! V P                  R/ 4      ;'       g    / P                  R4      ;'       g    T 4      # )Ú	artifactsr   rt   )r	   r�   rk   r   r,   r   Úextract_text)r}   ÚartifactÚtxts   &  r   rŽ   rŽ   ƒ   s�   € Ü×2Ò2°6Ó:€FÜ�fœd×#Ò#Ü�6‹{Ðà—J‘J˜{¨BÓ/×5Ð5°2Ò5ˆÜ×#Ò# HÓ-ˆß‰3ØŠJñ 6ô × Ò  &§*¡*¨X°rÓ":×"@Ð"@¸b×!EÑ!EÀiÓ!P×!ZÐ!ZÐTZÓ[Ð[r   zNError: peer '{agent}' rejected auth (HTTP {code}). Check the configured token.i‘  i“  i­  z>Error: peer '{agent}' rate limited us (HTTP 429). Retry later.c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úargsr   Ú_r   r   r,   r   )r   s   "r   r   r   ’   s!   € ÷ ñ �tð  #ð ¨#ñ r   c                ó   € \        V P                  R4      ;'       g    R4      P                  4       pV'       g   R#  \        V/ \        4      pTP                  R
/ 4      ;'       g    / pTP                  R. 4      ;'       g    . pTP                  R4      '       d   RMRpRP                  R TP                  R. 4      ;'       g    .  4       4      ;'       g    RTP                  RR4       R2pRTP                  RR4       2RTP                  RR4       2R\        Y#4       2RT 2R\        TP                  R4      4       R\        TP                  R4      4       R T 2R!\        T4       R"2.p	T	P                  R# TR$,           4       4       R%P                  T	4      #   \
        P                  P                   d   pRTP                   RT R2u Rp?# Rp?i\         d   pRT R	T R2u Rp?# Rp?ii ; i)&z.Fetch and summarize the Agent Card at ``url``.r#   r$   z6Error: 'url' is required (e.g. http://localhost:9999).u!   Error: discovery failed â€” HTTP z from Ú.NzError: could not reach u    â€” r/   Úskillsr
   ÚyesÚnoú, c              3  ó    "  € T FD  p\        V\        4      '       g   K  VP                  R R4       RVP                  RR4       2x € KF  	  R# 5i)rh   Ú?z vÚprotocolVersionNrj   )Ú.0Úis   & r   Ú	<genexpr>Úa2a_discover.<locals>.<genexpr>    sH   é € ð á;ˆAÄ
È1Ìd×@Sô 	Lˆ1�5‰5Ð" CÓ(Ð
)¨¨A¯E©EÐ2CÀSÓ,IÐ+JÕKÛ;ùs
   ‚AŸ/Arg   Úvr©   r¨   z (pre-1.0 card)zAgent: ÚnamezDescription: ÚdescriptionzURL: z
Protocol: zStreaming: Ú	streamingz  Push: ÚpushNotificationsz  Auth required: zSkills (ú):c           	   3  ó’   "  € T F=  pR VP                  RVP                  RR4      4       RVP                  RR4       2x € K?  	  R# 5i)ú  - r¯   rx   r¨   ú: r°   r$   Nr9   )rª   Úss   & r   r¬   r­   ¨   sD   é € ÐkÑ_jÐZ[�4˜Ÿ™˜f a§e¡e¨D°#Ó&6Ó7Ð8¸¸1¿5¹5ÀÐPRÓ;SÐ:TÕUÓ_jùs   ‚AA:Né   NÚ
)r,   r   Ústriprc   r(   rA   r^   r_   r`   r‚   Újoinrp   ÚboolÚlenÚextend)
rŸ   r    r#   re   rb   Úcapsr£   r%   ÚprotoÚliness
   &,        r   Úa2a_discoverrÂ   ’   s÷  € ä
ˆd�h‰h�u‹o×#Ð# Ó
$×
*Ñ
*Ó
,€CßÙGð8Ü˜3 Ô$4Ó5ˆð
 �8‰8�N BÓ'×-Ð-¨2€DØ�X‰X�h Ó#×)Ð) r€FØ—H‘H˜Z×(Ò(‰5¨d€DØ�I‰Iñ à—(‘(Ð0°"Ó5×;Ð;¸Ð;óó ÷ ?ð ?ð ˆT�X‰XÐ'¨Ó-Ð.¨oÐ	>ð 
ð �t—x‘x ¨Ó,Ð-Ð.°-ÀÇÁÈÐXZÓ@[Ð?\Ð0]ÐafÔgoÐpsÓgzÐf{Ð_|Ø˜%˜Ð!Øœ4 §¡¨Ó 5Ó6Ð7°xÄÀTÇXÁXÐNaÓEbÓ@cÐ?dÐduÐvzÐu{Ð|Øœ˜F›�} BÐ'ð)€Eð 
‡L�LÑkÐ_eÐfiÖ_jÓkÔkØ�9‰9�UÓÐøô! �<‰<×!Ñ!ô HØ2°1·6±6°(¸&ÀÀÀQÐGÕGûÜô 8Ø(¨¨¨U°1°#°QÐ7Õ7ûð8ús5   ¾F% Æ%G=ÇGÇG=ÇG=Ç)G=Ç*G8Ç2G=Ç8G=c               ó$   € V ^8„  d   QhRRRRRR/# rž   r   )r   s   "r   r   r   ¬   s!   € ÷ ñ �4ð ˜cð  cñ r   c                ó  € \        V P                  R4      ;'       g5    V P                  R4      ;'       g    V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g5    V P                  R4      ;'       g    V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g    V P                  R	4      ;'       g    R4      P                  4       pV'       d	   V'       g   R
# \        V4      pV'       d   VP                  R4      '       g   RV R2#  \	        W%W44      w  rgpTP                  RR4      P                  RR4      P                  4       p
RT RT 2T'       d   RT
 2MR,           R,           pT;'       g    RpT\        P                   8X  d   TRT R2,          pT RT 2#   \
        P                  P                   dE   p	\        P                  T	P                  R4      P                  Y)P                  R7      u Rp	?	# Rp	?	i\         d   p	\        T	4      u Rp	?	# Rp	?	i\         d   p	RT RT	 R2u Rp	?	# Rp	?	ii ; i)zaSend a task to a peer (configured name or direct URL); ``context_id`` continues a prior exchange.r+   Ú
agent_namer¯   r$   rt   ÚtextÚtaskru   r~   z/Error: both 'agent' and 'message' are required.r#   zError: unknown agent 'zP'. Configure it under 'a2a_agents' in config.yaml or pass a full http(s):// URL.u0   Error: call to '{agent}' failed â€” HTTP {code}.)r+   r`   NzError: call to 'u   ' failed â€” r¢   ÚTASK_STATE_r    Ú-Ú[u    Â· context u    Â· Ú]z(no text reply)uS   

(The peer needs more input â€” answer by calling a2a_call again with context_id 'z'.)r¹   )r,   r   rº   r2   r–   rA   r^   r_   Ú_HTTP_CALL_ERRORSr`   r   rŒ   r‚   ÚreplaceÚlowerr	   ÚSTATE_INPUT_REQUIRED)rŸ   r    r+   rt   ru   rs   r”   r•   r€   rb   Úshort_stateÚheaderrQ   s   &,           r   Úa2a_callrÒ   ¬   s+  € ô �—‘˜Ó!×UÐU T§X¡X¨lÓ%;×UÐU¸t¿x¹xÈÓ?O×UÐUÐSUÓV×\Ñ\Ó^€EÜ�$—(‘(˜9Ó%×SÐS¨¯©°&Ó)9×SÐS¸T¿X¹XÀfÓ=M×SÐSÐQSÓT×ZÑZÓ\€GÜ�T—X‘X˜lÓ+×JÐJ¨t¯x©x¸Ó/D×JÐJÈÓK×QÑQÓS€JßŸÙ@Ü˜Ó€Dß�t—x‘x —’Ø'¨ wÐ.~ÐÐð;Ü",¨U¸'Ó"NÑˆ˜%ð —-‘- ¨rÓ2×:Ñ:¸3ÀÓD×JÑJÓL€KØ���| I ;Ð/Ï5°T¸+¸Ñ3GÐVXÕYÐ\_Õ_€FØ×%Ð%Ð%€DØ”×-Ñ-Ô-ØÐgÐhqÐgrÐruÐvÕvˆØˆX�R˜�vÐÐøô �<‰<×!Ñ!ô BÜ ×$Ñ$ Q§V¡VÐ-_Ó`×gÑgÐns÷  {Añ  {AÐgó  Bõ  	BûÜô Ü�1‹v�ûÜô ;Ø! % ¨°a°S¸Ð:Õ:ûð;úsN   ÅG. Ç.JÈ9IÉJÉJÉJÉ
I*É$JÉ*JÉ7JÉ8JÊ JÊJc               ó$   € V ^8„  d   QhRRRRRR/# )r   rŸ   zdict | Noner    r   r   r,   r   )r   s   "r   r   r   Ç   s!   € ÷ ñ �;ð ¨Cð °Cñ r   c                óü  € \        4       p. pV'       dÂ   VP                  R\        V4       R24       VP                  4        FŽ  w  rEVP	                  R. 4      pTP                  RT RVP	                  RR4       RVP	                  R	4      ;'       g    / P	                  R
R4       R2V'       d   RRP                  V4       2MR,           4       K�  	  MVP                  R4       \        P                  ! 4       ;p'       dO   VP                  R4       VP                  R\        V4       R24       VP                  R VR,           4       4       \        P                  P                  4       pVP                  R4       VP                  RVR,           RVR,           RVR,           RVR,           RVR,           RVR ,           R!VR",           R#VR$,           R%VR&,           R'24       R(P                  V4      # ))z@List configured A2A peers, persisted conversations, and metrics.zConfigured peers (r³   r/   rµ   r¶   r#   r¨   z (auth: r%   r5   ÚnoneÚ)z caps: r¦   r$   z@No peers configured. Add them under 'a2a_agents' in config.yaml.zPersisted conversations (u   ) â€” recall with a2a_history:c              3  ó,   "  € T F
  pR V 2x € K  	  R# 5i)rµ   Nr   )rª   Úcs   & r   r¬   Úa2a_list.<locals>.<genexpr>Ö   s   é € Ð5© A�t˜A˜3•Z«ùs   ‚:Né   Nz	Metrics: r�   z in / r‹   z out, Útasks_completedz completed, Útasks_failedz	 failed, Ústreams_startedz
 streams, Ú	push_sentz push sent, Úanti_loop_triggersz anti-loop, Úrate_limit_triggersz rate-limited, avg Úavg_latency_msÚmsr¹   )r   Úappendr½   Úitemsr   r»   r	   Úlist_conversationsr¾   rŠ   Úsnapshot)	rŸ   r    ÚpeersrÁ   r¯   r    r¿   ÚconvosÚms	   &,       r   Úa2a_listrê   Ç   sá  € äÓ€EØ€EßØ�‰Ð)¬#¨e«*¨°RÐ8Ô9Ø Ÿ;™;ž=‰KˆDØ—9‘9˜^¨RÓ0ˆDØ�L‰L˜4 ˜v R¨¯	©	°%¸Ó(=Ð'>¸hÈÏ	É	ÐRXÓHY×H_ÐH_Ð]_×GdÑGdÐekÐmsÓGtÐFuÐuvÐwß;?˜g d§i¡i°£oÐ%6Ñ7ÀRõIö Jò )ð
 	�‰ÐWÔXÜ×,Ò,Ó.Ð.€vÖ.Ø�‰�RÔØ�‰Ð0´°V³°Ð=[Ð\Ô]Ø�‰Ñ5¨°®Ó5Ô5Ü×Ñ×!Ñ!Ó#€AØ	‡L�L�ÔØ	‡L�L�9˜Q˜Õ/Ð0°°qÐ9IÕ7JÐ6KÈ6ÐRSÐTeÕRfÐQgÐgsØ�nÕ%Ð& i°Ð2CÕ0DÐ/EÀZÐPQÐR]ÕP^ÐO_Ð_kØÐ*Õ+Ð,¨L¸Ð;PÕ9QÐ8RÐReÐfgÐhxÕfyÐezÐz|ð~ô ð �9‰9�UÓÐr   c               ó$   € V ^8„  d   QhRRRRRR/# rž   r   )r   s   "r   r   r   ß   s!   € ÷ ñ �dð  ð ¨ñ r   c           
     ó¢  € \        V P                  R4      ;'       g    V P                  R4      ;'       g    R4      P                  4       pV'       g   R# \        ^\	        \        V P                  R4      ;'       g    ^2^24      ^È4      4      p\        P                  ! W#R7      pV'       g   RV R2# R	V R
\        V4       R2.pV Fs  pVP                  R4      ;'       g    RP                  4       pTP                  RVP                  RR4       R\        V4      R8”  d   VR,          R,           MT 24       Ku  	  RP                  V4      # )zCRecall a persisted A2A conversation (survives compaction/restarts).ru   r~   r$   zGError: 'context_id' is required (see a2a_list for known conversations).Úlimit)rí   z'No persisted conversation for context 'ú'.zConversation z (last z messages):rÆ   rÊ   Úroler¨   z] iè  :Niè  Nu    â€¦[truncated]r¹   )r,   r   rº   Úmaxr�   Ú_coerce_intr	   Úload_conversationr½   rã   r»   )rŸ   r    ru   rí   ÚmessagesrÁ   ré   rÆ   s   &,      r   Úa2a_historyrô   ß   s   € ä�T—X‘X˜lÓ+×JÐJ¨t¯x©x¸Ó/D×JÐJÈÓK×QÑQÓS€JßÙXÜ�”3”{ 4§8¡8¨GÓ#4×#:Ð#:¸¸BÓ?ÀÓEÓF€EÜ×)Ò)¨*ÔB€HßØ8¸¸ÀBÐGÐGØ˜Z˜L¨´°H³¨¸kÐJÐK€EÛˆØ—‘�f“×#Ð# ×*Ñ*Ó,ˆØ�‰�q˜Ÿ™˜v sÓ+Ð,¨BÔRUÐVZÓR[Ð^bÔRb¨t°E­{Ð=NÖ/NÐhlÐ.mÐnÖoñ ð �9‰9�UÓÐr   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
capabilityr,   r   zlist[tuple[str, dict]]r   )r   s   "r   r   r   ï   s   € ÷ Yñ Y¨3ð YÐ3Iñ Yr   c           	     óº   € \        4       P                  4        UUu. uF1  w  rYP                  R. 4      ;'       g    . 9   g
   V R8X  g   K.  W3NK3  	  upp# u uppi )zAConfigured peers that advertise the capability ('*' matches all).r/   Ú*)r   rä   r   )rö   r¯   r    s   &  r   Ú_match_peers_by_capabilityrù   ï   s^   € ä->Ó-@×-FÑ-FÔ-Hô YÑ-H™k˜dØŸi™i¨¸Ó;×AÐA¸rÔBÀjÐTWÑFWô ˆT‹MÑ-Hò Yð Yùó Ys   œA¼AÁAc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rÅ   r,   Ú
peer_entryr   rt   ru   r   ztuple[str, str]r   )r   s   "r   r   r   õ   s1   € ÷ +ñ + ð +°ð +Àð +ÐQTð +Ð^mñ +r   c                óŽ   €  \        V \        V4      W#4      w  rEpY;'       g    R3#   \         d   pT RT 23u Rp?# Rp?ii ; i)z=Call a single peer synchronously -> (agent_name, reply_text).z
(no reply)úError: N)r–   r)   r‚   )rÅ   rû   rt   ru   r”   Ú_ctxÚ_staterb   s   &&&&    r   Ú_call_peer_syncr   õ   sS   € ð+Ü(¨Ô5EÀjÓ5QÐSZÓgÑˆ�VØ×1Ð1 \Ð2Ð2øÜô +Ø˜g a S˜MÐ*Õ*ûð+ús   ‚%( ¨A³?¹A¿Ac               ó$   € V ^8„  d   QhRRRRRR/# rž   r   )r   s   "r   r   r   þ   s&   € ÷ #cñ #c˜$ð #c Sð #c¨Sñ #cr   c                óÌ  € \        V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g    V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g    R4      P                  4       P                  4       pVR 9   d   TMRp\        V P                  R	4      ;'       g    R4      P                  4       pV'       g   R
# V'       g   R# \	        V4      ;p'       g   RV R2# . p\        \        \        V4      \        4      R7      ;_uu_ 4       pV U	U
u/ uF  w  ršVP                  \        WšW54      V	bK  	  pp	p
\        V4       Ft  pW¼,          p	 VP                  VP                  4       4       VR8X  dC   VR!,          ^,          P                  R4      '       g   V F  pVP                  4        K  	   MKt  Kv  	  RRR4       VP#                  R R7       V U	Uu. uF!  w  rŸVP                  R4      '       d   K  WŸ3NK#  	  pp	pVR"9   dg   V'       g4   RP%                  R.V U	Uu. uF  w  rŸRV	 RV 2NK  	  upp	,           4      # VR8X  d   \'        VR R7      MV^ ,          w  rŸRV RV	 RV 2# RP%                  RV R\        V4       R2.V U	UUu. uF  w  rŸRV	 R2V3 F  pVNK  	  K  	  uppp	,           4      # u up
p	i   \          d#   pTP                  T	RT 234        Rp?EK«  Rp?ii ; i  + '       g   i     ELD; iu upp	i u upp	i u uppp	i )#u¥   Fan-out a task to peers matching a capability. Modes: ``all``, ``first`` (first successful),
``best`` (longest successful â€” coarse; use ``all`` to judge yourself).rö   r$   rt   rÇ   ÚmodeÚallÚfirstÚbestru   zError: 'message' is required.z;Error: 'capability' is required (or use '*' for all peers).z1Error: no configured peers advertise capability 'rî   )Úmax_workerszError:rý   Nc                ó   € V ^ ,          # )é    r   ©Úrs   &r   Ú<lambda>Ú!a2a_orchestrate.<locals>.<lambda>  s   € ˜q žtr   )Úkeyr¹   zAll peers failed:z  r¶   c                ó&   € \        V ^,          4      # )é   )r½   r
  s   &r   r  r    s   € ´3°q¸µt´9r   rÊ   z]
zOrchestrated 'z' to z	 peer(s):z
--- z ---©r  r  r  éÿÿÿÿ)r  r  )r,   r   rº   rÎ   rù   r   r�   r½   Ú_ORCHESTRATE_MAX_WORKERSÚsubmitr   r   rã   r}   r1   Úcancelr‚   Úsortr»   rð   )rŸ   r    rö   rt   r  ru   ÚmatchesÚresultsÚpoolr¯   r    ÚfuturesÚfutÚfrb   r”   Ú	successesÚlines   &,                r   Úa2a_orchestrater  þ   s  € ô �T—X‘X˜lÓ+×1Ð1¨rÓ2×8Ñ8Ó:€JÜ�$—(‘(˜9Ó%×?Ð?¨¯©°&Ó)9×?Ð?¸RÓ@×FÑFÓH€GÜˆt�x‰x˜Ó×(Ð( 5Ó)×/Ñ/Ó1×7Ñ7Ó9€DØÐ3Ô3‰4¸€DÜ�T—X‘X˜lÓ+×1Ð1¨rÓ2×8Ñ8Ó:€JßÙ.ßÙLÜ1°*Ó=Ð=ˆGÖ=ØBÀ:À,ÈbÐQÐQØ%'€GÜ	¬¬C°«LÔ:RÓ(S×	TÕ	TÐX\ÙkrÔsÑkrÑ\gÐ\`�4—;‘;œ°¸WÓQÐSWÒWÑkrˆÑsÜ Ö(ˆCØ•<ˆDð6Ø—‘˜sŸz™z›|Ô,Ø˜7”?¨7°2­;°q­>×+DÑ+DÀX×+NÒ+NÛ$˜ØŸ™ž
ñ %áñ ,O‘?ñ	 )÷ 
Uð ‡L�L‘^€LÔ$Ù29Ô\±'¡; 4À×AQÑAQÐRZ×A[”�$“±'€IÑ\ØÐ Ô ßØ—9‘9Ð1Ð2Ñ^eÔ5fÑ^eÉ{Èt¸¸4¸&ÀÀ5À'Ó6JÑ^eÒ5fÕfÓgÐgØAEÈÄ”c˜)Ñ)<Õ=ÐU^Ð_`ÕUa‰ˆØ�4�&˜˜4˜&  E 7Ð+Ð+Ø�9‰9˜ z l°%¼¸G»°~ÀYÐOÐPÙ07Õa±¡ ÀvÈdÈVÐSWÐEXÐZ_ÓD`¸D›ÑD`™±Óaõbó cð cùó% tøô ô 6Ø—‘ ¨°¨s mÐ4×5Ó5ûð6ú÷ 
U×	TÐ	Tüó ]ùó 6gùô bsa   ÅL?Å#L	
Å>L?ÆA$LÇ<L?È$MÉMÉ/MËMÌ	L?ÌL<	ÌL7	Ì0L?Ì7L<	Ì<L?Ì?M	c               ó    € V ^8„  d   QhRRRR/# )r   r°   r,   r   r   r   )r   s   "r   r   r   $  s   € ÷ :ñ :�cð :˜dñ :r   c                ó   € R RRV /# )r5   Ústringr°   r   )r°   s   &r   Ú_strr#  $  s   € Ø�H˜m¨[Ð9Ð9r   rÂ   z³Fetch and summarize another agent's A2A Agent Card from a URL (its name, description, capabilities, and skills). Use this to find out what a remote agent can do before calling it.r#   z<Base URL of the remote A2A agent, e.g. http://localhost:9999rÒ   zãSend a natural-language task to a remote A2A agent and return its reply. The agent is a peer (any A2A-compliant framework), not a sub-agent you control. Pass 'context_id' from a previous reply to continue a multi-turn exchange.r+   z@Configured peer name (from a2a_agents) or a full http(s):// URL.rt   z9The task / message to send the peer, in natural language.ru   zFOptional: context id from a prior reply, to continue the conversation.rê   zJList configured A2A peer agents, persisted A2A conversations, and metrics.rô   z�Recall a persisted A2A conversation transcript by context_id (survives restarts and context compaction). Use a2a_list to see known context ids.z)Context id of the conversation to recall.rí   r5   Úintegerr°   z-Max messages to return (default 50, max 200).r  zÕFan-out a task to multiple peer agents by capability. Peers are matched from config.yaml a2a_agents.*.capabilities. Modes: 'all' (return all replies), 'first' (first successful), 'best' (longest successful reply).rö   zCCapability to match (e.g. 'research', 'code') or '*' for all peers.z'The task to send to all matching peers.r  r"  Úenumz)How to aggregate results. Default: 'all'.z*Optional: shared context id for all peers.z+dict[str, tuple[Any, str, dict, list[str]]]Ú_TOOLSc               ó   € V ^8„  d   QhRR/# )r   r   r¼   r   )r   s   "r   r   r   I  s   € ÷ ñ ˜dñ r   c                 óô  € / p \         P                  ! \        4      ;_uu_ 4        \        4       p V P	                  R4      '       d    RRR4       R#  RRR4        \        R4      '       d   R# V P	                  R4      ;'       g    / P	                  R4      ;'       g    / p\        \        V\        4      ;'       d    VP	                  R4      4      #   + '       g   i     LŠ; i  \         d     R# i ; i)	u.  check_fn: serve the client tools ONLY when the operator opted into A2A (peers under
``a2a_agents``, inbound platform enabled, or A2A_PORT set). Fail closed.

Maintainer-directed (#95681): these registered unconditionally, so every session on every install paid
~561 tok/call for tools whose only possible output without config is 'no peers configured'. A2A is
unrelated to Bot Mode (bots talk over gateway RPCs) â€” for most installs this toolset is foreign-agent
plumbing they never enabled. Config adds mid-session surface at the next compaction (#97073).
r   NTÚA2A_PORTÚ	platformsÚa2aÚenabledF)	Ú
contextlibÚsuppressr‚   r   r   Ú_get_scoped_secretr¼   rk   r   )ÚcfgÚa2a_cfgs     r   Ú_a2a_tools_availabler2  I  s¾   € ð €CÜ	×	Ò	œY×	'Õ	'Ü‹nˆØ�7‰7�<× Ò Ø÷ 
(Ñ	'à ÷ 
(ðä˜j×)Ò)ÙØ—7‘7˜;Ó'×-Ð-¨2×2Ñ2°5Ó9×?Ð?¸RˆÜ”J˜w¬Ó-×HÐH°'·+±+¸iÓ2HÓIÐI÷ 
(×	'ûô ô Úðús5   ¥#CÁC( Á/C( ÂC( Â C( Â?C( ÃC%	Ã(C7Ã6C7c               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   r   a  s   € ÷ Mñ M˜4ñ Mr   c                ó®   € \         P                  4        F<  w  pw  r#rERRRV/pV'       d   WVR&   V P                  VRW#RVRVRV/R	\        R
7       K>  	  R# )z@Register the client tools in the ``a2a`` toolset (config-gated).r5   ÚobjectÚ
propertiesÚrequiredr+  r¯   r°   Ú
parametersu   ðŸ§©)r¯   ÚtoolsetÚhandlerr°   ÚschemaÚemojiÚcheck_fnN)r&  rä   Úregister_toolr2  )r�   r¯   r;  r°   r7  r8  r9  s   &      r   Úregister_toolsr@  a  sg   € ä>D¿l¹l¾nÑ:ˆÑ:ˆw ZØ&,¨h¸ÀjÐ%Qˆ
ßØ%-�zÑ"Ø×Ñ˜t¨U¸GØ"(¨$°¸{ÈLÐZdÐ!eØ ,Ô7Kð 	ö 	Mó	 ?Mr   )N)r$   r  )8Ú__conditional_annotations__Ú__doc__Ú
__future__r   r-  rE   ÚloggingÚurllib.errorrA   Úurllib.requestÚconcurrent.futuresr   r   Útypingr   r   Úgateway.platforms._sharedr   rñ   r   r/  r$   r	   r
   Ú	getLoggerÚ__name__Úloggerr(   r  r   r   r)   r2   r:   rK   rO   rX   rc   rm   rp   r–   rŽ   Ú	_AUTH_ERRrÌ   rÂ   rÒ   rê   rô   rù   r   r  r#  r&  Ú__annotations__r2  r@  )rA  s   @r   Ú<module>rO     s  øðôhõ #ã Û Û Û Û ß ?ß  ç iç  à	×	Ò	˜8Ó	$€àÐ ØÐ õ(õ2õMõ
Hõ÷7õ4õTõ
Nõõ õ!#õH	\ð ]€	Ø˜) S¨)°SÐ:zÐ{Ð õõ4÷6õ0õ Y÷+õ#cõL:ð �\ðuà™TÐ"`ÓaÐbÐejÐdkðmð �ð<ð ™4Ð bÓcØ™TÐ"]Ó^Ø¡Ð%mÓ nðpð ˜9Ð%ð'ð �ÐgÐikÐmoÐpØ�KðRà!¡4Ð(SÓ#TØ˜v y°-ÐApÐqðsà!�Nð$ð ˜ð=ð &¡tÐ,qÓ'rØ"¡DÐ)RÓ$SØ &¨(°FÒ<TÐVcð  fQð  "RØ%¡tÐ,XÓ'Yð[ð & yÐ1ð3ð)7€Ð3ó õ@÷0Mr   