§
    øžyjNß  ã                  ó°  — U 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mZmZmZmZmZ ddlmZmZmZmZ  ej        e¦  «        Zdadrd„Z eh d	£¦  «        Z eh d
£¦  «        Z eh d£¦  «         eh d£¦  «         eh d£¦  «         eh d£¦  «         eh d£¦  «         eddh¦  «         eh d£¦  «         eh d£¦  «         eddh¦  «        h	ZdddddddddœZ dsd„Z! ej"        dej#        ¦  «         ej"        dej#        ¦  «         ej"        dej#        ¦  «         ej"        d ej#        ¦  «         ej"        d!ej#        ¦  «         ej"        d"ej#        ¦  «        gZ$dtd%„Z% ej&        ¦   «         Z'i Z(d&e)d'<   da*d(e)d)<   i Z+d*e)d+<   i Z,d,e)d-<   i Z-d.e)d/<    ej&        ¦   «         Z.i Z/d0e)d1<   i Z0d2e)d3<   dud5„Z1dvdwd8„Z2dxd:„Z3drd;„Z4 ej5        e4¦  «         drd<„Z6 G d=„ d>e¦  «        Z7dydB„Z8	 dvdzdD„Z9d{dE„Z:d|dG„Z;d}dJ„Z<d}dK„Z=d~dL„Z>dMZ?dNZ@dOZAddR„ZBd€dU„ZCe?fd�dY„ZDdZZEeEfd‚d`„ZFdƒda„ZGd„db„ZHd…dd„ZId†df„ZJd‡dˆdl„ZKd‰do„ZLdƒdp„ZMdŠdq„ZNdS )‹uB  Entry point for the `computer_use` tool.

Universal (any-model) desktop control across macOS, Windows, and Linux via
cua-driver's background computer-use primitive. Replaces #4562's
Anthropic-native `computer_20251124` approach â€” the schema here is standard
OpenAI function-calling so every tool-capable model can drive it.

Linux is the most recent runtime (X11 + Wayland, via cua-driver-rs's
AT-SPI tree path); it is enabled here alongside macOS and Windows. When a
host's display server or accessibility stack isn't reachable, cua-driver's
`health_report` (surfaced by `hermes computer-use doctor`) reports the
exact blocked check rather than the toolset silently failing.

Return contract
---------------
For text-only results (wait, key, list_apps, focus_app, failures, etc.):
  JSON string.

For captures / actions with `capture_after=True`:
  A dict wrapped as the OpenAI-style multi-part tool-message content:

      {
        "_multimodal": True,
        "content": [
            {"type": "text", "text": "<human-readable summary + SOM index>"},
            {"type": "image_url",
             "image_url": {"url": "data:image/png;base64,<b64>"}},
        ],
        "text_summary": "<text used for fallback string content>",
      }

  run_agent.py's tool-message builder inspects `_multimodal` and emits a
  list-shaped `content` for OpenAI-compatible providers. The Anthropic
  adapter splices the base64 image into a `tool_result` block (see
  `agent/anthropic_adapter.py`). Every provider that supports multi-part
  tool content gets the image; text-only providers see the summary only.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚTuple)ÚActionResultÚCaptureResultÚComputerUseBackendÚ	UIElementÚreturnÚNonec                ó
   — | a dS )a  Register a callback for computer_use approval prompts (used by CLI).

    Matches the terminal_tool._approval_callback pattern. The callback
    receives (action, args, summary) and returns one of:
      "approve_once" | "approve_session" | "always_approve" | "deny".
    N)Ú_approval_callback)Úcbs    ú=/home/ragecks/.hermes/hermes-agent/tools/computer_use/tool.pyÚset_approval_callbackr   E   s   € ð ÐÐÐó    >   ÚwaitÚcaptureÚ	list_appsÚlist_windowsÚcua_browser_state>   ÚkeyÚdragÚtypeÚclickÚscrollÚ	focus_appÚ	set_valueÚright_clickÚdouble_clickÚmiddle_clickÚcua_browser_typeÚcua_browser_clickÚcua_browser_dialogÚcua_browser_pointerÚcua_browser_prepareÚcua_browser_downloadÚcua_browser_navigateÚcua_browser_set_input_files>   ÚcmdÚshiftÚ	backspace>   r,   Úoptionr.   >   Úqr,   Úctrl>   r0   r,   r-   >   r0   r,   r-   r/   ÚwinÚl>   r1   Údeleter/   >   Údelr1   r/   r/   Úf4r,   r1   )ÚcommandÚcontrolÚaltu   âŒ˜u   âŒ¥ÚwindowsÚsuperÚmetaÚkeysÚstrÚ	frozensetc                óv   — d„ t          j        d| ¦  «        D ¦   «         }d„ |D ¦   «         }t          |¦  «        S )Nc                ó‚   — g | ]<}|                      ¦   «         ¯|                      ¦   «                              ¦   «         ‘Œ=S © )ÚstripÚlower©Ú.0Úps     r   ú
<listcomp>z$_canon_key_combo.<locals>.<listcomp>z   s7   € ÐTÐTÐT 1È!Ï'Ê'É)Ì)ÐTˆQ�WŠW‰YŒY�_Š_ÑÔÐTÐTÐTr   z\s*[+\-]\s*c                óD   — g | ]}t                                ||¦  «        ‘ŒS rB   )Ú_KEY_ALIASESÚgetrE   s     r   rH   z$_canon_key_combo.<locals>.<listcomp>{   s(   € Ð3Ð3Ð3¨�\×Ò˜a Ñ#Ô#Ð3Ð3Ð3r   )ÚreÚsplitr?   )r=   Úpartss     r   Ú_canon_key_comborO   u   sE   € ð
 UÐT­¬°ÀÑ(FÔ(FÐTÑTÔT€EØ3Ð3¨UÐ3Ñ3Ô3€EÝ�UÑÔÐr   zcurl\s+[^|]*\|\s*bashzcurl\s+[^|]*\|\s*shzwget\s+[^|]*\|\s*bashz\bsudo\s+rm\s+-[rf]z\brm\s+-rf\s+/\s*$z:\s*\(\)\s*\{\s*:\|:\s*&\s*\}ÚtextúOptional[str]c                óV   — t           D ] }|                     | ¦  «        r	|j        c S Œ!d S ©N)Ú_BLOCKED_TYPE_PATTERNSÚsearchÚpattern)rP   Úpats     r   Ú_is_blocked_typerX   Š   s=   € Ý%ð ð ˆØ�:Š:�dÑÔð 	Ø”;ÐÐÐð	àˆ4r   zDict[Tuple[str, str], bool]Ú_AUX_VISION_ROUTE_CACHEzOptional[ComputerUseBackend]Ú_backendzDict[str, ComputerUseBackend]Ú	_backendszDict[str, threading.RLock]Ú_backend_call_lockszDict[str, str]Ú_backend_permission_modeszDict[str, bool]Ú_session_auto_approvezDict[str, set]Ú_always_allowÚ
