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.
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/config/plugins.json +23 -0
- package/dist/agent-runner.d.ts +103 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +530 -0
- package/dist/agent-runner.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +497 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +68 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +252 -0
- package/dist/commands.js.map +1 -0
- package/dist/config-schema.d.ts +21 -0
- package/dist/config-schema.d.ts.map +1 -0
- package/dist/config-schema.js +26 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/core/api-client.d.ts +236 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/api-client.js +369 -0
- package/dist/core/api-client.js.map +1 -0
- package/dist/core/memory.d.ts +291 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +754 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/model-capabilities.d.ts +45 -0
- package/dist/core/model-capabilities.d.ts.map +1 -0
- package/dist/core/model-capabilities.js +85 -0
- package/dist/core/model-capabilities.js.map +1 -0
- package/dist/db.d.ts +103 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +380 -0
- package/dist/db.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/health.d.ts +27 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +55 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1181 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +19 -0
- package/dist/logger.js.map +1 -0
- package/dist/message-queue.d.ts +69 -0
- package/dist/message-queue.d.ts.map +1 -0
- package/dist/message-queue.js +198 -0
- package/dist/message-queue.js.map +1 -0
- package/dist/metrics.d.ts +46 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +101 -0
- package/dist/metrics.js.map +1 -0
- package/dist/paths.d.ts +81 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +127 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugins/index.d.ts +9 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +13 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/installer.d.ts +120 -0
- package/dist/plugins/installer.d.ts.map +1 -0
- package/dist/plugins/installer.js +1008 -0
- package/dist/plugins/installer.js.map +1 -0
- package/dist/plugins/loader.d.ts +37 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +429 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +72 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +187 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/types.d.ts +101 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +12 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/session-tracker.d.ts +81 -0
- package/dist/session-tracker.d.ts.map +1 -0
- package/dist/session-tracker.js +228 -0
- package/dist/session-tracker.js.map +1 -0
- package/dist/task-scheduler.d.ts +47 -0
- package/dist/task-scheduler.d.ts.map +1 -0
- package/dist/task-scheduler.js +331 -0
- package/dist/task-scheduler.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/env-substitute.d.ts +63 -0
- package/dist/utils/env-substitute.d.ts.map +1 -0
- package/dist/utils/env-substitute.js +133 -0
- package/dist/utils/env-substitute.js.map +1 -0
- package/dist/utils/log-rotate.d.ts +19 -0
- package/dist/utils/log-rotate.d.ts.map +1 -0
- package/dist/utils/log-rotate.js +85 -0
- package/dist/utils/log-rotate.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +38 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +79 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +10 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +47 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils.d.ts +86 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +218 -0
- package/dist/utils.js.map +1 -0
- package/package.json +78 -0
- package/plugins/cancel-task/index.ts +161 -0
- package/plugins/cancel-task/plugin.json +9 -0
- package/plugins/feishu/index.ts +944 -0
- package/plugins/feishu/plugin.json +29 -0
- package/plugins/list-tasks/index.ts +150 -0
- package/plugins/list-tasks/plugin.json +9 -0
- package/plugins/memory/index.ts +190 -0
- package/plugins/memory/plugin.json +7 -0
- package/plugins/pause-task/index.ts +95 -0
- package/plugins/pause-task/plugin.json +8 -0
- package/plugins/register-group/index.ts +147 -0
- package/plugins/register-group/plugin.json +7 -0
- package/plugins/resume-task/index.ts +92 -0
- package/plugins/resume-task/plugin.json +8 -0
- package/plugins/schedule-task/index.ts +248 -0
- package/plugins/schedule-task/plugin.json +9 -0
- package/plugins/send-message/index.ts +75 -0
- package/plugins/send-message/plugin.json +9 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Runner for FlashClaw
|
|
3
|
+
* 使用 Anthropic SDK 直接调用 API
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Direct Anthropic API integration
|
|
7
|
+
* - IPC-based tools for messaging and task scheduling
|
|
8
|
+
* - Per-group isolation via working directories
|
|
9
|
+
* - 记忆系统集成
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import pino from 'pino';
|
|
14
|
+
import { GROUPS_DIR, DATA_DIR, AGENT_TIMEOUT, TIMEZONE } from './config.js';
|
|
15
|
+
import { getApiClient } from './core/api-client.js';
|
|
16
|
+
import { currentModelSupportsVision, getCurrentModelId } from './core/model-capabilities.js';
|
|
17
|
+
import { getMemoryManager as getGlobalMemoryManager } from './core/memory.js';
|
|
18
|
+
import { pluginManager } from './plugins/manager.js';
|
|
19
|
+
import { recordTokenUsage } from './session-tracker.js';
|
|
20
|
+
const logger = pino({
|
|
21
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
22
|
+
transport: { target: 'pino-pretty', options: { colorize: true } }
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* 获取 IPC 目录路径
|
|
26
|
+
*/
|
|
27
|
+
function getIpcDir(groupFolder) {
|
|
28
|
+
return path.join(DATA_DIR, 'ipc', groupFolder);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 写入 IPC 文件(原子操作)
|
|
32
|
+
*/
|
|
33
|
+
function writeIpcFile(dir, data) {
|
|
34
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
35
|
+
const filename = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}.json`;
|
|
36
|
+
const filepath = path.join(dir, filename);
|
|
37
|
+
// Atomic write: temp file then rename
|
|
38
|
+
const tempPath = `${filepath}.tmp`;
|
|
39
|
+
fs.writeFileSync(tempPath, JSON.stringify(data, null, 2));
|
|
40
|
+
fs.renameSync(tempPath, filepath);
|
|
41
|
+
return filename;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 获取所有可用工具(完全依赖插件)
|
|
45
|
+
*/
|
|
46
|
+
export function getAllTools() {
|
|
47
|
+
return pluginManager.getActiveTools();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 创建工具执行器
|
|
51
|
+
* 完全依赖插件工具
|
|
52
|
+
*/
|
|
53
|
+
export function createToolExecutor(ctx, memoryManager) {
|
|
54
|
+
const { chatJid, groupFolder, userId } = ctx;
|
|
55
|
+
const IPC_DIR = getIpcDir(groupFolder);
|
|
56
|
+
const MESSAGES_DIR = path.join(IPC_DIR, 'messages');
|
|
57
|
+
// 构建插件工具上下文
|
|
58
|
+
const pluginContext = {
|
|
59
|
+
chatId: chatJid,
|
|
60
|
+
groupId: groupFolder,
|
|
61
|
+
userId: userId,
|
|
62
|
+
sendMessage: async (content) => {
|
|
63
|
+
// 通过 IPC 发送消息到当前聊天
|
|
64
|
+
const data = {
|
|
65
|
+
type: 'message',
|
|
66
|
+
chatJid,
|
|
67
|
+
text: content,
|
|
68
|
+
groupFolder,
|
|
69
|
+
timestamp: new Date().toISOString()
|
|
70
|
+
};
|
|
71
|
+
writeIpcFile(MESSAGES_DIR, data);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
return async (name, params) => {
|
|
75
|
+
logger.info({ tool: name, params }, '⚡ 执行工具');
|
|
76
|
+
// 使用插件工具
|
|
77
|
+
const toolInfo = pluginManager.getTool(name);
|
|
78
|
+
if (toolInfo) {
|
|
79
|
+
const { plugin, isMultiTool } = toolInfo;
|
|
80
|
+
try {
|
|
81
|
+
// 多工具插件:execute(toolName, params, context)
|
|
82
|
+
// 单工具插件:execute(params, context)
|
|
83
|
+
const result = isMultiTool
|
|
84
|
+
? await plugin.execute(name, params, pluginContext)
|
|
85
|
+
: await plugin.execute(params, pluginContext);
|
|
86
|
+
logger.info({ tool: name, success: result.success, error: result.error }, '⚡ 插件执行结果');
|
|
87
|
+
if (result.success) {
|
|
88
|
+
return {
|
|
89
|
+
content: typeof result.data === 'string'
|
|
90
|
+
? result.data
|
|
91
|
+
: JSON.stringify(result.data, null, 2)
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return { content: result.error || 'Plugin execution failed', isError: true };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
logger.error({ tool: name, err }, 'Plugin tool execution failed');
|
|
100
|
+
return {
|
|
101
|
+
content: `Plugin error: ${err instanceof Error ? err.message : String(err)}`,
|
|
102
|
+
isError: true
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// 插件不存在
|
|
107
|
+
logger.warn({ tool: name }, '⚠️ 工具插件不存在');
|
|
108
|
+
return {
|
|
109
|
+
content: `Unknown tool: ${name}. Please ensure the plugin is installed.`,
|
|
110
|
+
isError: true
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// ==================== 全局实例 ====================
|
|
115
|
+
/**
|
|
116
|
+
* 获取全局记忆管理器
|
|
117
|
+
* 使用 memory.ts 中的全局单例
|
|
118
|
+
*/
|
|
119
|
+
export function getMemoryManager() {
|
|
120
|
+
return getGlobalMemoryManager();
|
|
121
|
+
}
|
|
122
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
123
|
+
maxRetries: 3,
|
|
124
|
+
baseDelayMs: 1000,
|
|
125
|
+
maxDelayMs: 10000,
|
|
126
|
+
retryableErrors: [
|
|
127
|
+
'ECONNRESET',
|
|
128
|
+
'ETIMEDOUT',
|
|
129
|
+
'ECONNREFUSED',
|
|
130
|
+
'rate_limit',
|
|
131
|
+
'overloaded',
|
|
132
|
+
'529', // Overloaded
|
|
133
|
+
'503', // Service Unavailable
|
|
134
|
+
'502', // Bad Gateway
|
|
135
|
+
'socket hang up',
|
|
136
|
+
'network error'
|
|
137
|
+
]
|
|
138
|
+
};
|
|
139
|
+
function isRetryableError(error, config) {
|
|
140
|
+
const lowerError = error.toLowerCase();
|
|
141
|
+
return config.retryableErrors.some(e => lowerError.includes(e.toLowerCase()));
|
|
142
|
+
}
|
|
143
|
+
function calculateDelay(attempt, config) {
|
|
144
|
+
// Exponential backoff with jitter
|
|
145
|
+
const exponentialDelay = config.baseDelayMs * Math.pow(2, attempt);
|
|
146
|
+
const jitter = Math.random() * 0.3 * exponentialDelay;
|
|
147
|
+
return Math.min(exponentialDelay + jitter, config.maxDelayMs);
|
|
148
|
+
}
|
|
149
|
+
async function sleep(ms) {
|
|
150
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
151
|
+
}
|
|
152
|
+
// ==================== Agent Execution ====================
|
|
153
|
+
/**
|
|
154
|
+
* 动态生成可用工具列表
|
|
155
|
+
*/
|
|
156
|
+
function getAvailableToolsList() {
|
|
157
|
+
const tools = getAllTools();
|
|
158
|
+
if (tools.length === 0) {
|
|
159
|
+
return '暂无可用工具';
|
|
160
|
+
}
|
|
161
|
+
return tools.map(tool => {
|
|
162
|
+
const desc = tool.description || '无描述';
|
|
163
|
+
return `- ${tool.name}: ${desc}`;
|
|
164
|
+
}).join('\n');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 获取群组的系统提示词
|
|
168
|
+
*/
|
|
169
|
+
function getGroupSystemPrompt(group, isMain, isScheduledTask) {
|
|
170
|
+
const memoryManager = getMemoryManager();
|
|
171
|
+
// 获取当前时间(用于定时任务等需要时间计算的场景)
|
|
172
|
+
const now = new Date();
|
|
173
|
+
const currentTimeISO = now.toISOString();
|
|
174
|
+
const currentTimeLocal = now.toLocaleString('zh-CN', { timeZone: TIMEZONE });
|
|
175
|
+
// 动态获取可用工具列表
|
|
176
|
+
const toolsList = getAvailableToolsList();
|
|
177
|
+
// 读取群组的 CLAUDE.md 文件(如果存在)
|
|
178
|
+
const groupDir = path.join(GROUPS_DIR, group.folder);
|
|
179
|
+
const claudeMdPath = path.join(groupDir, 'CLAUDE.md');
|
|
180
|
+
let basePrompt = '';
|
|
181
|
+
// 预计算时间示例,帮助 AI 正确理解 ISO 时间
|
|
182
|
+
const in10Seconds = new Date(now.getTime() + 10000).toISOString();
|
|
183
|
+
const in30Seconds = new Date(now.getTime() + 30000).toISOString();
|
|
184
|
+
const in1Minute = new Date(now.getTime() + 60000).toISOString();
|
|
185
|
+
const in5Minutes = new Date(now.getTime() + 300000).toISOString();
|
|
186
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
187
|
+
// 用户自定义提示词,追加时间和工具信息
|
|
188
|
+
basePrompt = fs.readFileSync(claudeMdPath, 'utf-8');
|
|
189
|
+
basePrompt += `\n\n---\n当前时间: ${currentTimeLocal}\n当前 ISO 时间: ${currentTimeISO}\n时区: ${TIMEZONE}`;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// 默认系统提示词
|
|
193
|
+
basePrompt = `你是 FlashClaw,一个智能助手。
|
|
194
|
+
|
|
195
|
+
你正在 "${group.name}" 群组中与用户交流。
|
|
196
|
+
|
|
197
|
+
## 当前时间
|
|
198
|
+
- 本地时间: ${currentTimeLocal}
|
|
199
|
+
- ISO 时间: ${currentTimeISO}
|
|
200
|
+
- 时区: ${TIMEZONE}
|
|
201
|
+
|
|
202
|
+
## 可用工具
|
|
203
|
+
${toolsList}
|
|
204
|
+
|
|
205
|
+
## schedule_task 时间计算(重要!)
|
|
206
|
+
创建一次性任务时,scheduleValue 必须使用 ISO 8601 格式。
|
|
207
|
+
**请直接使用下面预计算好的 ISO 时间,不要自己转换:**
|
|
208
|
+
- 10秒后 = ${in10Seconds}
|
|
209
|
+
- 30秒后 = ${in30Seconds}
|
|
210
|
+
- 1分钟后 = ${in1Minute}
|
|
211
|
+
- 5分钟后 = ${in5Minutes}
|
|
212
|
+
|
|
213
|
+
对于其他时间,按比例估算即可。例如20秒后约在10秒和30秒之间。
|
|
214
|
+
|
|
215
|
+
请用中文回复,除非用户使用其他语言。
|
|
216
|
+
保持回复简洁、有帮助。`;
|
|
217
|
+
}
|
|
218
|
+
// 构建包含长期记忆的系统提示词
|
|
219
|
+
let systemPrompt = memoryManager.buildSystemPrompt(group.folder, basePrompt);
|
|
220
|
+
// 添加权限说明
|
|
221
|
+
if (isMain) {
|
|
222
|
+
systemPrompt += '\n\n你拥有管理员权限,可以注册新群组和管理所有任务。';
|
|
223
|
+
}
|
|
224
|
+
// 添加定时任务上下文
|
|
225
|
+
if (isScheduledTask) {
|
|
226
|
+
systemPrompt += `
|
|
227
|
+
|
|
228
|
+
## ⚠️ 这是定时任务执行
|
|
229
|
+
你现在是被定时任务自动触发的,不是在回复用户消息。
|
|
230
|
+
**重要:你的文字回复用户看不到!必须使用 send_message 工具才能向用户发送消息。**
|
|
231
|
+
|
|
232
|
+
执行步骤:
|
|
233
|
+
1. 根据任务内容(下面的用户消息)准备提醒内容
|
|
234
|
+
2. 调用 send_message 工具发送提醒给用户
|
|
235
|
+
3. 不要只是回复文字,那样用户收不到`;
|
|
236
|
+
}
|
|
237
|
+
return systemPrompt;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 运行 Agent(带重试)
|
|
241
|
+
*/
|
|
242
|
+
export async function runAgent(group, input, retryConfig = DEFAULT_RETRY_CONFIG) {
|
|
243
|
+
let lastError;
|
|
244
|
+
for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {
|
|
245
|
+
if (attempt > 0) {
|
|
246
|
+
const delay = calculateDelay(attempt - 1, retryConfig);
|
|
247
|
+
logger.info({
|
|
248
|
+
group: group.name,
|
|
249
|
+
attempt,
|
|
250
|
+
delay,
|
|
251
|
+
lastError
|
|
252
|
+
}, 'Retrying agent after error');
|
|
253
|
+
await sleep(delay);
|
|
254
|
+
}
|
|
255
|
+
const result = await runAgentOnce(group, input, attempt);
|
|
256
|
+
if (result.status === 'success') {
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
// Check if error is retryable
|
|
260
|
+
if (result.error && isRetryableError(result.error, retryConfig)) {
|
|
261
|
+
lastError = result.error;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
// Non-retryable error, return immediately
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
// All retries exhausted
|
|
268
|
+
return {
|
|
269
|
+
status: 'error',
|
|
270
|
+
result: null,
|
|
271
|
+
error: `Agent failed after ${retryConfig.maxRetries + 1} attempts. Last error: ${lastError}`
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* 单次运行 Agent
|
|
276
|
+
*/
|
|
277
|
+
async function runAgentOnce(group, input, attempt = 0) {
|
|
278
|
+
const startTime = Date.now();
|
|
279
|
+
// 获取 API 客户端
|
|
280
|
+
const apiClient = getApiClient();
|
|
281
|
+
if (!apiClient) {
|
|
282
|
+
return {
|
|
283
|
+
status: 'error',
|
|
284
|
+
result: null,
|
|
285
|
+
error: 'API client not configured. Set ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY environment variable.'
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
// 获取记忆管理器
|
|
289
|
+
const memoryManager = getMemoryManager();
|
|
290
|
+
const groupDir = path.join(GROUPS_DIR, group.folder);
|
|
291
|
+
fs.mkdirSync(groupDir, { recursive: true });
|
|
292
|
+
// Setup IPC directories
|
|
293
|
+
const groupIpcDir = getIpcDir(group.folder);
|
|
294
|
+
fs.mkdirSync(path.join(groupIpcDir, 'messages'), { recursive: true });
|
|
295
|
+
fs.mkdirSync(path.join(groupIpcDir, 'tasks'), { recursive: true });
|
|
296
|
+
const timeout = group.agentConfig?.timeout || AGENT_TIMEOUT;
|
|
297
|
+
logger.info({
|
|
298
|
+
group: group.name,
|
|
299
|
+
isMain: input.isMain,
|
|
300
|
+
attempt,
|
|
301
|
+
timeout
|
|
302
|
+
}, 'Starting agent');
|
|
303
|
+
// 创建工具执行器
|
|
304
|
+
const toolExecutor = createToolExecutor({
|
|
305
|
+
chatJid: input.chatJid,
|
|
306
|
+
groupFolder: group.folder,
|
|
307
|
+
isMain: input.isMain,
|
|
308
|
+
userId: input.userId || input.chatJid // 使用 userId,如果没有则使用 chatJid
|
|
309
|
+
}, memoryManager);
|
|
310
|
+
// 获取对话上下文
|
|
311
|
+
const context = memoryManager.getContext(group.folder);
|
|
312
|
+
// 检查当前模型是否支持图片输入
|
|
313
|
+
const supportsVision = currentModelSupportsVision();
|
|
314
|
+
const currentModel = getCurrentModelId();
|
|
315
|
+
// 构建用户消息内容(支持图片附件)
|
|
316
|
+
let userContent;
|
|
317
|
+
if (input.attachments && input.attachments.length > 0 && supportsVision) {
|
|
318
|
+
// 有图片附件,构建多内容块
|
|
319
|
+
const contentBlocks = [];
|
|
320
|
+
// 添加文本
|
|
321
|
+
if (input.prompt) {
|
|
322
|
+
contentBlocks.push({ type: 'text', text: input.prompt });
|
|
323
|
+
}
|
|
324
|
+
// 添加图片
|
|
325
|
+
for (const attachment of input.attachments) {
|
|
326
|
+
if (attachment.type === 'image' && attachment.content) {
|
|
327
|
+
// 从 data URL 提取 base64 数据
|
|
328
|
+
let base64Data = attachment.content;
|
|
329
|
+
let mimeType = attachment.mimeType || 'image/png';
|
|
330
|
+
if (attachment.content.startsWith('data:')) {
|
|
331
|
+
const match = attachment.content.match(/^data:([^;]+);base64,(.*)$/);
|
|
332
|
+
if (match) {
|
|
333
|
+
mimeType = match[1];
|
|
334
|
+
base64Data = match[2];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
contentBlocks.push({
|
|
338
|
+
type: 'image',
|
|
339
|
+
source: {
|
|
340
|
+
type: 'base64',
|
|
341
|
+
media_type: mimeType,
|
|
342
|
+
data: base64Data
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
userContent = contentBlocks;
|
|
348
|
+
logger.info({
|
|
349
|
+
group: group.name,
|
|
350
|
+
model: currentModel,
|
|
351
|
+
textBlocks: contentBlocks.filter(b => b.type === 'text').length,
|
|
352
|
+
imageBlocks: contentBlocks.filter(b => b.type === 'image').length
|
|
353
|
+
}, '📷 处理图片消息');
|
|
354
|
+
}
|
|
355
|
+
else if (input.attachments && input.attachments.length > 0 && !supportsVision) {
|
|
356
|
+
// 模型不支持图片,只发送文本
|
|
357
|
+
userContent = input.prompt + `\n\n[用户发送了 ${input.attachments.length} 张图片,但当前模型 ${currentModel} 不支持图片输入]`;
|
|
358
|
+
logger.info({
|
|
359
|
+
group: group.name,
|
|
360
|
+
model: currentModel,
|
|
361
|
+
imageCount: input.attachments.length
|
|
362
|
+
}, '⚠️ 当前模型不支持图片输入');
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
// 纯文本消息
|
|
366
|
+
userContent = input.prompt;
|
|
367
|
+
}
|
|
368
|
+
// 添加当前用户消息
|
|
369
|
+
const userMessage = { role: 'user', content: userContent };
|
|
370
|
+
memoryManager.addMessage(group.folder, { role: 'user', content: input.prompt }); // 记忆中只存文本
|
|
371
|
+
// 构建消息历史
|
|
372
|
+
const messages = [...context, userMessage];
|
|
373
|
+
// 获取系统提示词
|
|
374
|
+
const systemPrompt = getGroupSystemPrompt(group, input.isMain, input.isScheduledTask);
|
|
375
|
+
// 获取工具定义(插件工具 + 内置后备工具)
|
|
376
|
+
const tools = getAllTools();
|
|
377
|
+
// 调试:打印可用工具
|
|
378
|
+
logger.info({
|
|
379
|
+
group: group.name,
|
|
380
|
+
toolCount: tools.length,
|
|
381
|
+
toolNames: tools.map(t => t.name)
|
|
382
|
+
}, '⚡ 可用工具列表');
|
|
383
|
+
// 活动超时机制:有数据流动时自动延长超时
|
|
384
|
+
let activityTimer = null;
|
|
385
|
+
let isTimedOut = false;
|
|
386
|
+
const resetActivityTimeout = () => {
|
|
387
|
+
if (activityTimer) {
|
|
388
|
+
clearTimeout(activityTimer);
|
|
389
|
+
}
|
|
390
|
+
activityTimer = setTimeout(() => {
|
|
391
|
+
isTimedOut = true;
|
|
392
|
+
logger.error({ group: group.name }, 'Agent timeout (no activity)');
|
|
393
|
+
}, timeout);
|
|
394
|
+
};
|
|
395
|
+
const clearActivityTimeout = () => {
|
|
396
|
+
if (activityTimer) {
|
|
397
|
+
clearTimeout(activityTimer);
|
|
398
|
+
activityTimer = null;
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
// 开始计时
|
|
402
|
+
resetActivityTimeout();
|
|
403
|
+
try {
|
|
404
|
+
// 使用流式 API 获取响应(避免长时间等待导致超时)
|
|
405
|
+
let responseText = '';
|
|
406
|
+
let finalResponse = null;
|
|
407
|
+
logger.info({ group: group.name }, '⚡ 开始流式请求');
|
|
408
|
+
for await (const event of apiClient.chatStream(messages, {
|
|
409
|
+
system: systemPrompt,
|
|
410
|
+
tools,
|
|
411
|
+
maxTokens: 4096
|
|
412
|
+
})) {
|
|
413
|
+
// 每收到数据就重置超时计时器
|
|
414
|
+
resetActivityTimeout();
|
|
415
|
+
if (isTimedOut) {
|
|
416
|
+
throw new Error(`Agent timed out after ${timeout}ms of inactivity`);
|
|
417
|
+
}
|
|
418
|
+
if (event.type === 'text') {
|
|
419
|
+
responseText += event.text;
|
|
420
|
+
}
|
|
421
|
+
else if (event.type === 'done') {
|
|
422
|
+
finalResponse = event.message;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
clearActivityTimeout();
|
|
426
|
+
if (!finalResponse) {
|
|
427
|
+
throw new Error('No response received from API');
|
|
428
|
+
}
|
|
429
|
+
// 调试:打印 API 响应
|
|
430
|
+
logger.info({
|
|
431
|
+
group: group.name,
|
|
432
|
+
stopReason: finalResponse.stop_reason,
|
|
433
|
+
contentTypes: finalResponse.content.map((c) => c.type)
|
|
434
|
+
}, '⚡ API 响应');
|
|
435
|
+
// 记录 token 使用
|
|
436
|
+
if (finalResponse.usage) {
|
|
437
|
+
const session = recordTokenUsage(input.chatJid, {
|
|
438
|
+
inputTokens: finalResponse.usage.input_tokens || 0,
|
|
439
|
+
outputTokens: finalResponse.usage.output_tokens || 0
|
|
440
|
+
}, getCurrentModelId());
|
|
441
|
+
logger.info({
|
|
442
|
+
chatId: input.chatJid,
|
|
443
|
+
inputTokens: finalResponse.usage.input_tokens,
|
|
444
|
+
outputTokens: finalResponse.usage.output_tokens,
|
|
445
|
+
totalTokens: session.totalTokens
|
|
446
|
+
}, '📊 Token 统计');
|
|
447
|
+
}
|
|
448
|
+
let result;
|
|
449
|
+
// 检查是否有工具调用
|
|
450
|
+
if (finalResponse.stop_reason === 'tool_use') {
|
|
451
|
+
// 处理工具调用(使用活动超时)
|
|
452
|
+
resetActivityTimeout();
|
|
453
|
+
result = await apiClient.handleToolUse(finalResponse, messages, async (name, params) => {
|
|
454
|
+
resetActivityTimeout(); // 工具执行时也重置超时
|
|
455
|
+
const toolResult = await toolExecutor(name, params);
|
|
456
|
+
if (toolResult.isError) {
|
|
457
|
+
throw new Error(toolResult.content);
|
|
458
|
+
}
|
|
459
|
+
return toolResult.content;
|
|
460
|
+
}, { system: systemPrompt, tools, maxTokens: 4096 });
|
|
461
|
+
clearActivityTimeout();
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
// 使用流式收集的文本,或从响应中提取
|
|
465
|
+
result = responseText || apiClient.extractText(finalResponse);
|
|
466
|
+
}
|
|
467
|
+
// 保存助手回复到记忆
|
|
468
|
+
memoryManager.addMessage(group.folder, { role: 'assistant', content: result });
|
|
469
|
+
// 检查是否需要压缩上下文
|
|
470
|
+
if (memoryManager.needsCompaction(group.folder)) {
|
|
471
|
+
logger.info({ group: group.name }, 'Compacting conversation context');
|
|
472
|
+
await memoryManager.compact(group.folder, apiClient);
|
|
473
|
+
}
|
|
474
|
+
const duration = Date.now() - startTime;
|
|
475
|
+
logger.info({
|
|
476
|
+
group: group.name,
|
|
477
|
+
duration,
|
|
478
|
+
status: 'success',
|
|
479
|
+
hasResult: !!result
|
|
480
|
+
}, 'Agent completed');
|
|
481
|
+
return {
|
|
482
|
+
status: 'success',
|
|
483
|
+
result
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
catch (err) {
|
|
487
|
+
clearActivityTimeout();
|
|
488
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
489
|
+
const duration = Date.now() - startTime;
|
|
490
|
+
logger.error({
|
|
491
|
+
group: group.name,
|
|
492
|
+
duration,
|
|
493
|
+
error: errorMessage
|
|
494
|
+
}, 'Agent error');
|
|
495
|
+
return {
|
|
496
|
+
status: 'error',
|
|
497
|
+
result: null,
|
|
498
|
+
error: errorMessage
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// ==================== Snapshot Functions ====================
|
|
503
|
+
export function writeTasksSnapshot(groupFolder, isMain, tasks) {
|
|
504
|
+
// Write filtered tasks to the group's IPC directory
|
|
505
|
+
const groupIpcDir = getIpcDir(groupFolder);
|
|
506
|
+
fs.mkdirSync(groupIpcDir, { recursive: true });
|
|
507
|
+
// Main sees all tasks, others only see their own
|
|
508
|
+
const filteredTasks = isMain
|
|
509
|
+
? tasks
|
|
510
|
+
: tasks.filter(t => t.groupFolder === groupFolder);
|
|
511
|
+
const tasksFile = path.join(groupIpcDir, 'current_tasks.json');
|
|
512
|
+
fs.writeFileSync(tasksFile, JSON.stringify(filteredTasks, null, 2));
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Write available groups snapshot for the agent to read.
|
|
516
|
+
* Only main group can see all available groups (for activation).
|
|
517
|
+
* Non-main groups only see their own registration status.
|
|
518
|
+
*/
|
|
519
|
+
export function writeGroupsSnapshot(groupFolder, isMain, groups, registeredJids) {
|
|
520
|
+
const groupIpcDir = getIpcDir(groupFolder);
|
|
521
|
+
fs.mkdirSync(groupIpcDir, { recursive: true });
|
|
522
|
+
// Main sees all groups; others see nothing (they can't activate groups)
|
|
523
|
+
const visibleGroups = isMain ? groups : [];
|
|
524
|
+
const groupsFile = path.join(groupIpcDir, 'available_groups.json');
|
|
525
|
+
fs.writeFileSync(groupsFile, JSON.stringify({
|
|
526
|
+
groups: visibleGroups,
|
|
527
|
+
lastSync: new Date().toISOString()
|
|
528
|
+
}, null, 2));
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../src/agent-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|