+
    kHàjoX  ã            
      ó2  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
HtHt ^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ R	IHt R
tRRRutttRRut t!RRut"t#]$! ] ]!]"]#04      t%RRut&t'Rt(RbRcRdut)t*t+ReRfut,t-RgRhRiut.t/t0^^ut1t2^<Rut3t4R R lt5R R lt6R R lt7RRRRRRR RR!R"/R# R$ llt8R% R& lt9R' R( lt:R) R* lt;R+ R, lt<R- R. lt=R/ R0 lt>R1 R2 lt?R3 R4 lt@R5 R6 ltAR7 R8 ltBRjR9 R: lltCR; R< ltDR= R> ltER? R@ ltFRA RB ltGRC RD ltHRjRER"/RF RG llltIRjRH RI lltJRJ RK ltKRkRL RM lltLRN RO ltM ! RP RQ4      tN ! RR RS4      tO ! RT RU4      tP]P! 4       tQ ! RV RW4      tRRX RY ltSRlRZ R[ lltTR\ R] ltURmR^ R_ lltVR` Ra ltWR# )nuY  A2A protocol helpers â€” Agent Card, JSON-RPC framing, task store, conversation persistence.
Wire shape is A2A v1.0: SCREAMING_SNAKE_CASE states/roles; Parts and StreamResponse events are
discriminated by member presence (no ``kind``/``final``); SSE closure signals the terminal state.
Stdlib only. ``extract_text`` stays tolerant of v0.3 peers.)ÚannotationsN)ÚOrderedDictÚdefaultdictÚdeque)ÚFuture)ÚdatetimeÚtimezoneÚUTC)ÚPath)ÚAnyÚOptional)Úcoerce_port)Úget_hermes_homez1.0ÚTASK_STATE_SUBMITTEDÚTASK_STATE_WORKINGÚTASK_STATE_INPUT_REQUIREDÚTASK_STATE_COMPLETEDÚTASK_STATE_FAILEDÚTASK_STATE_CANCELEDÚTASK_STATE_REJECTEDÚ	ROLE_USERÚ
ROLE_AGENTz[INPUT_REQUIRED]g      N@c               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚnameÚstrÚdefaultÚintÚreturn© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/plugins/platforms/a2a/protocol.pyÚ__annotate__r"   .   s!   € ÷ :ñ :�3ð : ð :¨ñ :ó    c                óB   € \        \        P                  ! W4      V4      # ©N)Ú_coerce_intÚosÚgetenv)r   r   s   &&r!   Ú_env_intr)   .   s   € Ü”r—y’y Ó/°Ó9Ð9r#   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r    s   "r!   r"   r"   2   s   € ÷ .ñ .˜Cñ .r#   c                 óV   € \        R \        4      p \        ^\        V \        4      4      # )ÚA2A_MAX_PINGPONG_TURNS)r)   Ú_DEFAULT_MAX_PINGPONGÚmaxÚminÚ_HARD_MAX_PINGPONG)Úvs    r!   Úmax_pingpong_turnsr2   2   s%   € ÜÐ)Ô+@ÓA€AÜˆq”#�aÔ+Ó,Ó-Ð-r#   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r    s   "r!   r"   r"   7   s   € ÷ Iñ I�ñ Ir#   c                 óh   € \         P                  ! \        4      P                  R4      RR R,           # )z=ISO 8601 UTC timestamp with millisecond precision (A2A v1.0).z%Y-%m-%dT%H:%M:%S.%fNÚZéýÿÿÿ)r   Únowr	   Ústrftimer   r#   r!   Únow_isor:   7   s)   € ä�<Š<œÓ×%Ñ%Ð&<Ó=¸c¸rÐBÀSÕHÐHr#   ÚskillsÚ	streamingFÚpush_notificationsÚauth_requiredÚtenantÚ c               ó<   € V ^8„  d   QhRRRRRRRRRRR	RR
RRRRR/	# )r   r   r   ÚurlÚdescriptionr;   zOptional[list[dict]]r<   Úboolr=   r>   r?   r   Údictr   )r    s   "r!   r"   r"   <   sQ   € ÷ ñ ˜cð ¨ð ¸#ð ÐG[ð Ø $ðØBFðØ_cðà ðà*.ñr#   c                ó6  € RVRRR\         /V'       d   RV/M/ CpRT RTRTRR	R
R\        P                  ! RR4      R\        P                  ! RR4      ;'       g    T/RV.RRVRVRRRR/RR.RR.RT;'       g    . /
p	V'       d   RRRRR//V	R&   R. /.V	R &   V	# )!z’A2A v1.0 Agent Card. ``tenant`` is the optional multi-tenancy routing key on
AgentInterface; when present, clients MUST echo it in request params.rB   ÚprotocolBindingÚJSONRPCÚprotocolVersionr?   r   rC   Úversionz1.0.0ÚproviderÚorganizationÚA2A_PROVIDER_ORGzHermes AgentÚA2A_PROVIDER_URLr@   ÚsupportedInterfacesÚcapabilitiesr<   ÚpushNotificationsÚstateTransitionHistoryFÚextendedAgentCardÚdefaultInputModesú
text/plainÚdefaultOutputModesr;   ÚbearerÚtypeÚhttpÚschemeÚsecuritySchemesÚsecurity)ÚPROTOCOL_VERSIONr'   r(   )
r   rB   rC   r;   r<   r=   r>   r?   ÚifaceÚcards
   $$$$$$$$  r!   Úbuild_agent_cardr`   <   s  € ð
 # CÐ):¸IÐGXÔZjð  V÷  FLÐpxð  {Añ  pBð  RTð  V€Eà�Ø�{ØˆsØ�7Ø�^¤R§Y¢YÐ/AÀ>Ó%RÐTYÔ[]×[dÒ[dÐewÐy{Ó[|÷  \Dð  \Dð  ADð  EØ ˜wØ˜ iÐ1DÐFXØ1°5Ð:MÈuðVà˜l˜^Ð-AÀLÀ>ÐS[Ð]c×]iÐ]iÐgið
€D÷ Ø#+¨f°f¸hÈÐ-QÐ"RˆÐÑØ% r˜NÐ+ˆˆZÑØ€Kr#   c               ó    € V ^8„  d   QhRRRR/# )r   Útoolsetsz'list[str] | dict[str, list[str]] | Noner   ú
list[dict]r   )r    s   "r!   r"   r"   S   s   € ÷ Hñ HÐ#Jð HÈzñ Hr#   c                óˆ  € \        V \        4      '       g%   \        T ;'       g    . 4       Uu/ uF  q. bK  	  p p\        V 4       UUu. uFL  pRRV 2RTRRV R2RV.W,          ;'       g    .  Uu. uF  p\	        V4      NK  	  upR,          ,           /NKN  	  pppT;'       g    RR	RR	RR
RR	./.# u upi u upi u uppi )zmA2A skill descriptors from toolset names or a toolset -> tool-names mapping (tool names
become tags, max 10).Úidztoolset.r   rC   zHermes 'z' capabilitiesÚtags:Né
   NÚgeneralz$General-purpose conversational agent)Ú
isinstancerE   ÚsetÚsortedr   )rb   Útsr   Útr;   s   &    r!   Úskills_from_toolsetsrn   S   sÿ   € ô �h¤×%Ò%Ü%(¨¯¨°RÔ%8Ó9Ñ%8˜r˜’FÑ%8ˆÐ9ä[aÐbjÔ[kômÙ[kÐSWð �x ˜vÐ&¨°°mÀxÐPTÈvÐUcÐEdØ˜�v°(µ.×2FÐ2FÀBÐ2FÓ HÑ2F¨A¤ Q¦Ñ2FÑ HÈÕ MÕMóOÙ[kð ñ mà÷  Hð  H�t˜Y¨°	¸=ÐJpÐrxð  |Eð  {Fð  Gð  Hð  Hùò :ùâ Hùóms#   ®B4Á	#B>Á-B>Á2B9ÂB>Â9B>c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úreq_idr   Úresultr   rE   r   )r    s   "r!   r"   r"   ]   s!   € ÷ >ñ >˜3ð >¨ð >°ñ >r#   c                ó   € R RRV RV/# )Újsonrpcú2.0re   rq   r   )rp   rq   s   &&r!   Újsonrpc_resultru   ]   s   € Ø�u˜d F¨H°fÐ=Ð=r#   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rp   r   Úcoder   Úmessager   r   rE   r   )r    s   "r!   r"   r"   a   s.   € ÷ Yñ Y˜#ð Y Sð Y°3ð Y¸4ñ Yr#   c           	     ó   € R RRV RRVRV//# )rs   rt   re   Úerrorrw   rx   r   )rp   rw   rx   s   &&&r!   Újsonrpc_errorr{   a   s   € Ø�u˜d F¨G°f¸dÀIÈwÐ5WÐXÐXr#   c               ó    € V ^8„  d   QhRRRR/# )r   ÚpayloadrE   r   r   )r    s   "r!   r"   r"   e   s   € ÷  ñ   4ð  ¨Dñ  r#   c                óš   € \        V \        4      '       d3   V P                  R4      '       d   V P                  R4      '       d   RV /# RV /# )zFv1.0 SendMessageResponse oneof: exactly one of ``task`` / ``message``.Ústatusre   Útaskrx   ©ri   rE   Úget)r}   s   &r!   Úsend_message_responserƒ   e   sA   € ä�'œ4× Ò  W§[¡[°×%:Ò%:¸w¿{¹{È4×?PÒ?PØ˜Ð Ð Ø�wÐÐr#   c               ó    € V ^8„  d   QhRRRR/# )r   rq   r   r   r   )r    s   "r!   r"   r"   l   s   € ÷ ñ ¨ð °ñ r#   c                óê   € \        V \        4      '       d]   \        V P                  R4      \        4      '       d
   V R,          # \        V P                  R4      \        4      '       d
   V R,          # V # )zGTask/Message inside a v1.0 response; legacy bare payloads pass through.r€   rx   r�   )rq   s   &r!   Úunwrap_send_message_responser†   l   sU   € ä�&œ$×ÒÜ�f—j‘j Ó(¬$×/Ò/Ø˜&•>Ð!Ü�f—j‘j Ó+¬T×2Ò2Ø˜)Õ$Ð$Ø€Mr#   c               ó    € V ^8„  d   QhRRRR/# )r   r€   rE   r   r   )r    s   "r!   r"   r"   v   s   € ÷ ñ �dð ˜tñ r#   c                ó
   € RV /# )z'v1.0 StreamResponse with a task member.r€   r   )r€   s   &r!   Ústream_taskr‰   v   s   € à�Dˆ>Ðr#   c               ó   € V ^8„  d   QhRR/# r4   r   )r    s   "r!   r"   r"   {   s   € ÷ +ñ +�Sñ +r#   c                 ó\   € R \         P                  ! 4       P                  R,          ,           # )ztask-ºNé   N©ÚuuidÚuuid4Úhexr   r#   r!   Únew_task_idr’   {   s   € Ø”T—Z’Z“\×%Ñ% cÕ*Õ*Ð*r#   c               ó   € V ^8„  d   QhRR/# r4   r   )r    s   "r!   r"   r"      s   € ÷ *ñ *˜ñ *r#   c                 ó\   € R \         P                  ! 4       P                  R,          ,           # )úctx-rŒ   rŽ   r   r#   r!   Únew_context_idr–      s   € Ø”D—J’J“L×$Ñ$ SÕ)Õ)Ð)r#   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úscoper   Ú
message_idr   r   )r    s   "r!   r"   r"   ƒ   s&   € ÷ Wñ W˜cð W¨sð W°sñ Wr#   c                óŒ   € R\         P                  ! V  RV 2P                  4       4      P                  4       R,          ,           # )z©The context a first message without a ``contextId`` opens. Named by the message, so a retry
of that send after a timeout reopens the same context instead of a fresh one.r•   Ú rŒ   )ÚhashlibÚsha256ÚencodeÚ	hexdigest)r˜   r™   s   &&r!   Úmessage_context_idr    ƒ   s;   € ð ”G—N’N e W¨B¨z¨lÐ#;×#BÑ#BÓ#DÓE×OÑOÓQÐRUÕVÕVÐVr#   c               ó    € V ^8„  d   QhRRRR/# )r   Útextr   r   rE   r   )r    s   "r!   r"   r"   ‰   s   € ÷ 5ñ 5�Cð 5˜Dñ 5r#   c                ó   € RV RR/# )z<v1.0 text Part (member-presence discriminated, no ``kind``).r¢   Ú	mediaTyperU   r   )r¢   s   &r!   Ú	text_partr¥   ‰   s   € à�D˜+ |Ð4Ð4r#   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úroler   r¢   Ú
context_idr   rE   r   )r    s   "r!   r"   r"   Ž   s(   € ÷ ñ �sð  #ð °3ð Àñ r#   c                ó|   € RV R\        V4      .R\        P                  ! 4       P                  /pV'       d   W#R&   V# )z)A2A v1.0 Message with a single text Part.r§   ÚpartsÚ	messageIdÚ	contextId)r¥   r�   r�   r‘   )r§   r¢   r¨   Úmsgs   &&& r!   Útext_messager®   Ž   s;   € à! 4¨´9¸T³?Ð2CÀ[ÔRV×R\ÒR\ÓR^×RbÑRbÐc€CßØ%ˆKÑØ€Jr#   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úfnamer   ÚbodyÚmtyper   r   )r    s   "r!   r"   r"   –   s.   € ÷ @ñ @�cð @ ð @¨Sð @°Sñ @r#   c                óf   € V '       d   R V  R2MRpV RV 2V'       d   RV R2,           # R,           # )z[file: Ú]z[file]Ú z (Ú)r@   r   )r°   r±   r²   Úlabels   &&& r!   Ú
_file_noter¸   –   s<   € ß"'ˆg�e�W˜AÑ¨X€EØˆW�A�d�VÐ· " U G¨1 Õ?Ð?¸BÕ?Ð?r#   c               ó    € V ^8„  d   QhRRRR/# )r   Údatar   r   r   r   )r    s   "r!   r"   r"   ›   s   € ÷ ñ �sð ˜sñ r#   c                ó‚   €  \         P                  ! V R \        R7      #   \        \        3 d    \        T 4      u # i ; i)F)Úensure_asciir   )ÚjsonÚdumpsr   Ú	TypeErrorÚ
ValueError)rº   s   &r!   Ú_json_or_strrÁ   ›   s8   € ðÜ�zŠz˜$¨U¼CÔ@Ð@øÜ”zÐ"ô Ü�4‹yÒðús   ‚ Ÿ>½>c               ó    € V ^8„  d   QhRRRR/# )r   Úmessage_or_paramsrE   r   r   r   )r    s   "r!   r"   r"   ¢   s   € ÷ %ñ % Dð %¨Sñ %r#   c           
     óÒ  € V P                  RV 4      p. p\        V\        4      '       d   VP                  R. 4      M.  EF†  p\        V\        4      '       g   K  \        VP                  R4      ;p\        4      '       d   VP	                  V4       KV  \        VP                  R4      ;p\        4      '       dŒ   V'       d„   TP	                  \        VP                  R4      ;'       g    VP                  R4      ;'       g    RTVP                  R4      ;'       g    VP                  R	4      ;'       g    R4      4       EK  \        VP                  R
4      ;p\        4      '       d~   \        VP                  R4      \        4      '       dY   TP	                  \        VP                  R4      ;'       g    RVR,          VP                  R	4      ;'       g    R4      4       EK¬  \        VP                  R4      \        4      '       de   TP	                  \        VP                  R4      ;'       g    R\        VR,          4       R2VP                  R4      ;'       g    R4      4       EK5  VP                  R4      ;pf   EKM  TP	                  RVP                  R4      ;'       g    R R\        V4       24       EK‰  	  RP                  V4      P                  4       # )zíConcatenated text from an A2A Message / Task-result / params payload. v1.0, v0.3
(``kind``) and pre-0.3 (``type``) Parts all carry ``text``; file Parts render as
URL/filename (raw base64 noted, not decoded); data Parts render their JSON.rx   rª   r¢   rB   Úfilenamer   r@   r¤   ÚmimeTypeÚfileÚfileWithUriÚrawz bytes base64-encodedrº   z[data (zapplication/jsonz)]
Ú
)
r‚   ri   rE   r   Úappendr¸   ÚlenrÁ   ÚjoinÚstrip)rÃ   r­   ÚchunksÚpartÚtxtrB   Úv03rº   s   &       r!   Úextract_textrÓ   ¢   s2  € ð ×
Ñ
 	Ð+<Ó
=€CØ€FÜ(2°3¼×(=Ò(=�—‘˜ Ô$À2ÓEˆÜ˜$¤×%Ò%ÙÜ˜TŸX™X fÓ-Ð-�c¬s×3Ò3Ø�M‰M˜#ÖÜ˜tŸx™x¨›Ð.˜´×4Ò4¿Ø�M‰Mœ* T§X¡X¨jÓ%9×%SÐ%S¸T¿X¹XÀfÓ=M×%SÐ%SÐQSÐUXØ%)§X¡X¨kÓ%:×%XÐ%X¸d¿h¹hÀzÓ>R×%XÐ%XÐVXóZ÷ [ä˜tŸx™x¨Ó/Ð/˜´×6Ò6¼:ÀcÇgÁgÈmÓF\Ô^a×;bÒ;bØ�M‰Mœ* S§W¡W¨V£_×%:Ð%:¸¸CÀÕ<NÐPS×PWÑPWÐXbÓPc×PiÐPiÐgiÓj×kÜ˜Ÿ™ ›¬×-Ò-Ø�M‰Mœ* T§X¡X¨jÓ%9×%?Ð%?¸RÄCÈÈUÍÓDTÐCUÐUjÐAkØ%)§X¡X¨kÓ%:×%@Ð%@¸bóB÷ Cà—h‘h˜vÓ&Ð&ˆdÕ3Ø�M‰M˜G D§H¡H¨[Ó$9×$OÐ$OÐ=OÐ#PÐPTÔUaÐbfÓUgÐThÐi×jñ Fð �9‰9�VÓ×"Ñ"Ó$Ð$r#   c               ó    € V ^8„  d   QhRRRR/# ©r   ÚparamsrE   r   r   r   )r    s   "r!   r"   r"   º   s   € ÷ Lñ L˜tð L¨ñ Lr#   c                ó°   € V P                  R4      ;'       g    / p\        V\        4      '       d%   \        VP                  R4      ;'       g    R4      # R# )zJv1.0 puts messageId inside the Message; a peer retrying a send repeats it.rx   r«   r@   ©r‚   ri   rE   r   ©rÖ   r­   s   & r!   Úextract_message_idrÚ   º   sE   € à
�*‰*�YÓ
×
%Ð
% 2€CÜ.8¸¼d×.CÒ.CŒ3ˆs�w‰w�{Ó#×)Ð) rÓ*ÐKÈÐKr#   c               ó    € V ^8„  d   QhRRRR/# rÕ   r   )r    s   "r!   r"   r"   À   s   € ÷ tñ t˜tð t¨ñ tr#   c                ó  € V P                  R4      ;'       g    / p\        V\        4      '       d%   \        VP                  R4      ;'       g    R4      MR;'       g%    \        V P                  R4      ;'       g    R4      # )zBv1.0 puts contextId inside the Message; tolerate legacy top-level.rx   r¬   r@   rØ   rÙ   s   & r!   Úextract_context_idrÝ   À   sf   € à
�*‰*�YÓ
×
%Ð
% 2€CÜ/9¸#¼t×/DÒ/DŒC�—‘˜Ó$×*Ð*¨Ô+È"×sÐsÔQTÐU[×U_ÑU_Ð`kÓUl×UrÐUrÐprÓQsÐsr#   Ú
created_atc               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   Útask_idr   r¨   ÚstateÚ
agent_textrÞ   r   rE   r   )r    s   "r!   r"   r"   Æ   s8   € ÷ ñ ˜ð ¨ð °Sð Àcð Ð_bð Ðlpñ r#   c          
     óê   € RV RVRRVR\        4       //pV'       dW   \        \        W14      VR,          R&   V\        8X  d2   R\        P
                  ! 4       P                  R\        V4      ./.VR	&   V# )
