§
    Fij>  ã                  óì   — d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
mZmZmZmZ e G d„ d¦  «        ¦   «         Ze G d„ d	¦  «        ¦   «         Ze G d
„ d¦  «        ¦   «         Z G d„ de¦  «        ZdS )züAbstract backend interface for computer use.

Any implementation (cua-driver over MCP, pyautogui, noop, future Linux/Windows)
must return the shape described below. All methods synchronous; async is
handled inside the backend implementation if needed.
é    )Úannotations)ÚABCÚabstractmethod)Ú	dataclassÚfield)ÚAnyÚDictÚListÚOptionalÚTuplec                  ó˜   — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<   dZ	ded<    e
e¬¦  «        Zded<   dd„ZdS )Ú	UIElementz/One interactable element on the current screen.ÚintÚindexÚstrÚroleÚ Úlabel)r   r   r   r   zTuple[int, int, int, int]ÚboundsÚappr   ÚpidÚ	window_id©Údefault_factoryúDict[str, Any]Ú
attributesÚreturnúTuple[int, int]c                ó:   — | j         \  }}}}||dz  z   ||dz  z   fS )Né   )r   )ÚselfÚxÚyÚwÚhs        ú?/home/ubuntu/.hermes/hermes-agent/tools/computer_use/backend.pyÚcenterzUIElement.center   s,   € Ø”[‰
ˆˆ1ˆaØ1˜‘6‰z˜1˜q A™v™:Ð%Ð%ó    N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r   Údictr   r'   © r(   r&   r   r      s©   € € € € € € à9Ð9à€J€JJØ€I€IIØ€E€O€O€OOØ(4€FÐ4Ð4Ð4Ñ4Ø€C€M€M€MMØ€C€L€L€LLØ€IÐÐÐÑØ!& °tÐ!<Ñ!<Ô!<€JÐ<Ð<Ð<Ñ<ð&ð &ð &ð &ð &ð &r(   r   c                  óŒ   — e Zd ZU dZded<   ded<   ded<   dZded	<    ee¬
¦  «        Zded<   dZ	ded<   dZ
ded<   dZded<   dS )ÚCaptureResultu•  Result of a screen capture call.

    At least one of png_b64 / elements is populated depending on capture mode:
      * mode="vision" â†’ png_b64 only
      * mode="ax"     â†’ elements only
      * mode="som"    â†’ both (default): PNG already has numbered overlays
                         drawn by the backend, and `elements` holds the
                         matching index â†’ element mapping.
    r   Úmoder   ÚwidthÚheightNúOptional[str]Úpng_b64r   zList[UIElement]Úelementsr   r   Úwindow_titler   Úpng_bytes_len)r)   r*   r+   r,   r-   r6   r   Úlistr7   r   r8   r9   r/   r(   r&   r1   r1   !   s—   € € € € € € ðð ð €I€IIØ€J€JJØ€K€KKØ!€GÐ!Ð!Ð!Ñ!Ø % °dÐ ;Ñ ;Ô ;€HÐ;Ð;Ð;Ñ;à€C€M€M€MMØ€LÐÐÐÑà€MÐÐÐÑÐÐr(   r1   c                  óf   — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<    ee¬¦  «        Z	ded<   dS )ÚActionResultzAResult of any action (click / type / scroll / drag / key / wait).ÚboolÚokr   Úactionr   ÚmessageNzOptional[CaptureResult]Úcapturer   r   Úmeta)
