§
    øžyjèä  ã                  ó¸  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZmZ dd	lmZmZmZm Z m!Z! dd
l"m#Z# ddl$m%Z%m&Z&  ej'        e(¦  «        Z)dZ*dZ+dZ,dZ-dZ.d-d„Z/d.d„Z0d/d„Z1d0d„Z2d.d„Z3d1d„Z4d2d3d#„Z5d4d&„Z6 G d'„ d(e¦  «        Z7 G d)„ d*e¦  «        Z8 G d+„ d,e¦  «        Z9dS )5uX  
A2A inbound platform adapter â€” exposes Hermes as an A2A-discoverable agent.

Design (the #11025 insight, done as a plugin with zero core edits):
  - Runs a stdlib http.server in a daemon thread (no a2a-sdk, no asyncio loop
    dependency at register() time â€” avoids the a2a_fleet "register outside a
    loop" bug class).
  - Serves the A2A v1.0 Agent Card at GET /.well-known/agent-card.json (and legacy agent.json).
  - JSON-RPC at POST /: message/send, message/stream (SSE), tasks/get,
    tasks/list, tasks/cancel, tasks/subscribe, tasks/pushNotificationConfig/create,
    tasks/pushNotificationConfig/get, tasks/pushNotificationConfig/list,
    tasks/pushNotificationConfig/delete.
  - Push notifications: config accepted inline in message/send
    (configuration.taskPushNotificationConfig) or via the create method;
    payloads are v1.0 StreamResponse objects, HMAC-signed.
  - Metrics at GET /metrics.
  - Each inbound task is filtered + framed (security.wrap_inbound) and routed
    into the agent's LIVE gateway session via the normal MessageEvent path, so
    the agent that replies is the same one talking to its user â€” full memory
    and context, not a throwaway clone.
  - The agent's reply comes back through ``adapter.send()``; we override that to
    fulfil a per-task Future the HTTP handler is blocked on, turning the
    async gateway into a synchronous request/response for the A2A caller.
    ``on_processing_complete`` resolves failures/cancellations promptly.
  - Every exchange is persisted to disk and audit-logged.

Bind safety: with no token configured, the server binds 127.0.0.1 only.
é    )ÚannotationsN)Údeque)ÚFuture)ÚTimeoutError)ÚBaseHTTPRequestHandlerÚThreadingHTTPServer)ÚAnyÚDictÚOptional)ÚBasePlatformAdapterÚMessageEventÚMessageTypeÚProcessingOutcomeÚ
SendResult)ÚPlatformé   )ÚprotocolÚsecurityi¬&  é,  é<   i   é   ÚreturnÚfloatc            	     ó”   — 	 t          dt          t          j        dd¦  «        ¦  «        ¦  «        S # t          t
          f$ r Y dS w xY w)z8Seconds to wait for the agent to answer an inbound task.g      ð?ÚA2A_REPLY_TIMEOUTÚ300g     Àr@)Úmaxr   ÚosÚgetenvÚ
ValueErrorÚ	TypeError© ó    úC/home/ragecks/.hermes/hermes-agent/plugins/platforms/a2a/adapter.pyÚ_reply_timeoutr%   E   sS   € ðÝ�3��bœiÐ(;¸UÑCÔCÑDÔDÑEÔEÐEøÝ�	Ð"ð ð ð Øˆuˆuðøøøs   ‚/2 ²AÁAÚstrc                 ó²   — t          j        dd¦  «                             ¦   «         } | r| S 	 dd l}d|                     ¦   «         › �S # t
          $ r Y dS w xY w)NÚA2A_AGENT_NAMEÚ r   zhermes-zhermes-agent)r   r   ÚstripÚsocketÚgethostnameÚ	Exception)Únamer+   s     r$   Ú_default_agent_namer/   M   sw   € ÝŒ9Ð% rÑ*Ô*×0Ò0Ñ2Ô2€DØð ØˆðØˆˆˆØ/˜×+Ò+Ñ-Ô-Ð/Ð/Ð/øÝð ð ð Øˆ~ˆ~ðøøøs   ­A Á
AÁAÚvaluec                ó°   — t          | pd¦  «                             ¦   «                              d¦  «        }|dv rdn|                     d¦  «        d         S )z=Return a URL-safe-ish single-segment slug for a served agent.r)   ú/)r)   ÚdefaultÚrootr   )r&   r*   Úsplit)r0   Úslugs     r$   Ú_clean_slugr7   X   sQ   € åˆuˆ{˜ÑÔ×!Ò!Ñ#Ô#×)Ò)¨#Ñ.Ô.€DØÐ0Ð0Ð0ˆ2ˆ2°d·j²jÀ±o´oÀaÔ6HÐHr#   ÚbaseÚprefixc                óâ   — | pd                      ¦   «         pd} |                      d¦  «        s| dz  } |pd                      d¦  «        }|s| S t          j                             | |dz   ¦  «        S )Nr)   r2   )r*   ÚendswithÚurllibÚparseÚurljoin)r8   r9   s     r$   Ú	_join_urlr?   ^   sy   € ØˆJ�B×ÒÑÔÐ& 3€DØ�=Š=˜ÑÔð Ø�‰ˆØˆl˜×!Ò! #Ñ&Ô&€FØð ØˆÝŒ<×Ò  f¨s¡lÑ3Ô3Ð3r#   c                 óv   — 	 ddl m}   | ¦   «         pdS # t          $ r t          j        dd¦  «        pdcY S w xY w)Nr   ©Úget_active_profile_namer3   ÚHERMES_PROFILE)Úhermes_cli.profilesrB   r-   r   r   rA   s    r$   Ú_active_profile_namerE   h   sk   € ðCØ?Ð?Ð?Ð?Ð?Ð?Ø&Ð&Ñ(Ô(Ð5¨IÐ5øÝð Cð Cð CÝŒyÐ)¨9Ñ5Ô5ÐB¸ÐBÐBÐBðCøøøs   ‚ ”!8·8ÚprofileúOptional[str]c                ó  — 	 ddl m} t           || ¦  «        ¦  «        S # t          $ r_ | r| dk    r2	 ddlm} t           |¦   «         ¦  «        cY S # t          $ r Y Y d S w xY wt          j                             d| › �¦  «        cY S w xY w)Nr   )Úget_profile_dirr3   )Úget_hermes_homez~/.hermes/profiles/)	rD   rI   r&   r-   Úhermes_cli.configrJ   r   ÚpathÚ
expanduser)rF   rI   rJ   s      r$   Ú_profile_homerN   p   sß   € ð
CØ7Ð7Ð7Ð7Ð7Ð7Ý�?�? 7Ñ+Ô+Ñ,Ô,Ð,øÝð Cð Cð CØð 	˜' YÒ.Ð.ðØ=Ð=Ð=Ð=Ð=Ð=Ý˜?˜?Ñ,Ô,Ñ-Ô-Ð-Ð-Ð-øÝð ð ð Ø�t�t�tðøøøåŒw×!Ò!Ð"A¸Ð"AÐ"AÑBÔBÐBÐBÐBðCøøøs2   ‚   B	³AÁB	Á
A!ÁB	Á A!Á!%B	ÂB	é`   Úmax_lenÚintc                óŠ   — t          j        ddt          | pd¦  «        ¦  «                             d¦  «        }|pdd|…         S )zFSanitize attacker-provided context ids before using in session titles.z[^A-Za-z0-9_.-]+Ú-r)   z-._ÚctxN)ÚreÚsubr&   r*   )r0   rP   r6   s      r$   Ú_safe_context_slugrW   }   sC   € åŒ6Ð% s­C°°¸Ñ,<Ô,<Ñ=Ô=×CÒCÀEÑJÔJ€DØˆM�E˜8˜G˜8Ô$Ð$r#   Úmethodútuple[str, bool]c                ó¨   — i dd“dd“dd“dd“d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"d#d$d%d&œ¥}|                      | d'¦  «        S )(uÑ   Return (canonical_operation, is_v1_method).

    Canonical operation names are lowercase internal labels. v1 methods use the
    PascalCase names from A2A v1.0 Â§5.3/Â§9.4; legacy aliases remain accepted.
    ÚSendMessage)ÚsendTzmessage/send)r\   FÚSendStreamingMessage)ÚstreamTzmessage/stream)r^   FÚGetTask)ÚgetTz	tasks/get)r`   FÚ	ListTasks)ÚlistTz
tasks/list)rb   FÚ
CancelTask)ÚcancelTztasks/cancel)rd   FÚSubscribeToTask)Ú	subscribeTztasks/subscribe)rf   FÚ CreateTaskPushNotificationConfig)Úpush_createTz#tasks/pushNotificationConfig/create)rh   Fz tasks/pushNotificationConfig/setztasks/pushNotification/setÚGetTaskPushNotificationConfig)Úpush_getT)rj   F)Ú	push_listT)rk   F)Úpush_deleteT)rl   F)z tasks/pushNotificationConfig/getÚListTaskPushNotificationConfigsz!tasks/pushNotificationConfig/listÚ DeleteTaskPushNotificationConfigz#tasks/pushNotificationConfig/delete)r)   F©r`   )rX   Úmappings     r$   Ú_method_inforq   ƒ   s  € ðØ�~ðà˜ðð 	Ð 0ðð 	Ð+ð	ð
 	�=ðð 	�^ðð 	�^ðð 	�oðð 	Ð&ðð 	Ð)ðð 	Ð.ðð 	Ð/ðð 	+Ð,Aðð 	.Ð/Eðð 	+Ð,Bðð  	%Ð&<ð!ð" 	(Ð);ð#ð$ -@Ø+>Ø-AØ,AØ/Eð-ð ð €Gð0 �;Š;�v˜{Ñ+Ô+Ð+r#   c                  ó(   ‡ — e Zd ZdZdZdˆ fd„Zˆ xZS )Ú
_A2AServerz<ThreadingHTTPServer that carries a reference to its adapter.TÚadapterú'A2AAdapter'c                óZ   •— t          ¦   «                              ||¦  «         || _        d S ©N)ÚsuperÚ__init__rt   )ÚselfÚaddrÚhandler_clsrt   Ú	__class__s       €r$   ry   z_A2AServer.__init__©   s(   ø€ Ý‰Œ×Ò˜˜{Ñ+Ô+Ð+ØˆŒˆˆr#   )rt   ru   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Údaemon_threadsry   Ú__classcell__©r}   s   @r$   rs   rs   ¤   sH   ø€ € € € € ØFÐFà€Nðð ð ð ð ð ð ð ð ð r#   rs   c                  óL   — e Zd ZdZedd„¦   «         Zd„ Zdd
„Zdd„Zd„ Z	d„ Z
dS )ÚA2ARequestHandlerz¦HTTP handler for the A2A JSON-RPC surface.

    Module-level (not a closure) so request routing is unit-testable; all
    state lives on ``self.server.adapter``.
    r   ru   c                ó   — | j         j        S rw   )Úserverrt   ©rz   s    r$   rt   zA2ARequestHandler.adapterµ   s   € àŒ{Ô"Ð"r#   c                ó0   — t          j        d|z   g|¢R Ž  d S )Nz
A2A http: )ÚloggerÚdebug)rz   ÚformatÚargss      r$   Úlog_messagezA2ARequestHandler.log_messageº   s%   € ÝŒ�\ FÑ*Ð2¨TÐ2Ð2Ð2Ð2Ð2Ð2r#   ÚcoderQ   ÚpayloadÚdictc                óf  — t          j        |¦  «                             d¦  «        }|                      |¦  «         |                      dd¦  «         |                      dt          t          |¦  «        ¦  «        ¦  «         |                      ¦   «          | j         	                    |¦  «         d S )Núutf-8úContent-Typeúapplication/jsonúContent-Length)
ÚjsonÚdumpsÚencodeÚsend_responseÚsend_headerr&   ÚlenÚend_headersÚwfileÚwrite)rz   r�   r‘   Úbodys       r$   Ú_jsonzA2ARequestHandler._json½   s›   € ÝŒz˜'Ñ"Ô"×)Ò)¨'Ñ2Ô2ˆØ×Ò˜4Ñ Ô Ð Ø×Ò˜Ð);Ñ<Ô<Ð<Ø×ÒÐ)­3­s°4©y¬y©>¬>Ñ:Ô:Ð:Ø×ÒÑÔÐØŒ
×Ò˜ÑÔÐÐÐr#   r&   c                óÆ  — t          j        dd¦  «                             ¦   «         }|r|S | j                             dd¦  «        p| j                             dd¦  «        }|sdS |                     d¦  «        d                              ¦   «         }| j                             dd¦  «        pd                     d¦  «        d                              ¦   «         }|› d	|› d
�S )a+  Derive the routable URL for this request.

        Priority: A2A_PUBLIC_URL env > X-Forwarded-Host / Host header (with
        scheme from X-Forwarded-Proto) > empty. Empty means "caller has no
        info, fall back to bind host". See gfdsa's k8s bind-host bug report
        (PR #41711).
        ÚA2A_PUBLIC_URLr)   zX-Forwarded-HostÚHostÚ,r   zX-Forwarded-ProtoÚhttpz://r2   )r   r   r*   Úheadersr`   r5   )rz   ÚexplicitÚhostÚschemes       r$   Ú_request_public_urlz%A2ARequestHandler._request_public_urlÅ   sà   € õ ”9Ð-¨rÑ2Ô2×8Ò8Ñ:Ô:ˆØð 	ØˆOØŒ|×ÒÐ 2°BÑ7Ô7ÐW¸4¼<×;KÒ;KÈFÐTVÑ;WÔ;WˆØð 	Ø�2Ø�zŠz˜#‰Œ˜qÔ!×'Ò'Ñ)Ô)ˆØ”,×"Ò"Ð#6¸Ñ;Ô;ÐE¸v×LÒLÈSÑQÔQÐRSÔT×ZÒZÑ\Ô\ˆØÐ$Ð$˜TÐ$Ð$Ð$Ð$r#   c                óX  — | j                              | j        ¦  «        }|d         }|d                              d¦  «        pd}|dv rH|                      ¦   «         pd }|                      d| j                              ||¬¦  «        ¦  «         d S |dv rÃd|                     d	¦  «        p| j         j        d
