list-processes.js.map (6236B)
1 { 2 "version": 3, 3 "sources": ["../../src/tools/list-processes.ts", "../../src/utils/process.ts"], 4 "sourcesContent": ["import { Process } from \"../types\";\nimport { fetchRunningProcesses } from \"../utils/process\";\n\ntype SortOrder = \"asc\" | \"desc\";\ntype SortField = keyof Process;\n\ntype Input = {\n /**\n * Optional array of search terms to filter processes.\n * For single process search, provide an array with one element.\n * Example: [\"Logi\"] will find all processes containing \"Logi\" in their name\n * Example: [\"Chrome\", \"Firefox\"] will find all processes containing either \"Chrome\" or \"Firefox\"\n */\n searchTerm?: string[];\n /**\n * Field to sort by (defaults to 'mem')\n */\n sortBy?: SortField;\n /**\n * Sort order (defaults to 'desc')\n */\n sortOrder?: SortOrder;\n};\n\nconst sortProcesses = (processes: Process[], field: SortField = \"mem\", order: SortOrder = \"desc\"): Process[] => {\n return [...processes].sort((a, b) => {\n const valueA = a[field];\n const valueB = b[field];\n\n if (valueA === valueB) return 0;\n if (valueA === undefined) return 1;\n if (valueB === undefined) return -1;\n\n const comparison = valueA < valueB ? -1 : 1;\n return order === \"desc\" ? -comparison : comparison;\n });\n};\n\nconst filterProcessesBySearchTerm = (processes: Process[], searchTerms?: string[]): Process[] => {\n if (!searchTerms?.length) return processes;\n\n return processes.filter((p) => {\n const searchIn = `${p.path} ${p.processName} ${p.appName || \"\"}`.toLowerCase();\n return searchTerms.some((term) => searchIn.includes(term.toLowerCase()));\n });\n};\n\nconst validateResults = (processes: Process[], searchTerms?: string[]): void => {\n if (processes.length === 0 && searchTerms?.length) {\n throw new Error(`No processes found matching \"${searchTerms.join(\", \")}\"`);\n }\n};\n\n/**\n * List out all running processes.\n * This tool can be called by AI to answer queries like,\n * \"What processes are running right now?\"\n * or \"list processes containing xyz\"\n * or \"list processes containing xyz and abc\"\n *\n * Throws an error if no processes are found matching the search terms\n */\nexport default async function listProcesses(input?: Input): Promise<Process[]> {\n const processes = await fetchRunningProcesses();\n\n const filteredProcesses = filterProcessesBySearchTerm(processes, input?.searchTerm);\n validateResults(filteredProcesses, input?.searchTerm);\n\n return sortProcesses(filteredProcesses, input?.sortBy, input?.sortOrder);\n}\n", "import { exec } from \"child_process\";\nimport { Process } from \"../types\";\n\n/**\n * Get all processes from the system\n * @returns Promise<Process[]> List of processes\n */\nexport async function fetchRunningProcesses(): Promise<Process[]> {\n return new Promise((resolve, reject) => {\n exec(`ps -eo pid,ppid,pcpu,rss,comm`, (err, stdout) => {\n if (err != null) {\n reject(err);\n return;\n }\n\n const processes = stdout\n .split(\"\\n\")\n .map((line) => {\n const defaultValue = [\"\", \"\", \"\", \"\", \"\", \"\"];\n const regex = /(\\d+)\\s+(\\d+)\\s+(\\d+[.|,]\\d+)\\s+(\\d+)\\s+(.*)/;\n const [, id, pid, cpu, mem, path] = line.match(regex) ?? defaultValue;\n const processName = path.match(/[^/]*[^/]*$/i)?.[0] ?? \"\";\n const isPrefPane = path.includes(\".prefPane\");\n const isApp = path.includes(\".app/\");\n\n return {\n id: parseInt(id),\n pid: parseInt(pid),\n cpu: parseFloat(cpu),\n mem: parseInt(mem),\n type: isPrefPane ? \"prefPane\" : isApp ? \"app\" : \"binary\",\n path,\n processName,\n appName: isApp ? path.match(/(?<=\\/)[^/]+(?=\\.app\\/)/)?.[0] : undefined,\n } as Process;\n })\n .filter((process) => process.processName !== \"\");\n resolve(processes);\n });\n });\n}\n"], 5 "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GCAA,IAAAI,EAAqB,yBAOrB,eAAsBC,GAA4C,CAChE,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,IACtC,QAAK,gCAAiC,CAACC,EAAKC,IAAW,CACrD,GAAID,GAAO,KAAM,CACfD,EAAOC,CAAG,EACV,MACF,CAEA,IAAME,EAAYD,EACf,MAAM;AAAA,CAAI,EACV,IAAKE,GAAS,CACb,IAAMC,EAAe,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EACtCC,EAAQ,+CACR,CAAC,CAAEC,EAAIC,EAAKC,EAAKC,EAAKC,CAAI,EAAIP,EAAK,MAAME,CAAK,GAAKD,EACnDO,EAAcD,EAAK,MAAM,cAAc,IAAI,CAAC,GAAK,GACjDE,EAAaF,EAAK,SAAS,WAAW,EACtCG,EAAQH,EAAK,SAAS,OAAO,EAEnC,MAAO,CACL,GAAI,SAASJ,CAAE,EACf,IAAK,SAASC,CAAG,EACjB,IAAK,WAAWC,CAAG,EACnB,IAAK,SAASC,CAAG,EACjB,KAAMG,EAAa,WAAaC,EAAQ,MAAQ,SAChD,KAAAH,EACA,YAAAC,EACA,QAASE,EAAQH,EAAK,MAAM,yBAAyB,IAAI,CAAC,EAAI,MAChE,CACF,CAAC,EACA,OAAQI,GAAYA,EAAQ,cAAgB,EAAE,EACjDhB,EAAQI,CAAS,CACnB,CAAC,CACH,CAAC,CACH,CDhBA,IAAMa,EAAgB,CAACC,EAAsBC,EAAmB,MAAOC,EAAmB,SACjF,CAAC,GAAGF,CAAS,EAAE,KAAK,CAACG,EAAGC,IAAM,CACnC,IAAMC,EAASF,EAAEF,CAAK,EAChBK,EAASF,EAAEH,CAAK,EAEtB,GAAII,IAAWC,EAAQ,MAAO,GAC9B,GAAID,IAAW,OAAW,MAAO,GACjC,GAAIC,IAAW,OAAW,MAAO,GAEjC,IAAMC,EAAaF,EAASC,EAAS,GAAK,EAC1C,OAAOJ,IAAU,OAAS,CAACK,EAAaA,CAC1C,CAAC,EAGGC,EAA8B,CAACR,EAAsBS,IACpDA,GAAa,OAEXT,EAAU,OAAQU,GAAM,CAC7B,IAAMC,EAAW,GAAGD,EAAE,IAAI,IAAIA,EAAE,WAAW,IAAIA,EAAE,SAAW,EAAE,GAAG,YAAY,EAC7E,OAAOD,EAAY,KAAMG,GAASD,EAAS,SAASC,EAAK,YAAY,CAAC,CAAC,CACzE,CAAC,EALgCZ,EAQ7Ba,EAAkB,CAACb,EAAsBS,IAAiC,CAC9E,GAAIT,EAAU,SAAW,GAAKS,GAAa,OACzC,MAAM,IAAI,MAAM,gCAAgCA,EAAY,KAAK,IAAI,CAAC,GAAG,CAE7E,EAWA,eAAOK,EAAqCC,EAAmC,CAC7E,IAAMf,EAAY,MAAMgB,EAAsB,EAExCC,EAAoBT,EAA4BR,EAAWe,GAAO,UAAU,EAClF,OAAAF,EAAgBI,EAAmBF,GAAO,UAAU,EAE7ChB,EAAckB,EAAmBF,GAAO,OAAQA,GAAO,SAAS,CACzE", 6 "names": ["list_processes_exports", "__export", "listProcesses", "__toCommonJS", "import_child_process", "fetchRunningProcesses", "resolve", "reject", "err", "stdout", "processes", "line", "defaultValue", "regex", "id", "pid", "cpu", "mem", "path", "processName", "isPrefPane", "isApp", "process", "sortProcesses", "processes", "field", "order", "a", "b", "valueA", "valueB", "comparison", "filterProcessesBySearchTerm", "searchTerms", "p", "searchIn", "term", "validateResults", "listProcesses", "input", "fetchRunningProcesses", "filteredProcesses"] 7 }