r)   r*   r+   r,   r-   r@   rA   r   r.   rB   r/   r(   r&   r<   r<   9   sl   € € € € € € àKÐKà€H€HHØ€K€KKØ€GÐÐÐÑð (,€GÐ+Ð+Ð+Ñ+à ˜5°Ð6Ñ6Ô6€DÐ6Ð6Ð6Ñ6Ð6Ð6r(   r<   c                  ón  — e Zd ZdZed8d„¦   «         Zed8d„¦   «         Zed9d„¦   «         Zed:d;d„¦   «         Zed	d	d	ddd	dœd<d„¦   «         Z	ed	d	d	d	dd	dœd=d$„¦   «         Z
ed%d	d	d	d	d&œd>d)„¦   «         Zed?d+„¦   «         Zed@d-„¦   «         ZedAd/„¦   «         ZedBdCd2„¦   «         ZedDdEd4„¦   «         ZdFd7„Zd	S )GÚComputerUseBackendz<Lifecycle: `start()` before first use, `stop()` at shutdown.r   ÚNonec                ó   — d S ©Nr/   ©r!   s    r&   ÚstartzComputerUseBackend.startJ   s   € Ø ˜Sr(   c                ó   — d S rG   r/   rH   s    r&   ÚstopzComputerUseBackend.stopM   s   € Ø˜Cr(   r=   c                ó   — dS )z†Return True if the backend can be used on this host right now.

        Used by check_fn gating and by the post-setup wizard.
        Nr/   rH   s    r&   Úis_availablezComputerUseBackend.is_availableP   ó   € € € r(   ÚsomNr2   r   r   r5   r1   c                ó   — d S rG   r/   )r!   r2   r   s      r&   rA   zComputerUseBackend.captureX   s   € ØVYÐVYr(   Úlefté   )Úelementr"   r#   ÚbuttonÚclick_countÚ	modifiersrS   úOptional[int]r"   r#   rT   rU   r   rV   úOptional[List[str]]r<   c               ó   — d S rG   r/   )r!   rS   r"   r#   rT   rU   rV   s          r&   ÚclickzComputerUseBackend.click\   ó	   € ð sr(   )Úfrom_elementÚ
to_elementÚfrom_xyÚto_xyrT   rV   r\   r]   r^   úOptional[Tuple[int, int]]r_   c               ó   — d S rG   r/   )r!   r\   r]   r^   r_   rT   rV   s          r&   ÚdragzComputerUseBackend.dragh   r[   r(   é   )ÚamountrS   r"   r#   rV   Ú	directionrd   c               ó   — d S rG   r/   )r!   re   rd   rS   r"   r#   rV   s          r&   ÚscrollzComputerUseBackend.scrollt   r[   r(   Útextc                ó   — d S rG   r/   )r!   rh   s     r&   Ú	type_textzComputerUseBackend.type_text   s   € Ø47°Cr(   Úkeysc                ó   — dS )z7Send a key combo, e.g. 'cmd+s', 'ctrl+alt+t', 'return'.Nr/   )r!   rk   s     r&   ÚkeyzComputerUseBackend.key„   rN   r(   úList[Dict[str, Any]]c                ó   — dS )z9Return running apps with bundle IDs, PIDs, window counts.Nr/   rH   s    r&   Ú	list_appszComputerUseBackend.list_apps‰   rN   r(   FÚraise_windowc                ó   — dS )zJRoute input to `app` (by name or bundle ID). Default: focus without raise.Nr/   )r!   r   rq   s      r&   Ú	focus_appzComputerUseBackend.focus_app   rN   r(   Úvaluec                ó   — dS )z—Set a native value on an element (e.g. AXPopUpButton selection).

        `element` is the 1-based SOM index returned by a prior capture call.
        Nr/   )r!   rt   rS   s      r&   Ú	set_valuezComputerUseBackend.set_value’   rN   r(   ÚsecondsÚfloatc           	     óš   — ddl }|                     t          dt          |d¦  «        ¦  «        ¦  «         t	          ddd|d›d	¬
¦  «        S )z#Default implementation: time.sleep.r   Ng        g      >@TÚwaitzwaited z.2fÚs)r>   r?   r@   )ÚtimeÚsleepÚmaxÚminr<   )r!   rw   r|   s      r&   rz   zComputerUseBackend.waitš   sU   € àˆˆˆØ
Š
•3sC ¨Ñ.Ô.Ñ/Ô/Ñ0Ô0Ð0Ý˜t¨FÐ<TÀgÐ<TÐ<TÐ<TÐ<TÐUÑUÔUÐUr(   )r   rE   )r   r=   )rO   N)r2   r   r   r5   r   r1   )rS   rW   r"   rW   r#   rW   rT   r   rU   r   rV   rX   r   r<   )r\   rW   r]   rW   r^   r`   r_   r`   rT   r   rV   rX   r   r<   )re   r   rd   r   rS   rW   r"   rW   r#   rW   rV   rX   r   r<   )rh   r   r   r<   )rk   r   r   r<   )r   rn   )F)r   r   rq   r=   r   r<   rG   )rt   r   rS   rW   r   r<   )rw   rx   r   r<   )r)   r*   r+   r,   r   rI   rK   rM   rA   rZ   rb   rg   rj   rm   rp   rs   rv   rz   r/   r(   r&   rD   rD   G   sý  € € € € € ØFÐFàØ Ð Ð ñ „^Ø àØÐÐñ „^Øàðð ð ñ „^ðð ØYÐYÐYÐYñ „^ØYð ð "&ØØØØØ)-ð	ð 	ð 	ð 	ð 	ñ „^ð	ð ð '+Ø$(Ø-1Ø+/ØØ)-ð	ð 	ð 	ð 	ð 	ñ „^ð	ð ð
 Ø!%ØØØ)-ð	ð 	ð 	ð 	ð 	ñ „^ð	ð Ø7Ð7Ð7ñ „^Ø7àðFð Fð Fñ „^ðFð ðHð Hð Hñ „^ðHð ðYð Yð Yð Yñ „^ðYð ðð ð ð ñ „^ððVð Vð Vð Vð Vð Vr(   rD   N)r,   Ú
__future__r   Úabcr   r   Údataclassesr   r   Útypingr   r	   r
   r   r   r   r1   r<   rD   r/   r(   r&   ú<module>r„      sa  ððð ð #Ð "Ð "Ð "Ð "Ð "à #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð ð&ð &ð &ð &ð &ñ &ô &ñ „ð&ð" ðð ð ð ð ñ ô ñ „ðð. ð
7ð 
7ð 
7ð 
7ð 
7ñ 
7ô 
7ñ „ð
7ðWVð WVð WVð WVð WV˜ñ WVô WVð WVð WVð WVr(   