
    `gjC              
       \   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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jB                  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)Z0d*edefd+Z1d*edefd,Z2defd-Z3dedefd.Z4y)/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_wsls   PNG

destreturnc                     | j                   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    G/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/clipboard.pysave_clipboard_imager      sT    
 	KKdT2
||x4  
||wT""t    c                     t         j                  dk(  r
t               S t         j                  dk(  r
t               S t	               rt               ryt        j                  j                  d      rt               ry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!##y^%	zz~~'(-?-Ar   c                 2    t        |       xs 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 xs d| j                  v S # t        $ r Y y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   A   sQ    ~~1dA
  4;;.Q2Bdkk2QQ s   8; 	AAc                 2   	 t        j                  dt        |       gdd      }|j                  dk(  r.| j	                         r| j                         j                  dkD  ryy# t        $ r Y yt        $ r }t        j                  d|       Y d}~yd}~ww xY w)	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%   M   s    
/NNT#
 <<1499;3F3F3J
 	     /*A../s   AA# #	B.B6BBc                 N   t               syd|  d}	 t        j                  dd|gddd      }|j                  d	k(  r<d
|j                  vr.| j                         r| j                         j                  d	kD  ryy# t        $ r }t        j                  d|       Y d}~yd}~ww xY w)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    	226 8	 BNN$'dA
 <<1qxx!7DKKMdiikNaNadeNe   B=qAABs   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      s)    >>	l-z6B$ r   b64_datac                     t        j                  |d      }| j                  |       | j                         xr | j	                         j
                  dkD  S )NT)validater   )base64	b64decodewrite_bytesr9   r:   r;   )r   rK   image_bytess      r   _write_base64_imagerR      sD    ""8d;K[!;;=4TYY[00144r   labelc                   t         D ]0  }	 t        | ||      }|j                  dk(  rd|j                  v r y2 y# t        $ r t
        j                  d|        Y  yt        $ r!}t
        j                  d||       Y d }~zd }~ww xY w)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VW=A||q Vqxx%7		J  ! 	LLA3G 	JLL>qII	Js   +;BB%BBc                n   t         D ]L  }	 t        | ||      }|j                  dk7  r"|j                  j	                         }|s?t        ||      r yN y# t        $ r t        j                  d|        Y  yt        $ r3}t        j                  d||       |j                  d       Y d }~d }~ww xY w)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 xx~~'H"42 3)$  ! 	LLA3G 	)LLCUANKK4K((	)s(   AAAB49B4)B//B4c                      dD ]B  } 	 t        j                  | ddddgddd      }|j                  d	k(  rd
|j                  v r| c S D y# t        $ r Y Qt
        $ r Y [w xY w)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 TQXX%5 	 ! 	 		s   <A			AAAF_ps_exec                  2    t         du r
t               a t         S )NF)rh   rg   r"   r   r   _get_ps_exerj     s    %"$Nr   c                  8    t               } | yt        | dd      S )z1Check if the Windows clipboard contains an image.FrB   Windowsr.   rS   )rj   rY   )pss    r   r   r     s     	B	z Qi@@r   c                 d    t               }|t        j                  d       yt        || dd      S )uH   Extract clipboard image on native Windows via PowerShell → base64 PNG.uA   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!"dBiHHr   c                     t               rt        |       ryt        j                  j	                  d      rt        |       ry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:    yT? 
zz~~'(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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   D  s    !"2D"ERRr   c                     	 t        j                  ddgddd      } | j                  dk(  xr* t        d | j                  j                         D              S # t        $ r t        j                  d       Y y	t        $ r Y y	w xY w)
z-Check if Wayland clipboard has image content.wl-paste--list-typesTr*   r+   r   c              3   >   K   | ]  }|j                  d         yw)zimage/N)
startswith).0ts     r   	<genexpr>z%_wayland_has_image.<locals>.<genexpr>R  s      )
'(ALL")
s   8   wl-paste not installed — Wayland clipboard unavailableF)
r/   r0   r8   anyr1   
splitlinesr<   r=   r>   r2   r?   s    r   r    r    K  s    NN(dA
 ||q  
S )
,-HH,?,?,A)
 &
 	
  QOP   s   AA B8BBc                    	 t        j                  ddgddd      }|j                  dk7  ry|j                  j	                         }d}d	D ]
  }||v s|} n |syt        | d
      5 }t        j                  dd|g|t         j                  dd       ddd       | j                         r| j                         j                  dk(  r| j                  d       y|dk7  r)t        |       rt        |       s| j                  d       yy# 1 sw Y   xxY w# t        $ r t        j                  d       Y yt         $ r2}t        j                  d|       | j                  d       Y d}~yd}~ww xY w)z;Use wl-paste to extract clipboard image (Wayland sessions).r{   r|   Tr*   r+   r   FN)	image/pngz
image/jpegz	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_png_is_png_filer<   r=   r>   r2   )r   types_rtypesmime	preferredfr@   s          r   rs   rs   \  sn   .%..(dA
 "))+ 5 	IE! 		  $ 	NNXt,!3!3Qd	 {{}		 3 3q 8KK4K(
 ;"4(T0Bt,%	 	(  QOP   %?Ct$$%sM   *D %D D D ',D
AD -D 
DD E06E0>(E++E0pathc                    	 ddl m} |j                  |       }|j                  | d       y# t        $ r Y n+t
        $ r }t        j                  d|       Y d}~nd}~ww xY w| j                  d      }	 | j                  |       t        j                  dt        |      d	t        |       z   gdd
      }|j                  dk(  r@| j                         r0| j                         j                   dkD  r|j#                  d       y|j                  |        n# t$        $ rI t        j                  d       |j                         r!| j                         s|j                  |        Y n\t
        $ rQ}t        j                  d|       |j                         r!| j                         s|j                  |        Y d}~nd}~ww xY w| j                         xr | j                         j                   dkD  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     s   Bjju  B=qAAB 

6
"CCNNC&3t9"45
 <<1499;3F3F3JJJ$J' JJt NO::<JJt BAF::<JJt ;;=4TYY[00144s@   ), 	AAAA4BD D AG 'G /AF;;G c                     	 | j                  d      5 }|j                  t        t                    t        k(  cddd       S # 1 sw Y   yxY w# t        $ r Y yw xY w)z;Return True when *path* starts with the PNG file signature.rbNF)r   readlen_PNG_SIGNATUREOSError)r   r   s     r   r   r     sT    YYt_ 	A66#n-..@	A 	A 	A s-   A %A	A AA A 	AAc                      	 t        j                  g dddd      } | j                  dk(  xr d| j                  v S # t        $ r Y yt
        $ r Y yw xY w)z)Check if X11 clipboard has image content.xclip
-selection	clipboard-tTARGETS-oTr*   r+   r   r   Fre   r   s    r   r!   r!     se    	NNGdA
 ||q <[AHH%<<    s   9< 	AAAc                 (   	 t        j                  g dddd      }d|j                  vry	 	 t        | d      5 }t        j                  g d	|t         j                  d
d       ddd       | j                         r| j                         j                  dkD  ryy# t        $ r t        j                  d       Y yt        $ r Y yw xY w# 1 sw Y   fxY w# t        $ r2}t        j                  d|       | j                  d       Y d}~yd}~ww xY w)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dA
 gnn, -
%$ 	NNM!3!3Qd	
 ;;=TYY[0014 %  TU 
	 	  %8!<t$$%sE   )B C +C
%5C C<CC
CC 	D(DD)5__doc__rN   loggingr   r/   r   pathlibr   hermes_constantsr   r   	getLogger__name__r=   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   r!   rt   r"   r   r   <module>r      s     	  
  .			8	$%
t 
 
T &;d ;t ;
	$ 	$ 4  4 D B8 6    & T %& ' %& '  !!  #% ! c C J<W<W 5d 5c 5d 5s  C D  4 S  QU 8#* $ #td	 "S4Z AD AI I Id t "K K
SD ST SD "1 1 1h%5$ %54 %5Pt  $ d t r   