session_idc                óŠ   — 	 ddl m}m}  || ¦  «        rdS  |d¬¦  «        }|r ||¦  «        rdS n# t          $ r Y nw xY wdS )uÖ  Map Hermes's explicit approval bypass onto Cua's immutable mode.

    Hermes has TWO session-identity namespaces: the tool-dispatch path passes
    the DB ``session_id`` (``agent.session_id``), while gateway ``/yolo``
    keys approval state off the gateway ``session_key`` (set per turn via the
    ``set_current_session_key`` contextvar in tools/approval.py). CLI and TUI
    use the DB id for both. Checking ONLY ``session_id`` here would make a
    gateway ``/yolo`` toggle silently invisible to computer_use (works in
    CLI, dead on messaging platforms), so we consult both namespaces â€”
    bypass in either means the user explicitly opted out of approvals for
    this run. Fails closed on any resolution error.
    r   )Úget_current_session_keyÚ%is_approval_bypass_active_for_sessionÚunrestrictedÚ )ÚdefaultÚstandard)Útools.approvalrb   rc   Ú	Exception)r`   rb   rc   Úcurrent_keys       r   Ú_cua_permission_moderk   «   s¤   € ðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 1Ð0°Ñ<Ô<ð 	"Ø!�>Ø-Ð-°bÐ9Ñ9Ô9ˆØð 	"Ð@Ð@ÀÑMÔMð 	"Ø!�>øøÝð ð ð àˆðøøøð ˆ:s   ‚3 —3 ³
A ¿A re   r   c                óª  — t          | pd¦  «        }	 d }d }t          5  t          |¦  «        }|dk    rDt          �=|t          vr4t          t          |<   t          j        ¦   «         t          |<   |t          |<   t           	                    |¦  «        }|�†t           	                    |d¦  «        |k    r|cd d d ¦  «         S t           
                    |¦  «        }t           
                    |d ¦  «        }t           
                    |d ¦  «         |dk    rd anÉt          j         	                    dd¦  «                             ¦   «         }|dv rddlm}  ||¬	¦  «        }n'|d
k    rt!          ¦   «         }nt#          d|›�¦  «        ‚|                     ¦   «          |t          |<   t          j        ¦   «         t          |<   |t          |<   |dk    r|a|cd d d ¦  «         S d d d ¦  «         n# 1 swxY w Y   	 |�/|5  |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   n|�|                     ¦   «          n# t(          $ r Y nw xY w�ŒB)Nre   Trg   ÚHERMES_COMPUTER_USE_BACKENDÚcua>   ú
cua-driverre   rn   r   )ÚCuaDriverBackend)Úpermission_modeÚnoopz$Unknown HERMES_COMPUTER_USE_BACKEND=)r>   Ú_backend_lockrk   rZ   r[   Ú	threadingÚRLockr\   r]   rK   ÚpopÚosÚenvironrD   Útools.computer_use.cua_backendrp   Ú_NoopBackendÚRuntimeErrorÚstartÚstopri   )	r`   ÚsidÚstale_backendÚ
stale_lockrq   ÚcachedÚbackend_namerp   Úbackends	            r   Ú_get_backendr„   É   s/  € å
ˆjÐ˜BÑ
Ô
€Cð=Ø6:ˆØ04ˆ
Ýð .	ð .	õ 3°3Ñ7Ô7ˆOØ�bŠyˆy�XÐ1°cÅÐ6JÐ6Jõ "*•	˜#‘Ý+4¬?Ñ+<Ô+<Õ# CÑ(Ø1@Õ)¨#Ñ.Ý—]’] 3Ñ'Ô'ˆFØÐ!Ý,×0Ò0°°jÑAÔAÀ_ÒTÐTØ!ð.	ð .	ð .	ð .	ñ .	ô .	ð .	ð .	õ$ !*§¢¨cÑ 2Ô 2�Ý0×4Ò4°S¸$Ñ?Ô?�
Ý)×-Ò-¨c°4Ñ8Ô8Ð8Ø˜"’9�9Ø#�Høå!œzŸ~š~Ø1°5ñ ô  ç’%‘'”'ð ð  Ð#<Ð<Ð<ØOÐOÐOÐOÐOÐOà.Ð.¸ÐOÑOÔO�G�GØ! VÒ+Ð+Ý*™nœn�G�Gå&ØO¸|ÐOÐOñô ð ð —’‘”�Ø!(•	˜#‘Ý+4¬?Ñ+<Ô+<Õ# CÑ(Ø1@Õ)¨#Ñ.Ø˜"’9�9Ø&�HØð].	ð .	ð .	ð .	ñ .	ô .	ð .	ð .	ð .	ð .	ð .	ñ .	ô .	ð .	ð .	ð .	ð .	ð .	ð .	øøøð .	ð .	ð .	ð .	ðf	ØÐ%Øð )ð )Ø!×&Ò&Ñ(Ô(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )øàÐ*Ø×"Ò"Ñ$Ô$Ð$øøÝð 	ð 	ð 	ØˆDð	øøøñy=sO   žBG/ÃDG/Ç/G3Ç6G3Ç;I Ç?H ÈI È H$È$I È'H$È(I É
IÉIÚboolc                óâ  — t          | pd¦  «        }t          5  t                               |d¦  «        }t                               |d¦  «        }t
                               |d¦  «         |dk    r	|€t          }|dk    rt          |u rdaddd¦  «         n# 1 swxY w Y   t          5  t                               |d¦  «         t                               |d¦  «         ddd¦  «         n# 1 swxY w Y   |€dS 	 |�/|5  | 
                    ¦   «          ddd¦  «         n# 1 swxY w Y   n| 
                    ¦   «          n-# t          $ r  t                               d|d¬¦  «         Y nw xY wdS )uZ  Release one session-owned computer-use backend.

    This is the production lifecycle seam for hosts and policy plugins. It
    removes the exact session backend, its call lock, and its recorded
    permission mode before stopping the backend, so new lookups cannot retain
    the stale target/ref namespace â€” and stops a private embedded daemon when
    Hermes YOLO selected unrestricted mode. Approval state is cleared even
    when no backend was started.

    Returns ``True`` when a backend was found and released, ``False`` when the
    session was already absent. Safe to call repeatedly.
    re   NFz2computer_use backend release failed for session %sT)Úexc_info)r>   rs   r[   rv   r\   r]   rZ   Ú_approval_lockr^   r_   r}   ri   ÚloggerÚdebug)r`   r~   rƒ   Ú	call_locks       r   Úrelease_computer_use_sessionrŒ     sF  € õ ˆjÐ˜BÑ
Ô
€CÝ	ð 	ð 	Ý—-’-  TÑ*Ô*ˆÝ'×+Ò+¨C°Ñ6Ô6ˆ	Ý!×%Ò% c¨4Ñ0Ô0Ð0ð �"Š9ˆ9˜˜ÝˆGØ�"Š9ˆ9� WÐ,Ð,ØˆHð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ 
ð %ð %Ý×!Ò! # tÑ,Ô,Ð,Ý×Ò˜#˜tÑ$Ô$Ð$ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð €Øˆuð
ð Ð Øð ð Ø—’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øð �LŠL‰NŒNˆNøøÝð 
ð 
ð 
Ý�ŠØ@ØØð 	ñ 	
ô 	
ð 	
ð 	
ð 	
ð
øøøð ˆ4sZ   ™A2BÂBÂBÂ)7C,Ã,C0Ã3C0Ã<E Ä D!ÄE Ä!D%Ä%E Ä(D%Ä)E Å'E,Å+E,c                 ó†  — t           5  d„ t                               ¦   «         D ¦   «         } t          �G|                      t          t          ¦  «        t          t                               d¦  «        f¦  «         dat                               ¦   «          t                               ¦   «          t                               ¦   «          ddd¦  «         n# 1 swxY w Y   t          5  t                               ¦   «          t                               ¦   «          ddd¦  «         n# 1 swxY w Y   |                      ¦   «         D ]}\  }}	 |�/|5  |                     ¦   «          ddd¦  «         n# 1 swxY w Y   n|                     ¦   «          ŒL# t          $ r%}t                                d|¦  «         Y d}~Œvd}~ww xY wdS )uá  Stop all cached backends so cua-driver children don't outlive us.

    Each session backend holds a long-lived ``cua-driver`` subprocess, so
    without this a driver can survive the Hermes process that spawned it
    (#28152 item 3). #69903 kept the orphan from burning a core by disabling
    the cursor overlay; the process itself still lingered.

    Mirrors ``browser_tool``'s ``atexit.register(_emergency_cleanup_all_sessions)``
    â€” same spawn-and-drive-a-subprocess shape. atexit only, no signal handlers:
    a ``SystemExit`` raised from a prompt_toolkit key binding corrupts its
    coroutine state and makes the process unkillable. Never raises, since an
    exception escaping atexit prints a traceback on every exit.
    c                óh   — i | ]/\  }}t          |¦  «        |t                               |¦  «        f“Œ0S rB   )Úidr\   rK   )rF   r~   rƒ   s      r   ú
<dictcomp>z,_shutdown_backend_atexit.<locals>.<dictcomp>P  sH   € ð 
ð 
ð 
á��Wõ ˆw‰KŒK˜'Õ#6×#:Ò#:¸3Ñ#?Ô#?Ð@ð
ð 
ð 
r   Nre   z%cua-driver atexit teardown failed: %s)rs   r[   ÚitemsrZ   Ú
setdefaultr�   r\   rK   Úclearr]   rˆ   r^   r_   Úvaluesr}   ri   r‰   rŠ   )Úuniquerƒ   r‹   Úes       r   Ú_shutdown_backend_atexitr—   >  s{  € õ" 
ð *ð *ð
ð 
å )§¢Ñ 1Ô 1ð
ñ 
ô 
ˆõ ÐØ×ÒÝ•8‘”ÝÕ.×2Ò2°2Ñ6Ô6Ð7ñô ð ð ˆÝ�ŠÑÔÐÝ×!Ò!Ñ#Ô#Ð#Ý!×'Ò'Ñ)Ô)Ð)ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *õ 
ð ð Ý×#Ò#Ñ%Ô%Ð%Ý×ÒÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð %Ÿmšm™oœoð Eð EÑˆ�ð	EØÐ$Øð #ð #Ø—L’L‘N”N�Nð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #øð —’‘”�øøÝð 	Eð 	Eð 	EÝ�LŠLÐ@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøð	EøøøðEð Es`   ˆB?CÃCÃCÃ%3D$Ä$D(Ä+D(Å	FÅE.Å"FÅ.E2	Å2FÅ5E2	Å6FÆ
F>ÆF9Æ9F>c                 óT   — t          ¦   «          t                               ¦   «          dS )uC   Test helper â€” tear down the cached backend and per-session state.N)r—   rY   r“   rB   r   r   Úreset_backend_for_testsr™   p  s&   € åÑÔÐÝ×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c                  ó�   — e Zd ZdZd%d„Zd%d„Zd%d„Zd&d„Z	 	 	 	 d'd(d„Zd)d„Z	d)d„Z
d)d„Zd*d„Zd+d„Zd,d„Zd,d„Zd-d.d!„Zd/d0d$„Zd
S )1rz   z5Test/CI stub. Records calls; returns trivial results.r   r   c                ó"   — g | _         d| _        d S ©NF)ÚcallsÚ_started©Úselfs    r   Ú__init__z_NoopBackend.__init__y  s   € Ø79ˆŒ
ØˆŒˆˆr   c                ó   — d| _         d S ©NT©rž   rŸ   s    r   r|   z_NoopBackend.start}  s   € ¨T˜Tœ]˜]˜]r   c                ó   — d| _         d S rœ   r¤   rŸ   s    r   r}   z_NoopBackend.stop~  s   € ¨E˜DœM˜M˜Mr   r…   c                ó   — dS r£   rB   rŸ   s    r   Úis_availablez_NoopBackend.is_available  s   € ¨4¨4r   ÚsomNÚmoder>   ÚapprQ   ÚpidúOptional[int]Ú	window_idr
   c           	     ót   — | j                              d||||dœf¦  «         t          |ddd g |pdd¬¦  «        S )Nr   )r©   rª   r«   r­   i   i   re   )r©   ÚwidthÚheightÚpng_b64Úelementsrª   Úwindow_title)r�   Úappendr
   )r    r©   rª   r«   r­   s        r   r   z_NoopBackend.capture�  se   € ð 	Œ
