
    )j~              	         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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dUdZ eh d	          Z eh d
          Z eh d           eh d           eh d           eh d           eh d          hZddddddZdVd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#dWd Z$ e
j%                    Z&da'd!e(d"<   d#a) e*            a+d$e(d%<   dXd'Z,dUd(Z- G d) d*e          Z.dYd.Z/dZd0Z0d[d1Z1d\d3Z2d]d6Z3d7Z4d8Z5d9Z6d^d<Z7d_d?Z8e4fd`dCZ9dadEZ:dbdGZ;dcdIZ<dddedOZ=dfdRZ>dadSZ?dgdTZ@dS )hu  Entry point for the `computer_use` tool.

Universal (any-model) macOS desktop control 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.

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/ubuntu/.hermes/hermes-agent/tools/computer_use/tool.pyset_approval_callbackr   >   s         >   waitcapture	list_apps>
   keydragtypeclickscroll	focus_app	set_valueright_clickdouble_clickmiddle_click>   cmdshift	backspace>   r"   optionr$   >   qr"   ctrl>   r&   r"   r#   >   r&   r"   r#   r%   r"   r'   r%   )commandcontrolaltu   ⌘u   ⌥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>`   s7    QQQ1qwwyyQQWWYY__QQQr   z\s*\+\s*c                D    g | ]}t                               ||          S r0   )_KEY_ALIASESgetr3   s     r   r6   z$_canon_key_combo.<locals>.<listcomp>a   s(    333\a##333r   )resplitr-   )r+   partss     r   _canon_key_combor=   _   sB    QQd(C(CQQQE33U333E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)r>   pats     r   _is_blocked_typerF   p   s=    %  ::d 	;	4r   zOptional[ComputerUseBackend]_backendFset_always_allowr   c                 n   t           5  t          t          j                            dd                                          } | dv rddlm}  |            an'| dk    rt                      ant          d|           t          
                                 t          cd d d            S # 1 swxY w Y   d S )NHERMES_COMPUTER_USE_BACKENDcua>   
cua-driver rL   r   )CuaDriverBackendnoopz$Unknown HERMES_COMPUTER_USE_BACKEND=)_backend_lockrG   osenvironr9   r2   tools.computer_use.cua_backendrO   _NoopBackendRuntimeErrorstart)backend_namerO   s     r   _get_backendrY      s   	  :>>*GOOUUWWL888KKKKKK++--'''>>"#Z,#Z#Z[[[NN                 s   BB**B.1B.c                     t           5  t          +	 t                                           n# t          $ r Y nw xY wdaddd           n# 1 swxY w Y   dat                      adS )u-   Test helper — tear down the cached backend.NF)rQ   rG   stop	Exception_session_auto_approverH   rI   r0   r   r   reset_backend_for_testsr^      s     
                    "EEMMMs,   A	+A	
8A	8A		AA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+dZd,d-d!Zd
S ).rU   z5Test/CI stub. Records calls; returns trivial results.r   r   c                "    g | _         d| _        d S NF)calls_startedselfs    r   __init__z_NoopBackend.__init__   s    79
r   c                    d| _         d S NTrc   rd   s    r   rW   z_NoopBackend.start   s    TT]]]r   c                    d| _         d S ra   ri   rd   s    r   r[   z_NoopBackend.stop   s    EDMMMr   boolc                    dS rh   r0   rd   s    r   is_availablez_NoopBackend.is_available   s    44r   somNmoder,   appr?   r
   c           	     p    | j                             d||df           t          |ddd g |pdd          S )Nr   ro   rp   i   i   rN   )ro   widthheightpng_b64elementsrp   window_title)rb   appendr
   )re   ro   rp   s      r   r   z_NoopBackend.capture   sS    
9tC&@&@ABBB$d3&(ciRbJ J J 	Jr   r	   c                \    | j                             d|f           t          dd          S )Nr   Tokactionrb   rx   r	   re   kws     r   r   z_NoopBackend.click   s/    
7B-(((tG4444r   c                \    | j                             d|f           t          dd          S )Nr   Trz   r}   r~   s     r   r   z_NoopBackend.drag   s/    
62,'''tF3333r   c                \    | j                             d|f           t          dd          S )Nr   Trz   r}   r~   s     r   r   z_NoopBackend.scroll   s/    
8R.)))tH5555r   r>   c                `    | j                             dd|if           t          dd          S )Nr   r>   Trz   r}   )re   r>   s     r   	type_textz_NoopBackend.type_text   s4    
6FD>2333tF3333r   r+   c                `    | j                             dd|if           t          dd          S )Nr   r+   Trz   r}   )re   r+   s     r   r   z_NoopBackend.key   s4    
564.1222tE2222r   List[Dict[str, Any]]c                >    | j                             di f           g S )Nr   )rb   rx   rd   s    r   r   z_NoopBackend.list_apps   s"    
;+,,,	r   Fraise_windowc                b    | j                             d||df           t          dd          S )Nr   )rp   raiseTrz   r}   )re   rp   r   s      r   r   z_NoopBackend.focus_app   s8    
;l(K(KLMMMtK8888r   valueelementOptional[int]c                b    | j                             d||df           t          dd          S )Nr   r   r   Trz   r}   )re   r   r   s      r   r   z_NoopBackend.set_value   s8    
;%G(L(LMNNNtK8888r   r   r   r   rk   )rn   N)ro   r,   rp   r?   r   r
   )r   r	   )r>   r,   r   r	   )r+   r,   r   r	   )r   r   )F)rp   r,   r   rk   r   r	   rA   )r   r,   r   r   r   r	   )__name__
