import * as z from "zod" import { tool } from "langchain" import os from 'os' import { promisify } from 'util' import { exec } from 'child_process' const execPromise = promisify(exec) /** * 获取已安装软件信息工具 * @returns {string} - 返回已安装软件信息的 JSON 字符串 */ export const getInstalledSoftwareTool = tool( async (input) => { try { const softwareInfo = { platform: os.platform(), software: [] } // 获取Windows已安装软件 if (os.platform() === 'win32') { try { const { stdout } = await execPromise('powershell -Command "Get-WmiObject Win32_Product | Select-Object Name,Version,Vendor,InstallDate | ConvertTo-Json"') const softwareData = JSON.parse(stdout) const softwareArray = Array.isArray(softwareData) ? softwareData : [softwareData] softwareInfo.software = softwareArray.map(soft => ({ name: soft.Name || 'N/A', version: soft.Version || 'N/A', vendor: soft.Vendor || 'N/A', installDate: soft.InstallDate || 'N/A' })).filter(item => item) } catch (error) { console.error('Error getting installed software:', error) } } // 获取Linux已安装软件 else if (os.platform() === 'linux') { try { // 尝试使用dpkg(Debian/Ubuntu) const { stdout: dpkgOutput } = await execPromise('dpkg -l 2>/dev/null || echo "N/A"') if (dpkgOutput && dpkgOutput !== 'N/A') { const lines = dpkgOutput.trim().split('\n').slice(5) softwareInfo.software = lines.map(line => { const parts = line.trim().split(/\s+/) if (parts.length >= 3) { return { name: parts[1], version: parts[2], description: parts.slice(3).join(' ') } } return null }).filter(item => item) } else { // 尝试使用rpm(RHEL/CentOS) const { stdout: rpmOutput } = await execPromise('rpm -qa 2>/dev/null || echo "N/A"') if (rpmOutput && rpmOutput !== 'N/A') { const lines = rpmOutput.trim().split('\n') softwareInfo.software = lines.map(line => { const match = line.match(/(.+)-(.+)-(.+)/) if (match) { return { name: match[1], version: `${match[2]}-${match[3]}` } } return null }).filter(item => item) } } } catch (error) { console.error('Error getting installed software:', error) } } // 获取macOS已安装软件 else if (os.platform() === 'darwin') { try { const { stdout } = await execPromise('find /Applications -name "*.app" -type d | sort') const apps = stdout.trim().split('\n') softwareInfo.software = apps.map(app => ({ name: app.split('/').pop().replace('.app', ''), path: app })).filter(item => item) } catch (error) { console.error('Error getting installed software:', error) } } return JSON.stringify(softwareInfo, null, 2) } catch (error) { console.error('Error getting installed software:', error) return JSON.stringify({ error: error.message }, null, 2) } }, { name: "get_installed_software", description: `获取系统已安装的软件信息,包括软件名称、版本、供应商等`, schema: z.object({}) } )