z A2A v1.0 Task. ``created_at`` is accepted but NOT serialized: the v1.0 Task proto has no
createdAt and strict ProtoJSON parsers (a2a-sdk) reject unknown fields.re   r¬   r   rá   Ú	timestamprx   Ú
artifactIdrª   Ú	artifacts)r:   r®   r   ÚSTATE_COMPLETEDr�   r�   r‘   r¥   )rà   r¨   rá   râ   rÞ   r€   s   &&&&$ r!   Ú
build_taskrè   Æ   su   € ð ! '¨;¸
ÀHÈwÐX]Ð_jÔlsÓluÐNvÐw€DßÜ$0´¸ZÓ$TˆˆX��yÑ!Ø”OÔ#Ø".´·
²
³×0@Ñ0@À'ÌIÐV`ÓLaÐKbÐ!cÐ dˆD�ÑØ€Kr#   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   rà   r   r¨   rá   r¢   r   rE   r   )r    s   "r!   r"   r"   Ñ   s7   € ÷ \ñ \˜3ð \¨Cð \¸ð \À3ð \ÐPTñ \r#   c                óh   € RVR\        4       /pV'       d   \        \        W14      VR&   RRV RVRV//# )z/v1.0 StreamResponse with a statusUpdate member.rá   rä   rx   ÚstatusUpdateÚtaskIdr¬   r   )r:   r®   r   )rà   r¨   rá   r¢   r   s   &&&& r!   Ústatus_updaterí   Ñ   s?   € à% u¨k¼7»9ÐE€FßÜ(¬°TÓFˆˆyÑØ˜X w°¸ZÈÐSYÐZÐ[Ð[r#   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rà   r   r¨   r¢   r   rE   r   )r    s   "r!   r"   r"   Ù   s.   € ÷ bñ b˜Sð b¨cð b¸ð bÀñ br#   c                óp   € R\         P                  ! 4       P                  R\        V4      ./pRRV RVRV//# )z2v1.0 StreamResponse with an artifactUpdate member.rå   rª   ÚartifactUpdaterì   r¬   Úartifact)r�   r�   r‘   r¥   )rà   r¨   r¢   rñ   s   &&& r!   Úartifact_updaterò   Ù   s<   € àœdŸjšj›l×.Ñ.°¼)ÀD»/Ð9JÐK€HØ˜x¨°+¸zÈ:ÐW_Ð`ÐaÐar#   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r}   rE   rp   r   r   r   r   )r    s   "r!   r"   r"   ß   s&   € ÷ Cñ C�dð C Cð C°3ñ Cr#   c                ó\   € Ve   \        W4      MT pR\        P                  ! VRR7       R2# )u®   One StreamResponse as an SSE data frame. Â§9.4 requires a full JSON-RPC envelope (a2a-sdk
breaks on bare StreamResponses); ``req_id=None`` is the legacy no-envelope fallback.zdata: F©r¼   z

)ru   r½   r¾   )r}   rp   Úenvelopes   && r!   Ússe_datar÷   ß   s0   € ð 39Ò2DŒ~˜fÔ.È'€HØ”D—J’J˜x°eÔ<Ð=¸TÐBÐBr#   c               ó   € V ^8„  d   QhRR/# r4   r   )r    s   "r!   r"   r"   æ   s   € ÷ ñ �#ñ r#   c                 ó   € R# )u]   Stream-closure marker as an SSE *comment* â€” ``data: {}`` would make JSON-RPC clients parse.z: done

