
    i-                         d dl mZmZ d dlmZmZmZmZ d dlm	Z	 d dl
Z
 e
j                  e      Ze G d d             Zy)    )	dataclassfield)OptionalDictListAny)cached_propertyNc                      e Zd ZU dZeed<   eed<   eeef   ed<   eed<   e	ed<   eed<    e
e      Zed    ed	<   d
Zed    ed<   dZeed<   d
Zee	   ed<   d
Zedee   fd       Zedefd       Zedee   fd       Zedee   fd       ZdefdZdefdZdefdZdefdZdefdZdefdZd!de	defdZe defd       Z!deded    fdZ"deded    fd Z#y
)"MacElementNodezHRepresents a UI element in macOS with enhanced accessibility informationrole
identifier
attributes
is_visibleapp_pid	on_screen)default_factorychildrenNparentFis_interactivehighlight_indexreturnc                 >    | j                   j                  dg       }|S )z3Get the list of available actions for this element.actionsr   get)selflist_actionss     A/Users/mibo/.openclaw/workspace/data/TuriX-CUA/src/mac/element.pyr   zMacElementNode.actions   s      **9b9    c                 :    | j                   j                  dd      S )z Check if the element is enabled.enabledTr   r   s    r   r!   zMacElementNode.enabled   s     ""9d33r   c                 8    | j                   j                  d      S )zGet the element's position.positionr   r"   s    r   r$   zMacElementNode.position$   s     "":..r   c                 8    | j                   j                  d      S )zGet the element's size.sizer   r"   s    r   r&   zMacElementNode.size)   s     ""6**r   c                 `   d| j                    }g d}|D ]*  }|| j                  v s|d| d| j                  |    dz  }, | j                  r|d| j                   z  }| j                  r|d| j                   z  }|dz  }g }| j                  r;|j                  d	       | j                  r|j                  d
| j                          | j                  |j                  d| j                          | j                  s|j                  d       |r|ddj                  |       dz  }|S )z9Enhanced string representation including more attributes.<)titlevaluedescriptionr!    z="" pos= size=>interactiveactions=z
highlight:disabled [, ])
r   r   r$   r&   r   appendr   r   r!   join)r   role_strimportant_attrskeyextrass        r   __repr__zMacElementNode.__repr__.   s-   tyyk? G"Cdoo%auBts';&<A>> #
 ==%//H99&,,HC MM-(||78+MMJt';';&<=>||MM*%"TYYv./q11Hr   c                 N   | j                   | j                    nd}d| j                   }d| j                  v r|d| j                  d    dz  }d| j                  v r|d| j                  d    dz  }| j                  j                  d      }| j                  j                  d	      }|r|r|d
| d| z  }|dz  }g }| j                  r;|j                  d       | j                  r|j                  d| j                          |r|ddj                  |       dz  }| d| S )a	  
        Produce a short, clean summary string for this element:
         - highlight_index or '_' as prefix
         - role
         - if title or description exist, show them
         - location/size in parentheses
         - if interactive, show actions
        _r(   r)   z title="r-   r+   z description="r$   r&   r.   r/   r0   r1   r2   r4   r5   r6   z[:])r   r   r   r   r   r7   r   r8   )r   prefix	role_partpossizr<   s         r   _format_short_elementz$MacElementNode._format_short_elementS   s<    /3.B.B.ND(()TW		{O	doo%8DOOG$<#=Q??IDOO+>$//-*H)IKKI oo!!*-oo!!&)35VC511IS	 MM-(||782dii/022IYK((r   c                 `    g dddt         ddffd | d       dj                        S )	z[Convert the UI tree to a string representation focusing on interactive and context elementsnoder   depthr   Nc                    | j                   r| j                  sn| j                  dv rnd}g d}|D ]C  }|| j                  v s|dk(  r|d| j                  |    dz  }.|d| j                  |    dz  }E |dk7  r-j	                  | j                    d| j                   | d	       | j
                  D ]  } ||d
z           y )N)AXStaticTextAXGroupAXImage )r)   r*   r+   r$   r&   r$    Top left: "r-   (w,h): "[:]<r0      )r   r   r   r   r7   r   rF   rG   	attrs_strr:   r;   childformatted_textprocess_nodes         r   rU   zQMacElementNode._get_visible_clickable_elements_string_short.<locals>.process_node   s    ''t~~DD	"U*Cdoo-*,%<8L7MQ)OOI%8DOOC4H3I)KKI + ?"))//0TYYK	{!L UEAI. 'r   r   
intr8   r   rT   rU   s    @@r   ,_get_visible_clickable_elements_string_shortz;MacElementNode._get_visible_clickable_elements_string_short~   s>    	// 	/ 	/ 	/0 	T1yy((r   c                 `    g dddt         ddffd | d       dj                        S )	z
        Short version: 
        Omits duplicates based on (role, description) to reduce length, 
        uses `_format_short_element` for a more condensed view.
        rF   r   rG   r   Nc                 T   | j                   r| j                  s	 d}g d}|D ]C  }|| j                  v s|dk(  r|d| j                  |    dz  }.|d| j                  |    dz  }E j                  | j                    d| j                   | d       | j                  d	v rh| j
                  s\| j                  /| j                  j                  d
