
    iA              
       <   U d 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 ddlm	Z
  ej        e          ZdedefdZdefdZdedefd	Zdefd
ZdedefdZdedefdZdZdZdZdZdZde dZde dZeeefZeeefZdedededej         fdZ!dededefdZ"dedededefdZ#dededededef
dZ$dedz  fdZ%da&edz  ez  e'd <   dedz  fd!Z(defd"Z)dedefd#Z*dedefd$Z+defd%Z,dedefd&Z-defd'Z.dedefd(Z/d)edefd*Z0defd+Z1dedefd,Z2dS )-ux  Clipboard image extraction for macOS, Windows, Linux, and WSL2.

Provides a single function `save_clipboard_image(dest)` that checks the
system clipboard for image data, saves it to *dest* as PNG, and returns
True on success.  No external Python dependencies — uses only OS-level
CLI tools that ship with the platform (or are commonly installed).

Platform support:
  macOS   — osascript (always available), pngpaste (if installed)
  Windows — PowerShell via WinForms, Get-Clipboard, file-drop fallback
  WSL2    — powershell.exe via WinForms, Get-Clipboard, file-drop fallback
  Linux   — wl-paste (Wayland), xclip (X11)
    N)Path)is_wsldestreturnc                     | j                             dd           t          j        dk    rt	          |           S t          j        dk    rt          |           S t          |           S )zExtract an image from the system clipboard and save it as PNG.

    Returns True if an image was found and saved, False otherwise.
    T)parentsexist_okdarwinwin32)parentmkdirsysplatform_macos_save_windows_save_linux_saver   s    9/home/piyush/.hermes/hermes-agent/hermes_cli/clipboard.pysave_clipboard_imager      sc    
 	KdT222