r   r   r#   r!   Ússe_donerú   æ   s   € ár#   c                  óB   € ] tR t^ëtRtRtR R ltR R ltR R ltR	t	R
# )ÚTurnTrackerzUCounts inbound turns per context_id; beyond max_pingpong_turns() the adapter rejects.i  c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r    s   "r!   r"   ÚTurnTracker.__annotate__ð   ó   € ÷ &ñ &˜$ñ &r#   c                	óH   € / V n         \        P                  ! 4       V n        R # r%   )Ú_turnsÚ	threadingÚLockÚ_lock©Úselfs   &r!   Ú__init__ÚTurnTracker.__init__ð   s   € Ø46ˆŒÜ—^’^Ó%ˆŽ
r#   c               ó    € V ^8„  d   QhRRRR/# )r   r¨   r   r   r   r   )r    s   "r!   r"   r   ô   s   € ÷ ñ  ð ¨ñ r#   c           	     óÀ  € V P                   ;_uu_ 4        \        P                  ! 4       pV P                  P                  4        UUu/ uF'  w  r4W$^,          ,
          V P                  8:  g   K%  W4bK)  	  uppV n        V P                  P                  V^ V34      ^ ,          ^,           pWR3V P                  V&   VuuRRR4       # u uppi   + '       g   i     R# ; i)z;Increment and return the turn count; prunes stale contexts.N)r  Útimer  ÚitemsÚ_TTLr‚   )r  r¨   r8   Úcidr1   Úcounts   &&    r!   ÚtrackÚTurnTracker.trackô   sž   € à�Z�Z‹ZÜ—)’)“+ˆCØ04·±×0AÑ0AÔ0CÔ_Ñ0C¡f cÀsÈqÍTÅzÐUY×U^ÑU^ÑG^œ6˜3š6Ñ0CÒ_ˆDŒKØ—K‘K—O‘O J°°C°Ó9¸!Õ<¸qÕ@ˆEØ', lˆD�K‰K˜
