local Utils = require("avante.utils") ---@class AvanteClipboard local M = {} M.clip_cmd = nil M.get_clip_cmd = function() if M.clip_cmd then return M.clip_cmd end if (vim.fn.has("win32") > 0 or vim.fn.has("wsl") > 0) and vim.fn.executable("powershell.exe") then M.clip_cmd = "powershell.exe" end return M.clip_cmd end M.has_content = function() local cmd = M.get_clip_cmd() ---@type vim.SystemCompleted local output if cmd == "powershell.exe" then output = Utils.shell_run("Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Clipboard]::GetImage()") return output.code == 0 and output.stdout:find("Width") ~= nil end Utils.warn("Failed to validate clipboard content", { title = "Avante" }) return false end M.get_content = function() local cmd = M.get_clip_cmd() ---@type vim.SystemCompleted local output if cmd == "powershell.exe" then output = Utils.shell_run( [[Add-Type -AssemblyName System.Windows.Forms; $ms = New-Object System.IO.MemoryStream;]] .. [[ [System.Windows.Forms.Clipboard]::GetImage().Save($ms, [System.Drawing.Imaging.ImageFormat]::Png);]] .. [[ [System.Convert]::ToBase64String($ms.ToArray())]] ) if output.code == 0 then return output.stdout:gsub("\r\n", ""):gsub("\n", ""):gsub("\r", "") end end error("Failed to get clipboard content") end return M