œ}t          j
        ¦   «         sBt          j        | j                             d¦  «        | j        r| j        d         nd¦  «        	 �2| j                              |                      ¦   «         pd ¬¦  «        |d<   |                      d|¦  «         d S |dk    r4|                      dt          j                             ¦   «         ¦  «         d S |                      dddi¦  «         d S )NÚagentÚsubpathr2   )z/.well-known/agent.jsonz/.well-known/agent-card.jsonéÈ   ©r®   )r2   z/healthÚokr.   )Ústatusr®   ÚAuthorizationr   r)   )Ú
public_urlÚserved_agentsz/metricsi”  Úerrorz	not found)rt   Ú_route_for_pathrL   Úrstripr¬   r¢   Ú_build_cardr`   Ú
agent_namer   Úlocalhost_onlyÚauthenticater¨   Úclient_addressÚ_served_agent_summaryr   ÚmetricsÚsnapshot)rz   Úrouter®   r¯   rµ   r‘   s         r$   Údo_GETzA2ARequestHandler.do_GET×   sÀ  € Ø”×,Ò,¨T¬YÑ7Ô7ˆØ�g”ˆØ˜	Ô"×)Ò)¨#Ñ.Ô.Ð5°#ˆØÐQÐQÐQØ×1Ò1Ñ3Ô3Ð;°tˆJØ�JŠJ�s˜DœL×4Ò4°ZÀuÐ4ÑMÔMÑNÔNÐNØˆFØÐ&Ð&Ð&àØŸš 6Ñ*Ô*ÐE¨d¬lÔ.Eðð ˆGõ Ô&Ñ(Ô(ð C­HÔ,AØ”× Ò  Ñ1Ô1Ø*.Ô*=ÐE�Ô# AÔ&Ð&À2ñ-ô -ð ð-ð ,0¬<×+MÒ+MØ#×7Ò7Ñ9Ô9ÐA¸Tð ,Nñ ,Cô ,C�˜Ñ(à�JŠJ�s˜GÑ$Ô$Ð$ØˆFØ�jÒ Ð Ø�JŠJ�s�HÔ,×5Ò5Ñ7Ô7Ñ8Ô8Ð8ØˆFØ�
Š
�3˜ +Ð.Ñ/Ô/Ð/Ð/Ð/r#   c           
     óZ  — | j         }| j        r| j        d         nd}t          j        | j                             d¦  «        |¦  «        }|€6|                      dt          j        d t          j	        d¦  «        ¦  «         d S 	 t          | j                             dd¦  «        ¦  «        }|t          k    r6|                      dt          j        d t          j        d¦  «        ¦  «         d S |r| j                             |¦  «        nd	}t          j        |                     d
¦  «        ¦  «        }nE# t$          $ r8 |                      dt          j        d t          j        d¦  «        ¦  «         Y d S w xY wt'          |t(          ¦  «        s6|                      dt          j        d t          j        d¦  «        ¦  «         d S |                     d¦  «        }t-          |                     dd¦  «        ¦  «        }|                     di ¦  «        }	|	€i }	t'          |	t(          ¦  «        s6|                      dt          j        |t          j        d¦  «        ¦  «         d S | j                             d¦  «        pd                     ¦   «         }
|
r=|
dvr9|                      dt          j        |t          j        d|
› �¦  «        ¦  «         d S t1          |¦  «        \  }}|                     | j        |	¦  «        }|                     d¦  «        r<|                      dt          j        |t          j        |d         ¦  «        ¦  «         d S |d         }|j                             |¦  «        sPt          j        xj        dz  c_        |                      dt          j        |t          j        d¦  «        ¦  «         d S t          j         |¦  «        s:|                      dt          j        |t          j!        d|› d�¦  «        ¦  «         d S |s9|                      dt          j        |t          j"        d|› �¦  «        ¦  «         d S |dk    r0|                      d| #                    ||	|||¬ ¦  «        ¦  «         d S |d!k    r| $                    | ||	||¬"¦  «         d S |d#k    r.|                      d| %                    ||	|¬"¦  «        ¦  «         d S |d$k    r.|                      d| &                    ||	|¬"¦  «        ¦  «         d S |d%k    r.|                      d| '                    ||	|¬"¦  «        ¦  «         d S |d&k    r| (                    | ||	|¬"¦  «         d S |d'k    r.|                      d| )                    ||	|¬"¦  «        ¦  «         d S |d(k    r.|                      d| *                    ||	|¬"¦  «        ¦  «         d S |d)k    r.|                      d| +                    ||	|¬"¦  «        ¦  «         d S |d*k    r.|                      d| ,                    ||	|¬"¦  «        ¦  «         d S d S )+Nr   r)   r´   i‘  Úunauthorizedr—   i�  zpayload too larges   {}r”   i�  zparse errorz"JSON-RPC request must be an objectÚidrX   Úparamsr°   zparams must be an objectzA2A-Version>   ú1.0ú1.0.0zunsupported A2A-Version: r·   r®   r   i­  zrate limit exceededi“  zpeer 'z' not trustedzmethod not found: r\   )r®   Úv1_responser^   r±   r`   rb   rd   rf   rh   rj   rk   rl   )-rt   r¾   r   r½   r¨   r`   r¢   r   Újsonrpc_errorÚERR_UNAUTHORIZEDrQ   Ú	_MAX_BODYÚ	ERR_PARSEÚrfileÚreadr˜   ÚloadsÚdecoder-   Ú
isinstancer’   ÚERR_INVALID_PARAMSr&   r*   rq   Ú_route_for_requestrL   Ú_rate_limiterÚallowrÀ   Úrate_limit_triggersÚERR_RATE_LIMITEDÚis_trusted_peerÚERR_UNTRUSTED_PEERÚERR_METHOD_NOT_FOUNDÚ_rpc_message_sendÚ_rpc_message_streamÚ_rpc_tasks_getÚ_rpc_tasks_listÚ_rpc_tasks_cancelÚ_rpc_tasks_subscribeÚ_rpc_push_config_createÚ_rpc_push_config_getÚ_rpc_push_config_listÚ_rpc_push_config_delete)rz   rt   Ú	client_ipÚidentityÚlengthÚrawÚreqÚreq_idrX   rÇ   ÚversionÚ	operationÚis_v1rÂ   r®   s                  r$   Údo_POSTzA2ARequestHandler.do_POSTó   s9  € Ø”,ˆØ.2Ô.AÐI�DÔ'¨Ô*Ð*Àrˆ	õ Ô(¨¬×)9Ò)9¸/Ñ)JÔ)JÈIÑVÔVˆØÐØ�JŠJ�s�HÔ2°4½Ô9RÐTbÑcÔcÑdÔdÐdØˆFð		Ý˜œ×)Ò)Ð*:¸AÑ>Ô>Ñ?Ô?ˆFØ�	Ò!Ð!Ø—
’
˜3¥Ô 6°t½XÔ=OÐQdÑ eÔ eÑfÔfÐfØ�Ø-3Ð>�$”*—/’/ &Ñ)Ô)Ð)¸ˆCÝ”*˜SŸZšZ¨Ñ0Ô0Ñ1Ô1ˆCˆCøÝð 	ð 	ð 	Ø�JŠJ�s�HÔ2°4½Ô9KÈ]Ñ[Ô[Ñ\Ô\Ð\ØˆFˆFð	øøøõ ˜#�tÑ$Ô$ð 	Ø�JŠJ�s�HÔ2°4½Ô9TÐVzÑ{Ô{Ñ|Ô|Ð|ØˆFà—’˜‘”ˆÝ�S—W’W˜X rÑ*Ô*Ñ+Ô+ˆØ—’˜ 2Ñ&Ô&ˆØˆ>ØˆFÝ˜&¥$Ñ'Ô'ð 	Ø�JŠJ�s�HÔ2°6½8Ô;VÐXrÑsÔsÑtÔtÐtØˆFà”<×#Ò# MÑ2Ô2Ð8°b×?Ò?ÑAÔAˆØð 	�wÐ&6Ð6Ð6Ø�JŠJ�s�HÔ2°6½8Ô;VÐX}Ðt{ÐX}ÐX}Ñ~Ô~ÑÔÐØˆFå'¨Ñ/Ô/Ñˆ	�5Ø×*Ò*¨4¬9°fÑ=Ô=ˆØ�9Š9�WÑÔð 	Ø�JŠJ�s�HÔ2°6½8Ô;VÐX]Ð^eÔXfÑgÔgÑhÔhÐhØˆFØ�g”ˆàÔ$×*Ò*¨8Ñ4Ô4ð 	ÝÔÐ0Ô0°AÑ5Ð0Ô0Ø�JŠJ�s�HÔ2°6½8Ô;TÐVkÑlÔlÑmÔmÐmØˆFåÔ'¨Ñ1Ô1ð 	Ø�JŠJ�s�HÔ2Ø�Ô3Ð5U¸hÐ5UÐ5UÐ5UñWô Wñ Xô Xð XàˆFàð 	Ø�JŠJ�s�HÔ2Ø�Ô5Ð7TÈFÐ7TÐ7TñVô Vñ Wô Wð WàˆFà˜ÒÐØ�JŠJ�s˜G×5Ò5°f¸fÀhÐV[ÐinÐ5ÑoÔoÑpÔpÐpØˆFØ˜Ò Ð Ø×'Ò'¨¨f°f¸hÈeÐ'ÑTÔTÐTØˆFØ˜ÒÐØ�JŠJ�s˜G×2Ò2°6¸6ÈÐ2ÑOÔOÑPÔPÐPØˆFØ˜ÒÐØ�JŠJ�s˜G×3Ò3°F¸FÈ%Ð3ÑPÔPÑQÔQÐQØˆFØ˜Ò Ð Ø�JŠJ�s˜G×5Ò5°f¸fÈEÐ5ÑRÔRÑSÔSÐSØˆFØ˜Ò#Ð#Ø×(Ò(¨¨v°vÀUÐ(ÑKÔKÐKØˆFØ˜Ò%Ð%Ø�JŠJ�s˜G×;Ò;¸FÀFÐRWÐ;ÑXÔXÑYÔYÐYØˆFØ˜
Ò"Ð"Ø�JŠJ�s˜G×8Ò8¸ÀÈuÐ8ÑUÔUÑVÔVÐVØˆFØ˜Ò#Ð#Ø�JŠJ�s˜G×9Ò9¸&À&ÐPUÐ9ÑVÔVÑWÔWÐWØˆFØ˜Ò%Ð%Ø�JŠJ�s˜G×;Ò;¸FÀFÐRWÐ;ÑXÔXÑYÔYÐYØˆFð &Ð%s   ÂA'D3 Ã-AD3 Ä3>E5Å4E5N)r   ru   )r�   rQ   r‘   r’   ©r   r&   )r~   r   r€   r�   Úpropertyrt   r�   r¢   r¬   rÃ   rð   r"   r#   r$   r†   r†   ®   s˜   € € € € € ðð ð ð#ð #ð #ñ „Xð#ð3ð 3ð 3ðð ð ð ð%ð %ð %ð %ð$0ð 0ð 0ð8[ð [ð [ð [ð [r#   r†   c                  óö  ‡ — e Zd ZdZˆ fd„Zedad„¦   «         Zedbd„¦   «         Zdbd„Zdcd
„Z	dcd„Z
ddd„Zded„Zdfdgd„Zdhd„Zdid„Zdjdkd„Zdfdld„Zdmd!„Zdnd"„Zdod%„Zdpd&„Zdqd(„Zdrd,„Zdfdsd/„Zdtd1„Zdud3„Zdvd6„Zdwd8„Zdxd:„Zdyd=„Zdfdzd>„Zd{d|dC„Z e!dcdD„¦   «         Z"e!d}dF„¦   «         Z#	 dfd~dG„Z$dfddH„Z%dfd€dI„Z&dfd�dJ„Z'dfd�dK„Z(dfd�dL„Z)dfd‚dM„Z*dfd�dN„Z+dfd�dO„Z,dfd�dP„Z-dfd�dQ„Z.dƒdR„Z/	 	 djd„dX„Z0d…d]„Z1dfd†d^„Z2d‡d`„Z3ˆ xZ4S )ˆÚ
A2AAdapterzInbound A2A server adapter.c                ó
  •— t          d¦  «        }t          ¦   «                              ||¬¦  «         t          |di ¦  «        pi }t	          t          j        d¦  «        p|                     dt          ¦  «        ¦  «        | _	        t          j        ¦   «         | _        t          ¦   «         | _        d„ t          |                     d¦  «        pg ¦  «        p't          j        dd	¦  «                             d