Ñ#Ø÷ ŠZùã_÷ �ZˆZús$   •3CÁ"C
Á/C
Á5ACÃCÃC	c               ó    € V ^8„  d   QhRRRR/# )r   r¨   r   r   rÿ   r   )r    s   "r!   r"   r   ý   s   € ÷ .ñ . ð .¨ñ .r#   c                	ó    € V P                   ;_uu_ 4        V P                  P                  VR 4       R R R 4       R #   + '       g   i     R # ; ir%   )r  r  Úpop)r  r¨   s   &&r!   ÚresetÚTurnTracker.resetý   s)   € Ø�Z�Z‹ZØ�K‰K�O‰O˜J¨Ô-÷ �Z�ZŠZús	   •<¼A	)r  r  N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r  r	  r  r  Ú__static_attributes__r   r#   r!   rü   rü   ë   s   † Ù_à€Dõ&õ÷.ñ .r#   rü   c                  ó2   € ] tR tRtRtR R ltR R ltRtR# )	ÚRateLimiteri  zFSliding-window request limiter, one bucket per authenticated identity.c               ó   € V ^8„  d   QhRR/# rþ   r   )r    s   "r!   r"   ÚRateLimiter.__annotate__  r  r#   c                	ób   € \        \        4      V n        \        P                  ! 4       V n        R # r%   )r   r   Ú_bucketsr  r  r  r  s   &r!   r	  ÚRateLimiter.__init__  s   € Ü1<¼UÓ1CˆŒÜ—^’^Ó%ˆŽ
r#   c               ó    € V ^8„  d   QhRRRR/# )r   Úidentityr   r   rD   r   )r    s   "r!   r"   r"  	  s   € ÷ 
ñ 
˜cð 
 dñ 
r#   c           	     	óª  € V P                   ;_uu_ 4        \        ^\        R\        4      4      p\        P                  ! 4       pV P
                  V,          pV'       d+   W4^ ,          ,
          \        8”  d   VP                  4        K2  \        V4      V8¼  d    RRR4       R# VP                  V4        RRR4       R#   + '       g   i     R# ; i)é   ÚA2A_RATE_LIMITNFT)
r  r.   r)   Ú_RATE_LIMIT_DEFAULTr  r$  Ú_RATE_WINDOWÚpopleftrÌ   rË   )r  r'  Úlimitr8   Úbuckets   &&   r!   ÚallowÚRateLimiter.allow	  s†   € Ø�Z�Z‹ZÜ˜œ8Ð$4Ô6IÓJÓKˆEÜ—)’)“+ˆCØ—]‘] 8Õ,ˆFß˜S¨!¥9�_¬|Ô;Ø—‘Ö Ü�6‹{˜eÔ#Ø÷ ‰Zð �M‰M˜#ÔØ÷ �Z�ZŠZús   •A
CÁ ;CÂ%CÃC	)r$  r  N)r  r  r  r  r  r	  r0  r  r   r#   r!   r   r     s   † ÙPõ&÷
ñ 
r#   r   c                  óN   € ] tR tRtRtRtR R ltR R ltR R ltR	 R
 lt	Rt