×ÒØØ #¨cÀ	ÐJÐJð
ñ 	ô 	ð 	õ  $¨d¸3ÈØ&(¨c¨i°RÀbðJñ Jô Jð 	Jr   r	   c                ó\   — | j                              d|f¦  «         t          dd¬¦  «        S )Nr   T©ÚokÚaction©r�   r´   r	   ©r    Úkws     r   r   z_NoopBackend.click�  s/   € ØŒ
×Ò˜7 B˜-Ñ(Ô(Ð(Ý˜t¨GÐ4Ñ4Ô4Ð4r   c                ó\   — | j                              d|f¦  «         t          dd¬¦  «        S )Nr   Tr¶   r¹   rº   s     r   r   z_NoopBackend.drag“  s/   € ØŒ
×Ò˜6 2˜,Ñ'Ô'Ð'Ý˜t¨FÐ3Ñ3Ô3Ð3r   c                ó\   — | j                              d|f¦  «         t          dd¬¦  «        S )Nr   Tr¶   r¹   rº   s     r   r   z_NoopBackend.scroll—  s/   € ØŒ
×Ò˜8 R˜.Ñ)Ô)Ð)Ý˜t¨HÐ5Ñ5Ô5Ð5r   rP   c                ód   — | j                              dd|i|¥f¦  «         t          dd¬¦  «        S )Nr   rP   Tr¶   r¹   )r    rP   r»   s      r   Ú	type_textz_NoopBackend.type_text›  s:   € ØŒ
×Ò˜6 F¨DÐ#7°BÐ#7Ð8Ñ9Ô9Ð9Ý˜t¨FÐ3Ñ3Ô3Ð3r   r=   c                ód   — | j                              dd|i|¥f¦  «         t          dd¬¦  «        S )Nr   r=   Tr¶   r¹   )r    r=   r»   s      r   r   z_NoopBackend.keyŸ  s:   € ØŒ
×Ò˜5 6¨4Ð"6°2Ð"6Ð7Ñ8Ô8Ð8Ý˜t¨EÐ2Ñ2Ô2Ð2r   úList[Dict[str, Any]]c                ó>   — | j                              di f¦  «         g S )Nr   ©r�   r´   rŸ   s    r   r   z_NoopBackend.list_apps£  s"   € ØŒ
×Ò˜;¨Ð+Ñ,Ô,Ð,Øˆ	r   c                ó>   — | j                              di f¦  «         g S )Nr   rÃ   rŸ   s    r   r   z_NoopBackend.list_windows§  s"   € ØŒ
×Ò˜>¨2Ð.Ñ/Ô/Ð/Øˆ	r   FÚraise_windowc                ób   — | j                              d||dœf¦  «         t          dd¬¦  «        S )Nr   )rª   ÚraiseTr¶   r¹   )r    rª   rÅ   s      r   r   z_NoopBackend.focus_app«  s8   € ØŒ
×Ò˜;°¸lÐ(KÐ(KÐLÑMÔMÐMÝ˜t¨KÐ8Ñ8Ô8Ð8r   ÚvalueÚelementc                ób   — | j                              d||dœf¦  «         t          dd¬¦  «        S )Nr    ©rÈ   rÉ   Tr¶   r¹   )r    rÈ   rÉ   s      r   r    z_NoopBackend.set_value¯  s8   € ØŒ
×Ò˜;°%ÀGÐ(LÐ(LÐMÑNÔNÐNÝ˜t¨KÐ8Ñ8Ô8Ð8r   ©r   r   ©r   r…   )r¨   NNN)
r©   r>   rª   rQ   r«   r¬   r­   r¬   r   r
   )r   r	   )rP   r>   r   r	   )r=   r>   r   r	   )r   rÁ   )F)rª   r>   rÅ   r…   r   r	   rS   )rÈ   r>   rÉ   r¬   r   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¡   r|   r}   r§   r   r   r   r   r¿   r   r   r   r   r    rB   r   r   rz   rz   v  s>  € € € € € Ø?Ð?ðð ð ð ð 2Ð1Ð1Ð1Ø1Ð1Ð1Ð1Ø/Ð/Ð/Ð/ð Ø!Ø!Ø#'ðJð Jð Jð Jð Jð5ð 5ð 5ð 5ð4ð 4ð 4ð 4ð6ð 6ð 6ð 6ð4ð 4ð 4ð 4ð3ð 3ð 3ð 3ðð ð ð ðð ð ð ð9ð 9ð 9ð 9ð 9ð9ð 9ð 9ð 9ð 9ð 9ð 9r   rz   ÚargsúDict[str, Any]r   c                ó  — |                       d¦  «        pd                     ¦   «                              ¦   «         }|st          j        ddi¦  «        S t          |                      d¦  «        pd¦  «        }|dv rA|                       dd¦  «        }t          |¦  «        }|rt          j        d|›�d	d
œ¦  «        S |dk    r�|                       dd¦  «        }t          |¦  «        }t          D ]`}| 	                    |¦  «        rIt          |¦  «        t          |¦  «        k    r)t          j        dt          |¦  «        › �dd
œ¦  «        c S Œa|                       d¦  «        r0|                       d¦  «        dk    rt          j        dddœ¦  «        S |t          v rt          || |¦  «        }	|	�|	S |                       d¦  «        s|dk    r*|                       d¦  «        rt          d| |¦  «        }	|	�|	S 	 t          |¬¦  «        }
n1# t          $ r$}t          j        d|› �dd
œ¦  «        cY d}~S d}~ww xY w	 t           5  t"                               |t'          j        ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   |5  t+          |
|| ¦  «        cddd¦  «         S # 1 swxY w Y   dS # t          $ r@}t,                               d|¦  «         t          j        d|› d|› �i¦  «        cY d}~S d}~ww xY w)uÊ   Main entry point â€” dispatched by tools.registry.

    Returns either a JSON string (text-only) or a dict marked `_multimodal`
    (image + summary) which run_agent.py wraps into the tool message.
    r¸   re   Úerrorzmissing `action`r`   >   r   r$   rP   zblocked pattern in type text: z:Dangerous shell patterns cannot be typed via computer_use.)rÕ   Úhintr   r=   zblocked key combo: z.Destructive system shortcuts are hard-blocked.Úbring_to_frontÚdelivery_modeÚ
foregroundz2bring_to_front requires delivery_mode='foreground'Ú"bring_to_front_requires_foreground)rÕ   ÚcodeNr   rÅ   )r`   z"computer_use backend unavailable: z›If the cua-driver binary is missing, run `hermes computer-use install`. If a Python dependency is missing, the error above shows the exact install command.zcomputer_use %s failedz	 failed: )rK   rC   rD   ÚjsonÚdumpsr>   rX   rO   Ú_BLOCKED_KEY_COMBOSÚissubsetÚlenÚsortedÚ_DESTRUCTIVE_ACTIONSÚ_request_approvalr„   ri   rs   r\   r’   rt   ru   Ú	_dispatchr‰   Ú	exception)rÒ   Úkwargsr¸   r`   rP   rW   r=   ÚcomboÚblockedÚerrrƒ   r–   r‹   s                r   Úhandle_computer_userê   ¸  s+  € ð �hŠh�xÑ Ô Ð& B×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7€FØð 9ÝŒz˜7Ð$6Ð7Ñ8Ô8Ð8õ �V—Z’Z Ñ-Ô-Ð3°Ñ4Ô4€Jð Ð-Ð-Ð-Ø�xŠx˜ Ñ#Ô#ˆÝ˜tÑ$Ô$ˆØð 	Ý”:ØA¸#ÐAÐAØTðð ñ ô ð ð
 �‚€Ø�xŠx˜ Ñ#Ô#ˆÝ  Ñ&Ô&ˆÝ*ð 	ð 	ˆGØ×Ò Ñ&Ô&ð ­3¨w©<¬<½3¸u¹:¼:Ò+EÐ+EÝ”zØDµ6¸'±?´?ÐDÐDØLð#ð #ñ ô ð ð ð øð
 ‡x‚xÐ Ñ!Ô!ð  d§h¢h¨Ñ&?Ô&?À<Ò&OÐ&OÝŒzØIØ8ð
ð 
ñ ô ð 	ð Õ%Ð%Ð%Ý ¨¨jÑ9Ô9ˆØˆ?ØˆJð ‡x‚xÐ Ñ!Ô!ð Ø�+ÒÐ $§(¢(¨>Ñ":Ô":ÐåÐ 0°$¸
ÑCÔCˆØˆ?ØˆJðÝ¨*Ð5Ñ5Ô5ˆˆøÝð ð ð ÝŒzØ=¸!Ð=Ð=ðjð
ð 
ñ ô ð 	ð 	ð 	ð 	ð 	ð 	øøøøðøøøð>Ýð 	Vð 	VÝ+×6Ò6°zÅ9Ä?ÑCTÔCTÑUÔUˆIð	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vøøøð 	Vð 	Vð 	Vð 	Vàð 	4ð 	4Ý˜W f¨dÑ3Ô3ð	4ð 	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øåð >ð >ð >Ý×ÒÐ1°6Ñ:Ô:Ð:ÝŒz˜7 vÐ$;Ð$;¸Ð$;Ð$;Ð<Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð>øøøs„   Ç9H
 È

H8ÈH3È-H8È3H8È<J4 É-I<É0J4 É<J Ê J4 ÊJ ÊJ4 Ê	J'ÊJ4 Ê'J+Ê+J4 Ê.J+Ê/J4 Ê4
K>Ê>5K9Ë3K>Ë9K>r¸   c                ód  — |                      d¦  «        dk    }| |rdndf}t          5  t                                |¦  «        r	 ddd¦  «         dS |t                                |t	          ¦   «         ¦  «        v r	 ddd¦  «         dS 	 ddd¦  «         n# 1 swxY w Y   t
          }|€dS t          | |¦  «        }	  || ||¦  «        }n4# t          $ r'}t           	                    d|¦  «         d}Y d}~nd}~ww xY w|dk    rdS |dk    s|d	k    rkt          5  t           
                    |t	          ¦   «         ¦  «                             |¦  «         |d	k    r
d
t          |<   ddd¦  «         n# 1 swxY w Y   dS |dk    rt          j        d| dœ¦  «        S t          j        d| dœ¦  «        S )uP  Return None if approved, or a JSON error string if denied.

    Approval is scoped by (action, delivery_mode) AND by session_id.
    Foreground delivery is a visible focus change, so a prior background
    approval â€” even ``approve_session`` on the same action â€” must NOT
    silently authorize it (NousResearch/hermes-agent#67052).
    ``always_approve`` (the blanket "auto-approve everything" unlock) still
    covers foreground, since the user explicitly opted into unattended
    operation. State is keyed on session_id so concurrent runs don't leak
    unlocks into one another.
    rØ   rÙ   Ú
backgroundNzapproval callback failed: %sÚdenyÚapprove_onceÚapprove_sessionÚalways_approveTÚtimeoutun   approval prompt timed out â€” the user did not respond. Silence is not consent; do not retry without the user.)rÕ   r¸   zdenied by user)rK   rˆ   r^   r_   Úsetr   Ú_summarize_actionri   r‰   Úwarningr’   ÚaddrÜ   rÝ   )	r¸   rÒ   r`   Úis_foregroundÚ	scope_keyr   ÚsummaryÚverdictr–   s	            r   rã   rã     s²  € ð —H’H˜_Ñ-Ô-°Ò=€MØ¨ÐH˜˜¸LÐI€IÝ	ð ð Ý ×$Ò$ ZÑ0Ô0ð 	Øðð ð ñ ô ð ð ð ð �×)Ò)¨*µc±e´eÑ<Ô<Ð<Ð<Øð	ð ð ñ ô ð ð ð ð =ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ
 
€BØ	€zð ˆtÝ ¨Ñ-Ô-€GðØ�"�V˜T 7Ñ+Ô+ˆˆøÝð ð ð Ý�ŠÐ5°qÑ9Ô9Ð9Øˆˆˆˆˆˆøøøøðøøøð �.Ò Ð ØˆtØÐ#Ò#Ð# wÐ2BÒ'BÐ'BÝð 	9ð 	9Ý×$Ò$ Zµ±´Ñ7Ô7×;Ò;¸IÑFÔFÐFØÐ*Ò*Ð*Ø48Õ% jÑ1ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð ˆtØ�)ÒÐÝŒzðIð ð
ð 
ñ ô ð 	õ Œ:Ð 0¸FÐCÐCÑDÔDÐDsB   ©BÁ*BÂBÂBÂ=C Ã
C<ÃC7Ã7C<ÄAE1Å1E5Å8E5c                ón  — |                      d¦  «        dk    rdnd}| dv rV|                      d¦  «        �| › d|d         › |› �S |                      d¦  «        }|r| › d	t          |¦  «        › |› �S | |z   S | d
k    r^|                      d¦  «        p|                      d¦  «        }|                      d¦  «        p|                      d¦  «        }d|› d|› |› �S | dk    r2d|                      dd¦  «        › d|                      dd¦  «        › |› �S | dk    r>|                      dd¦  «        }d|d d…         ›�t          |¦  «        dk    rdndz   |z   S | dk    rd|                      dd¦  «        ›|› �S | d k    r3d!|                      d"d¦  «        ›�|                      d#¦  «        rd$ndz   S | |z   S )%NrØ   rÙ   u;    [FOREGROUND â€” briefly raises the window / changes focus]re   >   r   r!   r"   r#   rÉ   z
 element #Ú