¦  «        D ¦   «         | _        t%          ¦   «         | _        |                      |¦  «        | _        d | _        d | _        d | _        t3          j        ¦   «         | _        t3          j        ¦   «         | _        t3          j        ¦   «         | _        i | _         i | _!        tE          j#        ¦   «         | _$        i | _%        i | _&        tE          j#        ¦   «         | _'        tE          j(        ¦   «         | _)        d | _*        d S )NÚa2a)ÚconfigÚplatformÚextraÚA2A_PORTÚportc                óx   — g | ]7}t          |¦  «                             ¦   «         ¯#|                     ¦   «         ‘Œ8S r"   )r&   r*   ©Ú.0Úts     r$   ú
<listcomp>z'A2AAdapter.__init__.<locals>.<listcomp>]  sF   € ð %
ð %
ð %
Øõ �Q‘”—’‘”ð	%
Ø�GŠG‰IŒIð%
ð %
ð %
r#   Úadvertised_toolsetsÚA2A_ADVERTISED_TOOLSETSr)   r¦   )+r   rx   ry   ÚgetattrrQ   r   r   r`   Ú_DEFAULT_PORTrû   r   Úresolve_bind_hostrª   r/   r»   rb   r5   Ú_advertised_toolsetsrE   Ú_active_profileÚ_load_served_agentsÚ_agentsÚ_httpdÚ_server_threadÚ_loopr   Ú	TaskStoreÚtasksÚTurnTrackerÚ_turnsÚRateLimiterrÖ   Ú_profile_sessionsÚ_profile_session_locksÚ	threadingÚLockÚ_profile_session_locks_guardÚ_pendingÚ_pending_orderÚ_pending_lockÚEventÚ_watchdog_stopÚ_watchdog_thread)rz   r÷   Úkwargsrø   rù   r}   s        €r$   ry   zA2AAdapter.__init__U  s¼  ø€ Ý˜E‘?”?ˆÝ‰Œ×Ò °ÐÑ:Ô:Ð:å˜ ¨Ñ,Ô,Ð2°ˆÝ�œ	 *Ñ-Ô-ÐQ°·²¸6Å=Ñ1QÔ1QÑRÔRˆŒ	ÝÔ.Ñ0Ô0ˆŒ	Ý-Ñ/Ô/ˆŒð%
ð %
å�U—Y’YÐ4Ñ5Ô5Ð;¸Ñ<Ô<ð GÝ”9Ð6¸Ñ;Ô;×AÒAÀ#ÑFÔFð%
ñ %
ô %
ˆÔ!õ  4Ñ5Ô5ˆÔØ×/Ò/°Ñ6Ô6ˆŒà,0ˆŒØ:>ˆÔØ:>ˆŒ
õ Ô'Ñ)Ô)ˆŒ
ÝÔ*Ñ,Ô,ˆŒÝ%Ô1Ñ3Ô3ˆÔð CEˆÔØRTˆÔ#Ý,5¬NÑ,<Ô,<ˆÔ)ð 8:ˆŒØ57ˆÔÝ&œ^Ñ-Ô-ˆÔõ (œoÑ/Ô/ˆÔØ<@ˆÔÐÐr#   r   r&   c                ó   — dS )NÚA2Ar"   r‰   s    r$   r.   zA2AAdapter.name‚  s   € àˆur#   Úboolc                ó   — dS )uœ  A2A authenticates every inbound request via bearer token (or
        localhost-only binding) in ``do_POST`` before dispatch â€” the identity
        is already authorized upstream. Without this override, the gateway's
        per-platform user allow-list (``{PLATFORM}_ALLOWED_USERS``) rejects
        A2A peers because their identity is a token-derived name or pod IP,
        not a platform account the operator configures in an env allow-list.

        This is authorization delegated to the A2A bearer-token transport,
        not a fail-open: every request is 401'd if the credential is wrong.
        Reported by kuangmi-bit (PR #41711 comment, Jun 27).
        Tr"   r‰   s    r$   Úauthorization_is_upstreamz$A2AAdapter.authorization_is_upstream†  s	   € ð ˆtr#   c           
   ‹  ól  K  — 	 t          j        ¦   «         | _        n# t          $ r
 d | _        Y nw xY w	 t	          | j        | j        ft          | ¦  «        | _        nZ# t          $ rM}t                               d| j        | j        |¦  «         |                      dd|› �d¬¦  «         Y d }~dS d }~ww xY wt          j        | j        j        dd¬¦  «        | _        | j                             ¦   «          | j                             ¦   «          t          j        | j        d	d¬¦  «        | _        | j                             ¦   «          |                      ¦   «          t/          j        ¦   «         rd
nd}t                               d| j        | j        || j        t7          | j        ¦  «        ¦  «         dS )Nu    A2A: could not bind %s:%s â€” %sÚbind_failedzA2A bind failed: T)Ú	retryableFza2a-http)Útargetr.   Údaemonza2a-watchdogzlocalhost-onlyzREMOTE (bearer auth)zQA2A: serving Agent Card + JSON-RPC on http://%s:%s (%s) as %r; %d routed agent(s))ÚasyncioÚget_running_loopr  ÚRuntimeErrorrs   rª   rû   r†   r
  ÚOSErrorr‹   r·   Ú_set_fatal_errorr  ÚThreadÚserve_foreverr  Ústartr  ÚclearÚ_watchdog_loopr  Ú_mark_connectedr   r¼   Úinfor»   r�   r	  )rz   Ú_kwargsÚeÚexposures       r$   ÚconnectzA2AAdapter.connect—  sÓ  è è € ð	Ý Ô1Ñ3Ô3ˆDŒJˆJøÝð 	ð 	ð 	ØˆDŒJˆJˆJð	øøøð	Ý$ d¤i°´Ð%;Õ=NÐPTÑUÔUˆDŒKˆKøÝð 	ð 	ð 	Ý�LŠLÐ;¸T¼YÈÌ	ÐSTÑUÔUÐUØ×!Ò! -Ð1HÀQÐ1HÐ1HÐTXÐ!ÑYÔYÐYØ�5�5�5�5�5øøøøð	øøøõ
 (Ô.Ø”;Ô,ØØð
ñ 
ô 
ˆÔð
 	Ô×!Ò!Ñ#Ô#Ð#ð 	Ô×!Ò!Ñ#Ô#Ð#Ý )Ô 0ØÔ&ØØð!
ñ !
ô !
ˆÔð
 	Ô×#Ò#Ñ%Ô%Ð%à×ÒÑÔÐå'/Ô'>Ñ'@Ô'@Ð\Ð#Ð#ÐF\ˆÝ�ŠØ_ØŒI�t”y (¨D¬O½SÀÄÑ=NÔ=Nñ	
ô 	
ð 	
ð ˆts$   „ �1°1µ'A Á
B4Á'AB/Â/B4ÚNonec              ƒ  óT  K  — |                       ¦   «          | j                             ¦   «          | j        �K	 | j                             ¦   «          | j                             ¦   «          n# t          $ r Y nw xY wd | _        | j        5  | j         	                    ¦   «         D ]:\  }}| 
                    ¦   «         s!|                     t          j        df¦  «         Œ;| j                             ¦   «          | j                             ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S )Nz[agent shutting down])Ú_mark_disconnectedr  Úsetr
  ÚshutdownÚserver_closer-   r  r  ÚvaluesÚdoneÚ
set_resultr   ÚSTATE_FAILEDr0  r  )rz   Ú_ctxÚfuts      r$   Ú
disconnectzA2AAdapter.disconnectÂ  sr  è è € Ø×ÒÑ!Ô!Ð!ØÔ×ÒÑ!Ô!Ð!ØŒ;Ð"ðØ”×$Ò$Ñ&Ô&Ð&Ø”×(Ò(Ñ*Ô*Ð*Ð*øÝð ð ð Ø�ðøøøàˆDŒKàÔð 	(ð 	(Ø!œ]×1Ò1Ñ3Ô3ð Uð U‘	��cØ—x’x‘z”zð UØ—N’N¥HÔ$9Ð;RÐ#SÑTÔTÐTøØŒM×ÒÑ!Ô!Ð!ØÔ×%Ò%Ñ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(s$   ¸2A+ Á+
A8Á7A8Â	BDÄD!Ä$D!c                óœ  — | j                              t          ¦  «        s¬	 | j                             t
          ¦  «        D ]=}t                               d|t
          ¦  «         t          j	        xj
        dz  c_
        Œ>n,# t          $ r t                               dd¬¦  «         Y nw xY w| j                              t          ¦  «        ¯ªdS dS )zCBackground thread that fails orphaned tasks (keeps them queryable).z1A2A: orphaned task %s marked failed (timeout %ds)r   zA2A: watchdog errorT©Úexc_infoN)r  ÚwaitÚ_WATCHDOG_INTERVALr  Úfail_orphansÚ_ORPHAN_TIMEOUTr‹   Úwarningr   rÀ   Útasks_failedr-   rŒ   )rz   Útids     r$   r1  zA2AAdapter._watchdog_loopÖ  sí   € àÔ%×*Ò*Õ+=Ñ>Ô>ð 	CðCØœ:×2Ò2µ?ÑCÔCð 7ð 7�CÝ—N’NÐ#VÐX[Õ]lÑmÔmÐmÝÔ$Ð1Ô1°QÑ6Ð1Ô1Ð1ð7øõ ð Cð Cð CÝ—’Ð2¸T�ÑBÔBÐBÐBÐBðCøøøð Ô%×*Ò*Õ+=Ñ>Ô>ð 	Cð 	Cð 	Cð 	Cð 	Cs   ¡AA? Á?&B(Â'B(r’   c                ó~   — 	 ddl m}  |¦   «         pi }t          |t          ¦  «        r|ni S # t          $ r i cY S w xY w)Nr   )Úload_config)rK   rP  rÓ   r’   r-   )rz   rP  Úcfgs      r$   Ú_load_global_a2a_configz"A2AAdapter._load_global_a2a_configâ  sf   € ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø�+‘-”-Ð% 2ˆCÝ$ S­$Ñ/Ô/Ð7�3�3°RÐ7øÝð 	ð 	ð 	ØˆIˆIˆIð	øøøs   ‚*- ­<»<rù   údict[str, dict]c                óR  — |                      d¦  «        p|                      d¦  «        }|€S|                      ¦   «         }|                      d¦  «        p)|                      d¦  «        pi                       d¦  «        }i }t          j        dd¦  «        }ddd| j        d	| j        || j        d
œ|d<   h d£}i }t          |t          ¦  «        r| 	                    ¦   «         n't          |t          ¦  «        rt          |pg ¦  «        ng }|D �]˜\  }	}
t          |
t          ¦  «        sŒt          t          |
                      d¦  «        p|
                      d¦  «        p|	¦  «        ¦  «        }|sŒet          t          |
                      d¦  «        p|¦  «        ¦  «        }|r||v rt                               d||¦  «         Œ¹t          |
                      d¦  «        p|¦  «                             ¦   «         }d|z   }|
                      d¦  «        p+|
                      d¦  «        p|
                      d¦  «        pg }t          |t          ¦  «        rd„ |                     d¦  «        D ¦   «         }t%          |
                      d¦  «        ¦  «        p|dd| j        fv }t          |
                      d¦  «        p|¦  «                             ¦   «         }|r.||v r%t                               d||||         ¦  «         �Œø|||<   ||||p||t          |
                      d¦  «        pd|› �¦  «        t          |
                      d¦  «        pd|p|› d�¦  «        t          |pg ¦  «        t'          |
                      d ¦  «        pt)          ¦   «         ¦  «        d!œ	||<   �Œš|S )"a  Load served-agent routing config.

        Preferred config location is ``platforms.a2a.extra.agents``. A top-level
        ``a2a_served_agents`` fallback is accepted for scripts/tests. Root/default
        always maps to the live gateway session for backward compatibility.
        Úagentsr¶   NÚa2a_served_agentsrö   ÚA2A_AGENT_DESCRIPTIONõ<   Hermes Agent â€” a general-purpose agent reachable over A2A.r)   T)r6   rL   ÚtenantrF   Úlocalr.   Údescriptionr  >   ú.well-knownÚhealthrÀ   r6   rÆ   rL   z;A2A: ignoring served agent %r with reserved/invalid path %rrF   r2   r  ÚtoolsetsÚcapabilitiesc                ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r"   )r*   rý   s     r$   r   z2A2AAdapter._load_served_agents.<locals>.<listcomp>  s-   € ÐPÐPÐP¨!ÀaÇgÂgÁiÄiÐP˜AŸGšG™IœIÐPÐPÐPr#   r¦   rZ  r3   rY  zIA2A: ignoring served agent %r with duplicate tenant %r already used by %rr.   zHermes r[  zHermes profile 'z' exposed over A2A.Útimeout)	r6   rL   rY  rF   rZ  r.   r[  r  ra  )r`   rR  r   r   r  r»   r  rÓ   r’   Úitemsrb   Ú	enumerater7   r&   r‹   rL  r*   r5   r   rQ   r%   )rz   rù   rê   rQ  rU  Údefault_descÚreservedÚtenantsrb  ÚkeyÚvalr6   Úpath_segmentrF   rL   r^  rZ  rY  s                     r$   r  zA2AAdapter._load_served_agentsê  s»  € ð �iŠi˜Ñ!Ô!Ð? U§Y¢Y¨Ñ%?Ô%?ˆØˆ;Ø×.Ò.Ñ0Ô0ˆCØ—'’'Ð-Ñ.Ô.Ð]°3·7²7¸5±>´>Ð3GÀR×2LÒ2LÈ_Ñ2]Ô2]ˆCà"$ˆÝ”yØ#ØJñ
ô 
ˆð
 ØØØÔ+ØØ”OØ'Ø#'Ô#<ð	