R# )ÚMetricsi  z{Counters for A2A operations (module singleton ``metrics`` shared by the inbound adapter
and outbound tools; not persisted).c               ó   € V ^8„  d   QhRR/# rþ   r   )r    s   "r!   r"   ÚMetrics.__annotate__  s   € ÷ :ñ :˜$ñ :r#   c                	óš   € V P                    F  p\        W^ 4       K  	  \        P                  ! 4       V n        \	        ^dR7      V n        R# )é    )ÚmaxlenN)Ú	_COUNTERSÚsetattrr  Ú_start_timer   Ú
_latencies)r  r   s   & r!   r	  ÚMetrics.__init__  s4   € Ø—N”NˆDÜ�D Ö"ñ #äŸ9š9›;ˆÔÜ(-°SÔ(9ˆŽr#   c               ó    € V ^8„  d   QhRRRR/# )r   ÚsecondsÚfloatr   rÿ   r   )r    s   "r!   r"   r5  #  s   € ÷ (ñ ( eð (°ñ (r#   c                	ó<   € V P                   P                  V4       R # r%   )r<  rË   )r  r?  s   &&r!   Úrecord_latencyÚMetrics.record_latency#  s   € Ø�‰×Ñ˜wÖ'r#   c               ó   € V ^8„  d   QhRR/# )r   r   r@  r   )r    s   "r!   r"   r5  &  s   € ÷ Wñ W˜Uñ Wr#   c                	óˆ   € V P                   '       d0   \        V P                   4      \        V P                   4      ,          # R # )g        )r<  ÚsumrÌ   r  s   &r!   Úavg_latencyÚMetrics.avg_latency&  s-   € Ø>B¿o¿o¸oŒs�4—?‘?Ó#¤c¨$¯/©/Ó&:Õ:ÐVÐSVÐVr#   c               ó   € V ^8„  d   QhRR/# )r   r   zdict[str, Any]r   )r    s   "r!   r"   r5  )  s   € ÷ Gñ G˜.ñ Gr#   c           	     	ó   € R \        \        P                  ! 4       V P                  ,
          ^4      /V P                   Uu/ uF  q\	        W4      bK  	  upCR\        V P                  4       R,          ^4      /C# u upi )Úuptime_secondsÚavg_latency_msiè  )Úroundr  r;  r9  ÚgetattrrG  )r  Úns   & r!   ÚsnapshotÚMetrics.snapshot)  sy   € Ø ¤%¬¯	ª	«°d×6FÑ6FÕ(FÈÓ"Jð GÐlp×lzÒlzÓN{ÑlzÐghÔRYÐZ^ÓRbÒObÑlzÑN{ð GØ ¤%¨×(8Ñ(8Ó(:¸TÕ(AÀ1Ó"EñGð 	GùÒN{s   Á A;)r<  r;  N)	Úinbound_totalÚoutbound_totalÚstreams_startedÚ	push_sentÚpush_failedÚtasks_completedÚtasks_failedÚanti_loop_triggersÚrate_limit_triggers)r  r  r  r  r  r9  r	  rB  rG  rP  r  r   r#   r!   r3  r3    s+   † ñ+ða€Iõ:õ(õW÷Gñ Gr#   r3  c                  ó`  € ] tR tRtRtRtR R lt]R-R R ll4       tR-R R	 llt	R.R
 R llt
]R R l4       tR.R R lltR R ltR-R R lltR.R R lltR-R R lltR.R R lltR R ltR-R R lltR/R R lltR-R  R! lltR0R" R# lltR1R$R%/R& R' llltR( R) lt]R2R* R+ ll4       tR,tR%# )3Ú	TaskStorei1  z¡In-memory A2A tasks, kept after completion for tasks/get. Records carry agent slug +
tenant; readers pass a scope and get not-found outside it (spec authz rule).iô  c               ó   € V ^8„  d   QhRR/# rþ   r   )r    s   "r!   r"   ÚTaskStore.__annotate__7  s   € ÷ &ñ &˜$ñ &r#   c                	óf   € \        4       V n        / V n        \        P                  ! 4       V n        R # r%   )r   Ú_tasksÚ	_watchersr  r  r  r  s   &r!   r	  ÚTaskStore.__init__7  s    € Ü8C»ˆŒØ24ˆŒÜ—^’^Ó%ˆŽ
r#   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   ÚrecrE   Ú
agent_slugr   r?   r   rD   r   )r    s   "r!   r"   r^  =  s.   € ÷ ~ñ ~�tð ~¨ð ~¸3ð ~Èñ ~r#   c                	ó˜   € T;'       d    V P                  R R4      V8g  ;'       g     T;'       d    V P                  RR4      V8g  '       * # )re  r@   r?   ©r‚   )rd  re  r?   s   &&&r!   Ú	_in_scopeÚTaskStore._in_scope<  sJ   € à×KÐK C§G¡G¨L¸"Ó$=ÀÑ$K×|Ð|ÐQW×Q{ÐQ{Ð\_×\cÑ\cÐdlÐnpÓ\qÐu{Ñ\{Ô}Ð}r#   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r   rà   r   re  r?   r   úOptional[dict]r   )r    s   "r!   r"   r^  @  s.   € ÷ Pñ P˜sð P°ð PÀ#ð PÈ~ñ Pr#   c                ó€   € V P                   P                  V4      pV'       d   V P                  WBV4      '       d   V# R# )z7Live record if visible in scope. Caller holds the lock.N)r`  r‚   rh  ©r  rà   re  r?   rd  s   &&&& r!   Ú_scopedÚTaskStore._scoped@  s1   € à�k‰k�o‰o˜gÓ&ˆß˜dŸn™n¨S¸f×EÒEˆsÐOÈ4ÐOr#   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# ©r   rà   r   Ú	config_idre  r?   r   rl  r   )r    s   "r!   r"   r^  E  s1   € ÷ ñ  ð °ð Àsð ÐY\ð Ðftñ r#   c                ó¨   € V P                  WV4      pV'       d8   VP                  R4      '       d!   V'       d   VP                  R4      V8X  d   V# R# )z^Scoped record that has a push config (matching ``config_id`` if given). Caller holds the lock.Úpush_urlÚpush_config_idN)ro  r‚   ©r  rà   rs  re  r?   rd  s   &&&&& r!   Ú	_push_recÚTaskStore._push_recE  s?   € à�l‰l˜7°Ó7ˆß�3—7‘7˜:×&Ò&·	¸S¿W¹WÐEUÓ=VÐZcÔ=cØˆJÙr#   c               ó    € V ^8„  d   QhRRRR/# )r   rd  rE   r   r   )r    s   "r!   r"   r^  M  s   € ÷ wñ w˜tð w¨ñ wr#   c                	ó¬   € R V P                  R4      ;'       g    RRV R,          RV P                  RR4      RRV P                  R	4      ;'       g    R//# )
ÚconfigIdrv  r@   rì   rà   Ú	createdAtÚcreated_isoÚpushNotificationConfigrB   ru  rg  )rd  s   &r!   Ú_push_config_viewÚTaskStore._push_config_viewL  s^   € à˜CŸG™GÐ$4Ó5×;Ð;¸¸XÀsÈ9Å~Ø˜SŸW™W ]°BÓ7Ð9QÐTYÐ[^×[bÑ[bÐcmÓ[n×[tÐ[tÐrtÐSuðwð 	wr#   c               ó4   € V ^8„  d   QhRRRRRRRRRRRRRR	/# )
r   rà   r   r¨   Úpeerre  r?   Úinput_idr   rE   r   )r    s   "r!   r"   r^  Q  s@   € ÷ ñ ˜cð ¨sð ¸#ð È3ð Ð]`ð ØðØ&*ñr#   c                ó.  € RTRTRTRT;'       g    RRT;'       g    RRVR\         R	RR
\        P                  ! 4       R\        4       RRRR/pV P                  ;_uu_ 4        WpP                  V&   RRR4       \        V4      #   + '       g   i     L; i)zW``input_id``: the owner admission a forwarded task was sent as (empty for local tasks).rà   r¨   rƒ  re  r@   r?   r„  rá   ÚreplyrÞ   r~  ru  rv  N)ÚSTATE_SUBMITTEDr  r:   r  r`  rE   )r  rà   r¨   rƒ  re  r?   r„  rd  s   &&&&&&& r!   ÚcreateÚTaskStore.createQ  s®   € ð ˜' <°¸VÀTÈ<ÐYc×YiÐYiÐgiÐksÐu{÷  vBð  vBð  @BØ˜8 W¬o¸wÈÈLÔZ^×ZcÒZcÓZeÐgtÔv}Óvð  BLð  NPð  Rbð  dfðgˆà�Z�Z‹ZØ#&�K‰K˜Ñ ÷ ä�C‹yÐ÷ �Zús   Á"BÂB	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rà   r   rá   r   rÿ   r   )r    s   "r!   r"   r^  Z  s!   € ÷ %ñ % ð %¨Sð %°Tñ %r#   c                	óÚ   € V P                   ;_uu_ 4        V P                  P                  V4      ;p'       d   VR ,          \        9  d   W#R &   RRR4       R#   + '       g   i     R# ; i©rá   N)r  r`  r‚   ÚTERMINAL_STATES)r  rà   rá   rd  s   &&& r!   Ú	set_stateÚTaskStore.set_stateZ  sA   € Ø�Z�Z‹ZØ—{‘{—‘ wÓ/Ð/�Ö/°S¸µ\ÌÔ5XØ$�G‘÷ �Z�ZŠZús   •:AÁA*	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   rà   r   rB   re  r?   r   rl  r   )r    s   "r!   r"   r^  _  s1   € ÷ /ñ / sð /°ð /À#ð /ÐTWð /Ðaoñ /r#   c                ó@  € V P                   ;_uu_ 4        V P                  WV4      ;p'       g    RRR4       R# VR\        P                  ! 4       P                  R,          ,           uVR&   VR&   V P                  V4      uuRRR4       #   + '       g   i     R# ; i)zEAttach a push notification config; returns the stored config or None.Nzcfg-:Né   Nru  rv  )r  ro  r�   r�   r‘   r€  )r  rà   rB   re  r?   rd  s   &&&&& r!   Úset_push_configÚTaskStore.set_push_config_  st   € à�Z�Z‹ZØŸ<™<¨¸VÓDÐD�CÖDØ÷ ‰Zð 69¸&Ä4Ç:Â:Ã<×CSÑCSÐTWÕCXÕ:XÐ2ˆC�
‰O˜SÐ!1Ñ2Ø×)Ñ)¨#Ó.÷	 �Z�Z‹Zús   •B»ABÂB	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# rr  r   )r    s   "r!   r"   r^  g  s8   € ÷ |ñ | sð |°sð |ÈSð |Ð_bð |Ðlzñ |r#   c                	óÂ   € V P                   ;_uu_ 4        V P                  WW44      ;p'       d   V P                  V4      MR uuR R R 4       #   + '       g   i     R # ; ir%   )r  rx  r€  rw  s   &&&&& r!   Úget_push_configÚTaskStore.get_push_configg  s>   € Ø�Z�Z‹ZØ:>¿.¹.ÈÐ]gÓ:pÐ3p°3Ö3p�4×)Ñ)¨#Ô.Ðw{÷ �Z�Z‹Zús   •-AÁA	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rà   r   re  r?   r   rc   r   )r    s   "r!   r"   r^  k  s)   € ÷ $ñ $¨ð $¸#ð $ÈCð $ÐYcñ $r#   c                	óB   € V P                  VR W#4      pV'       d   V.# . # ©r@   )r—  )r  rà   re  r?   Úcfgs   &&&& r!   Úlist_push_configsÚTaskStore.list_push_configsk  s%   € Ø×"Ñ" 7¨B°
ÓCˆß�ˆuÐ# Ð#r#   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   rà   r   rs  re  r?   r   rD   r   )r    s   "r!   r"   r^  o  s2   € ÷ #ñ #¨#ð #¸#ð #ÐPSð #Ðbeð #Ðosñ #r#   c                	ó¸   € V P                   ;_uu_ 4        V P                  WW44      pV'       d   R ;VR&   VR&   VRJuuRRR4       #   + '       g   i     R# ; i)r@   ru  rv  N)r  rx  rw  s   &&&&& r!   Údelete_push_configÚTaskStore.delete_push_configo  sE   € Ø�Z�Z‹ZØ—.‘. °ZÓHˆCßØ:<Ð<��J‘ #Ð&6Ñ"7Ø˜d�?÷	 �Z�Z‹Zús   •(AÁA	c               ó    € V ^8„  d   QhRRRR/# )r   rà   r   r   r   )r    s   "r!   r"   r^  v  s   € ÷ &ñ & Cð &¨Cñ &r#   c                	óâ   € V P                   ;_uu_ 4        V P                  P                  V4      pV'       d   VR ,          Ruq2R &   V'       d   XMRuuRRR4       #   + '       g   i     R# ; i)ru  r@   N)r  r`  r‚   )r  rà   rd  rB   s   &&  r!   Úpop_push_urlÚTaskStore.pop_push_urlv  sE   € Ø�Z�Z‹ZØ—+‘+—/‘/ 'Ó*ˆCßØ'*¨:¥¸Ð$�˜‘_ß‘3 2÷	 �Z�Z‹Zús   •9AÁAÁA.	c               ó(   € V ^8„  d   QhRRRRRRRR/# rk  r   )r    s   "r!   r"   r^  }  s.   € ÷ ]ñ ]˜3ð ]¨Cð ]¸cð ]È>ñ ]r#   c                	ó¶   € V P                   ;_uu_ 4        V P                  WV4      ;p'       d   \        V4      MR uuR R R 4       #   + '       g   i     R # ; ir%   )r  ro  rE   rn  s   &&&& r!   r‚   ÚTaskStore.get}  s6   € Ø�Z�Z‹ZØ(,¯©°WÈ&Ó(QÐ!Q Ö!Q”4˜”9ÐX\÷ �Z�Z‹Zús   •'AÁA	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rà   r   rá   r†  r   rl  r   )r    s   "r!   r"   r^  �  s(   € ÷ ñ  ð ¨Cð ¸ð À^ñ r#   c                ó  € V P                   ;_uu_ 4        V P                  P                  V4      pV'       d   VR,          \        9   d    RRR4       R# VP	                  W#\
        P
                  ! 4       R7       V P                  P                  V. 4      pV P                  4        \        V4      pRRR4       X F-  pVP                  4       '       d   K  VP                  W#34       K/  	  X#   + '       g   i     LE; i)z2Transition a task to a terminal state. Idempotent.rá   N)rá   r†  Úcompleted_at)r  r`  r‚   r�  Úupdater  ra  r  Ú_trim_lockedrE   ÚdoneÚ
set_result)r  rà   rá   r†  rd  ÚwatchersÚoutÚfuts   &&&&    r!   ÚcompleteÚTaskStore.complete�  s±   € à�Z�Z‹ZØ—+‘+—/‘/ 'Ó*ˆCß˜#˜g�,¬/Ô9Ø÷ ‰Zð �J‰J˜U¼d¿iºi»kˆJÔJØ—~‘~×)Ñ)¨'°2Ó6ˆHØ×ÑÔÜ�s“)ˆC÷ ó ˆCØ—8‘8—:”:Ø—‘ ˜~Ö.ñ ð ˆ
÷ �Zús   •7C0ÁAC0Ã0D 	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rà   r   re  r?   r   zOptional[Future]r   )r    s   "r!   r"   r^  �  s)   € ÷ 	ñ 	˜Sð 	¨cð 	Àð 	ÐM]ñ 	r#   c           	     	óš  € V P                   ;_uu_ 4        V P                  WV4      ;p'       g    R R R 4       R # \        4       pVR,          \        9   d,   VP	                  VR,          VP                  RR4      34       M+V P                  P                  V. 4      P                  V4       VuuR R R 4       #   + '       g   i     R # ; i)Nrá   r†  r@   )	r  ro  r   r�  r°  r‚   ra  Ú
setdefaultrË   )r  rà   re  r?   rd  r³  s   &&&&  r!   ÚwatchÚTaskStore.watch�  sŽ   € Ø�Z�Z‹ZØŸ<™<¨¸VÓDÐD�CÖDØ÷ ‰Zô !›(ˆCØ�7�|œÔ.Ø—‘  G¥¨c¯g©g°g¸rÓ.BÐCÕDà—‘×)Ñ)¨'°2Ó6×=Ñ=¸cÔBØ÷ �Z�Z‹Zús   •B9»A3B9Â9C
	c               ó4   € V ^8„  d   QhRRRRRRRRRRRRR	R
/# )r   r¨   r   rá   Ú	page_sizer   Úoffsetre  r?   Ú
with_totalrD   r   )r    s   "r!   r"   r^  ›  sJ   € ÷ Qñ Q˜sð Q°ð QÀSð QÐWZð QØðQØ+.ðQØAEñQr#   c           
     ó>  € \        ^\        \        T;'       g    ^24      ^d4      4      pV P                  ;_uu_ 4        \	        V P
                  P                  4       4       Uu. uFX  pV P                  W…V4      '       g   K  V'       d   VR,          V8X  g   K5  V'       d   VR,          V8X  g   KM  \        V4      NKZ  	  p	pRRR4       \        X	4      p
W”WC,            pWC,           V
8  d	   WC,           M^ pV'       d   W¼V
3# W¼3# u upi   + '       g   i     LP; i)z•Filtered task page (newest first) as ``(records, next_offset)``, or
``(records, next_offset, total)`` with ``with_total`` (v1.0 ListTasks totalSize).r¨   rá   N)
r.   r/   r   r  Úreversedr`  Úvaluesrh  rE   rÌ   )r  r¨   rá   r¼  r½  re  r?   r¾  ÚrÚrecsÚtotalÚpageÚnext_offsets   &&&&&&&&     r!   ÚlistÚTaskStore.list›  sî   € ô ˜œ3œs 9§? ?°Ó3°SÓ9Ó:ˆ	Ø�Z�Z‹ZÜ%-¨d¯k©k×.@Ñ.@Ó.BÔ%Có rÑ%C Ø—~‘~ a°V×<ô ç'¨1¨\­?¸jÑ+Hô çSXÐ\]Ð^eÕ\fÐjoÑ\oô ”D˜–GÑ%CˆDð r÷ ô �D“	ˆØ˜6Õ-Ð.ˆØ,2Õ,>ÀÔ,F�fÖ(ÈAˆß-7� 5Ð)ÐP¸dÐ=PÐPùòr÷ �Zús;   ¾&DÁ$DÂDÂDÂDÂ#DÂ3DÃDÄDÄD	ÚexcludeNc               ó$   € V ^8„  d   QhRRRRRR/# )r   Útimeout_secondsr@  rÉ  zset[str] | Noner   ú	list[str]r   )r    s   "r!   r"   r^  ©  s'   € ÷ sñ s¨Eð sÀ_ð sÐ`iñ sr#   c          	     	óæ  € T;'       g    \        4       pV P                  ;_uu_ 4        V P                  P                  4        UUu. uFM  w  rEWC9  g   K  VR ,          \        9  g   K!  \
        P
                  ! 4       VR,          ,
          V8”  g   KK  VNKO  	  pppRRR4       X Uu. uF#  q@P                  V\        R4      '       g   K!  VNK%  	  up# u uppi   + '       g   i     LF; iu upi )rá   rÞ   Nu%   [task orphaned â€” no reply produced])rj   r  r`  r  r�  r  r´  ÚSTATE_FAILED)r  rË  rÉ  ÚexcludedÚtidrd  Ústales   &&$    r!   Úfail_orphansÚTaskStore.fail_orphans©  s½   € Ø×#Ð#œc›eˆØ�Z�Z‹ZØ)-¯©×):Ñ):Ô)<ô LÑ)<™X˜SØÑ+ô Ø03°GµÄOÑ0Sô äŸš› s¨<Õ'8Õ8¸?ÑJ÷ �SÑ)<ˆEñ L÷ ñ  %Ór™u˜¯©°c¼<ÐIp×(q—�™uÑrÐrùóL÷ �Züò ss;   ©CÁ
