@f2a/openclaw-adapter 0.1.0 → 0.1.4
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/dist/announcement-queue.d.ts +72 -1
- package/dist/announcement-queue.d.ts.map +1 -1
- package/dist/announcement-queue.js +145 -20
- package/dist/announcement-queue.js.map +1 -1
- package/dist/claim-handlers.d.ts +75 -0
- package/dist/claim-handlers.d.ts.map +1 -0
- package/dist/claim-handlers.js +368 -0
- package/dist/claim-handlers.js.map +1 -0
- package/dist/connector.d.ts +45 -18
- package/dist/connector.d.ts.map +1 -1
- package/dist/connector.js +219 -583
- package/dist/connector.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +28 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +44 -0
- package/dist/logger.js.map +1 -0
- package/dist/network-client.d.ts +17 -1
- package/dist/network-client.d.ts.map +1 -1
- package/dist/network-client.js +119 -23
- package/dist/network-client.js.map +1 -1
- package/dist/node-manager.d.ts +20 -0
- package/dist/node-manager.d.ts.map +1 -1
- package/dist/node-manager.js +194 -18
- package/dist/node-manager.js.map +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +4 -5
- package/dist/plugin.js.map +1 -1
- package/dist/reputation.d.ts +22 -1
- package/dist/reputation.d.ts.map +1 -1
- package/dist/reputation.js +102 -5
- package/dist/reputation.js.map +1 -1
- package/dist/task-guard.d.ts +82 -0
- package/dist/task-guard.d.ts.map +1 -1
- package/dist/task-guard.js +392 -15
- package/dist/task-guard.js.map +1 -1
- package/dist/task-queue.d.ts +50 -7
- package/dist/task-queue.d.ts.map +1 -1
- package/dist/task-queue.js +445 -12
- package/dist/task-queue.js.map +1 -1
- package/dist/tool-handlers.d.ts +96 -0
- package/dist/tool-handlers.d.ts.map +1 -0
- package/dist/tool-handlers.js +431 -0
- package/dist/tool-handlers.js.map +1 -0
- package/dist/types.d.ts +98 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/webhook-pusher.d.ts +71 -0
- package/dist/webhook-pusher.d.ts.map +1 -0
- package/dist/webhook-pusher.js +174 -0
- package/dist/webhook-pusher.js.map +1 -0
- package/dist/webhook-server.d.ts +8 -1
- package/dist/webhook-server.d.ts.map +1 -1
- package/dist/webhook-server.js +42 -7
- package/dist/webhook-server.js.map +1 -1
- package/package.json +21 -8
package/dist/task-queue.js
CHANGED
|
@@ -1,32 +1,350 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* F2A Task Queue
|
|
4
|
-
*
|
|
3
|
+
* F2A Task Queue with SQLite Persistence
|
|
4
|
+
* 任务队列 + SQLite 持久化
|
|
5
5
|
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
6
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
10
|
+
exports.TaskQueue = void 0;
|
|
11
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const fs_1 = __importDefault(require("fs"));
|
|
14
|
+
const logger_js_1 = require("./logger.js");
|
|
15
|
+
/** 默认超时时间(毫秒) */
|
|
16
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
17
|
+
/** 最小超时时间(毫秒) */
|
|
18
|
+
const MIN_TIMEOUT_MS = 1000;
|
|
19
|
+
/** 最大超时时间(毫秒) - 24小时 */
|
|
20
|
+
const MAX_TIMEOUT_MS = 24 * 60 * 60 * 1000;
|
|
8
21
|
class TaskQueue {
|
|
9
22
|
tasks = new Map();
|
|
10
23
|
maxSize;
|
|
11
24
|
maxAgeMs;
|
|
25
|
+
persistEnabled;
|
|
26
|
+
cleanupThreshold;
|
|
27
|
+
lastCleanupTime = 0;
|
|
28
|
+
cleanupIntervalMs;
|
|
29
|
+
db;
|
|
12
30
|
constructor(options) {
|
|
13
31
|
this.maxSize = options?.maxSize || 1000;
|
|
14
32
|
this.maxAgeMs = options?.maxAgeMs || 24 * 60 * 60 * 1000; // 24小时
|
|
33
|
+
this.persistEnabled = options?.persistEnabled ?? true;
|
|
34
|
+
this.cleanupThreshold = options?.cleanupThreshold || 0.8; // 默认 80% 触发清理
|
|
35
|
+
// 清理间隔:至少每 maxAgeMs/10 时间执行一次清理检查
|
|
36
|
+
this.cleanupIntervalMs = Math.min(this.maxAgeMs / 10, 60000); // 最多 1 分钟
|
|
37
|
+
if (this.persistEnabled && options?.persistDir) {
|
|
38
|
+
this.initPersistence(options.persistDir);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 初始化 SQLite 持久化
|
|
43
|
+
*/
|
|
44
|
+
initPersistence(persistDir) {
|
|
45
|
+
// 确保目录存在
|
|
46
|
+
if (!fs_1.default.existsSync(persistDir)) {
|
|
47
|
+
fs_1.default.mkdirSync(persistDir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
const dbPath = path_1.default.join(persistDir, 'task-queue.db');
|
|
50
|
+
try {
|
|
51
|
+
this.db = new better_sqlite3_1.default(dbPath);
|
|
52
|
+
// 创建表
|
|
53
|
+
this.db.exec(`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
55
|
+
id TEXT PRIMARY KEY,
|
|
56
|
+
task_type TEXT,
|
|
57
|
+
description TEXT,
|
|
58
|
+
parameters TEXT,
|
|
59
|
+
status TEXT NOT NULL,
|
|
60
|
+
created_at INTEGER NOT NULL,
|
|
61
|
+
updated_at INTEGER,
|
|
62
|
+
result TEXT,
|
|
63
|
+
error TEXT,
|
|
64
|
+
latency INTEGER,
|
|
65
|
+
webhook_pushed INTEGER DEFAULT 0
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
CREATE INDEX IF NOT EXISTS idx_status ON tasks(status);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_created ON tasks(created_at);
|
|
70
|
+
`);
|
|
71
|
+
// 恢复未完成的任务到内存
|
|
72
|
+
this.restore();
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
// 数据库损坏或无法访问,删除并重新创建
|
|
76
|
+
logger_js_1.queueLogger.warn('数据库初始化失败,将重建: error=%s', e);
|
|
77
|
+
try {
|
|
78
|
+
if (this.db) {
|
|
79
|
+
this.db.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (closeErr) {
|
|
83
|
+
// 忽略关闭错误,继续重建
|
|
84
|
+
logger_js_1.queueLogger.warn('关闭数据库时出错: error=%s', closeErr);
|
|
85
|
+
}
|
|
86
|
+
// 删除损坏的数据库文件
|
|
87
|
+
if (fs_1.default.existsSync(dbPath)) {
|
|
88
|
+
fs_1.default.unlinkSync(dbPath);
|
|
89
|
+
}
|
|
90
|
+
// 重新创建
|
|
91
|
+
this.db = new better_sqlite3_1.default(dbPath);
|
|
92
|
+
this.db.exec(`
|
|
93
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
94
|
+
id TEXT PRIMARY KEY,
|
|
95
|
+
task_type TEXT,
|
|
96
|
+
description TEXT,
|
|
97
|
+
parameters TEXT,
|
|
98
|
+
status TEXT NOT NULL,
|
|
99
|
+
created_at INTEGER NOT NULL,
|
|
100
|
+
updated_at INTEGER,
|
|
101
|
+
result TEXT,
|
|
102
|
+
error TEXT,
|
|
103
|
+
latency INTEGER,
|
|
104
|
+
webhook_pushed INTEGER DEFAULT 0
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_status ON tasks(status);
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_created ON tasks(created_at);
|
|
109
|
+
`);
|
|
110
|
+
logger_js_1.queueLogger.info('数据库已重建');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 从数据库恢复任务
|
|
115
|
+
*
|
|
116
|
+
* P1 修复:尝试逐条恢复有效数据,避免数据库损坏时丢失所有任务
|
|
117
|
+
*/
|
|
118
|
+
restore() {
|
|
119
|
+
if (!this.db)
|
|
120
|
+
return;
|
|
121
|
+
try {
|
|
122
|
+
// 恢复时将 processing 状态的任务重置为 pending,避免僵尸任务
|
|
123
|
+
// 这些任务在崩溃前正在处理,但未完成,需要重新执行
|
|
124
|
+
this.db.exec(`
|
|
125
|
+
UPDATE tasks SET status = 'pending' WHERE status = 'processing'
|
|
126
|
+
`);
|
|
127
|
+
const rows = this.db.prepare(`
|
|
128
|
+
SELECT * FROM tasks
|
|
129
|
+
WHERE status IN ('pending', 'processing')
|
|
130
|
+
ORDER BY created_at ASC
|
|
131
|
+
`).all();
|
|
132
|
+
let recoveredCount = 0;
|
|
133
|
+
let skippedCount = 0;
|
|
134
|
+
for (const row of rows) {
|
|
135
|
+
try {
|
|
136
|
+
// 验证必要字段
|
|
137
|
+
if (!row.id || typeof row.id !== 'string') {
|
|
138
|
+
logger_js_1.queueLogger.warn('跳过无效记录: 缺少 id');
|
|
139
|
+
skippedCount++;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!row.created_at || typeof row.created_at !== 'number') {
|
|
143
|
+
logger_js_1.queueLogger.warn('跳过无效记录: id=%s, 缺少 created_at', row.id);
|
|
144
|
+
skippedCount++;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// 检查任务是否过期
|
|
148
|
+
const age = Date.now() - row.created_at;
|
|
149
|
+
if (age > this.maxAgeMs) {
|
|
150
|
+
// 删除过期任务
|
|
151
|
+
this.db.prepare('DELETE FROM tasks WHERE id = ?').run(row.id);
|
|
152
|
+
skippedCount++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const task = {
|
|
156
|
+
taskId: row.id,
|
|
157
|
+
taskType: row.task_type || '',
|
|
158
|
+
description: row.description || '',
|
|
159
|
+
parameters: this.safeJsonParse(row.parameters),
|
|
160
|
+
from: row.from || '',
|
|
161
|
+
timestamp: row.timestamp || Date.now(),
|
|
162
|
+
timeout: row.timeout || 60000,
|
|
163
|
+
status: row.status || 'pending',
|
|
164
|
+
createdAt: row.created_at,
|
|
165
|
+
updatedAt: row.updated_at || undefined,
|
|
166
|
+
result: this.safeJsonParse(row.result),
|
|
167
|
+
error: row.error || undefined,
|
|
168
|
+
latency: row.latency || undefined,
|
|
169
|
+
webhookPushed: row.webhook_pushed === 1
|
|
170
|
+
};
|
|
171
|
+
this.tasks.set(task.taskId, task);
|
|
172
|
+
recoveredCount++;
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
logger_js_1.queueLogger.warn('跳过无效任务记录: id=%s, error=%s', row.id, e);
|
|
176
|
+
skippedCount++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (skippedCount > 0) {
|
|
180
|
+
logger_js_1.queueLogger.info('恢复完成: recovered=%d, skipped=%d', recoveredCount, skippedCount);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
logger_js_1.queueLogger.info('从持久化恢复任务: count=%d', this.tasks.size);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
// P1 修复:数据库损坏时不清空所有任务,而是尝试逐条恢复
|
|
188
|
+
logger_js_1.queueLogger.warn('批量恢复失败,尝试逐条恢复: error=%s', e);
|
|
189
|
+
try {
|
|
190
|
+
// 尝试逐条读取并恢复
|
|
191
|
+
const rows = this.db.prepare(`SELECT * FROM tasks WHERE status IN ('pending', 'processing')`).all();
|
|
192
|
+
for (const row of rows) {
|
|
193
|
+
try {
|
|
194
|
+
if (row.id && row.created_at) {
|
|
195
|
+
const task = {
|
|
196
|
+
taskId: row.id,
|
|
197
|
+
taskType: row.task_type || '',
|
|
198
|
+
description: row.description || '',
|
|
199
|
+
parameters: this.safeJsonParse(row.parameters),
|
|
200
|
+
from: row.from || '',
|
|
201
|
+
timestamp: row.timestamp || Date.now(),
|
|
202
|
+
timeout: row.timeout || 60000,
|
|
203
|
+
status: 'pending', // 恢复时默认设为 pending
|
|
204
|
+
createdAt: row.created_at,
|
|
205
|
+
updatedAt: row.updated_at || undefined,
|
|
206
|
+
result: this.safeJsonParse(row.result),
|
|
207
|
+
error: row.error || undefined,
|
|
208
|
+
latency: row.latency || undefined,
|
|
209
|
+
webhookPushed: row.webhook_pushed === 1
|
|
210
|
+
};
|
|
211
|
+
this.tasks.set(task.taskId, task);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (rowError) {
|
|
215
|
+
// 单条记录恢复失败,跳过并继续
|
|
216
|
+
logger_js_1.queueLogger.warn('单条记录恢复失败: id=%s, error=%s', row?.id, rowError);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
logger_js_1.queueLogger.info('逐条恢复完成: count=%d', this.tasks.size);
|
|
220
|
+
}
|
|
221
|
+
catch (recoverError) {
|
|
222
|
+
// 所有恢复尝试都失败,记录错误但不清空内存
|
|
223
|
+
logger_js_1.queueLogger.error('所有恢复尝试失败,将使用空内存队列: error=%s', recoverError);
|
|
224
|
+
// 注意:这里不清空 this.tasks,保留任何可能已部分恢复的数据
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 安全解析 JSON,失败返回 undefined
|
|
230
|
+
*/
|
|
231
|
+
safeJsonParse(json) {
|
|
232
|
+
if (!json)
|
|
233
|
+
return undefined;
|
|
234
|
+
try {
|
|
235
|
+
return JSON.parse(json);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
logger_js_1.queueLogger.warn('JSON 解析失败,跳过: json=%s...', json.slice(0, 50));
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
15
241
|
}
|
|
16
242
|
/**
|
|
17
243
|
* 添加新任务到队列
|
|
18
244
|
*/
|
|
19
245
|
add(request) {
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
246
|
+
// ========== 输入验证(带默认值)==========
|
|
247
|
+
// taskId 验证(必须)
|
|
248
|
+
if (!request.taskId || typeof request.taskId !== 'string' || request.taskId.trim() === '') {
|
|
249
|
+
throw new Error('taskId must be a non-empty string');
|
|
250
|
+
}
|
|
251
|
+
// from 验证(可选,默认 'unknown')
|
|
252
|
+
const from = request.from && typeof request.from === 'string' && request.from.trim()
|
|
253
|
+
? request.from.trim()
|
|
254
|
+
: 'unknown';
|
|
255
|
+
// timestamp 验证(可选,默认当前时间)
|
|
256
|
+
let timestamp;
|
|
257
|
+
if (request.timestamp !== undefined) {
|
|
258
|
+
if (typeof request.timestamp !== 'number' || !Number.isFinite(request.timestamp)) {
|
|
259
|
+
throw new Error('timestamp must be a finite number if provided');
|
|
260
|
+
}
|
|
261
|
+
if (request.timestamp <= 0) {
|
|
262
|
+
throw new Error('timestamp must be positive');
|
|
263
|
+
}
|
|
264
|
+
// timestamp 不能是未来时间(允许 5 分钟的时钟偏差)
|
|
265
|
+
const maxFutureTime = Date.now() + 5 * 60 * 1000;
|
|
266
|
+
if (request.timestamp > maxFutureTime) {
|
|
267
|
+
throw new Error('timestamp cannot be in the future');
|
|
268
|
+
}
|
|
269
|
+
timestamp = request.timestamp;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
timestamp = Date.now();
|
|
273
|
+
}
|
|
274
|
+
// timeout 验证(可选,默认 DEFAULT_TIMEOUT_MS)
|
|
275
|
+
let timeout;
|
|
276
|
+
if (request.timeout !== undefined) {
|
|
277
|
+
if (typeof request.timeout !== 'number' || !Number.isFinite(request.timeout)) {
|
|
278
|
+
throw new Error('timeout must be a finite number if provided');
|
|
279
|
+
}
|
|
280
|
+
if (request.timeout < MIN_TIMEOUT_MS) {
|
|
281
|
+
throw new Error(`timeout must be >= ${MIN_TIMEOUT_MS}ms`);
|
|
282
|
+
}
|
|
283
|
+
if (request.timeout > MAX_TIMEOUT_MS) {
|
|
284
|
+
throw new Error(`timeout cannot exceed ${MAX_TIMEOUT_MS}ms (24 hours)`);
|
|
285
|
+
}
|
|
286
|
+
timeout = request.timeout;
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
timeout = DEFAULT_TIMEOUT_MS;
|
|
290
|
+
}
|
|
291
|
+
// ========== 队列容量管理 ==========
|
|
292
|
+
// 智能清理策略:
|
|
293
|
+
// 1. 队列大小超过阈值时触发完整清理
|
|
294
|
+
// 2. 距离上次清理超过清理间隔时触发清理
|
|
295
|
+
const now = Date.now();
|
|
296
|
+
const cleanupTriggerSize = Math.floor(this.maxSize * this.cleanupThreshold);
|
|
297
|
+
const shouldCleanup = this.tasks.size >= cleanupTriggerSize ||
|
|
298
|
+
(now - this.lastCleanupTime) > this.cleanupIntervalMs;
|
|
299
|
+
if (shouldCleanup) {
|
|
300
|
+
this.cleanup();
|
|
301
|
+
this.lastCleanupTime = now;
|
|
302
|
+
}
|
|
303
|
+
// 检查是否为重复添加(保留原 createdAt)
|
|
304
|
+
const existingTask = this.tasks.get(request.taskId);
|
|
305
|
+
const preservedCreatedAt = existingTask?.createdAt ?? Date.now();
|
|
306
|
+
// 使用事务确保原子性(解决竞态条件)
|
|
307
|
+
if (this.db) {
|
|
308
|
+
const insertTask = this.db.transaction(() => {
|
|
309
|
+
// 在事务内检查队列大小(原子操作)
|
|
310
|
+
const count = this.db.prepare('SELECT COUNT(*) as count FROM tasks').get();
|
|
311
|
+
if (count.count >= this.maxSize && !existingTask) {
|
|
312
|
+
throw new Error('Task queue is full');
|
|
313
|
+
}
|
|
314
|
+
const task = {
|
|
315
|
+
...request,
|
|
316
|
+
from,
|
|
317
|
+
timestamp,
|
|
318
|
+
timeout,
|
|
319
|
+
status: 'pending',
|
|
320
|
+
createdAt: preservedCreatedAt,
|
|
321
|
+
webhookPushed: false
|
|
322
|
+
};
|
|
323
|
+
this.db.prepare(`
|
|
324
|
+
INSERT OR REPLACE INTO tasks
|
|
325
|
+
(id, task_type, description, parameters, status, created_at, webhook_pushed)
|
|
326
|
+
VALUES (?, ?, ?, ?, ?, ?, 0)
|
|
327
|
+
`).run(task.taskId, task.taskType || null, task.description || null, task.parameters ? JSON.stringify(task.parameters) : null, task.status, task.createdAt);
|
|
328
|
+
return task;
|
|
329
|
+
});
|
|
330
|
+
const task = insertTask();
|
|
331
|
+
// 同步内存状态
|
|
332
|
+
this.tasks.set(request.taskId, task);
|
|
333
|
+
return task;
|
|
334
|
+
}
|
|
335
|
+
// 无 DB 时,在内存中检查队列是否已满
|
|
336
|
+
// 注意:对于新任务才检查容量限制
|
|
337
|
+
if (!existingTask && this.tasks.size >= this.maxSize) {
|
|
24
338
|
throw new Error('Task queue is full');
|
|
25
339
|
}
|
|
26
340
|
const task = {
|
|
27
341
|
...request,
|
|
342
|
+
from,
|
|
343
|
+
timestamp,
|
|
344
|
+
timeout,
|
|
28
345
|
status: 'pending',
|
|
29
|
-
createdAt:
|
|
346
|
+
createdAt: preservedCreatedAt,
|
|
347
|
+
webhookPushed: false
|
|
30
348
|
};
|
|
31
349
|
this.tasks.set(request.taskId, task);
|
|
32
350
|
return task;
|
|
@@ -40,6 +358,29 @@ class TaskQueue {
|
|
|
40
358
|
.sort((a, b) => a.createdAt - b.createdAt)
|
|
41
359
|
.slice(0, limit);
|
|
42
360
|
}
|
|
361
|
+
/**
|
|
362
|
+
* 获取待 webhook 推送的任务
|
|
363
|
+
*/
|
|
364
|
+
getWebhookPending() {
|
|
365
|
+
return Array.from(this.tasks.values())
|
|
366
|
+
.filter(t => t.status === 'pending' && !t.webhookPushed)
|
|
367
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* 标记任务为已推送 webhook
|
|
371
|
+
*/
|
|
372
|
+
markWebhookPushed(taskId) {
|
|
373
|
+
const task = this.tasks.get(taskId);
|
|
374
|
+
if (!task)
|
|
375
|
+
return;
|
|
376
|
+
task.webhookPushed = true;
|
|
377
|
+
task.updatedAt = Date.now();
|
|
378
|
+
if (this.db) {
|
|
379
|
+
this.db.prepare(`
|
|
380
|
+
UPDATE tasks SET webhook_pushed = 1, updated_at = ? WHERE id = ?
|
|
381
|
+
`).run(task.updatedAt, taskId);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
43
384
|
/**
|
|
44
385
|
* 标记任务为处理中
|
|
45
386
|
*/
|
|
@@ -49,6 +390,35 @@ class TaskQueue {
|
|
|
49
390
|
return undefined;
|
|
50
391
|
task.status = 'processing';
|
|
51
392
|
task.updatedAt = Date.now();
|
|
393
|
+
if (this.db) {
|
|
394
|
+
// 使用事务确保内存和数据库状态一致
|
|
395
|
+
const updateTransaction = this.db.transaction(() => {
|
|
396
|
+
this.db.prepare(`
|
|
397
|
+
UPDATE tasks SET status = 'processing', updated_at = ? WHERE id = ?
|
|
398
|
+
`).run(task.updatedAt, taskId);
|
|
399
|
+
});
|
|
400
|
+
updateTransaction();
|
|
401
|
+
}
|
|
402
|
+
return task;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* P1 修复:重置 processing 任务为 pending
|
|
406
|
+
* 用于处理因异常导致的僵尸任务
|
|
407
|
+
*/
|
|
408
|
+
resetProcessingTask(taskId) {
|
|
409
|
+
const task = this.tasks.get(taskId);
|
|
410
|
+
if (!task || task.status !== 'processing')
|
|
411
|
+
return undefined;
|
|
412
|
+
task.status = 'pending';
|
|
413
|
+
task.updatedAt = Date.now();
|
|
414
|
+
if (this.db) {
|
|
415
|
+
const updateTransaction = this.db.transaction(() => {
|
|
416
|
+
this.db.prepare(`
|
|
417
|
+
UPDATE tasks SET status = 'pending', updated_at = ? WHERE id = ?
|
|
418
|
+
`).run(task.updatedAt, taskId);
|
|
419
|
+
});
|
|
420
|
+
updateTransaction();
|
|
421
|
+
}
|
|
52
422
|
return task;
|
|
53
423
|
}
|
|
54
424
|
/**
|
|
@@ -68,6 +438,17 @@ class TaskQueue {
|
|
|
68
438
|
}
|
|
69
439
|
task.latency = response.latency;
|
|
70
440
|
task.updatedAt = Date.now();
|
|
441
|
+
if (this.db) {
|
|
442
|
+
// 使用事务确保内存和数据库状态一致
|
|
443
|
+
const updateTransaction = this.db.transaction(() => {
|
|
444
|
+
this.db.prepare(`
|
|
445
|
+
UPDATE tasks
|
|
446
|
+
SET status = ?, result = ?, error = ?, latency = ?, updated_at = ?
|
|
447
|
+
WHERE id = ?
|
|
448
|
+
`).run(task.status, task.result ? JSON.stringify(task.result) : null, task.error || null, task.latency || null, task.updatedAt, taskId);
|
|
449
|
+
});
|
|
450
|
+
updateTransaction();
|
|
451
|
+
}
|
|
71
452
|
return task;
|
|
72
453
|
}
|
|
73
454
|
/**
|
|
@@ -80,7 +461,11 @@ class TaskQueue {
|
|
|
80
461
|
* 删除任务
|
|
81
462
|
*/
|
|
82
463
|
delete(taskId) {
|
|
83
|
-
|
|
464
|
+
const deleted = this.tasks.delete(taskId);
|
|
465
|
+
if (deleted && this.db) {
|
|
466
|
+
this.db.prepare('DELETE FROM tasks WHERE id = ?').run(taskId);
|
|
467
|
+
}
|
|
468
|
+
return deleted;
|
|
84
469
|
}
|
|
85
470
|
/**
|
|
86
471
|
* 获取队列统计
|
|
@@ -92,7 +477,8 @@ class TaskQueue {
|
|
|
92
477
|
processing: tasks.filter(t => t.status === 'processing').length,
|
|
93
478
|
completed: tasks.filter(t => t.status === 'completed').length,
|
|
94
479
|
failed: tasks.filter(t => t.status === 'failed').length,
|
|
95
|
-
total: tasks.length
|
|
480
|
+
total: tasks.length,
|
|
481
|
+
webhookPending: tasks.filter(t => t.status === 'pending' && !t.webhookPushed).length
|
|
96
482
|
};
|
|
97
483
|
}
|
|
98
484
|
/**
|
|
@@ -103,13 +489,50 @@ class TaskQueue {
|
|
|
103
489
|
}
|
|
104
490
|
/**
|
|
105
491
|
* 清理过期任务
|
|
492
|
+
* 同时清理已完成/失败的任务以腾出空间
|
|
106
493
|
*/
|
|
107
494
|
cleanup() {
|
|
108
495
|
const now = Date.now();
|
|
496
|
+
const toDelete = [];
|
|
109
497
|
for (const [id, task] of this.tasks) {
|
|
110
498
|
const age = now - task.createdAt;
|
|
499
|
+
// 清理过期任务
|
|
111
500
|
if (age > this.maxAgeMs) {
|
|
501
|
+
toDelete.push(id);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
for (const id of toDelete) {
|
|
505
|
+
this.tasks.delete(id);
|
|
506
|
+
if (this.db) {
|
|
507
|
+
this.db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
// 如果队列接近满,清理已完成和失败的任务
|
|
511
|
+
const highWatermark = Math.floor(this.maxSize * 0.9);
|
|
512
|
+
if (this.tasks.size >= highWatermark) {
|
|
513
|
+
const completedAndFailed = [];
|
|
514
|
+
for (const [id, task] of this.tasks) {
|
|
515
|
+
if (task.status === 'completed' || task.status === 'failed') {
|
|
516
|
+
completedAndFailed.push(id);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
// 按更新时间排序,优先删除旧的已完成/失败任务
|
|
520
|
+
completedAndFailed.sort((a, b) => {
|
|
521
|
+
const taskA = this.tasks.get(a);
|
|
522
|
+
const taskB = this.tasks.get(b);
|
|
523
|
+
return (taskA?.updatedAt || taskA?.createdAt || 0) - (taskB?.updatedAt || taskB?.createdAt || 0);
|
|
524
|
+
});
|
|
525
|
+
// 删除足够多的任务以腾出空间
|
|
526
|
+
const targetSize = Math.floor(this.maxSize * 0.7);
|
|
527
|
+
const toRemove = completedAndFailed.slice(0, Math.max(0, this.tasks.size - targetSize));
|
|
528
|
+
for (const id of toRemove) {
|
|
112
529
|
this.tasks.delete(id);
|
|
530
|
+
if (this.db) {
|
|
531
|
+
this.db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
if (toRemove.length > 0) {
|
|
535
|
+
logger_js_1.queueLogger.info('清理已完成/失败任务以释放空间: count=%d', toRemove.length);
|
|
113
536
|
}
|
|
114
537
|
}
|
|
115
538
|
}
|
|
@@ -118,9 +541,19 @@ class TaskQueue {
|
|
|
118
541
|
*/
|
|
119
542
|
clear() {
|
|
120
543
|
this.tasks.clear();
|
|
544
|
+
if (this.db) {
|
|
545
|
+
this.db.exec('DELETE FROM tasks');
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* 关闭数据库连接
|
|
550
|
+
*/
|
|
551
|
+
close() {
|
|
552
|
+
if (this.db) {
|
|
553
|
+
this.db.close();
|
|
554
|
+
this.db = undefined;
|
|
555
|
+
}
|
|
121
556
|
}
|
|
122
557
|
}
|
|
123
558
|
exports.TaskQueue = TaskQueue;
|
|
124
|
-
// 导出单例实例
|
|
125
|
-
exports.taskQueue = new TaskQueue();
|
|
126
559
|
//# sourceMappingURL=task-queue.js.map
|
package/dist/task-queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../src/task-queue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../src/task-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F2A OpenClaw Connector - Tool Handlers
|
|
3
|
+
* 工具处理器模块 - 处理 f2a_discover, f2a_delegate 等工具
|
|
4
|
+
*/
|
|
5
|
+
import type { SessionContext, ToolResult } from './types.js';
|
|
6
|
+
import type { F2AOpenClawAdapter } from './connector.js';
|
|
7
|
+
/**
|
|
8
|
+
* 工具处理器参数类型
|
|
9
|
+
*/
|
|
10
|
+
export interface ToolHandlerParams {
|
|
11
|
+
discover: {
|
|
12
|
+
capability?: string;
|
|
13
|
+
min_reputation?: number;
|
|
14
|
+
};
|
|
15
|
+
delegate: {
|
|
16
|
+
agent: string;
|
|
17
|
+
task: string;
|
|
18
|
+
context?: string;
|
|
19
|
+
timeout?: number;
|
|
20
|
+
};
|
|
21
|
+
broadcast: {
|
|
22
|
+
capability: string;
|
|
23
|
+
task: string;
|
|
24
|
+
min_responses?: number;
|
|
25
|
+
};
|
|
26
|
+
reputation: {
|
|
27
|
+
action: string;
|
|
28
|
+
peer_id?: string;
|
|
29
|
+
};
|
|
30
|
+
pollTasks: {
|
|
31
|
+
limit?: number;
|
|
32
|
+
status?: 'pending' | 'processing' | 'completed' | 'failed';
|
|
33
|
+
};
|
|
34
|
+
submitResult: {
|
|
35
|
+
task_id: string;
|
|
36
|
+
result: string;
|
|
37
|
+
status: 'success' | 'error';
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 工具处理器类
|
|
42
|
+
* 包含所有核心工具的处理逻辑
|
|
43
|
+
*/
|
|
44
|
+
export declare class ToolHandlers {
|
|
45
|
+
private adapter;
|
|
46
|
+
constructor(adapter: F2AOpenClawAdapter);
|
|
47
|
+
/**
|
|
48
|
+
* 处理 f2a_discover 工具
|
|
49
|
+
* 发现 F2A 网络中的 Agents
|
|
50
|
+
*/
|
|
51
|
+
handleDiscover(params: ToolHandlerParams['discover'], context: SessionContext): Promise<ToolResult>;
|
|
52
|
+
/**
|
|
53
|
+
* 处理 f2a_delegate 工具
|
|
54
|
+
* 委托任务给特定 Agent
|
|
55
|
+
*/
|
|
56
|
+
handleDelegate(params: ToolHandlerParams['delegate'], context: SessionContext): Promise<ToolResult>;
|
|
57
|
+
/**
|
|
58
|
+
* 处理 f2a_broadcast 工具
|
|
59
|
+
* 广播任务给所有具备某能力的 Agents
|
|
60
|
+
*/
|
|
61
|
+
handleBroadcast(params: ToolHandlerParams['broadcast'], context: SessionContext): Promise<ToolResult>;
|
|
62
|
+
/**
|
|
63
|
+
* 处理 f2a_status 工具
|
|
64
|
+
* 查看网络状态
|
|
65
|
+
*/
|
|
66
|
+
handleStatus(params: {}, context: SessionContext): Promise<ToolResult>;
|
|
67
|
+
/**
|
|
68
|
+
* 处理 f2a_reputation 工具
|
|
69
|
+
* 查看或管理 Peer 信誉
|
|
70
|
+
*/
|
|
71
|
+
handleReputation(params: ToolHandlerParams['reputation'], context: SessionContext): Promise<ToolResult>;
|
|
72
|
+
/**
|
|
73
|
+
* 处理 f2a_poll_tasks 工具
|
|
74
|
+
* 查询任务队列
|
|
75
|
+
*/
|
|
76
|
+
handlePollTasks(params: ToolHandlerParams['pollTasks'], context: SessionContext): Promise<ToolResult>;
|
|
77
|
+
/**
|
|
78
|
+
* 处理 f2a_submit_result 工具
|
|
79
|
+
* 提交任务结果
|
|
80
|
+
*/
|
|
81
|
+
handleSubmitResult(params: ToolHandlerParams['submitResult'], context: SessionContext): Promise<ToolResult>;
|
|
82
|
+
/**
|
|
83
|
+
* 处理 f2a_task_stats 工具
|
|
84
|
+
* 查看任务队列统计
|
|
85
|
+
*/
|
|
86
|
+
handleTaskStats(params: {}, context: SessionContext): Promise<ToolResult>;
|
|
87
|
+
/**
|
|
88
|
+
* 解析 Agent 引用
|
|
89
|
+
*/
|
|
90
|
+
private resolveAgent;
|
|
91
|
+
/**
|
|
92
|
+
* 格式化广播结果
|
|
93
|
+
*/
|
|
94
|
+
private formatBroadcastResults;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=tool-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-handlers.d.ts","sourceRoot":"","sources":["../src/tool-handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAKX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA8BzD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,SAAS,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,SAAS,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;KAAE,CAAC;IAC1F,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAA;KAAE,CAAC;CAChF;AAED;;;GAGG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,kBAAkB;IAE/C;;;OAGG;IACG,cAAc,CAClB,MAAM,EAAE,iBAAiB,CAAC,UAAU,CAAC,EACrC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IA6CtB;;;OAGG;IACG,cAAc,CAClB,MAAM,EAAE,iBAAiB,CAAC,UAAU,CAAC,EACrC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAmDtB;;;OAGG;IACG,eAAe,CACnB,MAAM,EAAE,iBAAiB,CAAC,WAAW,CAAC,EACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAkEtB;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,EAAE,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAkCtB;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,iBAAiB,CAAC,YAAY,CAAC,EACvC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAmEtB;;;OAGG;IACG,eAAe,CACnB,MAAM,EAAE,iBAAiB,CAAC,WAAW,CAAC,EACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAyEtB;;;OAGG;IACG,kBAAkB,CACtB,MAAM,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACzC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAwDtB;;;OAGG;IACG,eAAe,CACnB,MAAM,EAAE,EAAE,EACV,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAqBtB;;OAEG;YACW,YAAY;IA6B1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAO/B"}
|