ð 	
ˆˆr‰
ð 8Ð7Ð7ˆØ"$ˆÝ)¨#­tÑ4Ô4Ðo�—	’	‘”�ÕR\Ð]`ÕbfÑRgÔRgÐ:o½)ÀCÀIÈ2Ñ:NÔ:NÐ:NÐmoˆØð #	ñ #	‰HˆC�Ý˜c¥4Ñ(Ô(ð ØÝ�s 3§7¢7¨6¡?¤?Ð#J°c·g²g¸d±m´mÐ#JÀsÑKÔKÑLÔLˆDØð ØÝ&¥s¨3¯7ª7°6©?¬?Ð+B¸dÑ'CÔ'CÑDÔDˆLØð  <°8Ð#;Ð#;Ý—’Ð\Ð^bÐdpÑqÔqÐqØÝ˜#Ÿ'š' )Ñ,Ô,Ð4°Ñ5Ô5×;Ò;Ñ=Ô=ˆGØ˜Ñ%ˆDØ—w’wÐ4Ñ5Ô5Ðm¸¿ºÀÑ9LÔ9LÐmÐPS×PWÒPWÐXfÑPgÔPgÐmÐkmˆHÝ˜(¥CÑ(Ô(ð QØPÐP¨x¯~ª~¸cÑ/BÔ/BÐPÑPÔP�Ý˜Ÿš Ñ)Ô)Ñ*Ô*Ð^¨g¸"¸iÈÔI]Ð9^Ð.^ˆEÝ˜Ÿš Ñ*Ô*Ð2¨dÑ3Ô3×9Ò9Ñ;Ô;ˆFØð 'Ø˜WÐ$Ð$Ý—N’NØcØ˜f g¨f¤oñô ð ñ Ø"&�˜‘àØØ Ø"˜? dØÝ˜CŸGšG F™OœOÐ?Ð/?¸Ð/?Ð/?Ñ@Ô@Ý" 3§7¢7¨=Ñ#9Ô#9Ð#tÐ=tÐPWÐP_Ð[_Ð=tÐ=tÐ=tÑuÔuÝ'+¨H¨N¸Ñ';Ô';Ý˜sŸwšw yÑ1Ô1ÐEµ^Ñ5EÔ5EÑFÔFð
ð 
ˆF�4‰L‰Lð ˆr#   Nrµ   rG   ú
list[dict]c                ó    ‡— |pd                      ¦   «         pd| j        › d| j        › d�Šˆfd„| j                             ¦   «         D ¦   «         S )Nr)   úhttp://ú:r2   c                ó,  •— g | ]�}|d          pd|                      d¦  «        t          ‰|                      dd¦  «        ¦  «        |                      d¦  «        pd|                      d¦  «        t          |                      d¦  «        ¦  «        d	œ‘Œ‘S )
r6   r3   r.   rL   r)   rY  NrF   rZ  )r6   r.   ÚurlrY  rF   rZ  )r`   r?   r   )rþ   Úar8   s     €r$   r   z4A2AAdapter._served_agent_summary.<locals>.<listcomp>1  sœ   ø€ ð 

ð 

ð 

ð ð ˜&œ	Ð. YØŸš˜f™œÝ   q§u¢u¨V°RÑ'8Ô'8Ñ9Ô9ØŸ%š% ™/œ/Ð1¨TØŸ5š5 Ñ+Ô+Ý˜aŸeše G™nœnÑ-Ô-ðð ð

ð 

ð 

r#   )r*   rª   rû   r	  r>  )rz   rµ   r8   s     @r$   r¿   z A2AAdapter._served_agent_summary/  sq   ø€ ØÐ ˜b×'Ò'Ñ)Ô)ÐOÐ-O°t´yÐ-OÐ-OÀ4Ä9Ð-OÐ-OÐ-Oˆð

ð 

ð 

ð 

ð ”\×(Ò(Ñ*Ô*ð

ñ 

ô 

ð 
	
r#   Úraw_pathc                ó°  — t           j                             |pd¦  «        j        pd}t	          | j                             ¦   «         d„ d¬¦  «        D ]t}|                     dd¦  «        pd}|rX||k    s|                     |dz   ¦  «        r:|t          |¦  «        d …         pd}|                     d¦  «        sd|z   }||dœc S Œu| j        d         |dœS )Nr2   c                óH   — t          |                      dd¦  «        ¦  «        S )NrL   r)   )r�   r`   )rp  s    r$   ú<lambda>z,A2AAdapter._route_for_path.<locals>.<lambda>@  s   € ÅÀQÇUÂUÈ6ÐSUÑEVÔEVÑAWÔAW€ r#   T)rg  ÚreverserL   r)   ©r®   r¯   )
r<   r=   ÚurlsplitrL   Úsortedr	  r>  r`   Ú
startswithr�   )rz   rq  rL   r®   r9   r¯   s         r$   r¸   zA2AAdapter._route_for_path=  sò   € ÝŒ|×$Ò$ X _°Ñ5Ô5Ô:ÐA¸cˆå˜DœL×/Ò/Ñ1Ô1Ð7WÐ7WÐaeÐfÑfÔfð 	<ð 	<ˆEØ—Y’Y˜v rÑ*Ô*Ð0¨bˆFØð <˜4 6š>˜>¨T¯_ª_¸VÀc¹\Ñ-JÔ-J˜>Ø�s 6™{œ{˜|˜|Ô,Ð3°�Ø×)Ò)¨#Ñ.Ô.ð ,Ø! G™m�GØ!&°7Ð;Ð;Ð;Ð;Ð;øØœ bÔ)°dÐ;Ð;Ð;r#   rÇ   c                óÞ  ‡— |                       |¦  «        }|d         }t          |pi                      d¦  «        pd¦  «        Š|                     d¦  «        dk    rB‰r@ˆfd„| j                             ¦   «         D ¦   «         }|r|d         |d         dœ}|d         }t          |                     d¦  «        pd¦  «        }‰r'|r%‰|k    rd	d
‰›d|                     d¦  «        pd› �iS |S )Nr®   rY  r)   r6   c                óF   •— g | ]}|                      d ¦  «        ‰k    ¯|‘ŒS )rY  ro   )rþ   rp  rY  s     €r$   r   z1A2AAdapter._route_for_request.<locals>.<listcomp>O  s-   ø€ ÐUÐUÐU˜Q¸1¿5º5À¹?¼?ÈfÒ;TÐ;T�qÐ;TÐ;TÐ;Tr#   r   r¯   rv  r·   ztenant z does not match routed agent r3   )r¸   r&   r`   r	  r>  )rz   rq  rÇ   rÂ   r®   ÚmatchesÚexpectedrY  s          @r$   rÕ   zA2AAdapter._route_for_requestI  s  ø€ Ø×$Ò$ XÑ.Ô.ˆØ�g”ˆÝ�f�l ×'Ò'¨Ñ1Ô1Ð7°RÑ8Ô8ˆà�9Š9�VÑÔ Ò"Ð" vÐ"ØUÐUÐUÐU $¤,×"5Ò"5Ñ"7Ô"7ÐUÑUÔUˆGØð #Ø")¨!¤*¸¸yÔ9IÐJÐJ�Ø œ
�Ý�u—y’y Ñ*Ô*Ð0¨bÑ1Ô1ˆØð 	p�hð 	p 6¨XÒ#5Ð#5ØÐn vÐnÐnÈeÏiÊiÐX^ÑN_ÔN_ÐNlÐclÐnÐnÐoÐoØˆr#   r®   úOptional[dict]c                ó   — |p| j         d         }|pd                     ¦   «         pd| j        › d| j        › d�}t	          ||                     dd¦  «        ¦  «        }t          j        |                     d¦  «        p| j        ||                     d¦  «        pd|  	                    |¦  «        t          |                     d	d
¦  «        ¦  «        d
t          j        ¦   «          t          |                     d¦  «        pd¦  «        ¬¦  «        S )Nr)   rl  rm  r2   rL   r.   r[  rX  rZ  TrY  )r.   ro  r[  ÚskillsÚ	streamingÚpush_notificationsÚauth_requiredrY  )r	  r*   rª   rû   r?   r`   r   Úbuild_agent_cardr»   Ú_advertised_skillsr   r   r¼   r&   )rz   rµ   r®   r8   ro  s        r$   rº   zA2AAdapter._build_cardX  s  € ð Ð)˜œ bÔ)ˆØÐ ˜b×'Ò'Ñ)Ô)ÐOÐ-O°t´yÐ-OÐ-OÀ4Ä9Ð-OÐ-OÐ-OˆÝ˜˜eŸiši¨°Ñ3Ô3Ñ4Ô4ˆÝÔ(Ø—’˜6Ñ"Ô"Ð5 d¤oØØŸ	š	 -Ñ0Ô0ÐrÐ4rØ×*Ò*¨5Ñ1Ô1Ý˜5Ÿ9š9 W¨dÑ3Ô3Ñ4Ô4Ø#Ý&Ô5Ñ7Ô7Ð7Ý�u—y’y Ñ*Ô*Ð0¨bÑ1Ô1ð	
ñ 	
ô 	
ð 		
r#   c                ó²  ‡‡— 	 ddl mŠ ‰                     ¦   «         }|r|pi                      d¦  «        n| j        }t          |pg ¦  «        pdŠˆˆfd„|D ¦   «         }|rt          j        |¦  «        S n,# t          $ r t           
                    dd¬¦  «         Y nw xY w|r|pi                      d¦  «        n| j        }t          j        |pg ¦  «        S )	a6  Dynamic Agent Card skills from the live tool registry.

        The card reflects what the agent can actually do right now. An
        explicit ``advertised_toolsets`` config (or A2A_ADVERTISED_TOOLSETS)
        restricts what we advertise; without a registry we fall back to that
        static list.
        r   )Úregistryr  Nc                óH   •— i | ]}‰�|‰v ¯|‰                      |¦  «        “ŒS rw   )Úget_tool_names_for_toolset)rþ   ÚnÚallowedÚtool_registrys     €€r$   ú
<dictcomp>z1A2AAdapter._advertised_skills.<locals>.<dictcomp>w  s>   ø€ ð ð ð àØ�? a¨7 l lð �=×;Ò;¸AÑ>Ô>à&2 l lr#   z-A2A: tool registry unavailable for Agent CardTrF  )Útools.registryr‡  Úget_registered_toolset_namesr`   r  r;  r   Úskills_from_toolsetsr-   r‹   rŒ   )rz   r®   ÚnamesÚ
configuredrp   r‹  rŒ  s        @@r$   r…  zA2AAdapter._advertised_skillsj  s/  øø€ ð	YØ@Ð@Ð@Ð@Ð@Ð@Ø!×>Ò>Ñ@Ô@ˆEØEJÐi˜%˜+ 2×*Ò*Ð+@ÑAÔAÐAÐPTÔPiˆJÝ˜*Ð*¨Ñ+Ô+Ð3¨tˆGðð ð ð ð àðñ ô ˆGð
 ð >ÝÔ4°WÑ=Ô=Ð=ð>øåð 	Yð 	Yð 	YÝ�LŠLÐHÐSWˆLÑXÔXÐXÐXÐXð	YøøøàAFÐe�e�k˜r×&Ò&Ð'<Ñ=Ô=Ð=ÈDÔLeˆ
ÝÔ,¨ZÐ-=¸2Ñ>Ô>Ð>s   „A1A7 Á7&B ÂB Útask_idÚ
context_idr   c                óì   — t          ¦   «         }| j        5  ||f| j        |<   | j                             |t          ¦   «         ¦  «                             |¦  «         d d d ¦  «         n# 1 swxY w Y   |S rw   )r   r  r  r  Ú
setdefaultr   Úappend)rz   r“  r”  rC  s       r$   Ú_add_pendingzA2AAdapter._add_pending…  s½   € Ý‘h”hˆØÔð 	Pð 	PØ&0°#Ð%6ˆDŒM˜'Ñ"ØÔ×*Ò*¨:µu±w´wÑ?Ô?×FÒFÀwÑOÔOÐOð	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	Pð ˆ
s   –AA)Á)A-Á0A-c                óX  — | j         5  | j                             |d ¦  «        }|rl| j                             |d         ¦  «        }|rJ	 |                     |¦  «         n# t          $ r Y nw xY w|s!| j                             |d         d ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr   )r  r  Úpopr  r`   Úremover    )rz   r“  ÚentryÚorders       r$   Ú_pop_pendingzA2AAdapter._pop_pendingŒ  s&  € ØÔð 
	@ð 
	@Ø”M×%Ò% g¨tÑ4Ô4ˆEØð @ØÔ+×/Ò/°°a´Ñ9Ô9�Øð @ðØŸš WÑ-Ô-Ð-Ð-øÝ%ð ð ð Ø˜ðøøøà ð @ØÔ+×/Ò/°°a´¸$Ñ?Ô?Ð?ð
	@ð 
	@ð 
	@ñ 
	@ô 
	@ð 
	@ð 
	@ð 
	@ð 
	@ð 
	@ð 
	@ð 
	@øøøð 
	@ð 
	@ð 
	@ð 
	@ð 
	@ð 
	@s6   ˆA BÁ	AÁBÁ
A,Á)BÁ+A,Á,&BÂB#Â&B#ÚstateÚtextc                ó  — | j         5  | j                             |¦  «        }|rE|d                              ¦   «         s+|d                              ||f¦  «         	 d d d ¦  «         dS d d d ¦  «         n# 1 swxY w Y   dS )Nr   TF)r  r  r`   r?  r@  )rz   r“  rŸ  r   rœ  s        r$   Ú_resolve_taskzA2AAdapter._resolve_task™  sÞ   € ØÔð 	ð 	Ø”M×%Ò% gÑ.Ô.ˆEØð ˜U 1œXŸ]š]™_œ_ð Ø�a”×#Ò# U¨D MÑ2Ô2Ð2Øð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 ˆus   ˆAA6Á6A:Á=A:c                óD  — | j         5  | j                             |d¦  «        D ]c}| j                             |¦  «        }|rE|d                              ¦   «         s+|d                              ||f¦  «          d d d ¦  «         dS Œd	 d d d ¦  «         n# 1 swxY w Y   dS )Nr"   r   TF)r  r  r`   r  r?  r@  )rz   r”  rŸ  r   r“  rœ  s         r$   Ú_resolve_oldest_for_contextz&A2AAdapter._resolve_oldest_for_context¡  s  € ØÔð 	 ð 	 ØÔ.×2Ò2°:¸rÑBÔBð  ð  �Øœ×)Ò)¨'Ñ2Ô2�Øð    q¤§¢¡¤ð  Ø˜!”H×'Ò'¨°¨Ñ6Ô6Ð6Øð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 øð ð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð ˆus   ˆA2BÂBÂBÂBútuple[str, str]c                ó°   — |p| j         d         }t          |                     d¦  «        pd¦  «        t          |                     d¦  «        pd¦  «        fS )Nr)   r6   rY  )r	  r&   r`   )rz   r®   s     r$   Ú_scope_for_agentzA2AAdapter._scope_for_agentª  sP   € ØÐ)˜œ bÔ)ˆÝ�5—9’9˜VÑ$Ô$Ð*¨Ñ+Ô+­S°·²¸8Ñ1DÔ1DÐ1JÈÑ-KÔ-KÐKÐKr#   rg  útuple[str, str, str]úthreading.Lockc                óº   — | j         5  | j                             |¦  «        }|€t          j        ¦   «         }|| j        |<   |cd d d ¦  «         S # 1 swxY w Y   d S rw   )r  r  r`   r  r  )rz   rg  Úlocks      r$   Ú_forward_lockzA2AAdapter._forward_lock®  s§   € ØÔ.ð 	ð 	ØÔ.×2Ò2°3Ñ7Ô7ˆDØˆ|Ý ”~Ñ'Ô'�Ø37�Ô+¨CÑ0Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ;AÁAÁAÚpeerú%tuple[Optional[dict], Optional[dict]]c                óü
  — |p| j         d         }t          j        |¦  «        }t          j        |¦  «        pt          j        ¦   «         }t          j        ¦   «         }| j                             |¦  «        }|t          j        ¦   «         k    rÙt          j	        xj
        dz  c_
        t                               d||t          j        ¦   «         ¦  «          | j        j        |||g|                      |¦  «        ¢R Ž }| j                             |t          j        d¦  «         t          j        ||t          j        d|› dt          j        ¦   «         › d�|d         ¬¦  «        d	fS |sy | j        j        |||g|                      |¦  «        ¢R Ž }| j                             |t          j        d¦  «         t          j        ||t          j        d
