flashclaw 1.0.0

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.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/config/plugins.json +23 -0
  4. package/dist/agent-runner.d.ts +103 -0
  5. package/dist/agent-runner.d.ts.map +1 -0
  6. package/dist/agent-runner.js +530 -0
  7. package/dist/agent-runner.js.map +1 -0
  8. package/dist/cli.d.ts +7 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +497 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands.d.ts +68 -0
  13. package/dist/commands.d.ts.map +1 -0
  14. package/dist/commands.js +252 -0
  15. package/dist/commands.js.map +1 -0
  16. package/dist/config-schema.d.ts +21 -0
  17. package/dist/config-schema.d.ts.map +1 -0
  18. package/dist/config-schema.js +26 -0
  19. package/dist/config-schema.js.map +1 -0
  20. package/dist/config.d.ts +11 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +36 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/core/api-client.d.ts +236 -0
  25. package/dist/core/api-client.d.ts.map +1 -0
  26. package/dist/core/api-client.js +369 -0
  27. package/dist/core/api-client.js.map +1 -0
  28. package/dist/core/memory.d.ts +291 -0
  29. package/dist/core/memory.d.ts.map +1 -0
  30. package/dist/core/memory.js +754 -0
  31. package/dist/core/memory.js.map +1 -0
  32. package/dist/core/model-capabilities.d.ts +45 -0
  33. package/dist/core/model-capabilities.d.ts.map +1 -0
  34. package/dist/core/model-capabilities.js +85 -0
  35. package/dist/core/model-capabilities.js.map +1 -0
  36. package/dist/db.d.ts +103 -0
  37. package/dist/db.d.ts.map +1 -0
  38. package/dist/db.js +380 -0
  39. package/dist/db.js.map +1 -0
  40. package/dist/errors.d.ts +22 -0
  41. package/dist/errors.d.ts.map +1 -0
  42. package/dist/errors.js +44 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/health.d.ts +27 -0
  45. package/dist/health.d.ts.map +1 -0
  46. package/dist/health.js +55 -0
  47. package/dist/health.js.map +1 -0
  48. package/dist/index.d.ts +11 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +1181 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/logger.d.ts +9 -0
  53. package/dist/logger.d.ts.map +1 -0
  54. package/dist/logger.js +19 -0
  55. package/dist/logger.js.map +1 -0
  56. package/dist/message-queue.d.ts +69 -0
  57. package/dist/message-queue.d.ts.map +1 -0
  58. package/dist/message-queue.js +198 -0
  59. package/dist/message-queue.js.map +1 -0
  60. package/dist/metrics.d.ts +46 -0
  61. package/dist/metrics.d.ts.map +1 -0
  62. package/dist/metrics.js +101 -0
  63. package/dist/metrics.js.map +1 -0
  64. package/dist/paths.d.ts +81 -0
  65. package/dist/paths.d.ts.map +1 -0
  66. package/dist/paths.js +127 -0
  67. package/dist/paths.js.map +1 -0
  68. package/dist/plugins/index.d.ts +9 -0
  69. package/dist/plugins/index.d.ts.map +1 -0
  70. package/dist/plugins/index.js +13 -0
  71. package/dist/plugins/index.js.map +1 -0
  72. package/dist/plugins/installer.d.ts +120 -0
  73. package/dist/plugins/installer.d.ts.map +1 -0
  74. package/dist/plugins/installer.js +1008 -0
  75. package/dist/plugins/installer.js.map +1 -0
  76. package/dist/plugins/loader.d.ts +37 -0
  77. package/dist/plugins/loader.d.ts.map +1 -0
  78. package/dist/plugins/loader.js +429 -0
  79. package/dist/plugins/loader.js.map +1 -0
  80. package/dist/plugins/manager.d.ts +72 -0
  81. package/dist/plugins/manager.d.ts.map +1 -0
  82. package/dist/plugins/manager.js +187 -0
  83. package/dist/plugins/manager.js.map +1 -0
  84. package/dist/plugins/types.d.ts +101 -0
  85. package/dist/plugins/types.d.ts.map +1 -0
  86. package/dist/plugins/types.js +12 -0
  87. package/dist/plugins/types.js.map +1 -0
  88. package/dist/session-tracker.d.ts +81 -0
  89. package/dist/session-tracker.d.ts.map +1 -0
  90. package/dist/session-tracker.js +228 -0
  91. package/dist/session-tracker.js.map +1 -0
  92. package/dist/task-scheduler.d.ts +47 -0
  93. package/dist/task-scheduler.d.ts.map +1 -0
  94. package/dist/task-scheduler.js +331 -0
  95. package/dist/task-scheduler.js.map +1 -0
  96. package/dist/types.d.ts +57 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +2 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/utils/env-substitute.d.ts +63 -0
  101. package/dist/utils/env-substitute.d.ts.map +1 -0
  102. package/dist/utils/env-substitute.js +133 -0
  103. package/dist/utils/env-substitute.js.map +1 -0
  104. package/dist/utils/log-rotate.d.ts +19 -0
  105. package/dist/utils/log-rotate.d.ts.map +1 -0
  106. package/dist/utils/log-rotate.js +85 -0
  107. package/dist/utils/log-rotate.js.map +1 -0
  108. package/dist/utils/rate-limiter.d.ts +38 -0
  109. package/dist/utils/rate-limiter.d.ts.map +1 -0
  110. package/dist/utils/rate-limiter.js +79 -0
  111. package/dist/utils/rate-limiter.js.map +1 -0
  112. package/dist/utils/retry.d.ts +10 -0
  113. package/dist/utils/retry.d.ts.map +1 -0
  114. package/dist/utils/retry.js +47 -0
  115. package/dist/utils/retry.js.map +1 -0
  116. package/dist/utils.d.ts +86 -0
  117. package/dist/utils.d.ts.map +1 -0
  118. package/dist/utils.js +218 -0
  119. package/dist/utils.js.map +1 -0
  120. package/package.json +78 -0
  121. package/plugins/cancel-task/index.ts +161 -0
  122. package/plugins/cancel-task/plugin.json +9 -0
  123. package/plugins/feishu/index.ts +944 -0
  124. package/plugins/feishu/plugin.json +29 -0
  125. package/plugins/list-tasks/index.ts +150 -0
  126. package/plugins/list-tasks/plugin.json +9 -0
  127. package/plugins/memory/index.ts +190 -0
  128. package/plugins/memory/plugin.json +7 -0
  129. package/plugins/pause-task/index.ts +95 -0
  130. package/plugins/pause-task/plugin.json +8 -0
  131. package/plugins/register-group/index.ts +147 -0
  132. package/plugins/register-group/plugin.json +7 -0
  133. package/plugins/resume-task/index.ts +92 -0
  134. package/plugins/resume-task/plugin.json +8 -0
  135. package/plugins/schedule-task/index.ts +248 -0
  136. package/plugins/schedule-task/plugin.json +9 -0
  137. package/plugins/send-message/index.ts +75 -0
  138. package/plugins/send-message/plugin.json +9 -0
