@f2a/openclaw-adapter 0.1.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 (51) hide show
  1. package/README.md +510 -0
  2. package/dist/announcement-queue.d.ts +71 -0
  3. package/dist/announcement-queue.d.ts.map +1 -0
  4. package/dist/announcement-queue.js +181 -0
  5. package/dist/announcement-queue.js.map +1 -0
  6. package/dist/capability-detector.d.ts +21 -0
  7. package/dist/capability-detector.d.ts.map +1 -0
  8. package/dist/capability-detector.js +177 -0
  9. package/dist/capability-detector.js.map +1 -0
  10. package/dist/connector.d.ts +62 -0
  11. package/dist/connector.d.ts.map +1 -0
  12. package/dist/connector.js +1063 -0
  13. package/dist/connector.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +44 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/network-client.d.ts +48 -0
  19. package/dist/network-client.d.ts.map +1 -0
  20. package/dist/network-client.js +104 -0
  21. package/dist/network-client.js.map +1 -0
  22. package/dist/node-manager.d.ts +50 -0
  23. package/dist/node-manager.d.ts.map +1 -0
  24. package/dist/node-manager.js +187 -0
  25. package/dist/node-manager.js.map +1 -0
  26. package/dist/plugin.d.ts +16 -0
  27. package/dist/plugin.d.ts.map +1 -0
  28. package/dist/plugin.js +116 -0
  29. package/dist/plugin.js.map +1 -0
  30. package/dist/reputation.d.ts +72 -0
  31. package/dist/reputation.d.ts.map +1 -0
  32. package/dist/reputation.js +215 -0
  33. package/dist/reputation.js.map +1 -0
  34. package/dist/task-guard.d.ts +77 -0
  35. package/dist/task-guard.d.ts.map +1 -0
  36. package/dist/task-guard.js +330 -0
  37. package/dist/task-guard.js.map +1 -0
  38. package/dist/task-queue.d.ts +71 -0
  39. package/dist/task-queue.d.ts.map +1 -0
  40. package/dist/task-queue.js +126 -0
  41. package/dist/task-queue.js.map +1 -0
  42. package/dist/types.d.ts +248 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +6 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/webhook-server.d.ts +44 -0
  47. package/dist/webhook-server.d.ts.map +1 -0
  48. package/dist/webhook-server.js +119 -0
  49. package/dist/webhook-server.js.map +1 -0
  50. package/openclaw.plugin.json +106 -0
  51. package/package.json +40 -0
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ /**
3
+ * F2A Task Guard
4
+ * 轻量级任务安全检查和评审
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.taskGuard = exports.TaskGuard = exports.DEFAULT_TASK_GUARD_CONFIG = void 0;
8
+ // 默认配置
9
+ exports.DEFAULT_TASK_GUARD_CONFIG = {
10
+ enabled: true,
11
+ requireConfirmationForDangerous: true,
12
+ maxTasksPerMinute: 10,
13
+ blockedKeywords: [
14
+ 'rm -rf /',
15
+ 'rm -rf /*',
16
+ 'format',
17
+ 'delete all',
18
+ 'destroy',
19
+ 'wipe'
20
+ ],
21
+ dangerousPatterns: [
22
+ /rm\s+-rf\s+\/\s*$/i,
23
+ /format\s+/i,
24
+ /delete\s+all/i,
25
+ /drop\s+database/i,
26
+ /shutdown\s+-h/i
27
+ ],
28
+ minReputationForDangerous: 70
29
+ };
30
+ class TaskGuard {
31
+ config;
32
+ rules;
33
+ recentTasks = new Map();
34
+ constructor(config = {}) {
35
+ this.config = { ...exports.DEFAULT_TASK_GUARD_CONFIG, ...config };
36
+ this.rules = this.createDefaultRules();
37
+ }
38
+ /**
39
+ * 检查任务
40
+ */
41
+ check(task, context = {}) {
42
+ const fullContext = {
43
+ requesterReputation: context.requesterReputation,
44
+ isWhitelisted: context.isWhitelisted ?? false,
45
+ isBlacklisted: context.isBlacklisted ?? false,
46
+ recentTaskCount: this.getRecentTaskCount(task.from),
47
+ config: this.config
48
+ };
49
+ const results = [];
50
+ // 运行所有规则
51
+ for (const rule of this.rules) {
52
+ if (!rule.enabled)
53
+ continue;
54
+ try {
55
+ const result = rule.check(task, fullContext);
56
+ results.push(result);
57
+ }
58
+ catch (error) {
59
+ results.push({
60
+ passed: false,
61
+ severity: 'warn',
62
+ ruleId: rule.id,
63
+ message: `规则执行错误: ${rule.name}`
64
+ });
65
+ }
66
+ }
67
+ // 记录任务
68
+ this.recordTask(task.from);
69
+ const blocks = results.filter(r => r.severity === 'block' && !r.passed);
70
+ const warnings = results.filter(r => r.severity === 'warn' && !r.passed);
71
+ const requiresConfirmation = results.some(r => r.severity === 'warn' &&
72
+ !r.passed &&
73
+ this.config.requireConfirmationForDangerous);
74
+ return {
75
+ taskId: 'taskId' in task ? task.taskId : task.announcementId,
76
+ passed: blocks.length === 0,
77
+ results,
78
+ warnings,
79
+ blocks,
80
+ requiresConfirmation,
81
+ timestamp: Date.now()
82
+ };
83
+ }
84
+ /**
85
+ * 快速检查(只返回是否通过)
86
+ */
87
+ quickCheck(task, context) {
88
+ const report = this.check(task, context);
89
+ return report.passed;
90
+ }
91
+ /**
92
+ * 添加自定义规则
93
+ */
94
+ addRule(rule) {
95
+ this.rules.push(rule);
96
+ }
97
+ /**
98
+ * 启用/禁用规则
99
+ */
100
+ setRuleEnabled(ruleId, enabled) {
101
+ const rule = this.rules.find(r => r.id === ruleId);
102
+ if (rule) {
103
+ rule.enabled = enabled;
104
+ }
105
+ }
106
+ /**
107
+ * 更新配置
108
+ */
109
+ updateConfig(config) {
110
+ this.config = { ...this.config, ...config };
111
+ }
112
+ // ========== 私有方法 ==========
113
+ createDefaultRules() {
114
+ return [
115
+ // 规则 1: 黑名单检查
116
+ {
117
+ id: 'blacklist',
118
+ name: '黑名单检查',
119
+ description: '检查请求者是否在黑名单中',
120
+ enabled: true,
121
+ severity: 'block',
122
+ check: (task, context) => ({
123
+ passed: !context.isBlacklisted,
124
+ severity: 'block',
125
+ ruleId: 'blacklist',
126
+ message: context.isBlacklisted
127
+ ? '请求者在黑名单中,任务被拒绝'
128
+ : '通过黑名单检查'
129
+ })
130
+ },
131
+ // 规则 2: 频率限制
132
+ {
133
+ id: 'rate-limit',
134
+ name: '频率限制',
135
+ description: '检查请求频率是否过高',
136
+ enabled: true,
137
+ severity: 'block',
138
+ check: (task, context) => {
139
+ const exceeded = context.recentTaskCount > context.config.maxTasksPerMinute;
140
+ return {
141
+ passed: !exceeded,
142
+ severity: 'block',
143
+ ruleId: 'rate-limit',
144
+ message: exceeded
145
+ ? `请求频率过高: ${context.recentTaskCount}/${context.config.maxTasksPerMinute} 每分钟`
146
+ : '频率检查通过',
147
+ details: { current: context.recentTaskCount, limit: context.config.maxTasksPerMinute }
148
+ };
149
+ }
150
+ },
151
+ // 规则 3: 危险关键词检查
152
+ {
153
+ id: 'dangerous-keywords',
154
+ name: '危险关键词检查',
155
+ description: '检查任务描述中是否包含危险关键词',
156
+ enabled: true,
157
+ severity: 'block',
158
+ check: (task, context) => {
159
+ const description = task.description.toLowerCase();
160
+ const found = context.config.blockedKeywords.filter(kw => description.includes(kw.toLowerCase()));
161
+ return {
162
+ passed: found.length === 0,
163
+ severity: 'block',
164
+ ruleId: 'dangerous-keywords',
165
+ message: found.length > 0
166
+ ? `发现危险关键词: ${found.join(', ')}`
167
+ : '未检测到危险关键词',
168
+ details: { found }
169
+ };
170
+ }
171
+ },
172
+ // 规则 4: 危险模式检查(正则)
173
+ {
174
+ id: 'dangerous-patterns',
175
+ name: '危险模式检查',
176
+ description: '使用正则表达式检测危险命令模式',
177
+ enabled: true,
178
+ severity: 'block',
179
+ check: (task, context) => {
180
+ const description = task.description;
181
+ const found = [];
182
+ for (const pattern of context.config.dangerousPatterns) {
183
+ if (pattern.test(description)) {
184
+ found.push(pattern.source);
185
+ }
186
+ }
187
+ return {
188
+ passed: found.length === 0,
189
+ severity: 'block',
190
+ ruleId: 'dangerous-patterns',
191
+ message: found.length > 0
192
+ ? `发现危险命令模式`
193
+ : '未检测到危险模式',
194
+ details: { patternsFound: found.length }
195
+ };
196
+ }
197
+ },
198
+ // 规则 5: 信誉检查
199
+ {
200
+ id: 'reputation',
201
+ name: '信誉检查',
202
+ description: '检查请求者信誉是否足够',
203
+ enabled: true,
204
+ severity: 'warn',
205
+ check: (task, context) => {
206
+ if (!context.requesterReputation) {
207
+ return {
208
+ passed: true,
209
+ severity: 'info',
210
+ ruleId: 'reputation',
211
+ message: '无信誉记录,使用默认处理'
212
+ };
213
+ }
214
+ const rep = context.requesterReputation.score;
215
+ const isDangerous = this.isDangerousTask(task);
216
+ if (isDangerous && rep < context.config.minReputationForDangerous) {
217
+ return {
218
+ passed: false,
219
+ severity: 'warn',
220
+ ruleId: 'reputation',
221
+ message: `信誉不足执行危险任务: ${rep} < ${context.config.minReputationForDangerous}`,
222
+ details: { reputation: rep, required: context.config.minReputationForDangerous }
223
+ };
224
+ }
225
+ return {
226
+ passed: true,
227
+ severity: 'info',
228
+ ruleId: 'reputation',
229
+ message: `信誉检查通过: ${rep}`,
230
+ details: { reputation: rep }
231
+ };
232
+ }
233
+ },
234
+ // 规则 6: 文件操作检查
235
+ {
236
+ id: 'file-operation',
237
+ name: '文件操作检查',
238
+ description: '检查文件操作是否在允许范围内',
239
+ enabled: true,
240
+ severity: 'warn',
241
+ check: (task, context) => {
242
+ const description = task.description.toLowerCase();
243
+ const isFileOp = /\b(read|write|edit|delete|remove)\b/.test(description);
244
+ const hasPath = /[\/~]\w+/.test(description);
245
+ if (isFileOp && hasPath) {
246
+ // 检查是否是系统路径
247
+ const systemPaths = ['/etc/', '/sys/', '/proc/', '/dev/', 'c:\\windows'];
248
+ const hasSystemPath = systemPaths.some(p => description.includes(p));
249
+ if (hasSystemPath) {
250
+ return {
251
+ passed: false,
252
+ severity: 'warn',
253
+ ruleId: 'file-operation',
254
+ message: '检测到系统路径文件操作,需要确认',
255
+ details: { systemPath: true }
256
+ };
257
+ }
258
+ }
259
+ return {
260
+ passed: true,
261
+ severity: 'info',
262
+ ruleId: 'file-operation',
263
+ message: '文件操作检查通过'
264
+ };
265
+ }
266
+ },
267
+ // 规则 7: 网络操作检查
268
+ {
269
+ id: 'network-operation',
270
+ name: '网络操作检查',
271
+ description: '检查网络操作是否可疑',
272
+ enabled: true,
273
+ severity: 'warn',
274
+ check: (task, context) => {
275
+ const description = task.description.toLowerCase();
276
+ const isNetworkOp = /\b(fetch|download|curl|wget|http|api)\b/.test(description);
277
+ if (isNetworkOp) {
278
+ const suspicious = ['exe', 'dll', 'sh', 'bash', 'python', 'script'];
279
+ const hasSuspicious = suspicious.some(s => description.includes(s));
280
+ if (hasSuspicious) {
281
+ return {
282
+ passed: false,
283
+ severity: 'warn',
284
+ ruleId: 'network-operation',
285
+ message: '检测到可疑的网络下载操作',
286
+ details: { suspicious: true }
287
+ };
288
+ }
289
+ }
290
+ return {
291
+ passed: true,
292
+ severity: 'info',
293
+ ruleId: 'network-operation',
294
+ message: '网络操作检查通过'
295
+ };
296
+ }
297
+ }
298
+ ];
299
+ }
300
+ isDangerousTask(task) {
301
+ const description = task.description.toLowerCase();
302
+ // 检查关键词
303
+ if (this.config.blockedKeywords.some(kw => description.includes(kw.toLowerCase()))) {
304
+ return true;
305
+ }
306
+ // 检查模式
307
+ if (this.config.dangerousPatterns.some(p => p.test(description))) {
308
+ return true;
309
+ }
310
+ return false;
311
+ }
312
+ getRecentTaskCount(peerId) {
313
+ const now = Date.now();
314
+ const oneMinuteAgo = now - 60000;
315
+ const timestamps = this.recentTasks.get(peerId) || [];
316
+ const recent = timestamps.filter(t => t > oneMinuteAgo);
317
+ // 更新存储
318
+ this.recentTasks.set(peerId, recent);
319
+ return recent.length;
320
+ }
321
+ recordTask(peerId) {
322
+ const timestamps = this.recentTasks.get(peerId) || [];
323
+ timestamps.push(Date.now());
324
+ this.recentTasks.set(peerId, timestamps);
325
+ }
326
+ }
327
+ exports.TaskGuard = TaskGuard;
328
+ // 导出单例
329
+ exports.taskGuard = new TaskGuard();
330
+ //# sourceMappingURL=task-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-guard.js","sourceRoot":"","sources":["../src/task-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * F2A Task Queue
3
+ * 管理待处理和已完成的远程任务
4
+ */
5
+ import type { TaskRequest, TaskResponse } from './types.js';
6
+ export interface QueuedTask extends TaskRequest {
7
+ status: 'pending' | 'processing' | 'completed' | 'failed';
8
+ createdAt: number;
9
+ updatedAt?: number;
10
+ result?: unknown;
11
+ error?: string;
12
+ latency?: number;
13
+ }
14
+ export interface TaskQueueStats {
15
+ pending: number;
16
+ processing: number;
17
+ completed: number;
18
+ failed: number;
19
+ total: number;
20
+ }
21
+ export declare class TaskQueue {
22
+ private tasks;
23
+ private maxSize;
24
+ private maxAgeMs;
25
+ constructor(options?: {
26
+ maxSize?: number;
27
+ maxAgeMs?: number;
28
+ });
29
+ /**
30
+ * 添加新任务到队列
31
+ */
32
+ add(request: TaskRequest): QueuedTask;
33
+ /**
34
+ * 获取待处理任务
35
+ */
36
+ getPending(limit?: number): QueuedTask[];
37
+ /**
38
+ * 标记任务为处理中
39
+ */
40
+ markProcessing(taskId: string): QueuedTask | undefined;
41
+ /**
42
+ * 完成任务
43
+ */
44
+ complete(taskId: string, response: TaskResponse): QueuedTask | undefined;
45
+ /**
46
+ * 获取任务
47
+ */
48
+ get(taskId: string): QueuedTask | undefined;
49
+ /**
50
+ * 删除任务
51
+ */
52
+ delete(taskId: string): boolean;
53
+ /**
54
+ * 获取队列统计
55
+ */
56
+ getStats(): TaskQueueStats;
57
+ /**
58
+ * 获取所有任务
59
+ */
60
+ getAll(): QueuedTask[];
61
+ /**
62
+ * 清理过期任务
63
+ */
64
+ cleanup(): void;
65
+ /**
66
+ * 清空队列
67
+ */
68
+ clear(): void;
69
+ }
70
+ export declare const taskQueue: TaskQueue;
71
+ //# sourceMappingURL=task-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.d.ts","sourceRoot":"","sources":["../src/task-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU;IAmBrC;;OAEG;IACH,UAAU,CAAC,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAO5C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAStD;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAiBxE;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,QAAQ,IAAI,cAAc;IAW1B;;OAEG;IACH,MAAM,IAAI,UAAU,EAAE;IAItB;;OAEG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * F2A Task Queue
4
+ * 管理待处理和已完成的远程任务
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.taskQueue = exports.TaskQueue = void 0;
8
+ class TaskQueue {
9
+ tasks = new Map();
10
+ maxSize;
11
+ maxAgeMs;
12
+ constructor(options) {
13
+ this.maxSize = options?.maxSize || 1000;
14
+ this.maxAgeMs = options?.maxAgeMs || 24 * 60 * 60 * 1000; // 24小时
15
+ }
16
+ /**
17
+ * 添加新任务到队列
18
+ */
19
+ add(request) {
20
+ // 清理旧任务
21
+ this.cleanup();
22
+ // 检查队列是否已满
23
+ if (this.tasks.size >= this.maxSize) {
24
+ throw new Error('Task queue is full');
25
+ }
26
+ const task = {
27
+ ...request,
28
+ status: 'pending',
29
+ createdAt: Date.now()
30
+ };
31
+ this.tasks.set(request.taskId, task);
32
+ return task;
33
+ }
34
+ /**
35
+ * 获取待处理任务
36
+ */
37
+ getPending(limit = 10) {
38
+ return Array.from(this.tasks.values())
39
+ .filter(t => t.status === 'pending')
40
+ .sort((a, b) => a.createdAt - b.createdAt)
41
+ .slice(0, limit);
42
+ }
43
+ /**
44
+ * 标记任务为处理中
45
+ */
46
+ markProcessing(taskId) {
47
+ const task = this.tasks.get(taskId);
48
+ if (!task)
49
+ return undefined;
50
+ task.status = 'processing';
51
+ task.updatedAt = Date.now();
52
+ return task;
53
+ }
54
+ /**
55
+ * 完成任务
56
+ */
57
+ complete(taskId, response) {
58
+ const task = this.tasks.get(taskId);
59
+ if (!task)
60
+ return undefined;
61
+ if (response.status === 'success') {
62
+ task.status = 'completed';
63
+ task.result = response.result;
64
+ }
65
+ else {
66
+ task.status = 'failed';
67
+ task.error = response.error;
68
+ }
69
+ task.latency = response.latency;
70
+ task.updatedAt = Date.now();
71
+ return task;
72
+ }
73
+ /**
74
+ * 获取任务
75
+ */
76
+ get(taskId) {
77
+ return this.tasks.get(taskId);
78
+ }
79
+ /**
80
+ * 删除任务
81
+ */
82
+ delete(taskId) {
83
+ return this.tasks.delete(taskId);
84
+ }
85
+ /**
86
+ * 获取队列统计
87
+ */
88
+ getStats() {
89
+ const tasks = Array.from(this.tasks.values());
90
+ return {
91
+ pending: tasks.filter(t => t.status === 'pending').length,
92
+ processing: tasks.filter(t => t.status === 'processing').length,
93
+ completed: tasks.filter(t => t.status === 'completed').length,
94
+ failed: tasks.filter(t => t.status === 'failed').length,
95
+ total: tasks.length
96
+ };
97
+ }
98
+ /**
99
+ * 获取所有任务
100
+ */
101
+ getAll() {
102
+ return Array.from(this.tasks.values());
103
+ }
104
+ /**
105
+ * 清理过期任务
106
+ */
107
+ cleanup() {
108
+ const now = Date.now();
109
+ for (const [id, task] of this.tasks) {
110
+ const age = now - task.createdAt;
111
+ if (age > this.maxAgeMs) {
112
+ this.tasks.delete(id);
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * 清空队列
118
+ */
119
+ clear() {
120
+ this.tasks.clear();
121
+ }
122
+ }
123
+ exports.TaskQueue = TaskQueue;
124
+ // 导出单例实例
125
+ exports.taskQueue = new TaskQueue();
126
+ //# sourceMappingURL=task-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../src/task-queue.ts"],"names":[],"mappings":"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"}