C
ÁC
Á*%C
ÂC
ÂCÂ)C.ÃC.ÃCÃC+	c               ó   € V ^8„  d   QhRR/# rþ   r   )r    s   "r!   r"   r^  ±  s   € ÷ 'ñ '˜dñ 'r#   c                	ó,  € V P                   P                  4        UUu. uF  w  rVR ,          \        9   g   K  VNK  	  pppVR\        ^ \	        V4      V P
                  ,
          4        F  pV P                   P                  VR4       K!  	  R# u uppi rŒ  )r`  r  r�  r.   rÌ   Ú_MAX_TERMINALr  )r  rÐ  rd  Úterminals   &   r!   r®  ÚTaskStore._trim_locked±  su   € Ø(,¯©×(9Ñ(9Ô(;Ô_Ñ(;™H˜C¸sÀ7½|ÌÑ?^—C�CÑ(;ˆÑ_ØÐGœS ¤C¨£M°D×4FÑ4FÕ$FÓGÓHˆCØ�K‰K�O‰O˜C Ö&ó Iùó `s
   žB¹Bc               ó$   € V ^8„  d   QhRRRRRR/# )r   rd  rE   Úinclude_artifactsrD   r   r   )r    s   "r!   r"   r^  ·  s!   € ÷ ñ �Tð ¨dð ¸dñ r#   c           
     óÄ   € \        V R,          V R,          V R,          V P                  RR4      V P                  RR4      R7      pV'       g   VP                  RR	4       V# )