coordinatez at r   Úfrom_elementÚfrom_coordinateÚ
to_elementÚto_coordinatezdrag u    â†’ r   zscroll Ú	directionú?z xÚamounté   r   rP   ztype é<   z...r   zkey r=   r   zfocus rª   rÅ   z (raise))rK   Útuplerà   )r¸   rÒ   ÚfgÚcoordÚsrcÚdstrP   s          r   ró   ró   4  s  € à�8Š8�OÑ$Ô$¨Ò4Ð4ð 
GÐ	FØ:<ð àÐIÐIÐIØ�8Š8�IÑÔÐ*ØÐ=Ð=¨¨Y¬Ð=¸Ð=Ð=Ð=Ø—’˜Ñ&Ô&ˆØð 	5ØÐ4Ð4¥%¨¡,¤,Ð4°Ð4Ð4Ð4Ø˜‰{ÐØ�ÒÐØ�hŠh�~Ñ&Ô&ÐE¨$¯(ª(Ð3DÑ*EÔ*EˆØ�hŠh�|Ñ$Ô$ÐA¨¯ª°Ñ(AÔ(AˆØ*�sÐ*Ð* Ð* bÐ*Ð*Ð*Ø�ÒÐØR˜Ÿš +¨sÑ3Ô3ÐRÐR°t·x²xÀÈ!Ñ7LÔ7LÐRÈbÐRÐRÐRØ�ÒÐØ�xŠx˜ Ñ#Ô#ˆØ$�t˜C˜R˜C”yÐ$Ð$µ°T±´¸R²°¨¨ÀRÑHÈ2ÑMÐMØ�‚€Ø2�d—h’h˜v rÑ*Ô*Ð2¨bÐ2Ð2Ð2Ø�ÒÐØ/˜Ÿš ¨Ñ+Ô+Ð/Ð/ÀÇÂÈ.ÑAYÔAYÐ3a°:°:Ð_aÑbÐbØ�B‰;Ðr   rƒ   c                óþ  — t          |                     d¦  «        ¦  «        }|dk    rÿt          |                     dd¦  «        ¦  «        }|dvrt          j        dd|›d�i¦  «        S ||                     d	¦  «        d
œ}|                     d¦  «        €|                     d¦  «        �>|                     |                     d¦  «        |                     d¦  «        dœ¦  «          | j        dfi |¤Ž}t          |t          |                     d¦  «        ¦  «        ¬¦  «        S |dk    rGt          |                     dd¦  «        ¦  «        }|  
                    |¦  «        }t          |¦  «        S |dk    r8|                      ¦   «         }	t          j        |	t          |	¦  «        dœ¦  «        S |dk    r8|                      ¦   «         }
t          j        |
t          |
¦  «        dœ¦  «        S |dk    ru|                     d	¦  «        }|st          j        ddi¦  «        S |                      |t          |                     d¦  «        ¦  «        ¬¦  «        }t!          | ||¦  «        S |dk    rIi }dD ]%\  }}|                     |¦  «        �||         ||<   Œ&t          j         | j        dfi |¤Ž¦  «        S |dk    r™t          j        |                      |                     d¦  «        |                     d¦  «        |                     dd¦  «        |                     d ¦  «        t          |                     d!¦  «        ¦  «        ¬"¦  «        ¦  «        S d#d$d%d&d'd(d)d*œ}|                     |¦  «        }|��Ti }d+d,d-d.d/d0d1d2œ}||         D ]"}|                     |¦  «        �||         ||<   Œ#|d3v rW|                     d4¦  «        �B|d4         }t'          |t(          t*          f¦  «        rt          |¦  «        d5k    r|\  |d6<   |d7<   |                     d8¦  «        }|                     d9¦  «        }|                     d:¦  «        }||vr|d&k    r|€|}|d'k    r|€|}|�||d:<   |�||d:<   |                     d;¦  «        �|d;         |d<   t          j        |                      ||                     d<¦  «        |¬=¦  «        ¦  «        S |                     d>¦  «        }t          |                     d?¦  «        ¦  «        }|d@v rÈ|                     dA¦  «        }dB}|dCk    rd5}n|dDk    rdE}n|dFk    rdG}n|pdH}|                     dI¦  «        }|                     d4¦  «        pdJ}|r|dK         �|dK         |dB         fndJ\  }}|                      |�|nd |||pdH||                     dL¦  «        ||¬M¦  «        }t!          | ||¦  «        S |dNk    �rA|                     dO¦  «        d uo|                     dP¦  «        d u} |                     dQ¦  «        o|                     dR¦  «        }!| s|!st          j        ddSi¦  «        S |                      |                     dO¦  «        |                     dP¦  «        |                     dQ¦  «        rt+          |dQ         ¦  «        nd |                     dR¦  «        rt+          |dR         ¦  «        nd |                     dAdH¦  «        |                     dL¦  «        ||¬T¦  «        }t!          | ||¦  «        S |dUk    rÄ|                     d4¦  «        pdJ}|                      |                     dVdW¦  «        t5          |                     dXdY¦  «        ¦  «        |                     dI¦  «        |r|dK         �|dK         nd |r|dB         �|dB         nd |                     dL¦  «        ||¬Z¦  «        }t!          | ||¦  «        S |d[k    r=|                      |                     d\d]¦  «        ||¬^¦  «        }t!          | ||¦  «        S |d_k    r=|                      |                     d`d]¦  «        ||¬^¦  «        }t!          | ||¦  «        S |dak    ru|                     db¦  «        }"|"€t          j        ddci¦  «        S |                      t          |"¦  «        |                     dI¦  «        ¬d¦  «        }t!          | ||¦  «        S t          j        dde|›�i¦  «        S )gNÚcapture_afterr   r©   r¨   >   Úaxr¨   ÚvisionrÕ   z	bad mode z; use som|vision|axrª   ©r©   rª   r«   r­   )r«   r­   Úmax_elements)r  r   Úsecondsç      ð?r   )ÚappsÚcountr   )r:   r  r   zfocus_app requires `app`rÅ   )rÅ   r   ))r«   r«   )r­   r­   )Útab_idr  )Úsnapshot_formatr  )Úqueryr  )Ú	scope_refr  )Úcontinuationr  r(   Úprofile_modeÚisolated_newÚprofile_nameÚallow_launch)r«   r­   r  r  r  Úbrowser_navigateÚbrowser_clickÚbrowser_typeÚbrowser_pointerÚbrowser_dialogÚbrowser_set_input_filesÚbrowser_download)r*   r%   r$   r'   r&   r+   r)   )Úurl)ÚrefÚinput_routeÚxÚy)r%  rP   )	r%  Údestination_refr&  r'  r(  Úto_xÚto_yÚdelta_xÚdelta_y)Ú	dialog_idÚprompt_textrØ   )r%  Úfiles)r%  Údestination_root)r  r  r  r   r!  r"  r#  >   r  r   rû   é   r'  r(  Úbrowser_pointer_actionÚbrowser_dialog_actionr¸   Úbrowser_type_moder  )r  rÒ   rØ   r×   >   r   r!   r"   r#   Úbuttoné   r"   r!   Úrightr#   ÚmiddleÚleftrÉ   )NNr   Ú	modifiers)rÉ   r'  r(  r6  Úclick_countr;  rØ   r×   r   rü   rþ   rý   rÿ   zFdrag requires from_coordinate/to_coordinate or from_element/to_element)rü   rþ   Úfrom_xyÚto_xyr6  r;  rØ   r×   r   r   Údownr  r  )r   r  rÉ   r'  r(  r;  rØ   r×   r   rP   re   )rØ   r×   r   r=   r    rÈ   zset_value requires `value`rË   zunknown action rB   )r…   rK   r>   rÜ   rÝ   Úupdater   Ú_capture_responseÚ_coerce_max_elementsÚfloatr   Ú_text_responser   rà   r   r   Ú_maybe_follow_captureÚtyped_browser_stateÚtyped_browser_prepareÚ
isinstanceÚlistr  Útyped_browser_actionr   r   r   Úintr¿   r   r    )#rƒ   r¸   rÒ   r  r©   Úcapture_kwargsÚcapr  Úresr  r:   rª   Ú
state_argsÚpublicÚinternalÚbrowser_toolsÚdriver_toolÚ	call_argsÚallowed_fieldsÚfieldrû   Úpointer_actionÚdialog_actionÚnested_actionrØ   r×   r6  r<  rÉ   r  r'  r(  Úhas_elementsÚ
has_coordsrÈ   s#                                      r   rä   rä   N  s¸	  € Ý˜Ÿš /Ñ2Ô2Ñ3Ô3€Mà�ÒÐÝ�4—8’8˜F EÑ*Ô*Ñ+Ô+ˆØÐ.Ð.Ð.Ý”:˜wÐ(O°DÐ(OÐ(OÐ(OÐPÑQÔQÐQØ26¸t¿xºxÈ¹¼Ð)OÐ)OˆØ�8Š8�E‰?Œ?Ð&¨$¯(ª(°;Ñ*?Ô*?Ð*KØ×!Ò!Ø—x’x ‘”Ø!ŸXšX kÑ2Ô2ð#ð #ñ ô ð ð ˆgŒoÐ/Ð/ Ð/Ð/ˆÝ  Õ3GÈÏÊÐQ_ÑH`ÔH`Ñ3aÔ3aÐbÑbÔbÐbà�ÒÐÝ˜Ÿš ¨CÑ0Ô0Ñ1Ô1ˆØ�lŠl˜7Ñ#Ô#ˆÝ˜cÑ"Ô"Ð"à�ÒÐØ× Ò Ñ"Ô"ˆÝŒz 4µ#°d±)´)Ð<Ð<Ñ=Ô=Ð=à�ÒÐØ×&Ò&Ñ(Ô(ˆÝŒz g½¸G¹¼ÐEÐEÑFÔFÐFà�ÒÐØ�hŠh�u‰oŒoˆØð 	EÝ”:˜wÐ(BÐCÑDÔDÐDØ×Ò µ$°t·x²xÀÑ7OÔ7OÑ2PÔ2PÐÑQÔQˆÝ$ W¨c°=ÑAÔAÐAð Ð$Ò$Ð$Ø%'ˆ
ð!
ð 
	4ð 
	4ÑˆF�Hð �xŠx˜ÑÔÐ+Ø'+¨F¤|�
˜8Ñ$øÝŒzÐ5˜'Ô5ÐCÐC¸
ÐCÐCÑDÔDÐDàÐ&Ò&Ð&ÝŒz˜'×7Ò7Ø—’˜‘”Ø—h’h˜{Ñ+Ô+ØŸš .°.ÑAÔAØŸš .Ñ1Ô1Ý˜dŸhšh ~Ñ6Ô6Ñ7Ô7ð 8ñ 
ô 
ñ ô ð 	ð !3Ø,Ø*Ø0Ø.Ø'@Ø 2ðð €Mð  ×#Ò# FÑ+Ô+€KØÑØ$&ˆ	à (Ø=Ø+ð ðð (8Ø ;ð
ð 
ˆð $ KÔ0ð 	/ð 	/ˆEØ�xŠx˜‰ŒÐ*Ø#'¨¤;�	˜%Ñ øàÐ?Ð?Ð?Ø—’˜Ñ&Ô&Ð2à˜lÔ+ˆJÝ˜*¥t­U mÑ4Ô4ð <½¸Z¹¼ÈAÒ9MÐ9MØ1;Ñ.�	˜#‘ 	¨#¡ØŸšÐ":Ñ;Ô;ˆØŸšÐ!8Ñ9Ô9ˆð Ÿš Ñ*Ô*ˆØ Ð-Ð-ØÐ/Ò/Ð/°NÐ4JØ!.�ØÐ.Ò.Ð.°=Ð3HØ -�ØÐ%Ø"0ˆI�hÑØÐ$Ø"/ˆI�hÑØ�8Š8Ð'Ñ(Ô(Ð4Ø $Ð%8Ô 9ˆI�fÑÝŒz˜'×6Ò6ØØ—8’8˜HÑ%Ô%Øð 7ñ 
ô 
ñ ô ð 	ð —H’H˜_Ñ-Ô-€MÝ˜$Ÿ(š(Ð#3Ñ4Ô4Ñ5Ô5€NàÐIÐIÐIØ—’˜(Ñ#Ô#ˆØˆØ�^Ò#Ð#ØˆKˆKØ�}Ò$Ð$ØˆFˆFØ�~Ò%Ð%ØˆFˆFàÐ%˜vˆFØ—(’(˜9Ñ%Ô%ˆØ—’˜Ñ&Ô&Ð6¨,ˆØ',ÐW°°q´Ð1E��a”˜% œ(Ð#Ð#È<‰ˆˆ1Ø�mŠmØ&Ð2�G�G¸Ø�1˜VÐ- v¸;Ø—h’h˜{Ñ+Ô+Ø'¸ð	 ñ 
ô 
ˆõ % W¨c°=ÑAÔAÐAà�ÒÑØ—x’x Ñ/Ô/°tÐ;ÐbÀÇÂÈÑ@VÔ@VÐ^bÐ@bˆØ—X’XÐ/Ñ0Ô0ÐN°T·X²X¸oÑ5NÔ5Nˆ
Øð 	 Jð 	Ý”:ØÐaðñ ô ð ð �lŠlØŸš .Ñ1Ô1Ø—x’x Ñ-Ô-Ø6:·h²hÐ?PÑ6QÔ6QÐ[•E˜$Ð0Ô1Ñ2Ô2Ð2ÐW[Ø26·(²(¸?Ñ2KÔ2KÐU•%˜˜_Ô-Ñ.Ô.Ð.ÐQUØ—8’8˜H fÑ-Ô-Ø—h’h˜{Ñ+Ô+Ø'¸ð ñ 
ô 
ˆõ % W¨c°=ÑAÔAÐAà�ÒÐØ—’˜Ñ&Ô&Ð6¨,ˆØ�nŠnØ—h’h˜{¨FÑ3Ô3Ý�t—x’x ¨!Ñ,Ô,Ñ-Ô-Ø—H’H˜YÑ'Ô'ØÐB E¨!¤HÐ$8ˆe�AŒhˆh¸dØÐB E¨!¤HÐ$8ˆe�AŒhˆh¸dØ—h’h˜{Ñ+Ô+Ø'¸ð ñ 
ô 
ˆõ % W¨c°=ÑAÔAÐAà�ÒÐØ×Ò §¢¨°Ñ 4Ô 4Ø.;ÈNð  ñ \ô \ˆå$ W¨c°=ÑAÔAÐAà�‚€Ø�kŠk˜$Ÿ(š( 6¨2Ñ.Ô.Ø(5Ànð ñ Vô Vˆå$ W¨c°=ÑAÔAÐAà�ÒÐØ—’˜Ñ!Ô!ˆØˆ=Ý”:˜wÐ(DÐEÑFÔFÐFØ×Ò¥c¨%¡j¤j¸$¿(º(À9Ñ:MÔ:MÐÑNÔNˆÝ$ W¨c°=ÑAÔAÐAåŒ:�wÐ <°&Ð <Ð <Ð=Ñ>Ô>Ð>r   rN  r	   c                ó  — | j         dk    s	| j        du rddiS | j         dk    rddiS | j         dk    s| j        r| j        �=dd	i}t	          | j        t          ¦  «        r| j                             d
¦  «        |d
<   |S ddiS )a!  Choose the next ladder step from semantic evidence, in precedence order.

    An escalation recommendation is advisory. It never overrides a confirmed
    effect and it never turns an unverifiable action into permission to repeat
    input. The model must first obtain fresh evidence.
    Ú	confirmedTÚdecisionÚdoneÚunverifiableÚverify_fresh_stateÚsuspected_noopNÚescalateÚrecommended)ÚeffectÚverifiedr·   rÛ   rH  Ú
escalationÚdictrK   )rN  r^  s     r   Ú_classify_action_resultri    s§   € ð „z�[Ò Ð  C¤L°DÐ$8Ð$8Ø˜FÐ#Ð#Ø
„z�^Ò#Ð#ØÐ0Ð1Ð1Ø
„zÐ%Ò%Ð%¨S¬VÐ%°s´xÐ7KØ$.°
Ð#;ˆÝ�c”n¥dÑ+Ô+ð 	HØ&)¤n×&8Ò&8¸Ñ&GÔ&GˆH�]Ñ#ØˆàÐ,Ð-Ð-r   c                óz  — | j         | j        dœ}| j        r
| j        |d<   | j        �
| j        |d<   | j        �
| j        |d<   | j        �
| j        |d<   | j        �
| j        |d<   | j        �
| j        |d<   | j        �
| j        |d<   | j	        �
| j	        |d	<   | j
        r
| j
        |d
<   t          | ¦  «        |d<   |S )Nr¶   Úmessagerf  re  rg  ÚpathÚdegradedrØ   rÛ   r<   rù   )r·   r¸   rk  rf  re  rg  rl  rm  rØ   rÛ   r<   ri  )rN  Úpayloads     r   Ú_action_payloadro  /  sã   € Ø%(¤V°s´zÐBÐB€GØ
„{ð )Ø œ[ˆ�	Ñð
 „|ÐØ!œlˆ�
ÑØ
„zÐØœJˆ�ÑØ
„~Ð!Ø #¤ˆ�ÑØ
„xÐØœ(ˆ�‰Ø
„|ÐØ!œlˆ�
ÑØ
ÔÐ$Ø#&Ô#4ˆ�Ñ Ø
„xÐØœ(ˆ�‰Ø
„xð #Øœ(ˆ�‰Ý0°Ñ5Ô5€GˆIÑØ€Nr   c                óD   — t          j        t          | ¦  «        ¦  «        S rS   )rÜ   rÝ   ro  )rN  s    r   rD  rD  K  s   € ÝŒ:•o cÑ*Ô*Ñ+Ô+Ð+r   éd   iè  é   Ú	image_b64úOptional[Tuple[int, int]]c                ó�  — | sdS 	 t          j        | d¬¦  «        }n# t          $ r Y dS w xY w|                     d¦  «        rct	          |¦  «        dk    rP	 t          j        d|dd…         ¦  «        \  }}t          |¦  «        t          |¦  «        fS # t          $ r Y dS w xY w|                     d¦  «        �rŠt	          |¦  «        d	k    �rvd
}|dz   t	          |¦  «        k     �r]||         dk    r|dz  }Œ)||dz            }|d
z  }|dk    r9|t	          |¦  «        k     r&||         }|dz  }|dk    r|t	          |¦  «        k     °&|dv rŒ}|dk    rnð|d
z   t	          |¦  «        k    rnÙt                               |||d
z   …         d¦  «        }|d
k     s||z   t	          |¦  «        k    rn–|dv rv|dk    rpt                               ||dz   |dz   …         d¦  «        }t                               ||dz   |dz   …         d¦  «        }t          |¦  «        t          |¦  «        fS ||z  }|dz   t	          |¦  «        k     �°]dS )a!  Return (width, height) for common inline screenshot formats.

    Some providers reject images below 8x8 before the model sees the tool
    result. Inspecting the encoded bytes here lets computer_use fall back to
    its AX/SOM text payload instead of sending an unusable placeholder.
    NF©Úvalidates   ‰PNG