|d         ¬¦  «        d	fS t'          j        ||¦  «        }	t'          j        d|||¦  «         t          j        |d||¦  «         t          j	        xj        dz  c_         | j        j        |||g|                      |¦  «        ¢R Ž }|                      |||¬¦  «         |                     dd¦  «        sý|                      ||||	¦  «        \  }
}| j                             |||
¦  «         t          j        |d|
|¦  «         t'          j        d|||
¦  «         |t          j        k    r5t          j	        xj        dz  c_        t          j	        xj        dz  c_        nt          j	        xj        dz  c_        |                      |||
|¦  «         t          j        ||||
|d         ¬¦  «        d	fS | j         �| j!        €k| j                             |t          j"        d¦  «         t          j	        xj        dz  c_        t          j        ||t          j"        d|d         ¬¦  «        d	fS |  #                    ||¦  «        }tI          |	tJ          j&        |  '                    |d|› �d||¬¦  «        |¬¦  «        }	 tQ          j)        |  *                    |¦  «        | j         ¦  «         n®# tV          $ r¡}|  ,                    |¦  «         t'          j-        d|› �¦  «        }| j                             |t          j"        |¦  «         t          j	        xj        dz  c_        t          j        ||t          j"        ||d         ¬¦  «        d	fcY d	}~S d	}~ww xY w| j         .                    |t          j/        ¦  «         d	|||||d         ta          j0        ¦   «         dœfS )a  Validate, register, and dispatch an inbound message.

        Returns (terminal_task, None) when the task ends immediately
        (rejected / not ready), else (None, pending) where pending carries
        the future the caller must wait on. Runs on an HTTP worker thread.
        r)   r   z6A2A: anti-loop triggered for context %s (turn %d > %d)zAnti-loop protection: context z
 exceeded z? turns. Start a new context or increase A2A_MAX_PINGPONG_TURNS.Úcreated_iso©Ú
created_atNu   Empty task â€” nothing to do.ÚinboundÚuserr±   rZ  Tr®   Úoutboundz,Agent gateway not ready to accept A2A tasks.úa2a:Údm)Úchat_idÚ	chat_nameÚ	chat_typeÚuser_idÚ	user_name)r   Úmessage_typeÚsourceÚ
message_idzDispatch failed: )r“  r”  r­  Úfuturer°  Ústarted)1r	  r   Úextract_textÚextract_context_idÚnew_context_idÚnew_task_idr  ÚtrackÚmax_pingpong_turnsrÀ   Úanti_loop_triggersr‹   rL  r  Úcreater§  ÚcompleteÚSTATE_REJECTEDÚ
build_taskr   Úwrap_inboundÚauditÚpersist_messageÚinbound_totalÚ_register_inline_pushr`   Ú_forward_to_profileÚSTATE_COMPLETEDÚoutbound_totalÚtasks_completedrM  Ú_send_push_notificationr  Ú_message_handlerrA  r˜  r   r   ÚTEXTÚbuild_sourcer(  Úrun_coroutine_threadsafeÚhandle_messager-   rž  Úredact_outboundÚ	set_stateÚSTATE_WORKINGÚtime)rz   rÇ   r­  r®   r   r”  r“  ÚturnÚrecÚframedÚreplyrŸ  rC  Úeventr5  Úmsgs                   r$   Ú_prepare_taskzA2AAdapter._prepare_task¸  sã  € ð Ð)˜œ bÔ)ˆÝÔ$ VÑ,Ô,ˆÝÔ0°Ñ8Ô8ÐU½HÔ<SÑ<UÔ<Uˆ
ÝÔ&Ñ(Ô(ˆð Œ{× Ò  Ñ,Ô,ˆØ•(Ô-Ñ/Ô/Ò/Ð/ÝÔÐ/Ô/°1Ñ4Ð/Ô/Ý�NŠNÐSØ% t­XÔ-HÑ-JÔ-JñLô Lð Là#�$”*Ô# G¨Z¸Ð]À×@UÒ@UÐV[Ñ@\Ô@\Ð]Ð]Ð]ˆCØŒJ×Ò ­Ô)@À"ÑEÔEÐEÝÔ&Ø˜¥XÔ%<ð4°ð 4ð 4ÝÔ.Ñ0Ô0ð4ð 4ð 4ð ˜}Ô-ðñ ô ð ðð ð ð 	Ø#�$”*Ô# G¨Z¸Ð]À×@UÒ@UÐV[Ñ@\Ô@\Ð]Ð]Ð]ˆCØŒJ×Ò ­Ô)@À"ÑEÔEÐEÝÔ&Ø˜¥XÔ%<Ø/¸CÀÔ<Nðñ ô ð ðð õ
 Ô& t¨TÑ2Ô2ˆÝŒ�y $¨°Ñ6Ô6Ð6ÝÔ  ¨V°T¸7ÑCÔCÐCÝÔÐ&Ô&¨!Ñ+Ð&Ô&àˆdŒjÔ ¨°TÐY¸D×<QÒ<QÐRWÑ<XÔ<XÐYÐYÐYˆØ×"Ò" 7¨F¸%Ð"Ñ@Ô@Ð@à�yŠy˜ $Ñ'Ô'ð 	oØ×3Ò3°E¸4ÀÈVÑTÔT‰LˆE�5ØŒJ×Ò ¨°Ñ6Ô6Ð6ÝÔ$ Z°¸%ÀÑIÔIÐIÝŒN˜: t¨W°eÑ<Ô<Ð<Ø�Ô0Ò0Ð0ÝÔ Ð/Ô/°1Ñ4Ð/Ô/ÝÔ Ð0Ô0°AÑ5Ð0Ô0Ð0åÔ Ð-Ô-°Ñ2Ð-Ô-Ø×(Ò(¨°*¸eÀUÑKÔKÐKÝÔ& w°
¸EÀ5ÐUXÐYfÔUgÐhÑhÔhÐjnÐnÐnàŒ:Ð Ô!6Ð!>ØŒJ×Ò ­Ô)>ÀÑCÔCÐCÝÔÐ)Ô)¨QÑ.Ð)Ô)ÝÔ&Ø˜¥XÔ%:Ø>Ø˜}Ô-ðñ ô ð ð	ð ð ×Ò ¨Ñ4Ô4ˆåØÝ$Ô)Ø×$Ò$Ø"Ø' ˜-˜-ØØØð %ñ ô ð ð
ñ 
ô 
ˆð
	ÝÔ,¨T×-@Ò-@ÀÑ-GÔ-GÈÌÑTÔTÐTÐTøÝð 	ð 	ð 	Ø×Ò˜gÑ&Ô&Ð&ÝÔ*Ð+B¸qÐ+BÐ+BÑCÔCˆCØŒJ×Ò ­Ô)>ÀÑDÔDÐDÝÔÐ)Ô)¨QÑ.Ð)Ô)ÝÔ&Ø˜¥XÔ%:¸CØ˜}Ô-ðñ ô ð ðð ð ð ð ð ð øøøøð	øøøð 	Œ
×Ò˜W¥hÔ&<Ñ=Ô=Ð=ØØØ$ØØØ˜}Ô-Ý”y‘{”{ð
ð 
ð 
ð 	
s   Ñ-R	 Ò	
T4ÒBT/Ô)T4Ô/T4rF   c                óh   — t          |¦  «        }|sd S t          j                             |d¦  «        S )Nzstate.db)rN   r   rL   Újoin)rz   rF   Úhomes      r$   Ú_profile_state_dbzA2AAdapter._profile_state_db  s2   € Ý˜WÑ%Ô%ˆØð 	Ø�4ÝŒw�|Š|˜D *Ñ-Ô-Ð-r#   Útitlec                ó¦  — |                       |¦  «        }|rt          j                             |¦  «        sdS 	 t	          j        |d¬¦  «        }|                     d|f¦  «                             ¦   «         }|                     ¦   «          |rt          |d         ¦  «        ndS # t          $ r  t                               dd¬¦  «         Y dS w xY w)	Nr)   r   ©ra  zHSELECT id FROM sessions WHERE title = ? ORDER BY started_at DESC LIMIT 1r   z'A2A: could not lookup forwarded sessionTrF  ©rê  r   rL   ÚexistsÚsqlite3r7  ÚexecuteÚfetchoneÚcloser&   r-   r‹   rŒ   )rz   rF   rë  ÚdbÚconÚrows         r$   Ú_lookup_forward_sessionz"A2AAdapter._lookup_forward_session%  sÚ   € Ø×#Ò# GÑ,Ô,ˆØð 	�œŸš¨Ñ+Ô+ð 	Ø�2ð
	Ý”/ "¨aÐ0Ñ0Ô0ˆCØ—+’+ØZØ�ñô ÷ Šh‰jŒjð ð �IŠI‰KŒKˆKØ"%Ð-•3�s˜1”v‘;”;�;¨2Ð-øÝð 	ð 	ð 	Ý�LŠLÐBÈTˆLÑRÔRÐRØ�2�2ð	øøøs   ºA+B& Â&&CÃCÚstarted_afterr   c                ó¬  — |                       |¦  «        }|rt          j                             |¦  «        sdS 	 t	          j        |d¬¦  «        }|                     d|dz
  f¦  «                             ¦   «         }|                     ¦   «          |rt          |d         ¦  «        ndS # t          $ r  t                               dd¬	¦  «         Y dS w xY w)
Nr)   r   rí  zaSELECT id FROM sessions WHERE source = 'a2a' AND started_at >= ? ORDER BY started_at DESC LIMIT 1g       @r   z,A2A: could not find latest forwarded sessionTrF  rî  )rz   rF   rø  rô  rõ  rö  s         r$   Ú_latest_a2a_sessionzA2AAdapter._latest_a2a_session5  sá   € Ø×#Ò# GÑ,Ô,ˆØð 	�œŸš¨Ñ+Ô+ð 	Ø�2ð
	Ý”/ "¨aÐ0Ñ0Ô0ˆCØ—+’+ØsØ Ñ$Ð&ñô ÷ Šh‰jŒjð ð �IŠI‰KŒKˆKØ"%Ð-•3�s˜1”v‘;”;�;¨2Ð-øÝð 	ð 	ð 	Ý�LŠLÐGÐRVˆLÑWÔWÐWØ�2�2ð	øøøs   ºA.B) Â)&CÃCÚ
session_idc                ó‚  — |                       |¦  «        }|r!t          j                             |¦  «        r|sd S 	 t	          j        |d¬¦  «        }|                     d||f¦  «         |                     ¦   «          |                     ¦   «          d S # t          $ r  t                               dd¬¦  «         Y d S w xY w)Nr   rí  z*UPDATE sessions SET title = ? WHERE id = ?z&A2A: could not title forwarded sessionTrF  )rê  r   rL   rï  rð  r7  rñ  Úcommitró  r-   r‹   rŒ   )rz   rF   rû  rë  rô  rõ  s         r$   Ú_title_forward_sessionz!A2AAdapter._title_forward_sessionE  sÏ   € Ø×#Ò# GÑ,Ô,ˆØð 	�œŸš¨Ñ+Ô+ð 	°:ð 	ØˆFð	RÝ”/ "¨aÐ0Ñ0Ô0ˆCØ�KŠKÐDÀuÈjÐFYÑZÔZÐZØ�JŠJ‰LŒLˆLØ�IŠI‰KŒKˆKˆKˆKøÝð 	Rð 	Rð 	RÝ�LŠLÐAÈDˆLÑQÔQÐQÐQÐQÐQð	Røøøs   ¼AB Â&B>Â=B>Úframed_textc           
     ó  — t          |                     d¦  «        p|                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        p|pd¦  «        }t          |¦  «        }d|› d|› �}|pd||f}	t	          |                     d¦  «        pt          ¦   «         ¦  «        }
|                      |	¦  «        }|5  | j                             |	¦  «        p|                      ||¦  «        }d	d
d|dddg}|r| 	                    d|g¦  «         t          j                             ¦   «         }t          |¦  «        }|r||d<   ||d<   t          j        ¦   «         }	 t          j        |dd|
|dt          j        ¬¦  «        }np# t          j        $ r dt&          j        fcY cddd¦  «         S t*          $ r9}t-          j        d|› �¦  «        t&          j        fcY d}~cddd¦  «         S d}~ww xY w|j        dk    r^|j        p|j        p	d|j        › �                     ¦   «         }t-          j        |dd…         ¦  «        t&          j        fcddd¦  «         S |s9|                      ||¦  «        }|r!|| j        |	<   |                      |||¦  «         t-          j        |j        pd                     ¦   «         ¦  «        t&          j        fcddd¦  «         S # 1 swxY w Y   dS )a€  Forward a routed A2A task to another local Hermes profile.

        First contact creates a normal ``source=a2a`` CLI session, records its
        session id, and titles it deterministically. Later turns resume by the
        concrete session id, not by a non-existent name. The public CLI boundary
        is preserved while giving A2A contexts stable multi-turn continuity.
        rF   r6   r)   r®   za2a-rS   r3   ra  ÚhermesÚchatz-qz-Qz--sourcerö   z--resumeÚHERMES_HOMEÚHERMES_A2A_PEERTF)Úcapture_outputr   ra  ÚenvÚcheckÚstdinz[profile did not reply in time]NzProfile dispatch failed: r   zprofile exited i0øÿÿ)r&   r`   r*   rW   rQ   r%   r¬  r  r÷  Úextendr   ÚenvironÚcopyrN   rß  Ú