z+Render a stored record as an A2A v1.0 Task.rà   r¨   rá   r†  r@   r~  )rÞ   ræ   N)rè   r‚   r  )rd  rÚ  r€   s   && r!   Úto_taskÚTaskStore.to_task¶  sU   € ô ˜#˜i�.¨#¨lÕ*;¸SÀ½\È3Ï7É7ÐSZÐ\^ÓK_Ø%(§W¡W¨]¸BÓ%?ôAˆç Ø�H‰H�[ $Ô'Øˆr#   )r  r`  ra  ©r@   r@   )r@   r@   r@   r›  )r@   r@   é2   r7  r@   r@   F)i,  )T)r  r  r  r  r  rÖ  r	  Ústaticmethodrh  ro  rx  r€  rˆ  rŽ  r“  r—  r�  r¡  r¥  r‚   r´  r¹  rÇ  rÒ  r®  rÜ  r  r   r#   r!   r\  r\  1  s³   † ñTð €Mõ&ð
 ö~ó ð~÷P÷
ð ôwó ðw÷õ%÷
/÷|÷$÷#õ&÷]÷÷	÷QñsÐW[÷ sð sõ'ð
 öó ôr#   r\  c               ó    € V ^8„  d   QhRRRR/# )r   r¨   r   r   r
   r   )r    s   "r!   r"   r"   À  s   € ÷ Eñ E˜3ð E 4ñ Er#   c                ó�   € R P                  R T ;'       g    R 4       4      ;'       g    Rp\        4       R,          V R2,          # )r@   c              3  ób   "  € T F%  qP                  4       '       g
   VR 9   g   K!  Vx € K'  	  R# 5i)z-_N)Úisalnum)Ú.0Úcs   & r!   Ú	<genexpr>Ú_conv_path.<locals>.<genexpr>Á  s"   é € ÐTÑ6˜¿9¹9¿;º;È!ÈtÉ)—1’1Ó6ùs   ‚/¥
