+
    lHàjÓ  ã            
      óÞ   € R t ^ RIHt ^ RIt^ RIt^ RIHtHtHtH	t	H
t
 ]P                  ! ]4      tR R ltR R ltR R	 ltR
RRRRRRRRR/R R lltR R ltRRR
RRRRRRR/R R lltR# )u„  Registry-level browser extension router.

Agent-side half of browser-extension-control: decides, per ``browser_*`` handler
invocation, whether an attached extension controller (via
:mod:`gateway.browser_control_broker`) or the legacy backend executes it.

Routing contract (see ``tests/tools/test_browser_extension_router.py``):
- Feature off â‡’ legacy, broker never touched, ``fallback()`` called exactly once.
- No server-bound identity â‡’ legacy.
- Bound identity â‡’ authoritative extension lane; missing/ambiguous scope,
  disconnect, or capability mismatch fail closed (never jump to another browser).
- Selected controller â‡’ authoritative; its errors propagate, legacy never retried.
- ``args`` is never mutated.

:func:`routed_browser_handler` resolves the flag and broker lazily on every call
so importing this module never pulls in the gateway and config changes apply
without restart.
)ÚannotationsN)ÚAnyÚCallableÚDictÚOptionalÚTuplec               ó   € V ^8„  d   QhRR/# )é   Úreturnz2tuple[Optional[str], Optional[str], Optional[str]]© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/tools/browser_extension_router.pyÚ__annotate__r      s   € ÷ ñ ÐKñ ó    c                 ót   a € ^ RI Ho  \        ;QJ d    . V 3R lR 4       F  NK  	  5# ! V 3R lR 4       4      # )zF(session_id, principal_id, transport_family) from the session context.©Úget_session_envc              3  óJ   <"  € T F  pS! VR 4      ;'       g    Rx € K  	  R# 5i)Ú Nr   )Ú.0Úkeyr   s   & €r   Ú	<genexpr>Ú"_bound_identity.<locals>.<genexpr>!   s.   øé € ð ñ?ˆCñ 	˜˜RÓ ×(Ð( DÔ(ó?ùs   ƒ#˜#)ÚHERMES_SESSION_IDÚ HERMES_BROWSER_CONTROL_PRINCIPALÚ'HERMES_BROWSER_CONTROL_TRANSPORT_FAMILY)Úgateway.session_contextr   Útupler   s   @r   Ú_bound_identityr      s<   ø€ å7çŒ5ô ñ?ó�5ð ˆ5ô ñ?óó ð r   c               ó    € V ^8„  d   QhRRRR/# )r	   ÚmessageÚstrr
   Ú	Exceptionr   )r   s   "r   r   r   (   s   € ÷ *ñ * Sð *¨Yñ *r   c                ó   € ^ RI Hp V! V 4      # )é    )ÚControllerUnavailable)Úgateway.browser_control_brokerr%   )r    r%   s   & r   Ú_controller_unavailabler'   (   s   € ÝDá  Ó)Ð)r   c               ó    € V ^8„  d   QhRRRR/# )r	   Úactionr!   r
   Úboolr   )r   s   "r   r   r   .   s   € ÷ ñ ¨3ð °4ñ r   c                ó:  €  ^ RI HpHp V! 4       '       g   R# \        4       ;w  r4rV\	        V4      '       g   R# V! 4       pVP                  W4VR7      pVRJ;'       d    VP                  W€4      RJ#   \         d    \        P                  RT RR7        R# i ; i)zÔWhether this request owns one exact controller capable of ``action``.
Runs during tool-schema assembly inside the request's session context;
consults the process-local broker directly and fails closed on any gap.©Úbrowser_control_enabledÚget_browser_control_brokerF)Ú
session_idÚprincipal_idÚtransport_familyNz2browser extension availability check failed for %sT)Úexc_info)
r&   r-   r.   r   ÚallÚscope_for_sessionÚselectr"   ÚloggerÚdebug)	r)   r-   r.   r/   r0   r1   ÚidentityÚbrokerÚscopes	   &        r   Úextension_controller_availabler;   .   s˜   € ðßfá&×(Ò(ÙÜ@OÓ@QÐQÑ2ˆ
Ð"2Ü�8�}Š}ÙÙ+Ó-ˆØ×(Ñ(°JÐl|Ð(Ó}ˆØ˜DÐ ×MÐM V§]¡]°5Ó%AÈÐ%MÐMøÜô Ü�‰ÐIÈ6Ð\`ˆÔaÚðús!   ‚A3 ™A3 º$A3 ÁA3 Á3#BÂBr/   Útask_idr0   r1   Útool_call_idr   c               óD   € 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	   r)   r!   Úargsúdict[str, Any]ÚfallbackúCallable[[], Any]r9   r   Úenabledr*   r/   úOptional[str]r<   r0   r1   r=   r
   r   )r   s   "r   r   r   B   sx   € ÷ !Yñ !YØð!YØ%ð!YØ4Eð!YØORð!YØ]að!Yàð!Yà/<ð!YàS`ð!Yð $ð!Yð ;Hð!Yð 	ñ	!Yr   c               óT  € V'       dS   \        T;'       g    R4      P                  4       '       d*   \        T;'       g    R4      P                  4       '       g   V! 4       # \        WVWxR7      p
