index.js (7389B)
1 "use strict";var C=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var J=(s,i)=>{for(var a in i)C(s,a,{get:i[a],enumerable:!0})},ee=(s,i,a,u)=>{if(i&&typeof i=="object"||typeof i=="function")for(let d of j(i))!H.call(s,d)&&d!==a&&C(s,d,{get:()=>i[d],enumerable:!(u=Q(i,d))||u.enumerable});return s};var te=s=>ee(C({},"__esModule",{value:!0}),s);var ae={};J(ae,{default:()=>v});module.exports=te(ae);var t=require("@raycast/api"),M=require("child_process");var ie=["B","kB","MB","GB","TB","PB","EB","ZB","YB"],se=["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],re=["b","kbit","Mbit","Gbit","Tbit","Pbit","Ebit","Zbit","Ybit"],oe=["b","kibit","Mibit","Gibit","Tibit","Pibit","Eibit","Zibit","Yibit"],L=(s,i,a)=>{let u=s;return typeof i=="string"||Array.isArray(i)?u=s.toLocaleString(i,a):(i===!0||a!==void 0)&&(u=s.toLocaleString(void 0,a)),u};function x(s,i){if(!Number.isFinite(s))throw new TypeError(`Expected a finite number, got ${typeof s}: ${s}`);i={bits:!1,binary:!1,space:!0,...i};let a=i.bits?i.binary?oe:re:i.binary?se:ie,u=i.space?" ":"";if(i.signed&&s===0)return` 0${u}${a[0]}`;let d=s<0,y=d?"-":i.signed?"+":"";d&&(s=-s);let l;if(i.minimumFractionDigits!==void 0&&(l={minimumFractionDigits:i.minimumFractionDigits}),i.maximumFractionDigits!==void 0&&(l={maximumFractionDigits:i.maximumFractionDigits,...l}),s<1){let T=L(s,i.locale,l);return y+T+u+a[0]}let B=Math.min(Math.floor(i.binary?Math.log(s)/Math.log(1024):Math.log10(s)/3),a.length-1);s/=(i.binary?1024:1e3)**B,l||(s=s.toPrecision(3));let w=L(Number(s),i.locale,l),A=a[B];return y+w+u+A}var g=require("react");var S=require("react"),ne=()=>{};function ce(s,i){let a=(0,S.useRef)(ne);(0,S.useEffect)(()=>{a.current=s},[s]),(0,S.useEffect)(()=>{if(a.current(),(i??0)>0){let d=Math.max(i??0,1e3),y=setInterval(()=>a.current(),d);return()=>clearInterval(y)}},[i])}var k=ce;var p=require("react/jsx-runtime");function v(){let[s,i]=(0,g.useState)([]),[a,u]=(0,g.useState)([]),[d,y]=(0,g.useState)(""),l=(0,t.getPreferenceValues)(),B=l.shouldSearchInPaths,w=l.shouldSearchInPid,A=l.shouldPrioritizeAppsWhenFiltering,T=l.shouldShowPID,K=l.shouldShowPath,R=+l.refreshDuration,U=l.closeWindowAfterKill,$=l.clearSearchBarAfterKill,W=l.goToRootAfterKill,[F,Y]=(0,g.useState)(l.sortByMem?"memory":"cpu"),[P,G]=(0,g.useState)(l.aggregateApps),D=()=>{(0,M.exec)("ps -eo pid,ppid,pcpu,rss,comm",(e,o)=>{if(e!=null)return;let r=o.split(` 2 `).map(h=>{let N=["","","","","",""],b=/(\d+)\s+(\d+)\s+(\d+[.|,]\d+)\s+(\d+)\s+(.*)/,[,n,f,c,m,I]=h.match(b)??N,O=I.match(/[^/]*[^/]*$/i)?.[0]??"",X=I.includes(".prefPane"),q=I.includes(".app/");return{id:parseInt(n),pid:parseInt(f),cpu:parseFloat(c),mem:parseInt(m),type:X?"prefPane":q?"app":"binary",path:I,processName:O}}).filter(h=>h.processName!=="");i(r)})};k(D,R),(0,g.useEffect)(()=>{let e=s;P&&(e=z(e)),e.sort((o,r)=>F==="memory"?o.mem>r.mem?-1:1:o.cpu>r.cpu?-1:1),u(e)},[s,F,P]);let Z=e=>e.type==="prefPane"?{fileIcon:e.path?.replace(/(.+\.prefPane)(.+)/,"$1")??""}:e.type==="app"||e.type==="aggregatedApp"?{fileIcon:e.path?.replace(/(.+\.app)(.+)/,"$1")??""}:"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/ExecutableBinaryIcon.icns",E=async(e,o=!1)=>{let r=e.processName==="-"?`process ${e.id}?`:e.processName;if(!await(0,t.confirmAlert)({title:`${o?"Force ":""}Kill ${r}?`,rememberUserChoice:!0})){(0,t.showToast)({title:`Cancelled Killing ${r}`,style:t.Toast.Style.Failure});return}(0,M.exec)(`zsh -c '${o?"sudo ":""}kill -9 ${e.id}'`,h=>{if(h){o?(0,t.confirmAlert)({title:`Failed Killing ${r}`,message:"Please ensure that touch id/password prompt is enabled for sudo: https://dev.to/siddhantkcode/enable-touch-id-authentication-for-sudo-on-macos-sonoma-14x-4d28",primaryAction:{title:"Open Link",onAction:()=>(0,t.open)("https://dev.to/siddhantkcode/enable-touch-id-authentication-for-sudo-on-macos-sonoma-14x-4d28")}}):(0,t.showToast)({title:`Failed Killing ${r}`,style:t.Toast.Style.Failure});return}(0,t.showToast)({title:`Killed ${r}`,style:t.Toast.Style.Success})}),i(a.filter(h=>h.id!==e.id)),U&&(0,t.closeMainWindow)(),W&&(0,t.popToRoot)({clearSearchBar:$}),$&&(0,t.clearSearchBar)({forceScrollToTop:!0})},_=e=>{let o=[];return e.type==="aggregatedApp"&&e.appName!=null&&o.push(e.appName),T&&o.push(e.id.toString()),K&&o.push(e.path),o.join(" - ")},z=e=>{let o=Array(),r=new Map;r.set(1,{process:{id:1},childNodes:[]});let h=Array();e.forEach(n=>{if(n.type==="app"){h.push(n.id);let f=r.get(n.id);f==null?(f={process:n,childNodes:[]},r.set(n.id,f)):f.process=n;let c=r.get(n.pid);if(c==null)c={process:void 0,childNodes:[f]},r.set(n.pid,c);else if(c.process==null)c.childNodes.push(f);else{let m;for(;c?.process!=null&&c.process.pid!==1&&(m=r.get(c.process.pid))!=null;)c=m;c?.childNodes.push(f)}c.process?.id!==1&&(c.childNodes=c.childNodes.concat(f.childNodes),f.childNodes=[])}else o.push(n)});let N=r.get(1)?.childNodes,b=Array();return N?.forEach(n=>{if(n.process==null)return;b.push(n.process.id);let f=n.childNodes.map(c=>c.process?.id).filter(c=>c!=null);b=b.concat(f),o.push({id:n.process.id,pid:n.process.pid,cpu:(n.childNodes?.reduce((c,m)=>c+(m.process?.cpu??0),0)??0)+n.process.cpu,mem:(n.childNodes?.reduce((c,m)=>c+(m.process?.mem??0),0)??0)+n.process.mem,type:"aggregatedApp",path:n.process.path,processName:n.process.processName,appName:n.process.path.match(/(?<=\/)[^/]+(?=\.app\/)/)?.[0]})}),o},V=a.length;return(0,p.jsx)(t.List,{isLoading:a.length===0,searchBarPlaceholder:"Filter by name",onSearchTextChange:e=>y(e),searchBarAccessory:(0,p.jsx)(t.List.Dropdown,{tooltip:"Filter",storeValue:!0,onChange:e=>Y(e),children:(0,p.jsxs)(t.List.Dropdown.Section,{title:"Sort By",children:[(0,p.jsx)(t.List.Dropdown.Item,{title:"CPU Usage",value:"cpu"}),(0,p.jsx)(t.List.Dropdown.Item,{title:"Memory Usage",value:"memory"})]})}),children:(0,p.jsx)(t.List.Section,{title:"Processes",subtitle:`${V} running`,children:a.filter(e=>{if(d==="")return!0;let o=e.processName.toLowerCase().includes(d.toLowerCase()),r=B&&e.path.toLowerCase().match(new RegExp(`.+${d}.*\\.[app|framework|prefpane]`,"ig"))!=null,h=w&&e.id.toString().includes(d),N=e.type==="aggregatedApp"&&e.appName?.toLowerCase().includes(d.toLowerCase());return o||r||h||N}).sort((e,o)=>{if(A){let r=["app","aggregatedApp"];if(r.includes(e.type)&&!r.includes(o.type))return-1;if(!r.includes(e.type)&&r.includes(o.type))return 1}return 0}).map((e,o)=>{let r=Z(e);return(0,p.jsx)(t.List.Item,{title:e.processName,subtitle:_(e),icon:r,accessories:[{text:`${e.cpu.toFixed(2)}%`,icon:{source:"cpu.svg",tintColor:t.Color.PrimaryText},tooltip:"% CPU"},{text:x(e.mem*1024),icon:{source:"memorychip.svg",tintColor:t.Color.PrimaryText},tooltip:"Memory"}],actions:(0,p.jsxs)(t.ActionPanel,{children:[(0,p.jsx)(t.Action,{title:"Kill",icon:t.Icon.XMarkCircle,onAction:()=>E(e)}),(0,p.jsx)(t.Action,{title:"Force Kill",icon:t.Icon.XMarkCircle,onAction:()=>E(e,!0)}),e.path==null?null:(0,p.jsx)(t.Action.CopyToClipboard,{title:"Copy Path",content:e.path}),(0,p.jsx)(t.Action,{title:"Reload",icon:t.Icon.ArrowClockwise,shortcut:{key:"r",modifiers:["cmd"]},onAction:()=>D()}),(0,p.jsx)(t.Action,{title:`${P?"Disable":"Enable"} Aggregating Apps`,icon:t.Icon.AppWindow,shortcut:{key:"tab",modifiers:["shift"]},onAction:()=>{G(!P),(0,t.showToast)({title:`${P?"Disabled":"Enabled"} aggregating apps`})}})]})},o)})})})}