§
    øžyj•)  ã                  óì   — 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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]Ú
attributesNúOptional[str]Úelement_tokenÚreturnúTuple[int, int]c                ó:   — | j         \  }}}}||dz  z   ||dz  z   fS )Né   )r   )ÚselfÚxÚyÚwÚhs        ú@/home/ragecks/.hermes/hermes-agent/tools/computer_use/backend.pyÚcenterzUIElement.center#   s,   € Ø”[‰
ˆˆ1ˆa�Ø�1˜‘6‰z˜1˜q A™v™:Ð%Ð%ó    )r   r    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r   Údictr   r   r)   © r*   r(   r   r      s¼   € € € € € € à9Ð9à€J€J�JØ€I€I�IØ€E€O€O€O�OØ(4€FÐ4Ð4Ð4Ñ4Ø€C€M€M€M�MØ€C€L€L€L�LØ€IÐÐÐÑØ!& °tÐ!<Ñ!<Ô!<€JÐ<Ð<Ð<Ñ<ð $(€MÐ'Ð'Ð'Ñ'ð&ð &ð &ð &ð &ð &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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ÚheightNr   Úpng_b64r   zList[UIElement]Úelementsr   r   Úwindow_titler   Úpng_bytes_lenÚimage_mime_type)r+   r,   r-   r.   r/   r7   r   Úlistr8   r   r9   r:   r;   r1   r*   r(   r3   r3   (   sª   € € € € € € ðð ð €I€I�IØ€J€J�JØ€K€K�KØ!€GÐ!Ð!Ð!Ñ!Ø % °dÐ ;Ñ ;Ô ;€HÐ;Ð;Ð;Ñ;à€C€M€M€M�MØ€LÐÐÐÑà€MÐÐÐÑð &*€OÐ)Ð)Ð)Ñ)Ð)Ð)r*   r3   c                  óÈ   — 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Z
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<   dZded<   dS )ÚActionResultu=  Result of any action (click / type / scroll / drag / key / wait).

    Beyond the transport-level ``ok`` flag, this carries cua-driver's
    structured action verdict so the model can follow the documented
    verify â†’ escalate ladder (NousResearch/hermes-agent#67052). ``ok`` stays
    tool/transport success only â€” it is NOT the semantic verdict. Read
    ``effect`` / ``escalation`` to decide the next rung. All structured
    fields are optional and additive: an older driver that omits
    ``structuredContent`` leaves them ``None`` and behavior is unchanged.
    ÚboolÚokr   Úactionr   ÚmessageNzOptional[CaptureResult]Úcapturer   r   ÚmetazOptional[bool]Úverifiedr   ÚeffectúOptional[Dict[str, Any]]Ú
escalationÚpathÚdegradedÚdelivery_modeÚcode)r+   r,   r-   r.   r/   rB   rC   r   r0   rD   rE   rF   rH   rI   rJ   rK   rL   r1   r*   r(   r>   r>   F   sï   € € € € € € ð	ð 	ð €H€H�HØ€K€K�KØ€GÐÐÐÑð (,€GÐ+Ð+Ð+Ñ+à ˜5°Ð6Ñ6Ô6€DÐ6Ð6Ð6Ñ6ð  $€HÐ#Ð#Ð#Ñ#à €FÐ Ð Ð Ñ ð ,0€JÐ/Ð/Ð/Ñ/à€DÐÐÐÑà#€HÐ#Ð#Ð#Ñ#à#'€MÐ'Ð'Ð'Ñ'ð €DÐÐÐÑÐÐr*   r>   c            
      óÒ  — e Zd ZdZedJd„¦   «         ZedJd„¦   «         ZedKd„¦   «         Ze	 	 	 	 dLdMd„¦   «         Zed	d	d	ddd	d	ddœdNd"„¦   «         Z	ed	d	d	d	dd	d	dd#œdOd)„¦   «         Z
ed*d	d	d	d	d	dd+œdPd.„¦   «         Zed	dd/œdQd1„¦   «         Zed	dd/œdRd3„¦   «         ZedSd5„¦   «         ZdSd6„ZedTdUd8„¦   «         ZedVdWd:„¦   «         ZedXd<„¦   «         ZdYd?„ZdYd@„Zd	d	dAœdZdF„Zd[dI„Zd	S )\ÚComputerUseBackendz<Lifecycle: `start()` before first use, `stop()` at shutdown.r   ÚNonec                ó   — d S ©Nr1   ©r#   s    r(   ÚstartzComputerUseBackend.startr   s   € Ø ˜Sr*   c                ó   — d S rQ   r1   rR   s    r(   ÚstopzComputerUseBackend.stopu   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.
        Nr1   rR   s    r(   Úis_availablezComputerUseBackend.is_availablex   ó   € € € r*   ÚsomNr4   r   r   r   r   úOptional[int]r   r3   c                ó   — d S rQ   r1   )r#   r4   r   r   r   s        r(   rC   zComputerUseBackend.capture€   s	   € ð ˜r*   Úlefté   F)Úelementr$   r%   ÚbuttonÚclick_countÚ	modifiersrK   Úbring_to_frontr^   r$   r%   r_   r`   r   ra   úOptional[List[str]]rK   rb   r>   c               ó   — d S rQ   r1   )	r#   r^   r$   r%   r_   r`   ra   rK   rb   s	            r(   ÚclickzComputerUseBackend.clickŠ   ó	   € ð �sr*   )Úfrom_elementÚ
to_elementÚfrom_xyÚto_xyr_   ra   rK   rb   rg   rh   ri   úOptional[Tuple[int, int]]rj   c               ó   — d S rQ   r1   )	r#   rg   rh   ri   rj   r_   ra   rK   rb   s	            r(   ÚdragzComputerUseBackend.drag˜   rf   r*   é   )Úamountr^   r$   r%   ra   rK   rb   Ú	directionro   c               ó   — d S rQ   r1   )	r#   rp   ro   r^   r$   r%   ra   rK   rb   s	            r(   ÚscrollzComputerUseBackend.scroll¦   rf   r*   )rK   rb   Útextc               ó   — d S rQ   r1   )r#   rs   rK   rb   s       r(   Ú	type_textzComputerUseBackend.type_textµ   s   € àADÀr*   Úkeysc               ó   — dS )z7Send a key combo, e.g. 'cmd+s', 'ctrl+alt+t', 'return'.Nr1   )r#   rv   rK   rb   s       r(   ÚkeyzComputerUseBackend.key¹   rX   r*   úList[Dict[str, Any]]c                ó   — dS )z9Return running apps with bundle IDs, PIDs, window counts.Nr1   rR   s    r(   Ú	list_appszComputerUseBackend.list_apps¿   rX   r*   c                ó   — g S )zÎReturn visible native windows with PID and window identifiers.

        Optional compatibility hook: backends that predate window discovery
        remain instantiable and simply report no windows.
        r1   rR   s    r(   Úlist_windowszComputerUseBackend.list_windowsÃ   s	   € ð ˆ	r*   Úraise_windowc                ó   — dS )zJRoute input to `app` (by name or bundle ID). Default: focus without raise.Nr1   )r#   r   r~   s      r(   Ú	focus_appzComputerUseBackend.focus_appË   rX   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.
        Nr1   )r#   r�   r^   s      r(   Ú	set_valuezComputerUseBackend.set_valueÐ   rX   r*   r   c                 ó   — ddddddœS )NFÚrefusedÚtyped_browser_unavailablezOThis computer-use backend has no typed browser route; use native capture/input.T)r@   ÚstatusrL   rB   Únative_fallback_requiredr1   r1   r*   r(   Ú_typed_browser_unavailablez-ComputerUseBackend._typed_browser_unavailableØ   s"   € ð ØØ/ØhØ(,ð