k(  s| j                  j
                  r!j                  d| j                   | d       | j                  D ]  } ||dz           y )NrL   )r)   r*   r+   r!   r$   r&   r$   rM   r-   rN   rO   z> [interactive])rI   AXTextFieldAXWindowz_[:]<z> [context]rP   )r   r   r   r7   r   r   r   r   rQ   s         r   rU   zTMacElementNode._get_visible_clickable_elements_string_original.<locals>.process_node   s%   ''t~~I\O&$//)j(!|DOOC4H3I%KK	!x0D/EQ%GG	 ' !!''(TYYK	{/R 		<<));;&$++*:*:j*HDKKLfLf%%DII;yk= UEAI. 'r   r   rV   rW   rY   s    @@r   /_get_visible_clickable_elements_string_originalz>MacElementNode._get_visible_clickable_elements_string_original   s@     	// 	/ 	/ 	/< 	T1yy((r   c                     d
dt         dt        dt        fd} || j                               }|dkD  rt        j	                  d       yt        j	                  d| d	       | j                         S )Ntextestimated_tokens_per_characterr   c                     t        |       |z  S )N)len)ra   rb   s     r   count_tokenszKMacElementNode._get_visible_clickable_elements_string.<locals>.count_tokens   s    t9 >>>r   i'  z)Token count exceeded 10000, Do not use UIrL   zToken count is z, using original version.)   )strrX   r_   loggerdebugrZ   )r   re   total_tokenss      r   &_get_visible_clickable_elements_stringz5MacElementNode._get_visible_clickable_elements_string   so    	?s 	?C 	?PS 	?#D$X$X$Z[%LLDE LL?<.8QRSDDFFr   c                 *   d| j                    d| j                   d| j                   d| j                   d| j                   g}| j
                  r|j                  d| j
                          | j                  r|j                  d| j                          | j                  r|j                  d| j                          | j                  j                         D ]   \  }}|d	vs|j                  | d
|        " dj                  |      S )z<Return a detailed string with all attributes of the element.zRole: zIdentifier: zInteractive: z	Enabled: z	Visible: z	Actions: z
Position: zSize: )r   r!   r$   r&   z: r5   )r   r   r   r!   r   r   r7   r$   r&   r   itemsr8   )r   detailsr;   r*   s       r   get_detailed_infoz MacElementNode.get_detailed_info   s     TYYK 4??+,D//01~&()
 <<NNYt||n56==NNZ7899NNVDII;/0////1JCDD#b01 2 yy!!r   indentc                     d|z  }| | j                          d| d| j                          }| j                  D ]  }|d|j                  |dz         z   z  } |S )zBRecursively build a detailed string representation of the UI tree.r,   rV   z	Details:    )r=   ro   r   get_detailed_string)r   rp   spacesresultrS   s        r   rs   z"MacElementNode.get_detailed_string   sl    vht}}'r&4;Q;Q;S:TU 	 ]]EdU66vzBBBF #r   c                    g }| }|j                   |j                  }g }d|j                  v r!|j                  d|j                  d           d|j                  v r!|j                  d|j                  d           |j                   j                  D cg c]  }|j                  |k(  s| }}t        |      dkD  r|j                  |      dz   }| d| d}n|}|r|dd	j                  |       d
z  }|j                  |       |j                   }|j                   |j                          ddj                  |      z   S c c}w )zBGenerate a unique path to this element including more identifiers.r)   ztitle=r+   zdesc=rP   [r6   (,)/)	r   r   r   r7   r   rd   indexr8   reverse)	r   path_componentscurrentr   identifiersssiblingsidxpath_components	            r   accessibility_pathz!MacElementNode.accessibility_path   sU    nn(<<D K',,,""VG,>,>w,G+H#IJ 2 22""U7+=+=m+L*M#NO $+>>#:#:M#:aaffn#:HM8}q nnW-1$(63%q!1!% Achh{&;%<A">>"">2nnG/ nn(2 	!SXXo... Ns   E+Epathc                 v    | j                   |k(  r| S | j                  D ]  }|j                  |      }|s|c S  y)z-Find an element using its accessibility path.N)r   r   find_element_by_path)r   r   rS   ru   s       r   r   z#MacElementNode.find_element_by_path  s@    ""d*K]]E//5F # r   actionc                     g }|| j                   v r|j                  |        | j                  D ]"  }|j                  |j	                  |             $ |S )z1Find all elements that support a specific action.)r   r7   r   extendfind_elements_by_action)r   r   elementsrS   s       r   r   z&MacElementNode.find_elements_by_action"  sI    T\\!OOD!]]EOOE99&AB #r   )r   )$__name__
__module____qualname____doc__rg   __annotations__r   r   boolrX   r   listr   r   r   r   r   r   _elementpropertyr   r!   tupler$   r&   r=   rD   rZ   r_   rk   ro   rs   r	   r   r   r    r   r   r   r      s   R
IOS#XLO (-T'BHd#$B)-FH%&- ND %)OXc])Hc  
 4 4 4 /(5/ / / +huo + + #  J&)s &)V)c )B&) &)PG G"3 "2# c  /C / /@ :J1K c d;K6L r   r   )dataclassesr   r   typingr   r   r   r   	functoolsr	   logging	getLoggerr   rh   r   r   r   r   <module>r      s@    ( , , % 			8	$
a a ar   