__module____qualname____doc__rf   rW   r[   rm   r   r   r   r   r   r   r   r   r   r0   r   r   rU   rU      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   rU   argsDict[str, Any]r   c                   |                      d          pd                                                                }|st          j        ddi          S |dk    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|t          v rt          ||           }||S 	 t                      }	n1# t          $ r$}
t          j        d|
 dd	          cY d}
~
S d}
~
ww xY w	 t          |	||           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|   rN   errorzmissing `action`r   r>   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.Nz"computer_use backend unavailable: zARun `hermes tools` and enable Computer Use to install cua-driver.zcomputer_use %s failedz	 failed: )r9   r1   r2   jsondumpsrF   r=   _BLOCKED_KEY_COMBOSissubsetlensorted_DESTRUCTIVE_ACTIONS_request_approvalrY   r\   	_dispatchlogger	exception)r   kwargsr|   r>   rE   r+   comboblockederrbackendes              r   handle_computer_user      sn    hhx  &B--//5577F 9z7$67888 xx##t$$ 	:A#AAT    
 xx## &&* 	 	G&& 3w<<3u::+E+EzD6'??DDL# #      %%%--?J..   z=!==W
 
   	 	 	 	 	 	>&$/// > > >16:::z7v$;$;$;$;<========>s<   E 
F	%F>F	F	F 
G((5G#G(#G(r|   c                   t           rdS | t          v rdS 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    r$t                              |            |dk    rda dS t          j	        d| d	          S )
z:Return None if approved, or a JSON error string if denied.Nzapproval callback failed: %sdenyapprove_onceapprove_sessionalways_approveTzdenied by user)r   r|   )
r]   rI   r   _summarize_actionr\   r   warningaddr   r   )r|   r   r   summaryverdictr   s         r   r   r   
  s     tt	B	z t--G"VT7++   5q999 .  t###w2B'B'B&!!!&&&$(!t: 0FCCDDDs   ? 
A0	A++A0c                   | dv rO|                     d          |  d|d          S |                     d          }|r|  dt          |           S | S | dk    r\|                     d          p|                     d          }|                     d	          p|                     d
          }d| d| S | dk    r0d|                     dd           d|                     dd           S | dk    r;|                     dd          }d|d d         t          |          dk    rdndz   S | dk    rd|                     dd          S | dk    r3d|                     dd          |                     d           rd!ndz   S | S )"N>   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   r>   rN   ztype <   z...r   zkey r+   r   zfocus rp   r   z (raise))r9   tupler   )r|   r   coordsrcdstr>   s         r   r   r   &  s   III88I*99Y999&& 	100%,,000hh~&&E$((3D*E*Ehh|$$A(A(A&s&&&&&N+s33NNtxx!7L7LNNNxx##$tCRCy$$TRRHH.dhhvr**.../++//.AYAY3a::_abbMr   r   c           
     n   t          |                    d                    }|dk    rt          |                    dd                    }|dvrt          j        dd|di          S |                     ||                    d	          
          }t          |t          |                    d                              S |dk    rGt          |                    dd                    }| 	                    |          }t          |          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v r|                    d          }
