+
    lHàj€  ã                   ó¸   a € R t0 t R t^ RIt^ RIHtHtHt ^ RIHt ^ RI	H
t
 Rs] ^ k ]! R04      t] ^k R R ltR R	 ltR
 R ltR R ltR R ltR R ltR# )u“  Bridge desktop-only tools to Hermes-desktop renderer events.

The desktop ``tui_gateway`` installs an emitter via :func:`set_emitter`; elsewhere it
stays ``None`` and tools report "desktop only". Routing keys off ``HERMES_UI_SESSION_ID``
so the event lands on the window that owns the turn (the sink is lock-guarded).

Window-level events (``pane.reveal``, ``preview.open``) route by
``HERMES_UI_SESSION_ID`` â€” the window/socket that owns the turn.
Session-scoped events (``message.reaction``) route by ``HERMES_SESSION_ID``
so the renderer's gateway-event stream, keyed on the chat session, receives
the frame on the correct transcript transport (#80678).
N)ÚCallableÚ	FrozenSetÚOptional)Úget_session_env)Ú
tool_errorzmessage.reactionc                ón   € V ^8„  d   QhR\         \        \        \        \        .R3,          ,          RR/# )é   ÚfnNÚreturn)r   r   ÚstrÚdict)Úformats   "Ú5/home/ubuntu/.hermes/hermes-agent/tools/desktop_ui.pyÚ__annotate__r       s0   € ÷ ñ ”HœX¤s¬C´Ð&6¸Ð&<Õ=Õ>ð À4ñ ó    c                ó
   € V s R# )zJInstall (or clear) the renderer-event sink. Called by the desktop gateway.N©Ú_emit)r	   s   &r   Úset_emitterr       s	   € ð ‚Er   c                ó$   € V ^8„  d   QhR\         /# ©r   r
   )Úbool)r   s   "r   r   r   &   s   € ÷ ñ ”4ñ r   c                 ó   € \         RJ# )z>True when running under the desktop app (an emitter is wired).Nr   © r   r   Ú	availabler   &   s   € ä˜ÐÐr   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   ÚsettingÚdefaultr
   )r   r   )r   s   "r   r   r   +   s!   € ÷ &ñ &œ#ð &¬ð &´ñ &r   c                óÒ   €  ^ RI Hp V! 4       P                  R4      p\	        T\
        4      '       d   Y9  d   T# \        TP                  T 4      4      #   \         d    Tu # i ; i)ak  Read a desktop Appearance switch from ``display.<setting>``. The renderer mirrors
these toggles onto the CONNECTED gateway's config, so this is the user's real answer
for local/SSH/URL/cloud gateways alike; ``check_fn``s use it to withdraw a tool from
the schema. Unreadable config -> ``default`` so a shipped-on feature does not vanish
on a transient read error.)Úload_config_readonlyÚdisplay)Úhermes_cli.configr   ÚgetÚ	ExceptionÚ
isinstancer   r   )r   r   r   r    s   &&  r   Úuser_enabledr%   +   s`   € ðÝ:Ù&Ó(×,Ñ,¨YÓ7ˆô �gœt×$Ò$¨Ô(>ØˆÜ�—‘˜GÓ$Ó%Ð%øô	 ô ØŠðús   ‚A ÁA&Á%A&c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   ÚeventÚpayloadr
   )r   r   r   )r   s   "r   r   r   ;   s!   € ÷ ñ ”ð œdð ¤tñ r   c                ó¢   € \         f   R# V \        9   d"   \        RR4      pV'       g   \        RR4      pM\        RR4      p\        W V4       R# )zMRoute ``event`` to the window owning the current turn; False when no emitter.FÚHERMES_SESSION_IDÚ ÚHERMES_UI_SESSION_IDT)r   Ú_SESSION_SCOPED_EVENTSr   )r'   r(   Úsids   && r   Úemitr/   ;   sK   € ä‚}ÙØÔ&Ô&ÜÐ1°2Ó6ˆßÜ!Ð"8¸"Ó=ˆCøäÐ4°bÓ9ˆÜ	ˆ#�gÔÙr   c                ó`   € V ^8„  d   QhR\         R\        R\         R\         R\        R\         /# )r   r'   r(   Úfail_prefixÚdesktop_onlyÚresultr
   )r   r   )r   s   "r   r   r   I   s@   € ÷ Vñ Vœð V¤tð V¼#ð VÌSð VÔZ^ð VÔcfñ Vr   c                ó¾   €  \        W4      pT'       d   \        P                  ! TRR7      # \        T4      #   \         d   p\        T T 24      u Rp?# Rp?ii ; i)zÊEmit ``event``; ``tool_error`` text on failure (``fail_prefix`` + exception, or
``desktop_only`` when no emitter), else ``result`` as JSON. Calls ``emit`` via the
module attribute so tests can patch it.NF©Úensure_ascii)r/   r#   r   ÚjsonÚdumps)r'   r(   r1   r2   r3   ÚokÚexcs   &&&&&  r   Úemit_or_errorr;   I   sV   € ð1Ü�%Ó!ˆ÷ 68Œ4�:Š:�f¨5Ô1ÐU¼ZÈÓ=UÐUøô ô 1Ü˜[˜M¨#¨Ð/Ó0Õ0ûð1ús   ‚8 ¸AÁAÁAÁAc                ó$   € V ^8„  d   QhR\         /# r   )r   )r   s   "r   r   r   T   s   € ÷ Bñ BœSñ Br   c                óÐ   €  \         P                  ! \         P                  ! V 4      RR7      #   \        \        3 d'    \         P                  ! R\        T 4      /RR7      u # i ; i)zLDesktop answers with a JSON object; pass it through, else wrap the raw text.Fr5   Útext)r7   r8   ÚloadsÚ	TypeErrorÚ
ValueErrorr   )Úraws   &r   Úpassthrough_jsonrC   T   sQ   € ðBÜ�zŠzœ$Ÿ*š* S›/¸Ô>Ð>øÜ”zÐ"ô BÜ�zŠz˜6¤3 s£8Ð,¸5ÔAÒAðBús   ‚+. ®4A%Á$A%c                óÄ   € V ^8„  d   Qh/ ^ \         9   d-   \        \        \        \        \        .R3,          ,          ;R&   ^\         9   d   \
        \        ,          ;R&   # )r   Nr   r-   )Ú__conditional_annotations__r   r   r   r   Ú	frozenset)r   s   "r   r   r      sK   € ÷ ñ ÷( 9Ò 8„x”œ#œs¤DÐ)¨4Ð/Õ0Õ1Ñ 8ñ)÷6 IÒ Hœ	¤#�Ñ Hò7r   )rE   Ú__doc__r7   Útypingr   r   r   Úgateway.session_contextr   Útools.registryr   r   rF   r-   r   r   r%   r/   r;   rC   r   )rE   s   @r   Ú<module>rK      sZ   øðöó ß 0Ñ 0å 3Ý %ð 59€Ó 8ñ *3Ð4FÐ3GÓ)HÐ Ó Hõõõ
&õ õV÷Br   