subprocessÚrunÚDEVNULLÚTimeoutExpiredr   rA  r-   r   rÜ  Ú
returncodeÚstderrÚstdoutrú  rþ  rÓ  )rz   r®   r­  r”  rÿ  rF   r6   Úsafe_ctxÚsession_titlerg  ra  r«  rû  Úcmdr  ré  r/  Úprocr5  rå  s                       r$   rÒ  zA2AAdapter._forward_to_profileQ  sü  € õ �e—i’i 	Ñ*Ô*ÐE¨e¯iªi¸Ñ.?Ô.?ÐEÀ2ÑFÔF×LÒLÑNÔNˆÝ�5—9’9˜VÑ$Ô$Ð:¨Ð:°7Ñ;Ô;ˆÝ% jÑ1Ô1ˆØ0˜tÐ0Ð0 hÐ0Ð0ˆØÐ#˜) T¨8Ð4ˆÝ�e—i’i 	Ñ*Ô*Ð>­nÑ.>Ô.>Ñ?Ô?ˆà×!Ò! #Ñ&Ô&ˆØð 	cð 	cØÔ/×3Ò3°CÑ8Ô8Ðp¸D×<XÒ<XÐY`ÐboÑ<pÔ<pˆJØ˜V T¨;¸¸jÈ%ÐPˆCØð 5Ø—
’
˜J¨
Ð3Ñ4Ô4Ð4å”*—/’/Ñ#Ô#ˆCÝ  Ñ)Ô)ˆDØð *Ø%)��MÑ"Ø%)ˆCÐ!Ñ"Ý”I‘K”KˆEðhÝ!”~Ø¨°4ÀØ 5µ
Ô0Bðñ ô ��øõ Ô,ð Pð Pð PØ8½(Ô:OÐOÐOÐOð%	cð 	cð 	cð 	cñ 	cô 	cð 	cð 	cõ& ð hð hð hÝÔ/Ð0OÈAÐ0OÐ0OÑPÔPÕRZÔRgÐgÐgÐgÐgÐgÐgð)	cð 	cð 	cð 	cñ 	cô 	cð 	cð 	cøøøøð&høøøàŒ !Ò#Ð#Ø”{ÐX d¤kÐXÐ5XÀtÄÐ5XÐ5X×_Ò_ÑaÔa�ÝÔ/°°E°F°F´Ñ<Ô<½hÔ>SÐSð/	cð 	cð 	cð 	cñ 	cô 	cð 	cð 	cð0 ð TØ!×5Ò5°g¸uÑEÔE�
Øð TØ2<�DÔ*¨3Ñ/Ø×/Ò/°¸À]ÑSÔSÐSÝÔ+¨T¬[Ð->¸B×,EÒ,EÑ,GÔ,GÑHÔHÍ(ÔJbÐbð;	cð 	cð 	cð 	cñ 	cô 	cð 	cð 	cð 	cð 	cð 	cð 	cøøøð 	cð 	cð 	cð 	cð 	cð 	csW   ÃBK6Å7%FÆK6ÆH
Æ:K6Ç	H
Ç"HÇ3H
Ç4K6ÈH
È
AK6É6A3K6Ë6K:Ë=K:Úpendingrã  c                óÀ  — |d         }|d         }|d         }|                       |¦  «         t          j        |pd¦  «        }|t          j        k    r„|                     ¦   «         }|                     ¦   «                              t          j        ¦  «        r?t          j	        }|t          t          j        ¦  «        d…                              ¦   «         }t          j        |d||¦  «         t          j        d|||¦  «         |t          j        t          j	        fv rnt          j        xj        dz  c_        t          j        xj        dz  c_        t          j                             t%          j        ¦   «         |d	         z
  ¦  «         nt          j        xj        dz  c_        | j                             |||¦  «         |                      ||||¦  «         ||fS )
zuRecord the outcome of a dispatched task. Returns (state, reply) after
        redaction and input-required detection.r“  r”  r­  r)   Nr®   rµ  r   rÁ  )rž  r   rÜ  r   rÓ  ÚlstripÚupperry  ÚINPUT_REQUIRED_MARKERÚSTATE_INPUT_REQUIREDr�   r*   rÏ  rÎ  rÀ   rÔ  rÕ  Úrecord_latencyrß  rM  r  rÊ  rÖ  )rz   r  rŸ  rã  r“  r”  r­  Ústrippeds           r$   Ú_finalize_taskzA2AAdapter._finalize_task€  s©  € ð ˜)Ô$ˆØ˜\Ô*ˆ
Ø�vŒˆØ×Ò˜'Ñ"Ô"Ð"åÔ(¨¨°"Ñ5Ô5ˆð •HÔ,Ò,Ð,Ø—|’|‘~”~ˆHØ�~Š~ÑÔ×*Ò*­8Ô+IÑJÔJð OÝ Ô5�Ø ¥¥XÔ%CÑ!DÔ!DÐ!EÐ!EÔF×LÒLÑNÔN�åÔ  ¨W°e¸WÑEÔEÐEÝŒ�z 4¨°%Ñ8Ô8Ð8à•XÔ-­xÔ/LÐMÐMÐMÝÔÐ+Ô+¨qÑ0Ð+Ô+ÝÔÐ,Ô,°Ñ1Ð,Ô,ÝÔ×+Ò+­D¬I©K¬K¸'À)Ô:LÑ,LÑMÔMÐMÐMåÔÐ)Ô)¨QÑ.Ð)Ô)àŒ
×Ò˜G U¨EÑ2Ô2Ð2Ø×$Ò$ W¨j¸%ÀÑGÔGÐGØ�eˆ|Ðr#   c                óÄ  — |d         }|d         t          ¦   «         z   }	 	 |                     |rt          n#t          d|t	          j        ¦   «         z
  ¦  «        ¬¦  «        S # t
          $ rX t	          j        ¦   «         |k    rt          j        dfcY S |r,	  |¦   «          n # t          $ r t          j        dfcY cY S w xY wY nt          $ r t          j        dfcY S w xY wŒÁ)a	  Block until the task's future resolves (or times out).

        ``keepalive`` is an optional zero-arg callable invoked every
        _SSE_KEEPALIVE seconds while waiting (used by the SSE paths); if it
        raises, the client is gone and we stop waiting.
        rÀ  rÁ  Tg        rí  z[agent did not reply in time]z[client disconnected])	r%   ÚresultÚ_SSE_KEEPALIVEr   rß  ÚFuturesTimeoutr   rA  r-   )rz   r  Ú	keepaliverC  Údeadlines        r$   Ú_await_replyzA2AAdapter._await_reply   s3  € ð ˜hÔ'ˆØ˜9Ô%­Ñ(8Ô(8Ñ8ˆð	PðPØ—z’z¸IÐ*k­.¨.Í3ÈsÐT\Õ_cÔ_hÑ_jÔ_jÑTjÑKkÔKk�zÑlÔlÐløÝ!ð Pð Pð PÝ”9‘;”; (Ò*Ð*Ý$Ô1Ð3RÐSÐSÐSÐSØð PðPØ!˜	™œ˜˜øÝ$ð Pð Pð PÝ (Ô 5Ð7NÐOÐOÐOÐOÐOÐOðPøøøøøåð Pð Pð PÝ Ô-Ð/NÐOÐOÐOÐOðPøøøð	PsB   ¢A A# Á#/CÂCÂ
B"Â!CÂ"B?Â:CÂ>B?Â?CÃCÃCFrì   r	   rÊ   c                óª  — |                       |||¬¦  «        \  }}|�-|rt          j        |¦  «        n|}t          j        ||¦  «        S |                      |¦  «        \  }	}
|                      ||	|
¦  «        \  }	}
t          j        |d         |d         |	|
|d         ¬¦  «        }|rt          j        |¦  «        n|}t          j        ||¦  «        S )Nr±   r“  r”  r°  r±  )ræ  r   Úsend_message_responseÚjsonrpc_resultr&  r  rÌ  )rz   rì   rÇ   r­  r®   rÊ   Úterminalr  r!  rŸ  rã  Útasks               r$   rÝ   zA2AAdapter._rpc_message_send·  sé   € Ø ×.Ò.¨v°tÀ5Ð.ÑIÔIÑˆ�'ØÐØALÐZ•XÔ3°HÑ=Ô=Ð=ÐRZˆFÝÔ*¨6°6Ñ:Ô:Ð:Ø×(Ò(¨Ñ1Ô1‰ˆˆuØ×*Ò*¨7°E¸5ÑAÔA‰ˆˆuÝÔ"Ø�IÔ ¨Ô 5°u¸eØ˜}Ô-ð
ñ 
ô 
ˆð :EÐN•Ô/°Ñ5Ô5Ð5È$ˆÝÔ& v¨vÑ6Ô6Ð6r#   c                ó¾   — |                       d¦  «         |                      dd¦  «         |                      dd¦  «         |                      ¦   «          d| _        d S )Nr°   r•   ztext/event-streamzCache-Controlzno-cacheT)r›   rœ   rž   Úclose_connection)Úhandlers    r$   Ú_sse_headerszA2AAdapter._sse_headersÇ  se   € à×Ò˜cÑ"Ô"Ð"Ø×Ò˜NÐ,?Ñ@Ô@Ð@Ø×Ò˜O¨ZÑ8Ô8Ð8Ø×ÒÑÔÐð $(ˆÔ Ð Ð r#   Úchunkc                ó’   — | j                              |                     d¦  «        ¦  «         | j                              ¦   «          d S )Nr”   )rŸ   r    rš   Úflush)r.  r0  s     r$   Ú
_sse_writezA2AAdapter._sse_writeÑ  s>   € àŒ×Ò˜EŸLšL¨Ñ1Ô1Ñ2Ô2Ð2ØŒ×ÒÑÔÐÐÐr#   c                óê  — |r‹|t           j        k    r{|                      |t          j        t          j        |||¦  «        |¦  «        ¦  «         |                      |t          j        t          j        |||¦  «        |¦  «        ¦  «         n>|                      |t          j        t          j        ||||¦  «        |¦  «        ¦  «         |                      |t          j        ¦   «         ¦  «         dS )uÊ   Emit the final artifact/status events and close the stream (v1.0:
        closure signals terminal state, no ``final`` field).

        ``req_id`` is threaded into JSON-RPC-wrapped SSE frames per Â§9.4.N)r   rÓ  r3  Ússe_dataÚartifact_updateÚstatus_updateÚsse_done)rz   r.  r“  r”  rŸ  rã  rì   s          r$   Ú_emit_terminalzA2AAdapter._emit_terminalÖ  s  € ð ð 	T�U�hÔ6Ò6Ð6Ø�OŠO˜G¥XÔ%6ÝÔ(¨°*¸eÑDÔDÀfñ&Nô &Nñ Oô Oð Oà�OŠO˜G¥XÔ%6ÝÔ& w°
¸EÑBÔBÀFñ&Lô &Lñ Mô Mð Mð Mð �OŠO˜G¥XÔ%6ÝÔ& w°
¸EÀ5ÑIÔIÈ6ñ&Sô &Sñ Tô Tð Tà�Š˜¥Ô!2Ñ!4Ô!4Ñ5Ô5Ð5Ð5Ð5r#   c                ó   ‡ ‡— t           j        xj        dz  c_        ‰                      ‰¦  «         	 ‰                      |||¬¦  «        \  }}|�q‰                      ‰|d         |d         |d         d         t          j        |                     di ¦  «                             di ¦  «        pi ¦  «        |¬	¦  «         dS |d
         |d         }	}‰                      ‰t          j	        t          j
        t          j        ||	t           j        |d         ¬¦  «        ¦  «        |¦  «        ¦  «         ‰                      ‰t          j	        t          j        ||	t           j        ¦  «        |¦  «        ¦  «         ‰                      |ˆˆ fd„¬¦  «        \  }
}‰                      ||
|¦  «        \  }
}‰                      ‰||	|
||¬	¦  «         dS # t"          t$          f$ r t&                               d¦  «         Y dS w xY w)ul   Handle message/stream as an SSE response of JSON-RPC-wrapped
        StreamResponse events (A2A v1.0 Â§9.4).r   r±   NrÆ   Ú	contextIdr³   rŸ  Úmessage©rì   r“  r”  r°  r±  c                 ó0   •— ‰                      ‰ d¦  «        S )Nú: keepalive

)r3  )r.  rz   s   €€r$   rt  z0A2AAdapter._rpc_message_stream.<locals>.<lambda>ÿ  s   ø€ ¨4¯?ª?¸7ÐDUÑ+VÔ+V€ r#   )r$  zA2A: stream client disconnected)r   rÀ   Ústreams_startedr/  ræ  r9  rÂ  r`   r3  r5  Ústream_taskrÌ  ÚSTATE_SUBMITTEDr7  rÞ  r&  r  ÚBrokenPipeErrorÚConnectionResetErrorr‹   rŒ   )rz   r.  rì   rÇ   r­  r®   r*  r  r“  r”  rŸ  rã  s   ``          r$   rÞ   zA2AAdapter._rpc_message_streamæ  s;  øø€ õ 	ÔÐ(Ô(¨AÑ-Ð(Ô(Ø×Ò˜'Ñ"Ô"Ð"ð	<Ø $× 2Ò 2°6¸4ÀuÐ 2Ñ MÔ MÑˆH�gØÐ#Ø×#Ò#Ø˜X dœ^¨X°kÔ-BØ˜XÔ& wÔ/ÝÔ)¨(¯,ª,°xÀÑ*DÔ*D×*HÒ*HÈÐTVÑ*WÔ*WÐ*]Ð[]Ñ^Ô^Ø!ð	 $ñ ô ð ð �à")¨)Ô"4°g¸lÔ6K�ZˆGØ�OŠO˜G¥XÔ%6µxÔ7KÝÔ# G¨Z½Ô9QÐ^eÐfsÔ^tÐuÑuÔuñ8wô 8wàñ&ô &ñ ô ð ð �OŠO˜G¥XÔ%6ÝÔ& w°
½HÔ<RÑSÔSÐU[ñ&]ô &]ñ ^ô ^ð ^ð  ×,Ò,ØÐ#VÐ#VÐ#VÐ#VÐ#Vð -ñ Xô X‰LˆE�5à×.Ò.¨w¸¸uÑEÔE‰LˆE�5Ø×Ò ¨°*¸eÀUÐSYÐÑZÔZÐZÐZÐZøÝÕ!5Ð6ð 	<ð 	<ð 	<Ý�LŠLÐ:Ñ;Ô;Ð;Ð;Ð;Ð;ð	<øøøs   ³BG ÃDG Ç+G=Ç<G=c           	     óð  — t          |                     d¦  «        p|                     d¦  «        pd¦  «        } | j        j        |g|                      |¦  «        ¢R Ž }|s9|                     dt          j        |t
          j        d|› �¦  «        ¦  «         dS |                      |¦  «         	  | j        j	        |g|                      |¦  «        ¢R Ž }|€)|  
                    |t          j        ¦   «         ¦  «         dS t          j        ¦   «         t          ¦   «         z   }	 	 |                     t          ¬¦  «        \  }	}