é   z>IIé   s   ÿØé   r2  é	   éÿ   r7  >   éØ   éÙ   éÚ   Úbig>   éÀ   éÁ   éÂ   éÃ   éÅ   éÆ   éÇ   éÉ   éÊ   éË   éÍ   éÎ   éÏ   é   r  é   )	Úbase64Ú	b64decoderi   Ú
startswithrà   ÚstructÚunpackrK  Ú
from_bytes)rs  Úrawr¯   r°   ÚiÚmarkerÚsegment_lens          r   Ú_image_dimensions_from_b64rš  [  s—  € ð ð ØˆtðÝÔ˜y°5Ð9Ñ9Ô9ˆˆøÝð ð ð Øˆtˆtðøøøð ‡~‚~Ð*Ñ+Ô+ð µ°C±´¸B²°ð	Ý"œM¨%°°R¸°U´Ñ<Ô<‰MˆE�6Ý�u‘:”:�s 6™{œ{Ð*Ð*øÝð 	ð 	ð 	Ø�4�4ð	øøøð ‡~‚~�kÑ"Ô"ñ ¥s¨3¡x¤x°!¢|¡|ØˆØ�!‰e•c˜#‘h”hÒÑØ�1Œv˜Š~ˆ~Ø�Q‘�ØØ˜˜Q™”ZˆFØ�‰FˆAØ˜D’.�. Q­¨S©¬¢\ \Ø˜Qœ�Ø�Q‘�ð ˜D’.�. Q­¨S©¬¢\ \ð ˜Ð%Ð%ØØ˜Š~ˆ~ØØ�1‰u•s˜3‘x”xÒÐØÝŸ.š.¨¨Q¨q°1©u¨W¬°uÑ=Ô=ˆKØ˜QŠˆ ! k¡/µC¸±H´HÒ"<Ð"<ØØð ð ð ð  Ò"Ð"ÝŸš¨¨A°©E°!°a±%¨KÔ(8¸%Ñ@Ô@�ÝŸš s¨1¨q©5°°Q±¨;Ô'7¸Ñ?Ô?�Ý˜5‘z”z¥3 v¡;¤;Ð.Ð.Ø�ÑˆAð3 �!‰e•c˜#‘h”hÒÑð4 ˆ4s   † �
+ª+Á=B Â
B#Â"B#rÈ   rK  c                ó´   — | €t           S 	 t          | ¦  «        }n# t          t          f$ r
 t           cY S w xY w|dk     rt           S |t          k    rt          S |S )ap  Validate the caller-supplied ``max_elements``.

    Falls back to :data:`_DEFAULT_MAX_ELEMENTS` for missing / non-integer /
    sub-1 inputs so the cap can never be silently disabled by a malformed
    tool-call argument. Clamps oversized values to
    :data:`_MAX_ALLOWED_MAX_ELEMENTS` so a caller cannot bypass the
    safeguard by passing a very large integer.
    Nr7  )Ú_DEFAULT_MAX_ELEMENTSrK  Ú	TypeErrorÚ
ValueErrorÚ_MAX_ALLOWED_MAX_ELEMENTS)rÈ   Úns     r   rB  rB  ‘  ss   € ð €}Ý$Ð$ð%Ý�‰JŒJˆˆøÝ•zÐ"ð %ð %ð %Ý$Ð$Ð$Ð$ð%øøøàˆ1‚u€uÝ$Ð$ØÕ$Ò$Ð$Ý(Ð(Ø€Hs   ‹ ›6µ6rM  r
   r  c                ó   — t          | j        ¦  «        }| j        d |…         }t          d|t          |¦  «        z
  ¦  «        }| j        rt	          | j        pd¦  «        nd }|r|d         n| j        }|r|d         n| j        }t          |o!|d         t          k     p|d         t          k     ¦  «        }t          |¦  «        }	d| j
        › d|› d|› �| j        r
d| j        › �ndz   | j        r
d| j        ›�ndz   |› d	�g}
|	r|
                     |	¦  «         |r8|
                     d
|d         › d|d         › dt          › dt          › d�	¦  «         d                     |
¦  «        }| j        �r!| j
        dk    �r|�st!          ¦   «         r§t#          | |¦  «        }|�|S |
                     d¦  «         |r)|
                     dt          |¦  «        › d|› d�¦  «         | j
        ||| j        | j        d„ |D ¦   «         |d                     |
¦  «        ddœ	}|r||d<   t%          j        |¦  «        S | j        }|s(| j        d d…         }|                     d¦  «        rdnd}dd|dœddd|› d | j        › �id!œg|| j
        |||| j        d"œd#œS |r)|
                     dt          |¦  «        › d|› d�¦  «         d                     |
¦  «        }| j
        ||| j        | j        d$„ |D ¦   «         ||d%œ}|r||d<   t%          j        |¦  «        S )&Nr   re   r7  zcapture mode=Ú r'  z app=z window=z interactable element(s):z  (screenshot omitted: z is below the z provider minimum)Ú
r  u£     (vision unavailable: the auxiliary vision model could not be reached; screenshot omitted. Element-index actions still work â€” drive via the element list above.)z  (response truncated to z of z5 elements; raise max_elements or pass app= to narrow)c                ó,   — g | ]}t          |¦  «        ‘ŒS rB   ©Ú_element_to_dict©rF   r–   s     r   rH   z%_capture_response.<locals>.<listcomp>ò  s!   € ÐKÐKÐK°QÕ-¨aÑ0Ô0ÐKÐKÐKr   T)	r©   r¯   r°   rª   r³   r²   Útotal_elementsrø   Úvision_unavailableÚtruncated_elementsrr  ú/9j/ú
image/jpegz	image/pngrP   )r   rP   Ú	image_urlr$  zdata:z;base64,)r   r­  )r©   r¯   r°   r²   Ú	png_bytes)Ú_multimodalÚcontentÚtext_summaryr<   c                ó,   — g | ]}t          |¦  «        ‘ŒS rB   r¥  r§  s     r   rH   z%_capture_response.<locals>.<listcomp>   s!   € ÐCÐCÐC¨QÕ% aÑ(Ô(ÐCÐCÐCr   )r©   r¯   r°   rª   r³   r²   r¨  rø   )rà   r²   Úmaxr±   rš  r¯   r°   r…   Ú_MIN_PROVIDER_IMAGE_DIMENSIONÚ_format_elementsr©   rª   r³   Úextendr´   ÚjoinÚ _should_route_through_aux_visionÚ!_route_capture_through_aux_visionrÜ   rÝ   Úimage_mime_typer’  Úpng_bytes_len)rM  r  r¨  Úvisible_elementsrª  Úimage_dimensionsÚresponse_widthÚresponse_heightÚimage_too_smallÚelement_indexÚsummary_linesrø   Úroutedrn  Ú_mimeÚ_b64_prefixs                   r   rA  rA  §  sy  € Ý˜œÑ&Ô&€NØ”| M \ MÔ2ÐÝ˜Q µÐ5EÑ1FÔ1FÑ FÑGÔGÐØHKÌÐ]Õ1°#´+Ð2CÀÑDÔDÐDÐY]ÐØ,<ÐKÐ% aÔ(Ð(À#Ä)€NØ-=ÐMÐ& qÔ)Ð)À3Ä:€OÝØð 	
à˜QÔÕ"?Ò?ð CØ Ô"Õ%BÒBñ	ô €Oõ %Ð%5Ñ6Ô6€MàE˜œÐEÐE >ÐEÐE°OÐEÐEØ #¤Ð/Ð�3”7ÐÐÐ¨Rñ	1à.1Ô.>ÐFÐ*�cÔ&Ð*Ð*Ð*ÀBñ	Hð Ð4Ð4Ð4ð	€Mð ð ,Ø×Ò˜]Ñ+Ô+Ð+ð ð 
Ø×Òð Ð&6°qÔ&9ð  ð  Ð<LÈQÔ<Oð  ð  Ý9ð ð  Ý<Yð ð  ð  ñ	
ô 	
ð 	
ð
 �iŠi˜Ñ&Ô&€Gà
„{ñ A
�s”x 4Ò'Ñ'°Ñ'õ ,Ñ-Ô-ð "	'Ý6°s¸GÑDÔDˆFØÐ!Ø�ð × Ò ð>ñô ð ð
 "ð Ø×$Ò$ð&µÐ4DÑ0EÔ0Eð &ð &Ø%ð&ð &ð &ñô ð ð œØ'Ø)Ø”wØ #Ô 0ØKÐKÐ:JÐKÑKÔKØ"0ØŸ9š9 ]Ñ3Ô3Ø&*ð
ð 
ˆGð "ð CØ0B�Ð,Ñ-Ý”:˜gÑ&Ô&Ð&ð Ô#ˆØð 	TØœ+ b q bœ/ˆKØ$/×$:Ò$:¸6Ñ$BÔ$BÐS�L�LÈˆEð
  à¨Ð1Ð1Ø$Ø$Ð&J¨eÐ&JÐ&J¸S¼[Ð&JÐ&JÐKðMð Mðð
 $Ø œX°È/Ø!/¸cÔ>OðQð Qð

ð 

ð 
	
ð ð 
Ø×Òð:­Ð,<Ñ(=Ô(=ð :ð :À>ð :ð :ð :ñ	
ô 	
ð 	
ð �iŠi˜Ñ&Ô&€Gà”ØØ!ØŒwØÔ(ØCÐCÐ2BÐCÑCÔCØ(Øð	ð 	€Gð ð ;Ø(:ˆÐ$Ñ%ÝŒ:�gÑÔÐr   i°  r–  ÚbytesÚextÚmax_dimútuple[bytes, Optional[str]]c           
     óP  — 	 ddl m} ddlm} |                      || ¦  «        ¦  «        }t          |j        ¦  «        |k    r| dfS |j        \  }}|                     ||f¦  «         |j        \  }}	 |¦   «         }
|                     |
|dk    rdnd¬¦  «         |r||z  nd	}|	r||	z  nd	}|d
›|d
›k    rd|d
›d�}nd|d
›d|d
›d�}d|› d|› d|› d|	› d|› �
}|
 	                    ¦   «         |fS # t          $ r)}t                               d|¦  «         | dfcY d}~S d}~ww xY w)uÅ  Downscale encoded image bytes so the longest side is <= max_dim.

    Returns ``(bytes, scale_note)``. ``scale_note`` is ``None`` when the image
    was returned unchanged (already fits, or Pillow unavailable/failed â€” no
    worse than the pre-shrink behavior). When a downscale happened, the note
    tells the vision model the scale factor so any coordinates it reports can
    be mapped back to the real screen instead of being silently wrong.
    r   )ÚBytesIO)ÚImageNú.jpgÚJPEGÚPNG)Úformatr  z.2fz'multiply any coordinates you report by z  to map back to the real screen.z)multiply any x coordinates you report by z and any y coordinates by zScreenshot downscaled from r'  z to z for vision; z*computer_use: vision downscale skipped: %s)ÚiorË  ÚPILrÌ  Úopenr³  ÚsizeÚ	thumbnailÚsaveÚgetvalueri   r‰   rŠ   )r–  rÇ  rÈ  rË  rÌ  ÚimgÚorig_wÚorig_hÚnew_wÚnew_hÚoutÚfxÚfyÚfactor_clauseÚ