/r   Úa2a_conversationsz.jsonl)rÍ   r   )r¨   Úsafes   & r!   Ú
_conv_pathrë  À  sD   € Ø�7‰7ÑT˜z×6Ð6¨YÐ6ÓTÓT×aÐaÐXa€DÜÓÐ2Õ2¸°v¸V°_ÕDÐDr#   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   r¨   r   r§   r¢   rà   r„  r   rÿ   r   )r    s   "r!   r"   r"   Å  s8   € ÷ 	ñ 	 ð 	¨3ð 	°cð 	ÀCð 	ÐX[ð 	Ðeiñ 	r#   c           	     óž  €  \        V 4      pVP                  P                  RRR7       R\        P                  ! 4       RVRVRV/V'       d   RV/M/ CpVP	                  RR	R
7      ;_uu_ 4       pVP                  \        P                  ! VRR7      R,           4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)zKAppend one message to the context's on-disk conversation log. Never raises.T)ÚparentsÚexist_okrl   r§   r¢   rà   r„  Úazutf-8©ÚencodingFrõ   rÊ   N)	rë  ÚparentÚmkdirr  ÚopenÚwriter½   r¾   Ú	Exception)r¨   r§   r¢   rà   r„  ÚpathÚentryÚfhs   &&&&&   r!   Úpersist_messagerû  Å  s±   € ðÜ˜*Ó%ˆØ�‰×Ñ $°ÐÔ6Ø”t—y’y“{ F¨D°&¸$À	È7ð  D×qyÐXbÐdlÑWmð  @Bð  DˆØ�Y‰Y�s WˆY×-Ô-°Ø�H‰H”T—Z’Z °EÔ:¸TÕAÔB÷ .×-×-Ò-ûäô Úðús0   ‚A.B= Á0/B)ÂB= Â)B:	Â4B= Â:B= Â=CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r   r¨   r   r„  r   rD   r   )r    s   "r!   r"   r"   Ñ  s&   € ÷ fñ f˜Sð f¨Cð f°Dñ fr#   c                ó¤   a€ \         ;QJ d*    V3R l\        V ^ R7       4       F  '       g   K   R# 	  R# ! V3R l\        V ^ R7       4       4      # )zSTrue when the context's durable log already holds the forwarded input ``input_id``.c              3  óJ   <"  € T F  qP                  R 4      S8H  x € K  	  R# 5i)r„  Nrg  )rå  rù  r„  s   & €r!   rç  Úlogged_input.<locals>.<genexpr>Ô  s   øé € ÐeÑ>d°U�y‰y˜Ó$¨Ö0Ó>dùs   ƒ #)r.  TF)ÚanyÚload_conversation)r¨   r„  s   &fr!   Úlogged_inputr  Ñ  sB   ø€ ÷ ‹3ÔeÔ>OÐPZÐbcÕ>dÓe�3Œ3ÐeŠ3Ðeˆ3ÔeÔ>OÐPZÐbcÕ>dÓeÓeÐer#   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¨   r   r.  r   r   rc   r   )r    s   "r!   r"   r"   ×  s!   € ÷ ñ  #ð ¨cð ¸:ñ r#   c                ó„  €  \        V 4      P                  RR7      P                  4       p. pT F[  pTP	                  4       '       g   K   \
        P                  ! T4      p\        T\        4      '       g   KJ  TP                  T4       K]  	  Y1) R #   \         d    . u # i ; i  \
        P                   d     K�  i ; i)zFLast *limit* messages for a context (empty list if none / unreadable).z	utf-8-sigrñ  N)rë  Ú	read_textÚ
splitlinesr÷  rÎ   r½   ÚloadsÚJSONDecodeErrorri   rE   rË   )r¨   r.  Úlinesr²  Úlinerù  s   &&    r!   r  r  ×  s¯   € ðÜ˜:Ó&×0Ñ0¸+Ð0ÓF×QÑQÓSˆð €CÛˆØ�:‰:�<Œ<ðÜŸ
š
 4Ó(�ô ˜%¤×&Ô&Ø—
‘
˜5Ö!ñ ð ˆvˆwˆ<Ðøô ô ØŠ	ðûô ×'Ñ'ô Úðús#   ‚)B ÁB&ÂB#Â"B#Â&B?Â>B?c               ó   € V ^8„  d   QhRR/# )r   r   rÌ  r   )r    s   "r!   r"   r"   é  s   € ÷ ]ñ ]˜Iñ ]r#   c                 ób   € \        R \        4       R,          P                  R4       4       4      # )z.Context-ids that have persisted conversations.c              3  ó8   "  € T F  qP                   x € K  	  R # 5ir%   )Ústem)rå  Úps   & r!   rç  Ú%list_conversations.<locals>.<genexpr>ë  s   é € Ð\Ñ"[˜Q—&–&Ó"[ùs   ‚ré  z*.jsonl)rk   r   Úglobr   r#   r!   Úlist_conversationsr  é  s(   € äÑ\¤?Ó#4Ð7JÕ#J×"PÑ"PÐQZÔ"[Ó\Ó\Ð\r#   iD€ÿÿi¦€ÿÿi§€ÿÿiÿ‚ÿÿiþ‚ÿÿiÎ‚ÿÿiÍ‚ÿÿiÌ‚ÿÿr›  r%   rÞ  )rß  )Xr  Ú
__future__r   rœ   r½   r'   r  r  r�   Úcollectionsr   r   r   Úconcurrent.futuresr   r   r   r	   Úpathlibr
   Útypingr   r   Úgateway.platforms._sharedr   r&   Úhermes_constantsr   r]   r‡  ÚSTATE_WORKINGÚSTATE_INPUT_REQUIREDrç   rÎ  ÚSTATE_CANCELEDÚSTATE_REJECTEDÚ	frozensetr�  r   r   ÚINPUT_REQUIRED_MARKERÚ	ERR_PARSEÚERR_INVALID_PARAMSÚERR_METHOD_NOT_FOUNDÚERR_TASK_NOT_FOUNDÚERR_TASK_NOT_CANCELABLEÚERR_UNAUTHORIZEDÚERR_RATE_LIMITEDÚERR_UNTRUSTED_PEERr-   r0   r+  r,  r)   r2   r:   r`   rn   ru   r{   rƒ   r†   r‰   r’   r–   r    r¥   r®   r¸   rÁ   rÓ   rÚ   rÝ   rè   rí   rò   r÷   rú   rü   r   r3  Úmetricsr\  rë  rû  r  r  r  r   r#   r!   Ú<module>r)     sý  ðñ?õ
 #ã Û Û 	Û Û Û ß 7Ñ 7Ý %ß ,Ñ ,Ý ß  å @Ý ,àÐ ð 8NÐOcð  fAÐ 4€�Ð 4Ø 6Ð8KÐ €�Ø!6Ð8MÐ €�Ù˜_¨l¸NÈNÐ[Ó\€Ø# \Ð €	ˆ:ð +Ð ð 7=¸fÀfÐ 3€	ÐÐ3Ø.4°fÐ +Ð Ð+Ø9?ÀÈÐ 6Ð Ð"Ð$6ð -.¨rÐ )Ð Ð)Ø$&¨Ð !Ð �\õ:õ.õ
Ið
Ð^bð Ø',ðØINðØfkðà#%÷õ.Hõ>õYõ õõõ
+õ*õWõ5÷
õ@õ
õ%õ0LõtñÐeg÷ ð ÷\õb÷Cõ÷
.ñ .÷.ñ ÷(Gñ Gñ0 ‹)€÷Lñ Lõ^E÷
	õf÷÷$]r#   