n^# t           $ rP t          j        ¦   «         |k    r |d	         |                     d
d¦  «        }
}	Y n|  
                    |d¦  «         Y nw xY wŒ~|                      |||d         |	|
|¬¦  «         dS # t$          t&          f$ r t(                               d¦  «         Y dS w xY w)z>Reconnect to an existing task's stream (v1.0 SubscribeToTask).ÚtaskIdrÆ   r)   r°   útask not found: NTrí  rŸ  rã  r?  r”  r=  z"A2A: subscribe client disconnected)r&   r`   r  r§  r¢   r   rË   ÚERR_TASK_NOT_FOUNDr/  Úwatchr3  r8  rß  r%   r!  r"  r#  r9  rC  rD  r‹   rŒ   )rz   r.  rì   rÇ   r®   r“  rá  rC  r%  rŸ  rã  s              r$   râ   zA2AAdapter._rpc_tasks_subscribe  s)  € å�f—j’j Ñ*Ô*ÐD¨f¯jªj¸Ñ.>Ô.>ÐDÀ"ÑEÔEˆØˆdŒjŒn˜WÐD t×'<Ò'<¸UÑ'CÔ'CÐDÐDÐDˆØð 	Ø�MŠM˜#�xÔ5Ø�Ô3Ð5QÈÐ5QÐ5Qñ Sô  Sñ Tô Tð TàˆFà×Ò˜'Ñ"Ô"Ð"ð	?Ø"�$”*Ô" 7ÐJ¨T×-BÒ-BÀ5Ñ-IÔ-IÐJÐJÐJˆCØˆ{Ø—’ ­Ô):Ñ)<Ô)<Ñ=Ô=Ð=Ø�Ý”y‘{”{¥^Ñ%5Ô%5Ñ5ˆHð@ð@Ø#&§:¢:µn :Ñ#EÔ#E‘L�E˜5ØøÝ%ð @ð @ð @Ý”y‘{”{ hÒ.Ð.Ø'*¨7¤|°S·W²W¸WÀbÑ5IÔ5I˜u˜Ø˜Ø—O’O GÐ->Ñ?Ô?Ð?Ð?Ð?ð	@øøøð	@ð ×Ò ¨°#°lÔ2CÀUÈEÐZ`ÐÑaÔaÐaÐaÐaøÝÕ!5Ð6ð 	?ð 	?ð 	?Ý�LŠLÐ=Ñ>Ô>Ð>Ð>Ð>Ð>ð	?øøøsI   Â1AG Ä#G Ä&E ÅG Å?FÆG ÆFÆG ÆFÆ%G Ç+G5Ç4G5c                óø  — t          |                     d¦  «        p|                     d¦  «        pd¦  «        } | j        j        |g|                      |¦  «        ¢R Ž }|s#t	          j        |t          j        d|› �¦  «        S |                     d¦  «        }	 |�t          |¦  «        nd }n# t          t          f$ r d }Y nw xY wt	          j
        |t          j                             ||¬¦  «        ¦  «        S )NrF  rÆ   r)   rG  ÚhistoryLength)Úhistory_length)r&   r`   r  r§  r   rË   rH  rQ   r!   r    r)  r  Úto_task)rz   rì   rÇ   r®   r“  rá  Úhistory_lens          r$   rß   zA2AAdapter._rpc_tasks_get$  s  € Ý�f—j’j Ñ*Ô*ÐD¨f¯jªj¸Ñ.>Ô.>ÐDÀ"ÑEÔEˆØˆdŒjŒn˜WÐD t×'<Ò'<¸UÑ'CÔ'CÐDÐDÐDˆØð 	SÝÔ)Ø�Ô3Ð5QÈÐ5QÐ5QñSô Sð Sà—j’j Ñ1Ô1ˆð	Ø.9Ð.E�#˜kÑ*Ô*Ð*È4ˆKˆKøÝ�:Ð&ð 	ð 	ð 	ØˆKˆKˆKð	øøøåÔ& v­xÔ/A×/IÒ/IÈ#Ð^iÐ/IÑ/jÔ/jÑkÔkÐks   ÂB/ Â/CÃCc                óò  ‡	‡
— 	 t          |                     d¦  «        pd¦  «        }n# t          t          f$ r d}Y nw xY w	 t          |                     d¦  «        pd¦  «        }n# t          t          f$ r d}Y nw xY w| j                             t          |                     d¦  «        pd¦  «        t          |                     d¦  «        p|                     d¦  «        pd¦  «        |t          d|¦  «        |                      |¦  «        d         |                      |¦  «        d	         d
¬¦  «        \  }}}t          |                     dd¦  «        ¦  «        Š
|                     d¦  «        Š		 ‰	�t          ‰	¦  «        nd Š	n# t          t          f$ r d Š	Y nw xY wt          j        |ˆ	ˆ
fd„|D ¦   «         |rt          |¦  «        ndt          d	t          |d¦  «        ¦  «        |dœ¦  «        S )NÚ	pageTokenr   ÚpageSizeé2   r;  r)   r³   rŸ  r   T)r”  rŸ  Ú	page_sizeÚoffsetÚ
agent_slugrY  Ú
with_totalÚincludeArtifactsFrK  c                óT   •— g | ]$}t           j                             |‰‰¬ ¦  «        ‘Œ%S ))rL  Úinclude_artifacts)r   r  rM  )rþ   ÚrrN  rY  s     €€r$   r   z.A2AAdapter._rpc_tasks_list.<locals>.<listcomp>J  sE   ø€ ð  Dð  Dð  DÐyz•hÔ(×0Ò0°À;ÐbsÐ0ÑtÔtð  Dð  Dð  Dr#   éd   )r  ÚnextPageTokenrQ  Ú	totalSize)rQ   r`   r    r!   r  rb   r&   r   r§  r   r   r)  Úmin)rz   rì   rÇ   r®   rT  rS  ÚrecsÚnext_offsetÚtotalrN  rY  s            @@r$   rà   zA2AAdapter._rpc_tasks_list1  sE  øø€ ð	Ý˜Ÿš KÑ0Ô0Ð5°AÑ6Ô6ˆFˆFøÝ�IÐ&ð 	ð 	ð 	ØˆFˆFˆFð	øøøð	Ý˜FŸJšJ zÑ2Ô2Ð8°bÑ9Ô9ˆIˆIøÝ�IÐ&ð 	ð 	ð 	ØˆIˆIˆIð	øøøà#'¤:§?¢?Ý˜6Ÿ:š: kÑ2Ô2Ð8°bÑ9Ô9Ý�f—j’j Ñ*Ô*ÐG¨f¯jªj¸Ñ.AÔ.AÐGÀRÑHÔHØÝ�q˜&‘>”>Ø×,Ò,¨UÑ3Ô3°AÔ6Ø×(Ò(¨Ñ/Ô/°Ô2Øð $3ñ $
ô $
Ñ ˆˆk˜5õ ! §¢Ð,>ÀÑ!FÔ!FÑGÔGÐØ—j’j Ñ1Ô1ˆð	Ø.9Ð.E�#˜kÑ*Ô*Ð*È4ˆKˆKøÝ�:Ð&ð 	ð 	ð 	ØˆKˆKˆKð	øøøåÔ& vð Dð  Dð  Dð  Dð  Dð  Cð  Dñ  Dô  DØ1<ÐD�S Ñ-Ô-Ð-À"Ý˜A�s 9¨cÑ2Ô2Ñ3Ô3Øð	0
ð 0
ñ ô ð 	s0   „$) ©?¾?Á$A( Á(A>Á=A>Å8F ÆF"Æ!F"c           	     ó  — t          |                     d¦  «        p|                     d¦  «        pd¦  «        } | j        j        |g|                      |¦  «        ¢R Ž }|s#t	          j        |t          j        d|› �¦  «        S |d         t          j        v r,t	          j        |t          j        d|› d|d         › �¦  «        S | j         	                    |t          j
        d¦  «         | j                             |d         ¦  «         |                      |t          j
        d¦  «          | j        j        |g|                      |¦  «        ¢R Ž p|}t	          j        |t          j                             |¦  «        ¦  «        S )	NrF  rÆ   r)   rG  rŸ  ztask z	 already r”  )r&   r`   r  r§  r   rË   rH  ÚTERMINAL_STATESÚERR_TASK_NOT_CANCELABLErÊ  ÚSTATE_CANCELEDr  Úresetr¢  r)  r  rM  )rz   rì   rÇ   r®   r“  rá  s         r$   rá   zA2AAdapter._rpc_tasks_cancelP  s{  € Ý�f—j’j Ñ*Ô*ÐD¨f¯jªj¸Ñ.>Ô.>ÐDÀ"ÑEÔEˆØˆdŒjŒn˜WÐD t×'<Ò'<¸UÑ'CÔ'CÐDÐDÐDˆØð 	SÝÔ)Ø�Ô3Ð5QÈÐ5QÐ5QñSô Sð SàˆwŒ<�8Ô3Ð3Ð3ÝÔ)Ø�Ô8Ø8˜Ð8Ð8¨#¨g¬,Ð8Ð8ñ:ô :ð :ð 	Œ
×Ò˜G¥XÔ%<¸bÑAÔAÐAØŒ×Ò˜#˜lÔ+Ñ,Ô,Ð,Ø×Ò˜7¥HÔ$;¸RÑ@Ô@Ð@ØˆdŒjŒn˜WÐD t×'<Ò'<¸UÑ'CÔ'CÐDÐDÐDÐKÈˆÝÔ& v­xÔ/A×/IÒ/IÈ#Ñ/NÔ/NÑOÔOÐOr#   c                ó~  — |                      d¦  «        pi                       d¦  «        pi }t          |t          ¦  «        sdS |                      d¦  «        p+|                      d¦  «        pi                       d¦  «        pd}|r6 | j        j        |t          |¦  «        g|                      |¦  «        ¢R Ž  dS dS )zFv1.0: message/send can carry configuration.taskPushNotificationConfig.ÚconfigurationÚtaskPushNotificationConfigNro  ÚpushNotificationConfigr)   )r`   rÓ   r’   r  Úset_push_configr&   r§  )rz   r“  rÇ   r®   rQ  ro  s         r$   rÑ  z A2AAdapter._register_inline_pushb  sÍ   € à�zŠz˜/Ñ*Ô*Ð0¨b×5Ò5Ð6RÑSÔSÐYÐWYˆÝ˜#�tÑ$Ô$ð 	ØˆFØ�gŠg�e‰nŒnÐZ §¢Ð)AÑ!BÔ!BÐ!HÀb× MÒ MÈeÑ TÔ TÐZÐXZˆØð 	YØ&ˆDŒJÔ& wµ°C±´ÐX¸4×;PÒ;PÐQVÑ;WÔ;WÐXÐXÐXÐXÐXÐXð	Yð 	Yr#   c                óø  — t          |                     d¦  «        pd¦  «        }|                     d¦  «        p|                     d¦  «        pi }t          |pi                      d¦  «        pd¦  «        }|r|s t          j        |t          j        d¦  «        S  | j        j        ||g|                      |¦  «        ¢R Ž }|€#t          j        |t          j        d|› �¦  «        S t          j	        ||¦  «        S )NrF  r)   rj  r÷   ro  z.taskId and pushNotificationConfig.url requiredrG  )
r&   r`   r   rË   rÔ   r  rk  r§  rH  r)  )rz   rì   rÇ   r®   r“  rQ  ro  Ústoreds           r$   rã   z"A2AAdapter._rpc_push_config_createk  s  € Ý�f—j’j Ñ*Ô*Ð0¨bÑ1Ô1ˆØ�jŠjÐ1Ñ2Ô2ÐP°f·j²jÀÑ6JÔ6JÐPÈbˆÝ�3�9˜"—/’/ %Ñ(Ô(Ð.¨BÑ/Ô/ˆØð 	B˜cð 	BÝÔ)Ø�Ô3Ø@ñBô Bð Bð ,�”Ô+¨G°SÐX¸4×;PÒ;PÐQVÑ;WÔ;WÐXÐXÐXˆØˆ>ÝÔ)Ø�Ô3Ð5QÈÐ5QÐ5QñSô Sð SåÔ& v¨vÑ6Ô6Ð6r#   c                óÂ  — t          |                     d¦  «        pd¦  «        }t          |                     d¦  «        p|                     d¦  «        pd¦  «        }|s t          j        |t          j        d¦  «        S  | j        j        ||g|                      |¦  «        ¢R Ž }|€#t          j        |t          j        d|› �¦  «        S t          j	        ||¦  «        S )uD   GetTaskPushNotificationConfig â€” retrieve a push config by task id.rF  r)   rÆ   ÚconfigIdútaskId requiredNú push config not found for task: )
r&   r`   r   rË   rÔ   r  Úget_push_configr§  rH  r)  )rz   rì   rÇ   r®   r“  Ú	config_idrQ  s          r$   rä   zA2AAdapter._rpc_push_config_gety  sê   € å�f—j’j Ñ*Ô*Ð0¨bÑ1Ô1ˆÝ˜Ÿ
š
 4Ñ(Ô(ÐH¨F¯JªJ°zÑ,BÔ,BÐHÀbÑIÔIˆ	Øð 	HÝÔ)Ø�Ô3Ð5FñHô Hð Hà(ˆdŒjÔ(¨°)Ð[¸d×>SÒ>SÐTYÑ>ZÔ>ZÐ[Ð[Ð[ˆØˆ;ÝÔ)Ø�Ô3Ø<°7Ð<Ð<ñ>ô >ð >õ Ô& v¨sÑ3Ô3Ð3r#   c                ó
  — t          |                     d¦  «        pd¦  «        }|s t          j        |t          j        d¦  «        S  | j        j        |g|                      |¦  «        ¢R Ž }t          j        ||ddœ¦  «        S )uA   ListTaskPushNotificationConfigs â€” list push configs for a task.rF  r)   rp  )Úconfigsr\  )	r&   r`   r   rË   rÔ   r  Úlist_push_configsr§  r)  )rz   rì   rÇ   r®   r“  ru  s         r$   rå   z A2AAdapter._rpc_push_config_list‡  s’   € å�f—j’j Ñ*Ô*Ð0¨bÑ1Ô1ˆØð 	HÝÔ)Ø�Ô3Ð5FñHô Hð Hà.�$”*Ô.¨wÐV¸×9NÒ9NÈuÑ9UÔ9UÐVÐVÐVˆÝÔ& v¸7ÐUWÐ/XÐ/XÑYÔYÐYr#   c                óÆ  — t          |                     d¦  «        pd¦  «        }t          |                     d¦  «        p|                     d¦  «        pd¦  «        }|s t          j        |t          j        d¦  «        S  | j        j        ||g|                      |¦  «        ¢R Ž }|s#t          j        |t          j        d|› �¦  «        S t          j	        |ddi¦  «        S )	u:   DeleteTaskPushNotificationConfig â€” remove a push config.rF  r)   rÆ   ro  rp  rq  ÚdeletedT)
r&   r`   r   rË   rÔ   r  Údelete_push_configr§  rH  r)  )rz   rì   rÇ   r®   r“  rs  rx  s          r$   ræ   z"A2AAdapter._rpc_push_config_delete�  sò   € å�f—j’j Ñ*Ô*Ð0¨bÑ1Ô1ˆÝ˜Ÿ
š
 4Ñ(Ô(ÐH¨F¯JªJ°zÑ,BÔ,BÐHÀbÑIÔIˆ	Øð 	HÝÔ)Ø�Ô3Ð5FñHô Hð Hà/�$”*Ô/°¸ÐbÀT×EZÒEZÐ[`ÑEaÔEaÐbÐbÐbˆØð 	>ÝÔ)Ø�Ô3Ø<°7Ð<Ð<ñ>ô >ð >õ Ô& v°	¸4Ð/@ÑAÔAÐAr#   c                ó  — | j                              |¦  «        }|sdS t          j        |¦  «        s8t                               d||¦  «         t          j        xj        dz  c_        dS t          j	        ||||pddd…         ¦  «        }t          j
        |¦  «        }ddi}|r||d<   	 t          j        |¦  «                             d	¦  «        }	t          j                             ||	|d
¬¦  «        }
t          j                             |
d¬¦  «        5 }d|j        cxk    rdk     r9n n6t          j        xj        dz  c_        t                               d|¦  «         n;t          j        xj        dz  c_        t                               d||j        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t*          $ rA}t          j        xj        dz  c_        t                               d||¦  «         Y d}~dS d}~ww xY w)u:  POST a v1.0 StreamResponse payload to the task's registered callback.

        Validates the callback URL to prevent SSRF â€” blocks internal/private
        addresses (169.254.x.x metadata, loopback, RFC1918 private ranges)
        unless we're in localhost-only mode (where internal access is expected).
        NuF   A2A: push notification for task %s blocked â€” unsafe callback URL: %sr   r)   iÐ  r•   r–   zX-A2A-Signaturer”   ÚPOST)Údatar¨   rX   é
   rí  r°   r   z'A2A: push notification sent for task %sz.A2A: push notification for task %s got HTTP %dz-A2A: push notification for task %s failed: %s)r  Úpop_push_urlr   Úis_safe_callback_urlr‹   rL  r   rÀ   Úpush_failedr7  Úsign_push_payloadr˜   r™   rš   r<   ÚrequestÚRequestÚurlopenr³   Ú	push_sentrŒ   r-   )rz   r“  r”  rã  rŸ  Úcallback_urlr‘   Ú	signaturer¨   r|  rë   Úrespr5  s                r$   rÖ  z"A2AAdapter._send_push_notificationž  s†  € ð ”z×.Ò.¨wÑ7Ô7ˆØð 	ØˆFåÔ,¨\Ñ:Ô:ð 	Ý�NŠNÐcØ" Lñ2ô 2ð 2åÔÐ(Ô(¨AÑ-Ð(Ô(ØˆFõ Ô(¨°*¸eÀeÀkÈrÐSXÐTXÐSXÔEYÑZÔZˆåÔ.¨wÑ7Ô7ˆ	Ø!Ð#5Ð6ˆØð 	3Ø)2ˆGÐ%Ñ&ð	XÝ”:˜gÑ&Ô&×-Ò-¨gÑ6Ô6ˆDÝ”.×(Ò(¨¸DÈ'ÐZ`Ð(ÑaÔaˆCÝ”×'Ò'¨°RÐ'Ñ8Ô8ð k¸DØ˜$œ+Ð+Ð+Ò+Ð+¨Ò+Ð+Ð+Ð+Ð+ÝÔ$Ð.Ô.°!Ñ3Ð.Ô.Ý—L’LÐ!JÈGÑTÔTÐTÐTåÔ$Ð0Ô0°AÑ5Ð0Ô0Ý—N’NÐ#SÐU\Ð^bÔ^iÑjÔjÐjðkð kð kñ kô kð kð kð kð kð kð kð køøøð kð kð kð kð kð køõ ð 	Xð 	Xð 	XÝÔÐ(Ô(¨AÑ-Ð(Ô(Ý�NŠNÐJÈGÐUVÑWÔWÐWÐWÐWÐWÐWÐWÐWøøøøð	Xøøøs>   Â,A+F8 ÄBF+ÆF8 Æ+F/Æ/F8 Æ2F/Æ3F8 Æ8
HÇ6G>Ç>Hr¸  ÚcontentÚreply_toÚmetadataúOptional[Dict[str, Any]]c              ƒ  óŠ  K  — t          t          t          j        ¦   «         dz  ¦  «        ¦  «        }|pi                      d¦  «        s,t                               d|¦  «         t          d|¬¦  «        S |                      |t          j	        |pd¦  «        st                               d|¦  «         t          d|¬¦  «        S )u{  Fulfil the pending reply Future for this context.

        ``chat_id`` is the A2A context id we set as the source chat_id; the
        oldest outstanding task for that context receives the reply (the
        gateway session processes messages in order).

        The gateway marks final user-visible replies with ``metadata['notify']``
        (see ``_mark_notify_metadata`` in gateway.platforms.base â€” this is the
        base adapter's documented reply marker, not an incidental field).
        Progress, status, and editable preview sends intentionally lack the
        marker; those must not satisfy the JSON-RPC caller.
        iè  Únotifyz+A2A: ignoring non-final send for context %sT)Úsuccessr¿  r)   z0A2A: send() for context %s had no pending waiter)