|x4   
|wT"""t    c                  0   t           j        dk    rt                      S t           j        dk    rt                      S t	                      rt                      rdS t          j                            d          rt                      rdS t                      S )u   Quick check: does the clipboard currently contain an image?

    Lighter than save_clipboard_image — doesn't extract or write anything.
    r
   r   TWAYLAND_DISPLAY)r   r   _macos_has_image_windows_has_image_is_wsl_wsl_has_imageosenvironget_wayland_has_image_xclip_has_image r   r   has_clipboard_imager#   (   s    
 |x!!!
|w!###yy ^%% t	z~~'(( -?-A-A tr   c                 >    t          |           pt          |           S )zHTry pngpaste first (fast, handles more formats), fall back to osascript.)_macos_pngpaste_macos_osascriptr   s    r   r   r   ;   s    4  :$4T$:$::r   c                  ~    	 t          j        g dddd          } d| j        v pd| j        v S # t          $ r Y dS w xY w)z-Check if macOS clipboard contains image data.)	osascript-ezclipboard infoT   capture_outputtexttimeoutu   «class PNGf»u   «class TIFF»F)
subprocessrunstdout	Exception)infos    r   r   r   @   sk    ~111dA
 
 
  4;.Q2Bdk2QQ   uus   +. 
<<c                 L   	 t          j        dt          |           gdd          }|j        dk    r3|                                 r|                                 j        dk    rdS n=# t          $ r Y n1t          $ r%}t          
                    d|           Y d}~nd}~ww xY wdS )	u;   Use pngpaste (brew install pngpaste) — fastest, cleanest.pngpasteTr*   r,   r.   r   zpngpaste failed: %sNF)r/   r0   str
returncodeexistsstatst_sizeFileNotFoundErrorr2   loggerdebug)r   res      r   r%   r%   L   s    
/NT#
 
 
 <1499;;3F3J3J4    / / /*A......../5s   A"A' '
B!3	B!<BB!c                 ^   t                      sdS d|  d}	 t          j        dd|gddd          }|j        d	k    r<d
|j        vr3|                                 r|                                 j        d	k    rdS n2# t          $ r%}t          
                    d|           Y d}~nd}~ww xY wdS )zDUse osascript to extract PNG data from clipboard (always available).Fu\   try
  set imgData to the clipboard as «class PNGf»
  set f to open for access POSIX file "z_" with write permission
  write imgData to f
  close access f
on error
  return "fail"
end try
r(   r)   T   r+   r   failz&osascript clipboard extract failed: %sN)r   r/   r0   r8   r1   r9   r:   r;   r2   r=   r>   )r   scriptr?   r@   s       r   r&   r&   \   s     u	26	 	 	 BN$'dA
 
 
 <1qx!7!7DKKMM!7diikkNadeNeNe4 B B B=qAAAAAAAAB5s   A A; ;
B*B%%B*z]Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.Clipboard]::ContainsImage()a5  Add-Type -AssemblyName System.Windows.Forms;Add-Type -AssemblyName System.Drawing;$img = [System.Windows.Forms.Clipboard]::GetImage();if ($null -eq $img) { exit 1 }$ms = New-Object System.IO.MemoryStream;$img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png);[System.Convert]::ToBase64String($ms.ToArray())z}try { $img = Get-Clipboard -Format Image -ErrorAction Stop;if ($null -ne $img) { 'True' } else { 'False' }} catch { 'False' }a|  try { Add-Type -AssemblyName System.Drawing;Add-Type -AssemblyName PresentationCore;Add-Type -AssemblyName WindowsBase;$img = Get-Clipboard -Format Image -ErrorAction Stop;if ($null -eq $img) { exit 1 }$ms = New-Object System.IO.MemoryStream;if ($img -is [System.Drawing.Image]) {$img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)} elseif ($img -is [System.Windows.Media.Imaging.BitmapSource]) {$enc = New-Object System.Windows.Media.Imaging.PngBitmapEncoder;$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($img));$enc.Save($ms)} else { exit 2 }[System.Convert]::ToBase64String($ms.ToArray())} catch { exit 1 }z:'.png','.jpg','.jpeg','.gif','.webp','.bmp','.tiff','.tif'zNtry { $files = Get-Clipboard -Format FileDropList -ErrorAction Stop;$exts = @(z);$hit = $files | Where-Object { $exts -contains ([System.IO.Path]::GetExtension($_).ToLowerInvariant()) } | Select-Object -First 1;if ($null -ne $hit) { 'True' } else { 'False' }} catch { 'False' }z);$hit = $files | Where-Object { $exts -contains ([System.IO.Path]::GetExtension($_).ToLowerInvariant()) } | Select-Object -First 1;if ($null -eq $hit) { exit 1 }[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($hit))} catch { exit 1 }exerD   r.   c                 <    t          j        | ddd|gdd|          S )N
-NoProfile-NonInteractive-CommandTr+   )r/   r0   )rE   rD   r.   s      r   _run_powershellrJ      s1    >	l-z6B$   r   b64_datac                     t          j        |d          }|                     |           |                                 o|                                 j        dk    S )NT)validater   )base64	b64decodewrite_bytesr9   r:   r;   )r   rK   image_bytess      r   _write_base64_imagerR      sN    "8d;;;K[!!!;;==4TYY[[0144r   labelc                $   t           D ]}	 t          | ||          }|j        dk    rd|j        v r dS -# t          $ r  t
                              d|            Y  dS t          $ r&}t
                              d||           Y d }~d }~ww xY wdS )Nr.   r   TrueT&   %s not found — clipboard unavailableFz#%s clipboard image check failed: %s)_POWERSHELL_HAS_IMAGE_SCRIPTSrJ   r8   r1   r<   r=   r>   r2   )rE   r.   rS   rD   r?   r@   s         r   _powershell_has_imagerY      s    / 	J 	J	JVW===A|q  Vqx%7%7tt  	 	 	LLA3GGG555 	J 	J 	JLL>qIIIIIIII	J5s   &5%B	B'BBc                   t           D ]}	 t          | ||          }|j        dk    r!|j                                        }|s=t          ||          r dS Q# t          $ r  t                              d|            Y  dS t          $ r<}t                              d||           |
                    d           Y d }~d }~ww xY wdS )NrU   r   TrW   Fz(%s clipboard image extraction failed: %s
missing_ok)!_POWERSHELL_EXTRACT_IMAGE_SCRIPTSrJ   r8   r1   striprR   r<   r=   r>   r2   unlink)rE   r   r.   rS   rD   r?   rK   r@   s           r   _powershell_save_imager`      s   3 ) )	)VW===A|q  x~~''H "422 tt  	 	 	LLA3GGG555 	) 	) 	)LLCUANNNKK4K((((((((	) 5s(   AAA%C	C2CCc                      dD ]S} 	 t          j        | ddddgddd          }|j        d	k    rd
|j        v r| c S 9# t          $ r Y Et
          $ r Y Pw xY wdS )z:Return the first available PowerShell executable, or None.)
powershellpwshrG   rH   rI   zecho okTrB   r+   r   okNr/   r0   r8   r1   r<   r2   )namer?   s     r   _find_powershellrg      s    &  
	|%6
IN#$  A |q  TQX%5%5  	 	 	H 	 	 	H	4s   2<
A	AAF_ps_exec                  >    t           du rt                      a t           S )NF)rh   rg   r"   r   r   _get_ps_exerj     s    %"$$Nr   c                  J    t                      } | dS t          | dd          S )z1Check if the Windows clipboard contains an image.NFrB   Windowsr.   rS   )rj   rY   )pss    r   r   r     s*    	B	zu Qi@@@@r   c                     t                      }|t                              d           dS t          || dd          S )uH   Extract clipboard image on native Windows via PowerShell → base64 PNG.NuA   No PowerShell found — Windows clipboard image paste unavailableF   rl   rm   )rj   r=   r>   r`   )r   rn   s     r   r   r   "  s?    	B	zXYYYu!"dBiHHHHr   c                     t                      rt          |           rdS t          j                            d          rt          |           rdS t          |           S )uB   Try clipboard backends in priority order: WSL → Wayland → X11.Tr   )r   	_wsl_saver   r   r   _wayland_save_xclip_saver   s    r   r   r   -  s]    yy T?? 	4 
z~~'((  	4tr   c                  &    t          ddd          S )z=Check if Windows clipboard has an image (via powershell.exe).powershell.exe   WSLrm   )rY   r"   r   r   r   r   >  s     !11EJJJJr   c                 (    t          d| dd          S )uH   Extract clipboard image via powershell.exe → base64 → decode to PNG.rv   rp   rx   rm   )r`   r   s    r   rr   rr   C  s    !"2D"ERRRRr   c                     	 t          j        ddgddd          } | j        dk    o/t          d | j                                        D                       S # t          $ r t                              d           Y nt          $ r Y nw xY wd	S )
z-Check if Wayland clipboard has image content.wl-paste--list-typesTr*   r+   r   c              3   @   K   | ]}|                     d           V  dS )zimage/N)
startswith).0ts     r   	<genexpr>z%_wayland_has_image.<locals>.<genexpr>Q  s?       )
 )
'(ALL"")
 )
 )
 )
 )
 )
r   8   wl-paste not installed — Wayland clipboard unavailableF)
r/   r0   r8   anyr1   
splitlinesr<   r=   r>   r2   r?   s    r   r    r    J  s    N(dA
 
 
 |q  
S )
 )
,-H,?,?,A,A)
 )
 )
 &
 &
 	
  Q Q QOPPPPP   5s   AA $B	=	B	B	c                    	 t          j        ddgddd          }|j        dk    rdS |j                                        }d}d	D ]
}||v r|} n|sdS t          | d
          5 }t          j        dd|g|t           j        dd           ddd           n# 1 swxY w Y   |                                 r|                                 j	        dk    r| 
                    d           dS |dk    rt          |           S dS # t          $ r t                              d           Y nGt          $ r;}t                              d|           | 
                    d           Y d}~nd}~ww xY wdS )z;Use wl-paste to extract clipboard image (Wayland sessions).r{   r|   Tr*   r+   r   FN)	image/pngz
image/jpeg	image/bmpz	image/gifz
image/webpwbz--typerB   r1   stderrr.   checkr[   r   r   z(wl-paste clipboard extraction failed: %s)r/   r0   r8   r1   r   openDEVNULLr9   r:   r;   r_   _convert_to_pngr<   r=   r>   r2   )r   types_rtypesmime	preferredfr@   s          r   rs   rs   [  s   +%.(dA
 
 
 ""5))++ 5 	 	IE!!  "  	5 $ 	NXt,!3Qd   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 {{}} 			 3q 8 8KK4K(((5 ;"4(((t Q Q QOPPPPP % % %?CCCt$$$$$$$$% 5sS   %D *D D %'BD BD B A
D ,D $E-)	E-21E((E-pathc                    	 ddl m} |                    |           }|                    | d           dS # t          $ r Y n1t
          $ r%}t                              d|           Y d}~nd}~ww xY w|                     d          }	 | 	                    |           t          j        dt          |          d	t          |           z   gdd
          }|j        dk    rI|                                 r5|                                 j        dk    r|                    d           dS |	                    |            n# t$          $ rZ t                              d           |                                r)|                                 s|	                    |            Y nnt
          $ rb}t                              d|           |                                r)|                                 s|	                    |            Y d}~nd}~ww xY w|                                 o|                                 j        dk    S )zGConvert an image file to PNG in-place (requires Pillow or ImageMagick).r   )ImagePNGTu&   Pillow BMP→PNG conversion failed: %sNz.bmpconvertzpng:rB   r6   r[   u7   ImageMagick not installed — cannot convert BMP to PNGu+   ImageMagick BMP→PNG conversion failed: %s)PILr   r   saveImportErrorr2   r=   r>   with_suffixrenamer/   r0   r7   r8   r9   r:   r;   r_   r<   )r   r   imgr@   tmpr?   s         r   r   r     sL   Bjjut    B B B=qAAAAAAAAB 

6
"
"CCNC&3t99"45
 
 
 <1499;;3F3J3JJJ$J'''4 JJt   NOOO::<< 	 	JJt   BAFFF::<< 	 	JJt ;;==4TYY[[0144sB   15 
A/	A/
A**A/BD> (D> >A!H!	H*AHHc                      	 t          j        g dddd          } | j        dk    od| j        v S # t          $ r Y nt
          $ r Y nw xY wdS )z)Check if X11 clipboard has image content.xclip
-selection	clipboard-tTARGETS-oTr*   r+   r   r   Fre   r   s    r   r!   r!     s    	NGGGdA
 
 
 |q <[AH%<<      5s   -0 
A	AAc                 V   	 t          j        g dddd          }d|j        vrdS n7# t          $ r t                              d           Y dS t          $ r Y dS w xY w	 t          | d          5 }t          j        g d	|t           j        d
d           ddd           n# 1 swxY w Y   | 	                                r| 
                                j        dk    rdS nH# t          $ r;}t                              d|           |                     d           Y d}~nd}~ww xY wdS )z4Use xclip to extract clipboard image (X11 sessions).r   Tr*   r+   r   Fu=   xclip not installed — X11 clipboard image paste unavailabler   )r   r   r   r   r   r   rB   r   Nr   z!xclip image extraction failed: %sr[   )r/   r0   r1   r<   r=   r>   r2   r   r   r9   r:   r;   r_   )r   targetsr   r@   s       r   rt   rt     s   .GGGdA
 
 
 gn,,5 -   TUUUuu   uu
%$ 	NMMM!3Qd   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 ;;== 	TYY[[01444 % % %8!<<<t$$$$$$$$% 5sQ   #( $A	AA C! 0&B"C! "B&&C! )B&*4C! !
D&+1D!!D&)3__doc__rN   loggingr   r/   r   pathlibr   hermes_constantsr   r   	getLogger__name__r=   boolr   r#   r   r   r%   r&   _PS_CHECK_IMAGE_PS_EXTRACT_IMAGE_PS_CHECK_IMAGE_GET_CLIPBOARD_PS_EXTRACT_IMAGE_GET_CLIPBOARD_FILEDROP_IMAGE_EXTS_PS_CHECK_FILEDROP_IMAGE_PS_EXTRACT_FILEDROP_IMAGErX   r]   r7   intCompletedProcessrJ   rR   rY   r`   rg   rh   __annotations__rj   r   r   r   r   rr   r    rs   r   r!   rt   r"   r   r   <module>r      sA       				     



       . . . . . .		8	$	$
t 
 
 
 
 
T    &;d ;t ; ; ; ;
	$ 	 	 	 	$ 4     4 D    B8 6    & T %   %    !!  #% ! c C J<W    5d 5c 5d 5 5 5 5s  C D     4 S  QU    8#*    $ #td	 " " "S4Z    AD A A A AI I I I I Id t    "K K K K K
SD ST S S S SD    ". . . . . .b%5$ %54 %5 %5 %5 %5T$    d t      r   