ð 
ð 	
r*   Úkwargsr   c                ó*   — |                       ¦   «         S )z@Optional exact-bind/read hook; native-only backends fail closed.©r‰   ©r#   rŠ   s     r(   Útyped_browser_statez&ComputerUseBackend.typed_browser_stateâ   ó   € à×.Ò.Ñ0Ô0Ð0r*   c                ó*   — |                       ¦   «         S )z6Optional setup hook; native-only backends fail closed.rŒ   r�   s     r(   Útyped_browser_preparez(ComputerUseBackend.typed_browser_prepareæ   r�   r*   )Útab_idÚargsÚdriver_toolr’   r“   rG   c               ó*   — |                       ¦   «         S )z9Optional mutation hook; native-only backends fail closed.rŒ   )r#   r”   r’   r“   s       r(   Útyped_browser_actionz'ComputerUseBackend.typed_browser_actionê   s   € ð ×.Ò.Ñ0Ô0Ð0r*   Ú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@   rA   rB   )ÚtimeÚsleepÚmaxÚminr>   )r#   r—   rœ   s      r(   rš   zComputerUseBackend.waitõ   sU   € àˆˆˆØ�
Š
•3�s�C ¨Ñ.Ô.Ñ/Ô/Ñ0Ô0Ð0Ý˜t¨FÐ<TÀgÐ<TÐ<TÐ<TÐ<TÐUÑUÔUÐUr*   )r   rO   )r   r?   )rY   NNN)
r4   r   r   r   r   rZ   r   rZ   r   r3   )r^   rZ   r$   rZ   r%   rZ   r_   r   r`   r   ra   rc   rK   r   rb   r?   r   r>   )rg   rZ   rh   rZ   ri   rk   rj   rk   r_   r   ra   rc   rK   r   rb   r?   r   r>   )rp   r   ro   r   r^   rZ   r$   rZ   r%   rZ   ra   rc   rK   r   rb   r?   r   r>   )rs   r   rK   r   rb   r?   r   r>   )rv   r   rK   r   rb   r?   r   r>   )r   ry   )F)r   r   r~   r?   r   r>   rQ   )r�   r   r^   rZ   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   rS   rU   rW   rC   re   rm   rr   ru   rx   r{   r}   r€   rƒ   Ústaticmethodr‰   rŽ   r‘   r–   rš   r1   r*   r(   rN   rN   o   sÛ  € € € € € ØFÐFàØ Ð Ð ñ „^Ø àØÐÐñ „^Øàðð ð ñ „^ðð ð Ø!Ø!Ø#'ðð ð ð ñ „^ðð ð "&ØØØØØ)-Ø'+Ø$ðð ð ð ð ñ „^ðð ð '+Ø$(Ø-1Ø+/ØØ)-Ø'+Ø$ðð ð ð ð ñ „^ðð ð
 Ø!%ØØØ)-Ø'+Ø$ðð ð ð ð ñ „^ðð ØEIØ).ðEð Eð Eð Eð Eñ „^ðEð Ø?CØ#(ðFð Fð Fð Fð Fñ „^ðFð
 ðHð Hð Hñ „^ðHðð ð ð ð ðYð Yð Yð Yñ „^ðYð ðð ð ð ñ „^ðð ð
ð 
ð 
ñ „\ð
ð1ð 1ð 1ð 1ð1ð 1ð 1ð 1ð !%Ø)-ð1ð 1ð 1ð 1ð 1ð 1ðVð Vð Vð Vð Vð Vr*   rN   N)r.   Ú
__future__r   Úabcr   r   Údataclassesr   r   Útypingr   r	   r
   r   r   r   r3   r>   rN   r1   r*   r(   ú<module>r¥      sb  ððð ð #Ð "Ð "Ð "Ð "Ð "à #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð ð&ð &ð &ð &ð &ñ &ô &ñ „ð&ð0 ð*ð *ð *ð *ð *ñ *ô *ñ „ð*ð: ð%ð %ð %ð %ð %ñ %ô %ñ „ð%ðPJVð JVð JVð JVð JV˜ñ JVô JVð JVð JVð JVr*   