scale_noteÚexcs                   r   Ú_shrink_capture_for_visionrã  3  sñ  € ðØÐÐÐÐÐØÐÐÐÐÐØ�jŠj˜˜ ™œÑ&Ô&ˆÝˆsŒx‰=Œ=˜GÒ#Ð#Ø˜�9ÐØœ‰ˆ�Ø�Š�w Ð(Ñ)Ô)Ð)Ø”x‰ˆˆuØˆg‰iŒiˆØ�Š� s¨f¢} }˜V˜V¸%ˆÑ@Ô@Ð@Ø$Ð-ˆV�e‰^ˆ^¨#ˆØ$Ð-ˆV�e‰^ˆ^¨#ˆØˆ;ˆ;˜R˜+˜+Ò%Ð%ð3¸"ÐCð 3ð 3ð 3ð ˆMðQ¸BÐIð Qð QØ(*ÐPðQð Qð Qð ð
;¨&ð ;ð ;°6ð ;ð ;Øð;ð ;Øð;ð ;Ø+8ð;ð ;ð 	ð �|Š|‰~Œ~˜zÐ)Ð)øÝð ð ð Ý�ŠÐAÀ3ÑGÔGÐGØ�DˆyÐÐÐÐÐÐøøøøðøøøs%   ‚AC2 ÁB)C2 Ã2
D%Ã<D ÄD%Ä D%c                 óp  — 	 ddl m} m} ddlm} ddlm} n3# t          $ r&}t           	                    d|¦  «         Y d}~dS d}~ww xY w	  |¦   «         pd} | ¦   «         pd}n3# t          $ r&}t           	                    d	|¦  «         Y d}~dS d}~ww xY wt          |¦  «        t          |¦  «        f}t                               |¦  «        }|�|S 	  |¦   «         }	t           ||||	¦  «        ¦  «        }
n3# t          $ r&}t           	                    d
|¦  «         Y d}~dS d}~ww xY w|
t          |<   |
S )uÂ  Return True when ``_capture_response`` should hand the PNG to aux vision.

    Reads the active main provider/model and the loaded config and asks the
    routing helper. Any failure (config import, runtime override missing,
    etc.) returns False so the existing multimodal envelope continues to be
    returned â€” fail open on the routing decision so a broken config can
    never silently drop the screenshot for vision-capable main models.
    r   )Ú_read_main_modelÚ_read_main_provider©Úload_config)Ú"should_route_capture_to_aux_visionz2computer_use: aux-vision routing import failed: %sNFre   z7computer_use: aux-vision routing config read failed: %sz4computer_use: aux-vision routing decision failed: %s)Úagent.auxiliary_clientrå  ræ  Úhermes_cli.configrè  Ú!tools.computer_use.vision_routingré  ri   r‰   rŠ   r>   rY   rK   r…   )rå  ræ  rè  ré  râ  ÚproviderÚmodelÚ	cache_keyr�   Úcfgr^  s              r   r¸  r¸  ^  s¾  € ðØPÐPÐPÐPÐPÐPÐPÐPØ1Ð1Ð1Ð1Ð1Ð1ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ ð ð ð Ý�ŠÐIÈ3ÑOÔOÐOØˆuˆuˆuˆuˆuøøøøðøøøðØ&Ð&Ñ(Ô(Ð.¨BˆØ Ð Ñ"Ô"Ð( bˆˆøÝð ð ð Ý�ŠÐNÐPSÑTÔTÐTØˆuˆuˆuˆuˆuøøøøðøøøõ �X‘”¥ E¡
¤
Ð+€IÝ$×(Ò(¨Ñ3Ô3€FØÐØˆðØˆk‰mŒmˆÝÐ:Ð:¸8ÀUÈCÑPÔPÑQÔQˆˆøÝð ð ð Ý�ŠÐKÈSÑQÔQÐQØˆuˆuˆuˆuˆuøøøøðøøøð *2Õ˜IÑ&Ø€OsD   ‚ —
A¡AÁAÁA$ Á$
BÁ.BÂBÃ$C9 Ã9
D)ÄD$Ä$D)c                 ó  — 	 ddl m}   | ¦   «         pi                      d¦  «        pi                      dd¦  «        }n# t          $ r Y dS w xY wt	          |pd¦  «                             ¦   «                              ¦   «         }|dv r|ndS )zDMode for ``capture_after`` follow-ups. Default ``som`` (screenshot).r   rç  Úcomputer_useÚcapture_after_moder¨   >   r  r¨   r  )rë  rè  rK   ri   r>   rC   rD   )rè  r–  r©   s      r   Ú_capture_after_moderô  „  sµ   € ðØ1Ð1Ð1Ð1Ð1Ð1à�‘”Ð# ×(Ò(¨Ñ8Ô8Ð>¸B×CÒCØ  %ñ
ô 
ˆˆøõ ð ð ð Øˆuˆuðøøøåˆsˆ|�eÑÔ×"Ò"Ñ$Ô$×*Ò*Ñ,Ô,€DØÐ2Ð2Ð2ˆ4ˆ4¸Ð=s   ‚;> ¾
AÁArø   c                ó  — | j         sdS 	 ddl}ddl}ddl}ddlm} ddlm} ddlm	} n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY wd}		 	 |                     | j         d¬¦  «        }
nk# t          $ r^}t                               d	|¦  «         Y d}~|	�6	 |                     t          |	¦  «        ¦  «         dS # t          $ r Y dS w xY wdS d}~ww xY w| j        pd
}|dk    s$|s%| j         dd…                              d¦  «        rd}nd} |dd¦  «        }|                     dd¬¦  «         |d|                     ¦   «         j        › |› �z  }	t+          |
|¦  «        \  }
}|	                     |
¦  «         d|› �}|r|d|› �z  } | |t          |	¦  «        |¦  «        ¦  «        }nk# t          $ r^}t                               d|¦  «         Y d}~|	�6	 |                     t          |	¦  «        ¦  «         dS # t          $ r Y dS w xY wdS d}~ww xY w	 |	�4	 |                     t          |	¦  «        ¦  «         nL# t          $ r Y n@w xY wn;# |	�4	 |                     t          |	¦  «        ¦  «         w # t          $ r Y w w xY ww xY wd
}t1          |t          ¦  «        r‘	 t3          j        |¦  «        }t1          |t6          ¦  «        r6t          |                     d¦  «        pd
¦  «                             ¦   «         }n0# t<          t2          j        f$ r |                     ¦   «         }Y nw xY w|sdS t3          j         | j!        | j"        | j#        | j$        | j%        d„ | j&        D ¦   «         ||ddœ	¦  «        S )a\  Pre-analyse the captured PNG via ``vision_analyze`` and return a text result.

    The captured base64 PNG is materialised to ``$HERMES_HOME/cache/vision/``
    and handed to ``vision_analyze_tool`` with a generic describe prompt.
    The resulting text description is merged into the existing AX/SOM
    summary so the main model receives a single text payload that mentions
    every interactable element AND a description of what the screenshot
    looked like.

    Returns:
      A JSON-encoded text response on success.
      ``None`` on failure (caller falls back to the multimodal envelope).
    Nr   )Úget_hermes_dir)Ú
_run_async)Úvision_analyze_toolz*computer_use: aux-vision import failed: %sFrv  z1computer_use: failed to decode capture base64: %sre   r¬  rr  r«  rÍ  z.pngzcache/visionÚtemp_vision_imagesT)ÚparentsÚexist_okÚcomputer_use_ak  Describe what is visible in this desktop application screenshot in concise but specific terms. Mention the app name and window title if visible, the overall layout, any labelled buttons, menus or text fields, and any prominent text content the user would need to know about. Do not invent details that are not actually visible.

AX/SOM index for cross-reference:
z

Note: zacomputer_use: auxiliary.vision pre-analysis failed (%s); returning to caller without aux analysisÚanalysisc                ó,   — g | ]}t          |¦  «        ‘ŒS rB   r¥  r§  s     r   rH   z5_route_capture_through_aux_vision.<locals>.<listcomp>ö  s!   € Ð?Ð?Ð?¨QÕ% aÑ(Ô(Ð?Ð?Ð?r   zauxiliary.vision)	r©   r¯   r°   rª   r³   r²   rø   Úvision_analysisÚvision_analysis_routed_via)'r±   r�  rw   ÚuuidÚhermes_constantsrö  Úmodel_toolsr÷  Útools.vision_toolsrø  ri   r‰   rŠ   r‘  Úunlinkr>   rº  r’  ÚmkdirÚuuid4Úhexrã  Úwrite_bytesrô   rH  rÜ   Úloadsrh  rK   rC   r�  ÚJSONDecodeErrorrÝ   r©   r¯   r°   rª   r³   r²   )rM  rø   Ú_base64Ú_osÚ_uuidrö  r÷  rø  râ  Útemp_image_pathr–  Ú_mime_for_extrÇ  Ú	cache_dirrá  ÚpromptÚresult_jsonÚanalysis_textÚparseds                      r   r¹  r¹  ’  sß  € ð" Œ;ð Øˆtð
Ø Ð Ð Ð ØÐÐÐØÐÐÐà3Ð3Ð3Ð3Ð3Ð3Ø*Ð*Ð*Ð*Ð*Ð*Ø:Ð:Ð:Ð:Ð:Ð:Ð:øÝð ð ð Ý�ŠÐAÀ3ÑGÔGÐGØˆtˆtˆtˆtˆtøøøøðøøøð €Oð0ð	Ø×#Ò# C¤K¸%Ð#Ñ@Ô@ˆCˆCøÝð 	ð 	ð 	Ý�LŠLÐLÈcÑRÔRÐRØ�4�4�4ðN Ð&ðØ—
’
�3˜Ñ/Ô/Ñ0Ô0Ð0Ð0Ð0øÝð ð ð Ø��ðøøøð 'Ð&øøøøðS	øøøð Ô+Ð1¨rˆØ˜LÒ(Ð(°Ð(À3Ä;ÈrÐPQÈrÄ?×C]ÒC]Ð^dÑCeÔCeÐ(ØˆCˆCàˆCØ"�N >Ð3GÑHÔHˆ	Ø�Š ¨tˆÑ4Ô4Ð4Ø#Ð&N°e·k²k±m´mÔ6GÐ&NÈÐ&NÐ&NÑNˆÝ4°S¸#Ñ>Ô>‰ˆˆZØ×#Ò# CÑ(Ô(Ð(ð<ð 3:ð<ð <ð 	ð ð 	0ØÐ/ :Ð/Ð/Ñ/ˆFà �jØÐ¥ OÑ 4Ô 4°fÑ=Ô=ñ
ô 
ˆˆøõ ð ð ð Ý�Šð7àñ	
ô 	
ð 	
ð
 ˆtˆtˆtàÐ&ðØ—