r&   rQ   rß  r`   r‹   rŒ   r   r¤  r   rÓ  )rz   r¸  r‰  rŠ  r‹  r¿  s         r$   r\   zA2AAdapter.sendÇ  s¸   è è € õ& ��TœY™[œ[¨4Ñ/Ñ0Ô0Ñ1Ô1ˆ
Ø�˜B×#Ò# HÑ-Ô-ð 	CÝ�LŠLÐFÈÑPÔPÐPÝ d°zÐBÑBÔBÐBØ×/Ò/°½Ô9QÐSZÐS`Ð^`ÑaÔað 	Vå�LŠLÐKÈWÑUÔUÐUÝ $°:Ð>Ñ>Ô>Ð>r#   rä  r   Úoutcomer   c              ƒ  ó`  K  — t          t          |dd¦  «        pd¦  «        }|sdS |t          j        k    r#|                      |t
          j        d¦  «         dS |t          j        k    r#|                      |t
          j        d¦  «         dS |                      |t
          j	        d¦  «         dS )a  Resolve the task future when processing ends without a reply send.

        The success path resolves via send(); this hook catches failures,
        cancellations, and empty runs so the HTTP thread returns promptly
        instead of waiting out the reply timeout.
        r¿  r)   Nz[agent processing failed])
r&   r  r   ÚFAILUREr¢  r   rA  Ú	CANCELLEDre  rÓ  )rz   rä  r�  r“  s       r$   Úon_processing_completez!A2AAdapter.on_processing_completeã  sµ   è è € õ •g˜e \°2Ñ6Ô6Ð<¸"Ñ=Ô=ˆØð 	ØˆFØÕ'Ô/Ò/Ð/Ø×Ò˜w­Ô(=Ð?ZÑ[Ô[Ð[Ð[Ð[ØÕ)Ô3Ò3Ð3Ø×Ò˜w­Ô(?ÀÑDÔDÐDÐDÐDà×Ò˜w­Ô(@À"ÑEÔEÐEÐEÐEr#   c              ƒ  ó
   K  — d S rw   r"   )rz   r¸  r‹  s      r$   Úsend_typingzA2AAdapter.send_typingô  s   è è € Øˆtr#   úDict[str, Any]c              ƒ  ó   K  — d|› �ddœS )Nr¶  r·  )r.   Útyper"   )rz   r¸  s     r$   Úget_chat_infozA2AAdapter.get_chat_info÷  s   è è € Ø(˜wÐ(Ð(°$Ð7Ð7Ð7r#   rñ   )r   r   )r   r8  )r   r’   )rù   r’   r   rS  rw   )rµ   rG   r   rj  )rq  r&   r   r’   )rq  r&   rÇ   r’   r   r’   )NN)rµ   rG   r®   r~  r   r’   )r®   r~  r   rj  )r“  r&   r”  r&   r   r   )r“  r&   r   r8  )r“  r&   rŸ  r&   r   r&   r   r   )r”  r&   rŸ  r&   r   r&   r   r   )r®   r~  r   r¥  )rg  r¨  r   r©  )rÇ   r’   r­  r&   r®   r~  r   r®  ©rF   r&   r   rG   )rF   r&   rë  r&   r   r&   )rF   r&   rø  r   r   r&   )rF   r&   rû  r&   rë  r&   r   r8  )
r®   r’   r­  r&   r”  r&   rÿ  r&   r   r¥  )r  r’   rŸ  r&   rã  r&   r   r¥  )r  r’   r   r¥  )NF)rì   r	   rÇ   r’   r­  r&   r®   r~  rÊ   r   r   r’   )r0  r&   r   r8  )r“  r&   r”  r&   rŸ  r&   rã  r&   rì   r	   r   r8  )
rì   r	   rÇ   r’   r­  r&   r®   r~  r   r8  )rì   r	   rÇ   r’   r®   r~  r   r8  )rì   r	   rÇ   r’   r®   r~  r   r’   )r“  r&   rÇ   r’   r®   r~  r   r8  )
r“  r&   r”  r&   rã  r&   rŸ  r&   r   r8  )r¸  r&   r‰  r&   rŠ  rG   r‹  rŒ  )rä  r   r�  r   r   r8  )r¸  r&   r   r8  )r¸  r&   r   r—  )5r~   r   r€   r�   ry   rò   r.   r"  r7  rD  r1  rR  r  r¿   r¸   rÕ   rº   r…  r˜  rž  r¢  r¤  r§  r¬  ræ  rê  r÷  rú  rþ  rÒ  r  r&  rÝ   Ústaticmethodr/  r3  r9  rÞ   râ   rß   rà   rá   rÑ  rã   rä   rå   ræ   rÖ  r\   r”  r–  rš  rƒ   r„   s   @r$   rô   rô   R  s­  ø€ € € € € Ø%Ð%ð+Að +Að +Að +Að +AðZ ðð ð ñ „Xðð ðð ð ñ „Xðð )ð )ð )ð )ðV(ð (ð (ð (ð(Cð Cð Cð Cðð ð ð ðCð Cð Cð CðJ
ð 
ð 
ð 
ð 
ð
<ð 
<ð 
<ð 
<ðð ð ð ð
ð 
ð 
ð 
ð 
ð$?ð ?ð ?ð ?ð ?ð6ð ð ð ð@ð @ð @ð @ðð ð ð ðð ð ð ðLð Lð Lð Lðð ð ð ðe
ð e
ð e
ð e
ð e
ðN.ð .ð .ð .ðð ð ð ð ð ð ð ð 
Rð 
Rð 
Rð 
Rð-cð -cð -cð -cð^ð ð ð ð@Pð Pð Pð Pð Pð.7ð 7ð 7ð 7ð 7ð  ð(ð (ð (ñ „\ð(ð ðð ð ñ „\ðð
 &*ð6ð 6ð 6ð 6ð 6ð <ð <ð <ð <ð <ð>?ð ?ð ?ð ?ð ?ð>lð lð lð lð lðð ð ð ð ð>Pð Pð Pð Pð Pð$Yð Yð Yð Yð Yð7ð 7ð 7ð 7ð 7ð4ð 4ð 4ð 4ð 4ðZð Zð Zð Zð ZðBð Bð Bð Bð Bð%Xð %Xð %Xð %XðZ #'Ø-1ð?ð ?ð ?ð ?ð ?ð8Fð Fð Fð Fð"ð ð ð ð ð8ð 8ð 8ð 8ð 8ð 8ð 8ð 8r#   rô   )r   r   rñ   )r0   r&   r   r&   )r8   r&   r9   r&   r   r&   r›  )rO   )r0   r&   rP   rQ   r   r&   )rX   r&   r   rY   ):r�   Ú
__future__r   r(  r˜   Úloggingr   rU   rð  r  r  rß  Úurllib.parser<   Úurllib.requestÚcollectionsr   Úconcurrent.futuresr   r   r#  Úhttp.serverr   r   Útypingr	   r
   r   Úgateway.platforms.baser   r   r   r   r   Úgateway.configr   r)   r   r   Ú	getLoggerr~   r‹   r  rK  rI  rÍ   r"  r%   r/   r7   r?   rE   rN   rW   rq   rs   r†   rô   r"   r#   r$   ú<module>r¨     sì  ððð ð: #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø =Ð =Ð =Ð =Ð =Ð =Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð $Ð #Ð #Ð #Ð #Ð #à  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à	ˆÔ	˜8Ñ	$Ô	$€à€Ø€ØÐ Ø€	Ø€ðð ð ð ðð ð ð ðIð Ið Ið Ið4ð 4ð 4ð 4ðCð Cð Cð CðCð Cð Cð Cð%ð %ð %ð %ð %ð,ð ,ð ,ð ,ðBð ð ð ð Ð$ñ ô ð ð`ð `ð `ð `ð `Ð.ñ `ô `ð `ðHf8ð f8ð f8ð f8ð f8Ð$ñ f8ô f8ð f8ð f8ð f8r#   