package/dist/cli.js ADDED
@@ -0,0 +1,497 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * FlashClaw CLI - 命令行入口
4
+ * ⚡ 闪电龙虾 - 快如闪电的 AI 助手
5
+ */
6
+ import { readFileSync } from 'fs';
7
+ import { dirname, join } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ // ==================== ANSI 颜色代码 ====================
10
+ const colors = {
11
+ green: '\x1b[32m',
12
+ yellow: '\x1b[33m',
13
+ red: '\x1b[31m',
14
+ cyan: '\x1b[36m',
15
+ reset: '\x1b[0m',
16
+ bold: '\x1b[1m',
17
+ dim: '\x1b[2m',
18
+ };
19
+ // 颜色辅助函数
20
+ const green = (text) => `${colors.green}${text}${colors.reset}`;
21
+ const yellow = (text) => `${colors.yellow}${text}${colors.reset}`;
22
+ const red = (text) => `${colors.red}${text}${colors.reset}`;
23
+ const cyan = (text) => `${colors.cyan}${text}${colors.reset}`;
24
+ const bold = (text) => `${colors.bold}${text}${colors.reset}`;
25
+ const dim = (text) => `${colors.dim}${text}${colors.reset}`;
26
+ const PLUGIN_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]{0,63}$/;
27
+ const isValidPluginName = (name) => PLUGIN_NAME_PATTERN.test(name);
28
+ // ==================== 版本信息 ====================
29
+ const VERSION = (() => {
30
+ try {
31
+ const __dirname = dirname(fileURLToPath(import.meta.url));
32
+ const pkgPath = join(__dirname, '..', 'package.json');
33
+ const raw = readFileSync(pkgPath, 'utf-8');
34
+ const pkg = JSON.parse(raw);
35
+ return pkg.version ?? 'unknown';
36
+ }
37
+ catch {
38
+ return 'unknown';
39
+ }
40
+ })();
41
+ // ==================== Banner ====================
42
+ function showBanner() {
43
+ console.log(yellow(`
44
+ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡
45
+
46
+ ███████╗██╗ █████╗ ███████╗██╗ ██╗
47
+ ██╔════╝██║ ██╔══██╗██╔════╝██║ ██║
48
+ █████╗ ██║ ███████║███████╗███████║
49
+ ██╔══╝ ██║ ██╔══██║╚════██║██╔══██║
50
+ ██║ ███████╗██║ ██║███████║██║ ██║
51
+ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
52
+ ██████╗██╗ █████╗ ██╗ ██╗
53
+ ██╔════╝██║ ██╔══██╗██║ ██║
54
+ ██║ ██║ ███████║██║ █╗ ██║
55
+ ██║ ██║ ██╔══██║██║███╗██║
56
+ ╚██████╗███████╗██║ ██║╚███╔███╔╝
57
+ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚══╝╚══╝
58
+
59
+ ⚡ 闪电龙虾 - 快如闪电的 AI 助手
60
+
61
+ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡
62
+ `));
63
+ }
64
+ // ==================== 帮助信息 ====================
65
+ function showHelp() {
66
+ console.log(`
67
+ ${bold('FlashClaw')} ${dim(`v${VERSION}`)} - ⚡ 闪电龙虾 AI 助手
68
+
69
+ ${bold('用法:')}
70
+ flashclaw [命令] [选项]
71
+
72
+ ${bold('命令:')}
73
+ ${cyan('start')} 启动服务
74
+ ${cyan('plugins list')} 列出已安装插件
75
+ ${cyan('plugins list --available')} 列出可用插件
76
+ ${cyan('plugins install <name>')} 安装插件
77
+ ${cyan('plugins uninstall <name>')} 卸载插件
78
+ ${cyan('plugins update <name>')} 更新插件
79
+ ${cyan('plugins update --all')} 更新所有插件
80
+ ${cyan('config list-backups')} 列出配置备份
81
+ ${cyan('config restore [n]')} 恢复配置备份(n=1-5,默认1)
82
+ ${cyan('version')} 显示版本
83
+ ${cyan('help')} 显示帮助
84
+
85
+ ${bold('示例:')}
86
+ flashclaw 启动服务(默认)
87
+ flashclaw start 启动服务
88
+ flashclaw plugins list 查看已安装插件
89
+ flashclaw plugins install feishu 安装飞书插件
90
+ flashclaw config restore 恢复最新备份
91
+ flashclaw config restore 2 恢复第2个备份
92
+
93
+ ${bold('更多信息:')}
94
+ 文档: https://github.com/GuLu9527/flashclaw
95
+ `);
96
+ }
97
+ // ==================== 版本信息 ====================
98
+ function showVersion() {
99
+ console.log(`${bold('FlashClaw')} ${cyan(`v${VERSION}`)}`);
100
+ }
101
+ // 插件安装器(从 ./plugins/installer.js 导入)
102
+ let pluginInstaller = null;
103
+ async function loadPluginInstaller() {
104
+ if (pluginInstaller)
105
+ return pluginInstaller;
106
+ try {
107
+ const installer = await import('./plugins/installer.js');
108
+ pluginInstaller = {
109
+ listInstalledPlugins: installer.listInstalledPlugins,
110
+ listAvailablePlugins: installer.listAvailablePlugins,
111
+ installPlugin: installer.installPlugin,
112
+ uninstallPlugin: installer.uninstallPlugin,
113
+ updatePlugin: installer.updatePlugin,
114
+ };
115
+ return pluginInstaller;
116
+ }
117
+ catch (error) {
118
+ // 安装器模块不存在时提供默认实现
119
+ console.log(yellow('⚠') + ' 插件安装器未配置,使用内置插件管理');
120
+ return null;
121
+ }
122
+ }
123
+ async function listInstalledPlugins() {
124
+ const installer = await loadPluginInstaller();
125
+ if (installer) {
126
+ try {
127
+ const plugins = await installer.listInstalledPlugins();
128
+ if (plugins.length === 0) {
129
+ console.log(`\n${yellow('⚡')} 暂无已安装插件\n`);
130
+ console.log(`使用 ${cyan('flashclaw plugins list --available')} 查看可安装插件`);
131
+ return;
132
+ }
133
+ console.log(`\n🔌 ${bold('已安装插件')} (${plugins.length}):\n`);
134
+ for (const plugin of plugins) {
135
+ console.log(` ${green('✓')} ${bold(plugin.name.padEnd(16))} ${dim(`v${plugin.version}`.padEnd(10))}`);
136
+ }
137
+ console.log(`\n使用 ${cyan('flashclaw plugins list --available')} 查看可安装插件\n`);
138
+ }
139
+ catch (error) {
140
+ console.log(red('✗') + ` 获取插件列表失败: ${error}`);
141
+ }
142
+ }
143
+ else {
144
+ // 内置插件列表展示
145
+ await listBuiltinPlugins();
146
+ }
147
+ }
148
+ async function listBuiltinPlugins() {
149
+ try {
150
+ const fs = await import('fs');
151
+ const path = await import('path');
152
+ const { fileURLToPath } = await import('url');
153
+ const __filename = fileURLToPath(import.meta.url);
154
+ const __dirname = path.dirname(__filename);
155
+ const pluginsDir = path.resolve(__dirname, '..', 'plugins');
156
+ if (!fs.existsSync(pluginsDir)) {
157
+ console.log(`\n${yellow('⚡')} 暂无已安装插件\n`);
158
+ return;
159
+ }
160
+ const entries = fs.readdirSync(pluginsDir, { withFileTypes: true });
161
+ const plugins = [];
162
+ for (const entry of entries) {
163
+ if (!entry.isDirectory())
164
+ continue;
165
+ const manifestPath = path.join(pluginsDir, entry.name, 'plugin.json');
166
+ try {
167
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
168
+ plugins.push({
169
+ name: manifest.name || entry.name,
170
+ version: manifest.version || '1.0.0',
171
+ description: manifest.description || '',
172
+ });
173
+ }
174
+ catch {
175
+ // 跳过无效插件
176
+ }
177
+ }
178
+ if (plugins.length === 0) {
179
+ console.log(`\n${yellow('⚡')} 暂无已安装插件\n`);
180
+ return;
181
+ }
182
+ console.log(`\n🔌 ${bold('已安装插件')} (${plugins.length}):\n`);
183
+ for (const plugin of plugins) {
184
+ console.log(` ${bold(plugin.name.padEnd(16))} ${dim(`v${plugin.version}`.padEnd(10))} ${plugin.description}`);
185
+ }
186
+ console.log(`\n使用 ${cyan('flashclaw plugins list --available')} 查看可安装插件\n`);
187
+ }
188
+ catch (error) {
189
+ console.log(red('✗') + ` 读取插件目录失败: ${error}`);
190
+ }
191
+ }
192
+ async function listAvailablePlugins() {
193
+ const installer = await loadPluginInstaller();
194
+ if (installer) {
195
+ try {
196
+ const plugins = await installer.listAvailablePlugins();
197
+ if (plugins.length === 0) {
198
+ console.log(`\n${yellow('⚡')} 暂无可用插件\n`);
199
+ return;
200
+ }
201
+ console.log(`\n📦 ${bold('可用插件')} (${plugins.length}):\n`);
202
+ for (const plugin of plugins) {
203
+ console.log(` ${bold(plugin.name.padEnd(16))} ${dim(`v${plugin.version}`.padEnd(10))} ${plugin.description}`);
204
+ }
205
+ console.log(`\n使用 ${cyan('flashclaw plugins install <name>')} 安装插件\n`);
206
+ }
207
+ catch (error) {
208
+ console.log(red('✗') + ` 获取可用插件列表失败: ${error}`);
209
+ }
210
+ }
211
+ else {
212
+ console.log(`\n${yellow('⚠')} 插件市场未配置\n`);
213
+ console.log(`请访问 ${cyan('https://github.com/GuLu9527/flashclaw')} 获取更多插件`);
214
+ }
215
+ }
216
+ async function installPlugin(name) {
217
+ const installer = await loadPluginInstaller();
218
+ if (!installer) {
219
+ console.log(red('✗') + ' 插件安装器未配置');
220
+ return;
221
+ }
222
+ if (!isValidPluginName(name)) {
223
+ console.log(red('✗') + ` 插件名称不合法: ${name}`);
224
+ console.log('插件名称只能包含小写字母、数字、- 或 _');
225
+ return;
226
+ }
227
+ console.log(`${yellow('⚡')} 正在安装插件 ${cyan(name)}...`);
228
+ try {
229
+ const success = await installer.installPlugin(name);
230
+ if (success) {
231
+ console.log(green('✓') + ` 插件 ${bold(name)} 安装成功`);
232
+ console.log(`\n使用 ${cyan('flashclaw start')} 重启服务以加载新插件`);
233
+ }
234
+ else {
235
+ console.log(red('✗') + ` 安装失败`);
236
+ }
237
+ }
238
+ catch (error) {
239
+ console.log(red('✗') + ` 安装失败: ${error}`);
240
+ }
241
+ }
242
+ async function uninstallPlugin(name) {
243
+ const installer = await loadPluginInstaller();
244
+ if (!installer) {
245
+ console.log(red('✗') + ' 插件安装器未配置');
246
+ return;
247
+ }
248
+ if (!isValidPluginName(name)) {
249
+ console.log(red('✗') + ` 插件名称不合法: ${name}`);
250
+ console.log('插件名称只能包含小写字母、数字、- 或 _');
251
+ return;
252
+ }
253
+ console.log(`${yellow('⚡')} 正在卸载插件 ${cyan(name)}...`);
254
+ try {
255
+ const success = await installer.uninstallPlugin(name);
256
+ if (success) {
257
+ console.log(green('✓') + ` 插件 ${bold(name)} 已卸载`);
258
+ }
259
+ else {
260
+ console.log(red('✗') + ` 卸载失败`);
261
+ }
262
+ }
263
+ catch (error) {
264
+ console.log(red('✗') + ` 卸载失败: ${error}`);
265
+ }
266
+ }
267
+ async function updatePlugin(name) {
268
+ const installer = await loadPluginInstaller();
269
+ if (!installer) {
270
+ console.log(red('✗') + ' 插件安装器未配置');
271
+ return;
272
+ }
273
+ if (!isValidPluginName(name)) {
274
+ console.log(red('✗') + ` 插件名称不合法: ${name}`);
275
+ console.log('插件名称只能包含小写字母、数字、- 或 _');
276
+ return;
277
+ }
278
+ console.log(`${yellow('⚡')} 正在更新插件 ${cyan(name)}...`);
279
+ try {
280
+ const success = await installer.updatePlugin(name);
281
+ if (success) {
282
+ console.log(green('✓') + ` 插件 ${bold(name)} 更新成功`);
283
+ }
284
+ else {
285
+ console.log(red('✗') + ` 更新失败`);
286
+ }
287
+ }
288
+ catch (error) {
289
+ console.log(red('✗') + ` 更新失败: ${error}`);
290
+ }
291
+ }
292
+ async function updateAllPlugins() {
293
+ const installer = await loadPluginInstaller();
294
+ if (!installer) {
295
+ console.log(red('✗') + ' 插件安装器未配置');
296
+ return;
297
+ }
298
+ console.log(`${yellow('⚡')} 正在更新所有插件...`);
299
+ try {
300
+ const plugins = await installer.listInstalledPlugins();
301
+ let successCount = 0;
302
+ let failCount = 0;
303
+ for (const plugin of plugins) {
304
+ console.log(`\n${yellow('⚡')} 更新 ${cyan(plugin.name)}...`);
305
+ const success = await installer.updatePlugin(plugin.name);
306
+ if (success) {
307
+ successCount++;
308
+ }
309
+ else {
310
+ failCount++;
311
+ }
312
+ }
313
+ console.log(`\n${green('✓')} 更新完成: ${successCount} 成功, ${failCount} 失败`);
314
+ }
315
+ catch (error) {
316
+ console.log(red('✗') + ` 更新失败: ${error}`);
317
+ }
318
+ }
319
+ // ==================== 启动服务 ====================
320
+ async function startService() {
321
+ showBanner();
322
+ console.log(`${yellow('⚡')} 正在启动 FlashClaw...\n`);
323
+ try {
324
+ // 动态导入主模块
325
+ await import('./index.js');
326
+ }
327
+ catch (error) {
328
+ console.log(red('✗') + ` 启动失败: ${error}`);
329
+ process.exit(1);
330
+ }
331
+ }
332
+ // ==================== 参数解析 ====================
333
+ function parseArgs() {
334
+ const args = process.argv.slice(2);
335
+ const flags = {};
336
+ const positional = [];
337
+ for (const arg of args) {
338
+ if (arg.startsWith('--')) {
339
+ flags[arg.slice(2)] = true;
340
+ }
341
+ else if (arg.startsWith('-')) {
342
+ flags[arg.slice(1)] = true;
343
+ }
344
+ else {
345
+ positional.push(arg);
346
+ }
347
+ }
348
+ const command = positional[0] || '';
349
+ const subcommand = positional[1];
350
+ const restArgs = positional.slice(2);
351
+ return { command, subcommand, args: restArgs, flags };
352
+ }
353
+ // ==================== 主入口 ====================
354
+ async function main() {
355
+ const { command, subcommand, args, flags } = parseArgs();
356
+ // 处理 -v / --version
357
+ if (flags['v'] || flags['version']) {
358
+ showVersion();
359
+ return;
360
+ }
361
+ // 处理 -h / --help
362
+ if (flags['h'] || flags['help']) {
363
+ showHelp();
364
+ return;
365
+ }
366
+ switch (command) {
367
+ case '':
368
+ case 'start':
369
+ // 默认启动服务
370
+ await startService();
371
+ break;
372
+ case 'plugins':
373
+ await handlePluginsCommand(subcommand, args, flags);
374
+ break;
375
+ case 'config':
376
+ await handleConfigCommand(subcommand, args);
377
+ break;
378
+ case 'version':
379
+ showVersion();
380
+ break;
381
+ case 'help':
382
+ showHelp();
383
+ break;
384
+ default:
385
+ console.log(red('✗') + ` 未知命令: ${command}`);
386
+ console.log(`\n使用 ${cyan('flashclaw help')} 查看可用命令`);
387
+ process.exit(1);
388
+ }
389
+ }
390
+ // ==================== 配置管理 ====================
391
+ async function handleConfigCommand(subcommand, args) {
392
+ // 动态导入配置相关模块
393
+ const { listBackups, restoreConfig } = await import('./utils.js');
394
+ const { paths } = await import('./paths.js');
395
+ const configPath = paths.pluginsConfig();
396
+ switch (subcommand) {
397
+ case 'list-backups':
398
+ case 'backups': {
399
+ const backups = listBackups(configPath);
400
+ if (backups.length === 0) {
401
+ console.log(`\n${yellow('⚡')} 暂无配置备份\n`);
402
+ return;
403
+ }
404
+ console.log(`\n📦 ${bold('配置备份')} (${backups.length}):\n`);
405
+ for (const backup of backups) {
406
+ const date = backup.modifiedAt.toLocaleString('zh-CN');
407
+ const size = (backup.size / 1024).toFixed(1);
408
+ console.log(` ${green('✓')} ${bold(`备份 #${backup.number}`)} ${dim(`${date} ${size} KB`)}`);
409
+ }
410
+ console.log(`\n使用 ${cyan('flashclaw config restore [n]')} 恢复备份\n`);
411
+ break;
412
+ }
413
+ case 'restore': {
414
+ const backupNumber = args[0] ? parseInt(args[0], 10) : 1;
415
+ if (isNaN(backupNumber) || backupNumber < 1 || backupNumber > 5) {
416
+ console.log(red('✗') + ' 备份编号必须在 1-5 之间');
417
+ process.exit(1);
418
+ }
419
+ console.log(`${yellow('⚡')} 正在恢复配置备份 #${backupNumber}...`);
420
+ const success = restoreConfig(configPath, backupNumber);
421
+ if (success) {
422
+ console.log(green('✓') + ` 配置已从备份 #${backupNumber} 恢复`);
423
+ console.log(`\n使用 ${cyan('flashclaw start')} 重启服务以应用更改`);
424
+ }
425
+ else {
426
+ console.log(red('✗') + ` 恢复失败,备份 #${backupNumber} 可能不存在`);
427
+ console.log(`\n使用 ${cyan('flashclaw config list-backups')} 查看可用备份`);
428
+ process.exit(1);
429
+ }
430
+ break;
431
+ }
432
+ default:
433
+ console.log(red('✗') + ` 未知配置命令: ${subcommand || '(空)'}`);
434
+ console.log(`\n可用命令:`);
435
+ console.log(` ${cyan('flashclaw config list-backups')} 列出配置备份`);
436
+ console.log(` ${cyan('flashclaw config restore [n]')} 恢复配置备份(n=1-5)`);
437
+ process.exit(1);
438
+ }
439
+ }
440
+ async function handlePluginsCommand(subcommand, args, flags) {
441
+ switch (subcommand) {
442
+ case 'list':
443
+ if (flags['available']) {
444
+ await listAvailablePlugins();
445
+ }
446
+ else {
447
+ await listInstalledPlugins();
448
+ }
449
+ break;
450
+ case 'install':
451
+ if (!args[0]) {
452
+ console.log(red('✗') + ' 请指定插件名称');
453
+ console.log(`\n用法: ${cyan('flashclaw plugins install <name>')}`);
454
+ process.exit(1);
455
+ }
456
+ await installPlugin(args[0]);
457
+ break;
458
+ case 'uninstall':
459
+ if (!args[0]) {
460
+ console.log(red('✗') + ' 请指定插件名称');
461
+ console.log(`\n用法: ${cyan('flashclaw plugins uninstall <name>')}`);
462
+ process.exit(1);
463
+ }
464
+ await uninstallPlugin(args[0]);
465
+ break;
466
+ case 'update':
467
+ if (flags['all']) {
468
+ await updateAllPlugins();
469
+ }
470
+ else if (args[0]) {
471
+ await updatePlugin(args[0]);
472
+ }
473
+ else {
474
+ console.log(red('✗') + ' 请指定插件名称或使用 --all 更新所有插件');
475
+ console.log(`\n用法: ${cyan('flashclaw plugins update <name>')}`);
476
+ console.log(` ${cyan('flashclaw plugins update --all')}`);
477
+ process.exit(1);
478
+ }
479
+ break;
480
+ default:
481
+ console.log(red('✗') + ` 未知插件命令: ${subcommand || '(空)'}`);
482
+ console.log(`\n可用命令:`);
483
+ console.log(` ${cyan('flashclaw plugins list')} 列出已安装插件`);
484
+ console.log(` ${cyan('flashclaw plugins list --available')} 列出可用插件`);
485
+ console.log(` ${cyan('flashclaw plugins install <name>')} 安装插件`);
486
+ console.log(` ${cyan('flashclaw plugins uninstall <name>')} 卸载插件`);
487
+ console.log(` ${cyan('flashclaw plugins update <name>')} 更新插件`);
488
+ console.log(` ${cyan('flashclaw plugins update --all')} 更新所有插件`);
489
+ process.exit(1);
490
+ }
491
+ }
492
+ // 运行主函数
493
+ main().catch((error) => {
494
+ console.log(red('✗') + ` 发生错误: ${error}`);
495
+ process.exit(1);
496
+ });
497
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Chat Commands Module
3
+ *
4
+ * 处理用户在聊天中发送的斜杠命令
5
+ * 如 /status, /new, /help 等
6
+ */
7
+ /**
8
+ * 命令执行上下文
9
+ */
10
+ export interface CommandContext {
11
+ chatId: string;
12
+ userId: string;
13
+ userName: string;
14
+ platform: string;
15
+ /** 获取会话统计 */
16
+ getSessionStats?: () => SessionStats | null;
17
+ /** 重置会话 */
18
+ resetSession?: () => void;
19
+ /** 压缩会话(返回 Promise,压缩完成后回调) */
20
+ compactSession?: () => Promise<string | null>;
21
+ /** 获取任务列表 */
22
+ getTasks?: () => TaskInfo[];
23
+ }
24
+ export interface SessionStats {
25
+ messageCount: number;
26
+ tokenCount?: number;
27
+ maxTokens?: number;
28
+ model?: string;
29
+ startedAt?: string;
30
+ }
31
+ export interface TaskInfo {
32
+ id: string;
33
+ prompt: string;
34
+ scheduleType: string;
35
+ nextRun?: string;
36
+ status: string;
37
+ }
38
+ /**
39
+ * 命令执行结果
40
+ */
41
+ export interface CommandResult {
42
+ /** 是否是命令(用于判断是否需要继续处理为普通消息) */
43
+ isCommand: boolean;
44
+ /** 返回给用户的消息 */
45
+ response?: string;
46
+ /** 是否需要发送响应 */
47
+ shouldRespond?: boolean;
48
+ }
49
+ /**
50
+ * 检查消息是否是命令
51
+ */
52
+ export declare function isCommand(content: string): boolean;
53
+ /**
54
+ * 处理命令
55
+ */
56
+ export declare function handleCommand(content: string, context: CommandContext): CommandResult;
57
+ /**
58
+ * 检查是否需要提示用户压缩会话
59
+ * @param tokenCount 当前 token 数
60
+ * @param maxTokens 最大 token 数
61
+ * @param threshold 阈值(默认 0.7 = 70%)
62
+ */
63
+ export declare function shouldSuggestCompact(tokenCount: number, maxTokens: number, threshold?: number): boolean;
64
+ /**
65
+ * 生成压缩提示消息
66
+ */
67
+ export declare function getCompactSuggestion(tokenCount: number, maxTokens: number): string;
68
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,eAAe,CAAC,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;IAC5C,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,QAAQ,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAcD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,CAyCrF;AAuLD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAY,GACtB,OAAO,CAGT;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAOlF"}