d}|dk    rd}n|dk    rd}
n|dk    rd}
n|
pd}
|                    d           }|                    d!          pd"}|r|d#         |d#         |d         fnd"\  }}|                     ||nd |||
pd||                    d$          %          }t          | ||          S |d&k    r?|                    d'          d uo|                    d(          d u}|                    d)          o|                    d*          }|s|st          j        dd+i          S |                     |                    d'          |                    d(          |                    d)          rt#          |d)                   nd |                    d*          rt#          |d*                   nd |                    dd          |                    d$          ,          }t          | ||          S |d-k    r|                    d!          pd"}|                     |                    d.d/          t'          |                    d0d1                    |                    d           |r|d#         |d#         nd |r|d         |d         nd |                    d$          2          }t          | ||          S |d3k    r:|                     |                    d4d5                    }t          | ||          S |d6k    r:|                     |                    d7d5                    }t          | ||          S |d8k    ru|                    d9          }|t          j        dd:i          S |                     t          |          |                    d           ;          }t          | ||          S t          j        dd<|i          S )=Ncapture_afterr   ro   rn   >   axrn   visionr   z	bad mode z; use som|vision|axrp   rr   max_elements)r   r   secondsg      ?r   )appscountr   zfocus_app requires `app`r   )r   >   r   r   r    r!   button   r       r   rightr!   middleleftr   r   )NNr   	modifiers)r   xyr   click_countr   r   r   r   r   r   zFdrag requires from_coordinate/to_coordinate or from_element/to_element)r   r   from_xyto_xyr   r   r   r   downr   r   )r   r   r   r   r   r   r   r>   rN   r   r+   r   r   zset_value requires `value`r   zunknown action )rk   r9   r,   r   r   r   _capture_response_coerce_max_elementsfloatr   _text_responser   r   r   _maybe_follow_capturer   r   r   r   intr   r   r   )r   r|   r   r   ro   capr   resr   rp   r   r   r   r   r   r   has_elements
has_coordsr   s                      r   r   r   >  s   /2233M488FE**++...:w(OD(O(O(OPQQQoo4TXXe__o== 3GQ_H`H`3a3abbbbC0011ll7##c"""  ""z4#d))<<===hhuoo 	E:w(BCDDD$txx7O7O2P2PQQ$Wc=AAAIII(##^##KK}$$FF~%%FF%vF((9%%&&6,',Wq1Ea%(##<1mm&2GG1V-v;hh{++  
 

 %Wc=AAAxx//t;b@V@V^b@bXX/00NTXXo5N5N
 	J 	:a    ll.11xx--6:hh?P6Q6Q[E$01222W[26((?2K2KU%_-...QU88Hf--hh{++  
 
 %Wc=AAA&&6,nnhh{F33txx!,,--HHY''BE!H$8eAhhdBE!H$8eAhhdhh{++  
 
 %Wc=AAA 4 455$Wc=AAAkk$((62..//$Wc=AAA!!=:w(DEFFFc%jj$((9:M:MNN$Wc=AAA:w <& < <=>>>r   r   r	   c                    | j         | j        d}| j        r
| j        |d<   | j        r
| j        |d<   t	          j        |          S )Nrz   messagemeta)r{   r|   r   r   r   r   )r   payloads     r   r   r     sN    %(VszBBG
{ ) [	
x #(:g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          rt	          |          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nt                              |||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      r   	      r   >            big>                                             r      )	base64	b64decoder\   
startswithr   structunpackr   
from_bytes)r   rawrs   rt   imarkersegment_lens          r   _image_dimensions_from_b64r    s     ty5999   tt ~~*++ CB	"M%RU<<ME6u::s6{{** 	 	 	44	 ~~k"" s3xx!||!ec#hh1v~~QQZFFAD..QS\\QQ D..QS\\ %%~~1us3xx..Qq1uWu==KQ!k/CHH"<"<    ""AE!a%K(8%@@s1q5Q;'7??5zz3v;;..A3 !ec#hh4 4s    
++=B 
B#"B#r   r   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.
    Nr   )_DEFAULT_MAX_ELEMENTSr   	TypeError
ValueError_MAX_ALLOWED_MAX_ELEMENTS)r   ns     r   r   r     ss     }$$%JJz" % % %$$$$%1uu$$$$$((Hs    66r   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    rx|svt!                      rt#          | |          }||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   rN   r   zcapture mode= r   z app=z window=z interactable element(s):z  (screenshot omitted: z is below the z provider minimum)
r   r   /9j/z
image/jpegz	image/pngTr>   )r   r>   	image_urlurlzdata:z;base64,)r   r  )ro   rs   rt   rv   	png_bytes)_multimodalcontenttext_summaryr   z  (response truncated to z of z5 elements; raise max_elements or pass app= to narrow)c                ,    g | ]}t          |          S r0   _element_to_dictr4   r   s     r   r6   z%_capture_response.<locals>.<listcomp>[  s!    CCCQ%a((CCCr   )ro   rs   rt   rp   rw   rv   total_elementsr   truncated_elements)r   rv   maxru   r  rs   rt   rk   _MIN_PROVIDER_IMAGE_DIMENSION_format_elementsro   rp   rw   extendrx   join _should_route_through_aux_vision!_route_capture_through_aux_visionr	  png_bytes_lenr   r   )r   r   r&  visible_elementsr'  image_dimensionsresponse_widthresponse_heightimage_too_smallelement_indexsummary_linesr   routed_b64_prefix_mimer   s                   r   r   r     s   &&N|M\M2Q5E1F1F FGGHK]1#+2CDDDY],<K%a((#)N-=M&q))3:O 	
Q"?? C"%BB	 O %%566MEEE>EEOEE #/37R	1.1.>F*c&***B	H 444	M  ,]+++  
 &6q&9    <LQ<O    9   <Y     	
 	
 	

 ii&&G
{ "
sx4''' ,-- 	6sGDDF! k"1"o + 6 6v > >OK
  11$$&Je&J&JS[&J&JKM M
 $ X/!/c>OQ Q

 

 
	
  
:,<(=(= : :> : : :	
 	
 	
 ii&&G!w(CC2BCCC(	 	G  ;(:$%:gr   rk   c                    	 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	  |            } |             } |            }n3# t          $ r&}t          	                    d|           Y d}~dS d}~ww xY w	 t           ||||                    S # t          $ r&}t          	                    d	|           Y d}~dS d}~ww xY w)
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: %sNFz7computer_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>  r\   r   debugrk   )r;  r<  r=  r>  excprovidermodelcfgs           r   r-  r-  h  sk   PPPPPPPP111111	
 	
 	
 	
 	
 	
 	
    I3OOOuuuuu&&((  ""kmm   NPSTTTuuuuu66xLLMMM   KSQQQuuuuusD    
AAAA* *
B4BBB8 8
C(C##C(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         dd
                             d          rdnd} |dd          }|                    dd           |d|                                j         | z  }	|	                    |
           d| } | |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}t-          |t                    r	 t/          j        |          }t-          |t2                    r6t          |                    d          pd                                          }n0# t8          t.          j        f$ r |                                }Y nw xY w|sdS t/          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: %sFr   z1computer_use: failed to decode capture base64: %sr   r  z.jpgz.pngzcache/visiontemp_vision_imagesT)parentsexist_okcomputer_use_ai  Describe what is visible in this macOS 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:
zccomputer_use: auxiliary.vision pre-analysis failed (%s); falling back to native multimodal enveloperN   analysisc                ,    g | ]}t          |          S r0   r#  r%  s     r   r6   z5_route_capture_through_aux_vision.<locals>.<listcomp>  s!    ???Q%a((???r   zauxiliary.vision)	ro   rs   rt   rp   rw   rv   r   vision_analysisvision_analysis_routed_via)%ru   r  rR   uuidhermes_constantsrH  model_toolsrI  tools.vision_toolsrJ  r\   r   rB  r  unlinkr,   r	  mkdiruuid4hexwrite_bytesr   
isinstancer   loadsdictr9   r1   r  JSONDecodeErrorr   ro   rs   rt   rp   rw   rv   )r   r   _base64_os_uuidrH  rI  rJ  rC  temp_image_pathr  ext	cache_dirpromptresult_jsonanalysis_textparseds                    r   r.  r.    s   " ; t
    333333******:::::::   A3GGGttttt O(	##CK%#@@CC 	 	 	LLLcRRR444> &

3//00000    '&C	 BQB226::Fff"N>3GHH	t444#&Nekkmm6G&N&N&NN##C(((< 3:< < 	 !jO 4 4f==
 
    9	
 	
 	

 ttt&

3//00000    '& 	 &

3//0000    '?&

3//0000    ' M+s## 0	0Z,,F&$'' J #FJJz$:$:$@b A A G G I I4/0 	0 	0 	0'--//MMM	0  t:*w(??#,???(&8
 
 
 
 
s   * 
AAA!A> =F >
C&C!#F *"C 
CC!C&&B)F H3 
G8G35H3 <"G   
G.-G.3G88H3 ?"H" "
H/.H/3I+7"II+
I'$I+&I''I+AK& &*LL
do_capturec                :   |st          |          S |j        st          |          S 	 t          | dd           }|                     d|          }nA# t          $ r4}t
                              d|           t          |          cY d }~S d }~ww xY wt          |          }t          |t                    rw|
                    d          rbd|j         d|j         |j        r
d|j         nd	z   }|d
z   |d         d         d         z   |d         d         d<   |d
z   |d         z   |d<   |S 	 t          j        |          }n # t          t          j        f$ r d|i}Y nw xY w|j        |d<   |j        |d<   |j        r
|j        |d<   t          j        |          S )N	_last_apprn   rr   zfollow-up capture failed: %sr  [z] ok=u    — rN   z

r   r   r>   r!  r   r|   r{   r   )r   r{   getattrr   r\   r   r   r   r\  r^  r9   r|   r   r   r]  r  r_  r   )	r   r   rj  last_appr   r   respprefixdatas	            r   r   r     s     #c""" 6 #c"""# 7K66oo5ho77 # # #5q999c""""""""# S!!D$ $((="9"9 .SZ..cf..3;2^2G#+2G2G2G\^_%+f_tIq7I&7Q%QY6"%n1EE^!z$t+, ! ! !4 !ZDNDJ
{ &+Y:ds/   (A 
B)BBB/E E! E!(   rv   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 []rN   z  ... +z( more (call capture with app= to narrow))labelreplacerx   indexroleboundsrp   r   )rv   ru  outr   ry  s        r   r*  r*    s    Cjyj! 7 7c**3B3/

BBB16BBEBBBB'(u4m15mmmm"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|  ry  r}  rp   )r{  r|  ry  listr}  rp   )r   s    r   r$  r$    s0    qx..u  r   c                 F    t           j        dk    rdS ddlm}   |             S )zReturn True iff computer_use can run on this host.

    Conditions: macOS + cua-driver binary installed (or override via env).
    darwinFr   cua_driver_binary_available)sysplatformrT   r  r  s    r   check_computer_use_requirementsr  *  s7    
 |xuJJJJJJ&&(((r   c                     ddl m}  | S )Nr   COMPUTER_USE_SCHEMA)tools.computer_use.schemar  r  s    r   get_computer_use_schemar  5  s    ======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   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
   r   r   r   r   r   )r   r
   r   r,   r   r?   )r   r   r   r	   rj  rk   r   r   )rs  )rv   rt  ru  r   r   rv  )r   r   r   r   )r   r   )Ar   
__future__r   r  r   loggingrR   r:   r
  r  	threadingtypingr   r   r   r   r   tools.computer_use.backendr	   r
   r   r   	getLoggerr   r   r   r   r-   _SAFE_ACTIONSr   r   r8   r=   compile
IGNORECASErB   rF   LockrQ   rG   __annotations__r]   rH   rI   rY   r^   rU   r   r   r   r   r   r  r  r)  r  r   r   r-  r.  r   r*  r$  r  r  r0   r   r   <module>r     sz    @ # " " " " "    				 				  



     3 3 3 3 3 3 3 3 3 3 3 3 3 3            
	8	$	$      	:::;; !y " " "    I+++,,I,,,--I"""##I###$$I---..  !VHU[cdd    BJ'77BJ%r}55BJ'77BJ%r}55BJ$bm44BJ/??     	  )- - - - - SUU           .9 .9 .9 .9 .9% .9 .9 .9j1> 1> 1> 1>hE E E E8   0[? [? [? [?D      !  ! 3 3 3 3l   , ?T ` ` ` ` `N   @` ` ` `F# # # #L       ) ) ) )     r   