’
�3˜Ñ/Ô/Ñ0Ô0Ð0Ð0Ð0øÝð ð ð Ø��ðøøøð 'Ð&øøøøðøøøð 	ð Ð&ðØ—
’
�3˜Ñ/Ô/Ñ0Ô0Ð0Ð0øÝð ð ð Ø�ðøøøð 'øˆ?Ð&ðØ—
’
�3˜Ñ/Ô/Ñ0Ô0Ð0Ð0øÝð ð ð Ø�ðøøøð 'øøøð €MÝ�+�sÑ#Ô#ð 0ð	0Ý”Z Ñ,Ô,ˆFÝ˜&¥$Ñ'Ô'ð JÝ # F§J¢J¨zÑ$:Ô$:Ð$@¸bÑ AÔ A× GÒ GÑ IÔ I�øøÝ�4Ô/Ð0ð 	0ð 	0ð 	0Ø'×-Ò-Ñ/Ô/ˆMˆMˆMð	0øøøð ð ØˆtåŒ:Ø”Ø”Ø”*ØŒwØÔ(Ø?Ð?°#´,Ð?Ñ?Ô?ØØ(Ø&8ð
ð 
ñ 
ô 
ð 
sÖ   ‹* ª
A´AÁAÁ!A> Á=F? Á>
C&ÂC!Â#F? Â*"C Ã
CÃCÃ!C&Ã&CF? Æ>I" Æ?
H'Ç	H"Ç$I" Ç+"H È
HÈHÈ"H'È'I" È."I É
IÉIÉ"JÉ&"J	ÊJÊ	
JÊJÊJÊJÊ5AL Ì*MÍMÚ
do_capturec                ó  — |st          |¦  «        S |j        st          |¦  «        S 	 t          | dd ¦  «        pi }|                     d¦  «        }|                     d¦  «        }t	          ¦   «         }|�|�|                      |||¬¦  «        }n&|                      |t          | dd ¦  «        ¬¦  «        }nA# t          $ r4}t                               d|¦  «         t          |¦  «        cY d }~S d }~ww xY wt          |¦  «        }	t          |	t          ¦  «        r„|	                     d¦  «        rot          j        t          |¦  «        ¦  «        }
|
d	z   |	d
         d         d         z   |	d
         d         d<   |
d	z   |	d         z   |	d<   t          |¦  «        |	d<   |	S 	 t          j        |	¦  «        }n # t           t          j        f$ r d|	i}Y nw xY w|                     t          |¦  «        ¦  «         t          j        |¦  «        S )NÚ_last_targetr«   r­   )r©   r«   r­   Ú	_last_appr  zfollow-up capture failed: %sr¯  z

r°  r   rP   r±  Úaction_resultr   )rD  r·   ÚgetattrrK   rô  r   ri   r‰   rô   rA  rH  rh  rÜ   rÝ   ro  r
  r�  r  r@  )rƒ   rN  r  Útargetr«   r­   r©   rM  r–   ÚrespÚprefixÚdatas               r   rE  rE  ý  s+  € ð ð #Ý˜cÑ"Ô"Ð"ð Œ6ð #Ý˜cÑ"Ô"Ð"ð#õ ˜ .°$Ñ7Ô7Ð=¸2ˆØ�jŠj˜ÑÔˆØ—J’J˜{Ñ+Ô+ˆ	Ý"Ñ$Ô$ˆØˆ?˜yÐ4Ø—/’/ t°À	�/ÑJÔJˆCˆCà—/’/ tµ¸À+ÈtÑ1TÔ1T�/ÑUÔUˆCøøÝð #ð #ð #Ý�ŠÐ5°qÑ9Ô9Ð9Ý˜cÑ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"øøøøð#øøøõ ˜SÑ!Ô!€DÝ�$�ÑÔð  $§(¢(¨=Ñ"9Ô"9ð õ ”�O¨CÑ0Ô0Ñ1Ô1ˆØ%+¨f¡_°t¸I´ÀqÔ7IÈ&Ô7QÑ%QˆˆYŒ˜Ô˜6Ñ"Ø%¨™°°nÔ1EÑEˆˆ^ÑÝ /°Ñ 4Ô 4ˆˆ_ÑØˆð!ÝŒz˜$ÑÔˆˆøÝ•tÔ+Ð,ð !ð !ð !Ø˜4Ð ˆˆˆð!øøøà‡K‚K• Ñ$Ô$Ñ%Ô%Ð%ÝŒ:�dÑÔÐs0   ©BB8 Â8
C6Ã)C1Ã+C6Ã1C6Æ"F7 Æ7GÇGé(   r²   úList[UIElement]Ú	max_linesú	List[str]c                ól  — g }| d |…         D ]j}|j                              dd¦  «        d d…         }|                     d|j        › d|j        › d|›d|j        › �|j        rd|j        › d�ndz   ¦  «         Œkt          | ¦  «        |k    r)|                     d	t          | ¦  «        |z
  › d
�¦  «         |S )Nr£  r¢  r  z  #z @ z [Ú]re   z  ... +z( more (call capture with app= to narrow))ÚlabelÚreplacer´   ÚindexÚroleÚboundsrª   rà   )r²   r"  rÝ  r–   r&  s        r   rµ  rµ  *  sÝ   € Ø€CØ�j�y�jÔ!ð 7ð 7ˆØ”—’  cÑ*Ô*¨3¨B¨3Ô/ˆØ�
Š
ÐB˜œÐBÐB 1¤6ÐBÐB¨EÐBÐB¸¼ÐBÐBØ'(¤uÐ4�m˜1œ5�m�m�m�m°"ñ6ñ 	7ô 	7ð 	7ð 	7å
ˆ8�}„}�yÒ Ð Ø�
Š
Ð`�S ™]œ]¨YÑ6Ð`Ð`Ð`ÑaÔaÐaØ€Jr   r–   r   c                ó^   — | j         | j        | j        t          | j        ¦  «        | j        dœS )N)r(  r)  r&  r*  rª   )r(  r)  r&  rI  r*  rª   )r–   s    r   r¦  r¦  5  s0   € à”Ø”Ø”Ý�q”x‘.”.ØŒuðð ð r   c                 óB   — t           j        dvrdS ddlm}   | ¦   «         S )aª  Return True iff computer_use can run on this host.

    Conditions: macOS, Windows, or Linux + cua-driver binary installed (or
    override via env). cua-driver runs on all three; the Linux path is
    headed/X11 today (Wayland via XWayland), pure-Wayland progress tracked
    upstream. Linux users see specific blocked checks via
    `hermes computer-use doctor` if their session is incomplete (e.g. no
    DISPLAY set).
    )ÚdarwinÚwin32ÚlinuxFr   ©Úcua_driver_binary_available)ÚsysÚplatformry   r1  r0  s    r   Úcheck_computer_use_requirementsr4  C  s8   € õ „|Ð7Ð7Ð7ØˆuØJÐJÐJÐJÐJÐJØ&Ð&Ñ(Ô(Ð(r   c                 ó   — ddl m}  | S )Nr   ©ÚCOMPUTER_USE_SCHEMA)Útools.computer_use.schemar7  r6  s    r   Úget_computer_use_schemar9  S  s   € Ø=Ð=Ð=Ð=Ð=Ð=ØÐr   rÌ   )r=   r>   r   r?   )rP   r>   r   rQ   )r`   r>   r   r>   )re   )r`   r>   r   r   )r`   r>   r   r…   )rÒ   rÓ   r   r   )r¸   r>   rÒ   rÓ   r`   r>   r   rQ   )r¸   r>   rÒ   rÓ   r   r>   )rƒ   r   r¸   r>   rÒ   rÓ   r   r   )rN  r	   r   rÓ   )rN  r	   r   r>   )rs  r>   r   rt  )rÈ   r   r   rK  )rM  r
   r  rK  r   r   )r–  rÆ  rÇ  r>   rÈ  rK  r   rÉ  rÍ   )r   r>   )rM  r
   rø   r>   r   rQ   )rƒ   r   rN  r	   r  r…   r   r   )r   )r²   r!  r"  rK  r   r#  )r–   r   r   rÓ   )r   rÓ   )OrÑ   Ú
__future__r   Úatexitr�  rÜ   Úloggingrw   rL   r“  r2  rt   Útypingr   r   r   r   r   Útools.computer_use.backendr	   r
   r   r   Ú	getLoggerrÎ   r‰   r   r   r?   Ú_SAFE_ACTIONSrâ   rÞ   rJ   rO   ÚcompileÚ
IGNORECASErT   rX   ÚLockrs   rY   Ú__annotations__rZ   r[   r\   r]   rˆ   r^   r_   rk   r„   rŒ   r—   Úregisterr™   rz   rê   rã   ró   rä   ri  ro  rD  rœ  rŸ  r´  rš  rB  rA  Ú_MAX_VISION_DIMrã  r¸  rô  r¹  rE  rµ  r¦  r4  r9  rB   r   r   ú<module>rG     s  ðð$ð $ð $ðL #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ð Ð ðð ð ð ð �	ð ð ð ñ ô €ð
 !�yð "ð "ð "ñ ô Ð ð €IÐ+Ð+Ð+Ñ,Ô,Ø€IÐ,Ð,Ð,Ñ-Ô-Ø€IÐ"Ð"Ð"Ñ#Ô#Ø€IÐ#Ð#Ð#Ñ$Ô$Ø€IÐ-Ð-Ð-Ñ.Ô.ð €Iˆu�cˆlÑÔØ€IÐ*Ð*Ð*Ñ+Ô+Ø€IÐ'Ð'Ð'Ñ(Ô(Ø€Iˆx˜ÐÑÔðÐ ð   °ÀÈxØ˜u¨eðð €ðð ð ð ð €B„JÐ'¨¬Ñ7Ô7Ø€B„JÐ% r¤}Ñ5Ô5Ø€B„JÐ'¨¬Ñ7Ô7Ø€B„JÐ% r¤}Ñ5Ô5Ø€B„JÐ$ b¤mÑ4Ô4Ø€B„JÐ/°´Ñ?Ô?ðÐ ðð ð ð ð �	”Ñ Ô €ð 8:Ð Ð 9Ð 9Ð 9Ñ 9Ø)-€Ð -Ð -Ð -Ñ -Ø+-€	Ð -Ð -Ð -Ñ -Ø24Ð Ð 4Ð 4Ð 4Ñ 4Ø,.Ð Ð .Ð .Ð .Ñ .ð  �”Ñ!Ô!€Ø)+Ð Ð +Ð +Ð +Ñ +Ø "€Ð "Ð "Ð "Ñ "ðð ð ð ð<@ð @ð @ð @ð @ðF/ð /ð /ð /ðd,Eð ,Eð ,Eð ,Eð^ €„Ð(Ñ )Ô )Ð )ð$ð $ð $ð $ð;9ð ;9ð ;9ð ;9ð ;9Ð%ñ ;9ô ;9ð ;9ðDG>ð G>ð G>ð G>ðV )+ð/Eð /Eð /Eð /Eð /Eðdð ð ð ð4F?ð F?ð F?ð F?ðZ.ð .ð .ð .ð(ð ð ð ð8,ð ,ð ,ð ,ð Ð ð !Ð Ø !Ð ð3ð 3ð 3ð 3ðlð ð ð ð, ?Tð ð ð ð ð ðR €ð />ð)ð )ð )ð )ð )ðV#ð #ð #ð #ðL>ð >ð >ð >ðhð hð hð hðV*ð *ð *ð *ðZð ð ð ð ðð ð ð ð)ð )ð )ð )ð ð ð ð ð ð r   