inspiration-agent 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +368 -0
- package/dist/.env.example +53 -0
- package/dist/README.md +368 -0
- package/dist/agent/ai.agent.js +712 -0
- package/dist/channel/feishu-connection.js +238 -0
- package/dist/channel/feishu.service.js +222 -0
- package/dist/cli.js +659 -0
- package/dist/config/system.prompt.txt +312 -0
- package/dist/index.js +176 -0
- package/dist/model/base-llm.service.js +320 -0
- package/dist/model/deepseek.service.js +18 -0
- package/dist/model/kimi.service.js +19 -0
- package/dist/model/minimax.service.js +35 -0
- package/dist/model/zhipu.service.js +26 -0
- package/dist/services/database.service.js +697 -0
- package/dist/services/memory.manager.js +486 -0
- package/dist/services/message.queue.js +157 -0
- package/dist/tools/browser.tools.js +814 -0
- package/dist/tools/command.tools.js +361 -0
- package/dist/tools/file.tools.js +222 -0
- package/dist/tools/memory.tools.js +393 -0
- package/dist/tools/scheduler.tools.js +559 -0
- package/dist/tools/search.tools.js +208 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/markdown-renderer.js +207 -0
- package/package.json +51 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
const { exec } = require("child_process");
|
|
2
|
+
const logger = require("../utils/logger");
|
|
3
|
+
const util = require("util");
|
|
4
|
+
|
|
5
|
+
const execPromise = util.promisify(exec);
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 配置:是否启用命令白名单
|
|
9
|
+
* 可通过环境变量 COMMAND_WHITELIST_ENABLED 控制
|
|
10
|
+
* - true: 启用白名单模式(推荐,更安全)
|
|
11
|
+
* - false: 禁用白名单,允许执行任意命令(仅用于可信环境)
|
|
12
|
+
*/
|
|
13
|
+
const WHITELIST_ENABLED = process.env.COMMAND_WHITELIST_ENABLED !== "false";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 命令白名单
|
|
17
|
+
* 仅在 WHITELIST_ENABLED 为 true 时生效
|
|
18
|
+
* 仅允许执行以下基础命令,确保系统安全
|
|
19
|
+
*/
|
|
20
|
+
const ALLOWED_COMMANDS = [
|
|
21
|
+
// 文件操作(安全)
|
|
22
|
+
"ls",
|
|
23
|
+
"cat",
|
|
24
|
+
"head",
|
|
25
|
+
"tail",
|
|
26
|
+
"wc",
|
|
27
|
+
"grep",
|
|
28
|
+
"sort",
|
|
29
|
+
"uniq",
|
|
30
|
+
"find",
|
|
31
|
+
"tree",
|
|
32
|
+
"file",
|
|
33
|
+
"stat",
|
|
34
|
+
|
|
35
|
+
// 版本控制
|
|
36
|
+
"git",
|
|
37
|
+
|
|
38
|
+
// 包管理器
|
|
39
|
+
"npm",
|
|
40
|
+
"yarn",
|
|
41
|
+
"pnpm",
|
|
42
|
+
|
|
43
|
+
// 构建工具
|
|
44
|
+
"make",
|
|
45
|
+
"cmake",
|
|
46
|
+
"gradle",
|
|
47
|
+
"mvn",
|
|
48
|
+
|
|
49
|
+
// 运行工具
|
|
50
|
+
"node",
|
|
51
|
+
"python",
|
|
52
|
+
"python3",
|
|
53
|
+
"java",
|
|
54
|
+
|
|
55
|
+
// 压缩工具
|
|
56
|
+
"tar",
|
|
57
|
+
"zip",
|
|
58
|
+
"unzip",
|
|
59
|
+
"gzip",
|
|
60
|
+
"gunzip",
|
|
61
|
+
|
|
62
|
+
// 系统信息(只读)
|
|
63
|
+
"df",
|
|
64
|
+
"du",
|
|
65
|
+
"free",
|
|
66
|
+
"top",
|
|
67
|
+
"ps",
|
|
68
|
+
"uname",
|
|
69
|
+
"whoami",
|
|
70
|
+
"date",
|
|
71
|
+
"pwd",
|
|
72
|
+
|
|
73
|
+
// 文本处理
|
|
74
|
+
"echo",
|
|
75
|
+
"printf",
|
|
76
|
+
"sed",
|
|
77
|
+
"awk",
|
|
78
|
+
"cut",
|
|
79
|
+
"tr",
|
|
80
|
+
|
|
81
|
+
// 网络工具(安全)
|
|
82
|
+
"curl",
|
|
83
|
+
"wget",
|
|
84
|
+
"ping",
|
|
85
|
+
"nslookup",
|
|
86
|
+
"dig",
|
|
87
|
+
|
|
88
|
+
// Docker(需谨慎)
|
|
89
|
+
"docker",
|
|
90
|
+
|
|
91
|
+
// 开发工具
|
|
92
|
+
"eslint",
|
|
93
|
+
"prettier",
|
|
94
|
+
"tsc",
|
|
95
|
+
"jest",
|
|
96
|
+
"mocha",
|
|
97
|
+
"pytest",
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 危险命令模式黑名单
|
|
102
|
+
* 任何包含这些模式的命令都将被拒绝
|
|
103
|
+
*/
|
|
104
|
+
const DANGEROUS_PATTERNS = [
|
|
105
|
+
// 文件删除
|
|
106
|
+
/\brm\s+[-rf]+\s*\//, // rm -rf /
|
|
107
|
+
/\brm\s+[-rf]+\s+\*\*?/, // rm -rf *
|
|
108
|
+
|
|
109
|
+
// 磁盘操作
|
|
110
|
+
/dd\s+.*of=\//, // dd writing to root
|
|
111
|
+
/\bmkfs\./, // mkfs.* filesystem creation
|
|
112
|
+
/\bformat\b/, // format command (Windows)
|
|
113
|
+
|
|
114
|
+
// 权限提升
|
|
115
|
+
/\bsudo\b/, // sudo
|
|
116
|
+
/\bdoas\b/, // doas
|
|
117
|
+
/\bsu\b/, // su
|
|
118
|
+
|
|
119
|
+
// 系统配置
|
|
120
|
+
/\/etc\/.*write/, // writing to /etc
|
|
121
|
+
/\/boot\/.*write/, // writing to /boot
|
|
122
|
+
/\/sys\/.*write/, // writing to /sys
|
|
123
|
+
/\/proc\/.*write/, // writing to /proc
|
|
124
|
+
|
|
125
|
+
// 进程终止
|
|
126
|
+
/\bkill\s+[-9]/, // kill -9
|
|
127
|
+
/\bpkill\b/, // pkill
|
|
128
|
+
/\bkillall\b/, // killall
|
|
129
|
+
|
|
130
|
+
// 系统控制
|
|
131
|
+
/\bshutdown\b/, // shutdown
|
|
132
|
+
/\breboot\b/, // reboot
|
|
133
|
+
/\bhalt\b/, // halt
|
|
134
|
+
/\bpoweroff\b/, // poweroff
|
|
135
|
+
|
|
136
|
+
// 用户管理
|
|
137
|
+
/\buseradd\b/, // useradd
|
|
138
|
+
/\buserdel\b/, // userdel
|
|
139
|
+
/\busermod\b/, // usermod
|
|
140
|
+
/\bpasswd\b/, // passwd
|
|
141
|
+
|
|
142
|
+
// 软件包安装(需要确认)
|
|
143
|
+
/\bapt-get\s+install\b/, // apt-get install
|
|
144
|
+
/\bapt\s+install\b/, // apt install
|
|
145
|
+
/\byum\s+install\b/, // yum install
|
|
146
|
+
/\bapk\s+add\b/, // apk add
|
|
147
|
+
|
|
148
|
+
// 覆盖/重定向危险操作
|
|
149
|
+
/>.*\/dev\/sda/, // writing to disk directly
|
|
150
|
+
/>.*\/dev\/hda/, // writing to disk directly
|
|
151
|
+
/>\s*\/dev\/null/, // redirect to /dev/null (might hide errors)
|
|
152
|
+
|
|
153
|
+
// 命令注入
|
|
154
|
+
/&&\s*rm/, // command && rm
|
|
155
|
+
/\|\s*rm/, // command | rm
|
|
156
|
+
/;\s*rm/, // command ; rm
|
|
157
|
+
|
|
158
|
+
// 下载执行脚本(危险)
|
|
159
|
+
/\bcurl.*\|\s*sh\b/, // curl | sh
|
|
160
|
+
/\bcurl.*\|\s*bash\b/, // curl | bash
|
|
161
|
+
/\bwget.*\|\s*sh\b/, // wget | sh
|
|
162
|
+
/\bwget.*\|\s*bash\b/, // wget | bash
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* 危险参数黑名单
|
|
167
|
+
* 某些命令配合特定参数会很危险
|
|
168
|
+
*/
|
|
169
|
+
const DANGEROUS_ARGS = {
|
|
170
|
+
rm: ["-rf", "-fr", "-r", "-R", "--recursive"],
|
|
171
|
+
dd: ["of=/dev/", "if=/dev/"],
|
|
172
|
+
chmod: ["777", "4755", "+s"],
|
|
173
|
+
chown: ["root:", ":root"],
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* 命令行工具类
|
|
178
|
+
* 提供执行 shell 命令的功能
|
|
179
|
+
* 包含白名单和安全检查机制
|
|
180
|
+
*/
|
|
181
|
+
class CommandTools {
|
|
182
|
+
/**
|
|
183
|
+
* 验证命令是否在白名单中且不包含危险操作
|
|
184
|
+
* @param {string} command - 要验证的命令
|
|
185
|
+
* @returns {{allowed: boolean, reason: string|null}}
|
|
186
|
+
*/
|
|
187
|
+
validateCommand(command) {
|
|
188
|
+
const trimmedCommand = command.trim();
|
|
189
|
+
|
|
190
|
+
if (!trimmedCommand) {
|
|
191
|
+
return { allowed: false, reason: "命令不能为空" };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// 提取基础命令名称
|
|
195
|
+
const baseCommand = trimmedCommand.split(/\s+/)[0];
|
|
196
|
+
|
|
197
|
+
// 如果启用了白名单模式,检查命令是否在白名单中
|
|
198
|
+
if (WHITELIST_ENABLED && !ALLOWED_COMMANDS.includes(baseCommand)) {
|
|
199
|
+
return {
|
|
200
|
+
allowed: false,
|
|
201
|
+
reason: `命令 "${baseCommand}" 不在允许的命令白名单中。允许的命令: ${ALLOWED_COMMANDS.join(", ")}`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 无论是否启用白名单,都检查危险命令模式
|
|
206
|
+
for (const pattern of DANGEROUS_PATTERNS) {
|
|
207
|
+
if (pattern.test(trimmedCommand)) {
|
|
208
|
+
return {
|
|
209
|
+
allowed: false,
|
|
210
|
+
reason: `命令包含危险操作模式,已被安全策略阻止`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// 无论是否启用白名单,都检查危险参数组合
|
|
216
|
+
if (DANGEROUS_ARGS[baseCommand]) {
|
|
217
|
+
const dangerousArgs = DANGEROUS_ARGS[baseCommand];
|
|
218
|
+
for (const arg of dangerousArgs) {
|
|
219
|
+
const argPattern = new RegExp(
|
|
220
|
+
`\\b${arg.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`
|
|
221
|
+
);
|
|
222
|
+
if (argPattern.test(trimmedCommand)) {
|
|
223
|
+
return {
|
|
224
|
+
allowed: false,
|
|
225
|
+
reason: `命令 "${baseCommand}" 包含危险参数 "${arg}",已被安全策略阻止`,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return { allowed: true, reason: null };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* 执行 shell 命令
|
|
236
|
+
* @param {Object} args - 参数对象
|
|
237
|
+
* @param {string} args.command - 要执行的命令
|
|
238
|
+
* @param {string} args.cwd - 工作目录,可选,默认当前目录
|
|
239
|
+
* @param {number} args.timeout - 超时时间(毫秒),可选,默认 30000
|
|
240
|
+
* @returns {Promise<Object>} 操作结果
|
|
241
|
+
*/
|
|
242
|
+
async executeCommand(args) {
|
|
243
|
+
try {
|
|
244
|
+
const { command, cwd, timeout = 30000 } = args;
|
|
245
|
+
|
|
246
|
+
// 安全验证
|
|
247
|
+
const validation = this.validateCommand(command);
|
|
248
|
+
if (!validation.allowed) {
|
|
249
|
+
logger.warn(`\n========== 命令被安全策略阻止 ==========`);
|
|
250
|
+
logger.warn(`命令: ${command}`);
|
|
251
|
+
logger.warn(`原因: ${validation.reason}`);
|
|
252
|
+
logger.warn(`白名单模式: ${WHITELIST_ENABLED ? "启用" : "禁用"}`);
|
|
253
|
+
logger.warn(`============================================\n`);
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
success: false,
|
|
257
|
+
exitCode: -1,
|
|
258
|
+
error: validation.reason,
|
|
259
|
+
message: `命令执行被阻止: ${validation.reason}`,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
logger.info(`\n========== 执行命令 ==========`);
|
|
264
|
+
logger.info(`命令: ${command}`);
|
|
265
|
+
logger.info(`工作目录: ${cwd || "当前目录"}`);
|
|
266
|
+
logger.info(`超时: ${timeout}ms`);
|
|
267
|
+
logger.info(`白名单模式: ${WHITELIST_ENABLED ? "启用" : "禁用"}`);
|
|
268
|
+
logger.info(`================================\n`);
|
|
269
|
+
|
|
270
|
+
const options = {
|
|
271
|
+
timeout: timeout,
|
|
272
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
if (cwd) {
|
|
276
|
+
options.cwd = cwd;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const { stdout, stderr } = await execPromise(command, options);
|
|
280
|
+
|
|
281
|
+
logger.info(`\n========== 命令执行结果 ==========`);
|
|
282
|
+
logger.info(`退出码: 0`);
|
|
283
|
+
logger.info(`标准输出长度: ${stdout?.length || 0} 字符`);
|
|
284
|
+
logger.info(`错误输出长度: ${stderr?.length || 0} 字符`);
|
|
285
|
+
logger.info(`========================================\n`);
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
success: true,
|
|
289
|
+
exitCode: 0,
|
|
290
|
+
stdout: stdout || "",
|
|
291
|
+
stderr: stderr || "",
|
|
292
|
+
message: `命令执行成功: ${command}`,
|
|
293
|
+
};
|
|
294
|
+
} catch (error) {
|
|
295
|
+
logger.info(`\n========== 命令执行失败 ==========`);
|
|
296
|
+
logger.info(`命令: ${args.command}`);
|
|
297
|
+
logger.info(`退出码: ${error.code || error.signal || "未知"}`);
|
|
298
|
+
logger.info(`错误信息: ${error.message}`);
|
|
299
|
+
logger.info(`========================================\n`);
|
|
300
|
+
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
exitCode: error.code || error.signal || -1,
|
|
304
|
+
stdout: error.stdout || "",
|
|
305
|
+
stderr: error.stderr || "",
|
|
306
|
+
error: error.message,
|
|
307
|
+
message: `命令执行失败: ${args.command}`,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* 获取允许的命令白名单
|
|
314
|
+
* @returns {Array<string>} 允许的命令列表
|
|
315
|
+
*/
|
|
316
|
+
getAllowedCommands() {
|
|
317
|
+
return [...ALLOWED_COMMANDS];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* 获取函数定义
|
|
322
|
+
* @returns {Array<Object>} 函数定义数组
|
|
323
|
+
*/
|
|
324
|
+
getFunctionDefinitions() {
|
|
325
|
+
const whitelistStatus = WHITELIST_ENABLED
|
|
326
|
+
? `仅允许执行白名单中的命令。允许的命令: ${ALLOWED_COMMANDS.join(", ")}。`
|
|
327
|
+
: `白名单已禁用,可以执行任意命令。但仍然会阻止危险操作。`;
|
|
328
|
+
|
|
329
|
+
return [
|
|
330
|
+
{
|
|
331
|
+
type: "function",
|
|
332
|
+
function: {
|
|
333
|
+
name: "execute_command",
|
|
334
|
+
description: `执行 shell 命令或命令行工具。
|
|
335
|
+
${whitelistStatus}
|
|
336
|
+
始终不允许的操作: 权限提升(sudo/su)、危险删除(rm -rf /)、系统关机等。`,
|
|
337
|
+
parameters: {
|
|
338
|
+
type: "object",
|
|
339
|
+
properties: {
|
|
340
|
+
command: {
|
|
341
|
+
type: "string",
|
|
342
|
+
description: `要执行的命令,如 'ls -la', 'npm install', 'git status' 等。${WHITELIST_ENABLED ? "仅支持白名单中的命令" : ""}`,
|
|
343
|
+
},
|
|
344
|
+
cwd: {
|
|
345
|
+
type: "string",
|
|
346
|
+
description: "命令执行的工作目录,可选,默认为当前目录",
|
|
347
|
+
},
|
|
348
|
+
timeout: {
|
|
349
|
+
type: "number",
|
|
350
|
+
description: "命令超时时间(毫秒),可选,默认 30000(30秒)",
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
required: ["command"],
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
];
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
module.exports = CommandTools;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
const fs = require("fs").promises;
|
|
2
|
+
const path = require("path");
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 文件工具类
|
|
6
|
+
* 提供文件读取、写入、列表和删除功能
|
|
7
|
+
*/
|
|
8
|
+
class FileTools {
|
|
9
|
+
/**
|
|
10
|
+
* 读取文件内容
|
|
11
|
+
* @param {Object} args - 参数对象
|
|
12
|
+
* @param {string} args.filePath - 文件路径
|
|
13
|
+
* @returns {Promise<Object>} 操作结果
|
|
14
|
+
*/
|
|
15
|
+
async readFile(args) {
|
|
16
|
+
try {
|
|
17
|
+
const { filePath } = args;
|
|
18
|
+
const absolutePath = path.resolve(filePath);
|
|
19
|
+
|
|
20
|
+
const content = await fs.readFile(absolutePath, "utf-8");
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
filePath: absolutePath,
|
|
25
|
+
content: content,
|
|
26
|
+
message: `成功读取文件: ${absolutePath}`,
|
|
27
|
+
};
|
|
28
|
+
} catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: error.message,
|
|
32
|
+
message: `读取文件失败: ${error.message}`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 写入内容到文件
|
|
39
|
+
* @param {Object} args - 参数对象
|
|
40
|
+
* @param {string} args.filePath - 文件路径
|
|
41
|
+
* @param {string} args.content - 要写入的内容
|
|
42
|
+
* @returns {Promise<Object>} 操作结果
|
|
43
|
+
*/
|
|
44
|
+
async writeFile(args) {
|
|
45
|
+
try {
|
|
46
|
+
const { filePath, content } = args;
|
|
47
|
+
const absolutePath = path.resolve(filePath);
|
|
48
|
+
|
|
49
|
+
const dir = path.dirname(absolutePath);
|
|
50
|
+
await fs.mkdir(dir, { recursive: true });
|
|
51
|
+
|
|
52
|
+
await fs.writeFile(absolutePath, content, "utf-8");
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
filePath: absolutePath,
|
|
57
|
+
message: `成功写入文件: ${absolutePath}`,
|
|
58
|
+
};
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: error.message,
|
|
63
|
+
message: `写入文件失败: ${error.message}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 列出目录内容
|
|
70
|
+
* @param {Object} args - 参数对象
|
|
71
|
+
* @param {string} args.directoryPath - 目录路径,默认为当前目录
|
|
72
|
+
* @returns {Promise<Object>} 操作结果
|
|
73
|
+
*/
|
|
74
|
+
async listFiles(args) {
|
|
75
|
+
try {
|
|
76
|
+
const { directoryPath = "." } = args;
|
|
77
|
+
const absolutePath = path.resolve(directoryPath);
|
|
78
|
+
|
|
79
|
+
const entries = await fs.readdir(absolutePath, { withFileTypes: true });
|
|
80
|
+
|
|
81
|
+
const files = [];
|
|
82
|
+
const directories = [];
|
|
83
|
+
|
|
84
|
+
for (const entry of entries) {
|
|
85
|
+
if (entry.isDirectory()) {
|
|
86
|
+
directories.push(entry.name);
|
|
87
|
+
} else {
|
|
88
|
+
const stat = await fs.stat(path.join(absolutePath, entry.name));
|
|
89
|
+
files.push({
|
|
90
|
+
name: entry.name,
|
|
91
|
+
size: stat.size,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
success: true,
|
|
98
|
+
path: absolutePath,
|
|
99
|
+
directories: directories,
|
|
100
|
+
files: files,
|
|
101
|
+
message: `成功列出目录: ${absolutePath}`,
|
|
102
|
+
};
|
|
103
|
+
} catch (error) {
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
error: error.message,
|
|
107
|
+
message: `列出目录失败: ${error.message}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 删除文件
|
|
114
|
+
* @param {Object} args - 参数对象
|
|
115
|
+
* @param {string} args.filePath - 要删除的文件路径
|
|
116
|
+
* @returns {Promise<Object>} 操作结果
|
|
117
|
+
*/
|
|
118
|
+
async deleteFile(args) {
|
|
119
|
+
try {
|
|
120
|
+
const { filePath } = args;
|
|
121
|
+
const absolutePath = path.resolve(filePath);
|
|
122
|
+
|
|
123
|
+
await fs.unlink(absolutePath);
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
filePath: absolutePath,
|
|
128
|
+
message: `成功删除文件: ${absolutePath}`,
|
|
129
|
+
};
|
|
130
|
+
} catch (error) {
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
error: error.message,
|
|
134
|
+
message: `删除文件失败: ${error.message}`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 获取函数定义
|
|
141
|
+
* 返回所有文件工具的函数定义,用于 OpenAI 函数调用格式
|
|
142
|
+
* @returns {Array<Object>} 函数定义数组
|
|
143
|
+
*/
|
|
144
|
+
getFunctionDefinitions() {
|
|
145
|
+
return [
|
|
146
|
+
{
|
|
147
|
+
type: "function",
|
|
148
|
+
function: {
|
|
149
|
+
name: "read_file",
|
|
150
|
+
description: "读取本地文件内容",
|
|
151
|
+
parameters: {
|
|
152
|
+
type: "object",
|
|
153
|
+
properties: {
|
|
154
|
+
filePath: {
|
|
155
|
+
type: "string",
|
|
156
|
+
description: "文件路径,可以是相对路径或绝对路径",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
required: ["filePath"],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: "function",
|
|
165
|
+
function: {
|
|
166
|
+
name: "write_file",
|
|
167
|
+
description: "写入内容到本地文件",
|
|
168
|
+
parameters: {
|
|
169
|
+
type: "object",
|
|
170
|
+
properties: {
|
|
171
|
+
filePath: {
|
|
172
|
+
type: "string",
|
|
173
|
+
description: "文件路径,可以是相对路径或绝对路径",
|
|
174
|
+
},
|
|
175
|
+
content: {
|
|
176
|
+
type: "string",
|
|
177
|
+
description: "要写入文件的内容",
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
required: ["filePath", "content"],
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: "function",
|
|
186
|
+
function: {
|
|
187
|
+
name: "list_files",
|
|
188
|
+
description: "列出指定目录下的文件和子目录",
|
|
189
|
+
parameters: {
|
|
190
|
+
type: "object",
|
|
191
|
+
properties: {
|
|
192
|
+
directoryPath: {
|
|
193
|
+
type: "string",
|
|
194
|
+
description: "目录路径,默认为当前目录",
|
|
195
|
+
default: ".",
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
type: "function",
|
|
203
|
+
function: {
|
|
204
|
+
name: "delete_file",
|
|
205
|
+
description: "删除指定的文件",
|
|
206
|
+
parameters: {
|
|
207
|
+
type: "object",
|
|
208
|
+
properties: {
|
|
209
|
+
filePath: {
|
|
210
|
+
type: "string",
|
|
211
|
+
description: "要删除的文件路径",
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
required: ["filePath"],
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
module.exports = FileTools;
|