VP                  ! R
/ V
B pVfB   \	        VRR4      p\        V4      '       d   V! R
/ V
B '       g   V! 4       # \        RV  24      hVP                  W°4      f   \        RV  24      hVP                  W°WR7      p\        V\         4      '       d   V# \        P                  ! VRR	7      # )ag  Route one browser action through the extension-control broker.

``broker`` exposes ``scope_for_session(**identity)``, ``select(scope, cap)``
and ``dispatch(scope, *, action, arguments, tool_call_id)``. ``fallback`` is
called exactly once when the feature is off or no server-bound identity
exists; once a controller is selected its result/exception is final.
r   )r/   r<   r0   r1   NÚlane_registeredz)bound browser controller unavailable for z(bound browser controller cannot execute )r)   Ú	argumentsr=   F)Úensure_asciir   )r!   ÚstripÚdictr4   ÚgetattrÚcallabler'   r5   ÚdispatchÚ
isinstanceÚjsonÚdumps)r)   r?   rA   r9   rC   r/   r<   r0   r1   r=   r8   r:   Ú
lane_boundÚresults   &&$$$$$$$$    r   Úroute_browser_toolrS   B   s  € ÷ œ#˜l×0Ð0¨bÓ1×7Ñ7×9Ò9ÄÐEU×E[ÐE[ÐY[ÓA\×AbÑAb×AdÒAdÙ‹zÐä˜zÈÔy€HØ×$Ò$Ñ0 xÑ0€EØ‚}ô ˜VÐ%6¸Ó=ˆ
Ü�J×Ò©
Ñ(>°X×(>Ð(>Ù“:ÐÜ%Ð(QÐRXÐQYÐ&ZÓ[Ð[à‡}�}�UÓ#Ò+Ü%Ð(PÐQWÐPXÐ&YÓZÐZð
 �_‰_˜U¸Tˆ_Ó]€FÜ ¬×,Ò,ˆ6ÐX´$·*²*¸VÐRWÔ2XÐXr   c               ó   € V ^8„  d   QhRR/# )r	   r
   r!   r   )r   s   "r   r   r   f   s   € ÷ ñ ˜cñ r   c                 óh   €  ^ RI Hp  V P                  4       ;'       g    R#   \         d     R# i ; i)zEActive tool_call_id bound by the agent executor, or ``""`` when none.©Ú_approval_tool_call_idr   )Útools.approval_contextrW   Úgetr"   rV   s    r   Úcurrent_tool_call_idrZ   f   s3   € ðÝAà%×)Ñ)Ó+×1Ð1¨rÐ1øÜô Úðús   ‚" Ÿ" ¢1°1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!   r?   r@   rA   rB   r<   rD   r/   r0   r1   r=   r
   r   r   )r   s   "r   r   r   p   s[   € ÷ ñ ØðØ%ðØ4EðØP]ðàðà4Aðð $ðð ;Hðð 	ñ	r   c               ó~  €  ^ RI HpHp	 T! 4       '       g   T! 4       #  \        4       w  r¼p\        YY)! 4       RT;'       g    TY5;'       g    TT;'       g    TTf   \        4       R7
      # TR7
      #   \         d(   p
\        P                  RT
4       T! 4       u Rp
?
# Rp
?
ii ; i  \         d	    R;p;rÍ L�i ; i)u‰   Lazy registry-handler route wrapper for ``browser_*`` tools.
Feature off (or gateway unimportable) â‡’ the legacy handler runs unchanged.r,   z?browser extension router unavailable (%s); using legacy backendNT)rA   r9   rC   r/   r<   r0   r1   r=   )	r&   r-   r.   r"   r6   r7   r   rS   rZ   )r)   r?   rA   r<   r/   r0   r1   r=   r-   r.   ÚexcÚenv_sessionÚenv_principalÚenv_transports   &&$$$$$$      r   Úrouted_browser_handlerra   p   sÓ   € ðßfñ #×$Ò$Ù‹zÐð;Ü4CÓ4EÑ1ˆ Mô Ø˜xÐ0JÓ0LÐVZØ×,Ð, °g×LiÐLiÐ\iØ)×:Ð:¨]Ø/;Ò/CÔ)Ó+ô	ð ð JVô	ð øô ô Ü�‰ÐVÐX[Ô\Ù‹zÕûðûô ô ;Ø6:Ð:ˆÐ:�m¡mð;ús.   ‚A4 ŸB) Á4B&Á?B!ÂB&Â!B&Â)B<Â;B<)Ú__doc__Ú
__future__r   rO   ÚloggingÚtypingr   r   r   r   r   Ú	getLoggerÚ__name__r6   r   r'   r;   rS   rZ   ra   r   r   r   Ú<module>rh      s±   ðñõ& #ã Û ß 7Õ 7à	×	Ò	˜8Ó	$€õõ*õð(!Yà $ð!Yà?Cð!Yàcgð!Yð '+ð!Yð KM÷!YõHðØ`dðà $ðàDHðð '+ðð KO÷ñ r   