@f2a/openclaw-f2a 0.2.20

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 (71) hide show
  1. package/README.md +510 -0
  2. package/dist/agent-manager.d.ts +78 -0
  3. package/dist/agent-manager.d.ts.map +1 -0
  4. package/dist/agent-manager.js +206 -0
  5. package/dist/agent-manager.js.map +1 -0
  6. package/dist/announcement-queue.d.ts +152 -0
  7. package/dist/announcement-queue.d.ts.map +1 -0
  8. package/dist/announcement-queue.js +307 -0
  9. package/dist/announcement-queue.js.map +1 -0
  10. package/dist/capability-detector.d.ts +21 -0
  11. package/dist/capability-detector.d.ts.map +1 -0
  12. package/dist/capability-detector.js +178 -0
  13. package/dist/capability-detector.js.map +1 -0
  14. package/dist/claim-handlers.d.ts +75 -0
  15. package/dist/claim-handlers.d.ts.map +1 -0
  16. package/dist/claim-handlers.js +368 -0
  17. package/dist/claim-handlers.js.map +1 -0
  18. package/dist/connector.d.ts +174 -0
  19. package/dist/connector.d.ts.map +1 -0
  20. package/dist/connector.js +1284 -0
  21. package/dist/connector.js.map +1 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +45 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +28 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +44 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/network-client.d.ts +73 -0
  31. package/dist/network-client.d.ts.map +1 -0
  32. package/dist/network-client.js +202 -0
  33. package/dist/network-client.js.map +1 -0
  34. package/dist/node-manager.d.ts +79 -0
  35. package/dist/node-manager.d.ts.map +1 -0
  36. package/dist/node-manager.js +374 -0
  37. package/dist/node-manager.js.map +1 -0
  38. package/dist/plugin.d.ts +22 -0
  39. package/dist/plugin.d.ts.map +1 -0
  40. package/dist/plugin.js +148 -0
  41. package/dist/plugin.js.map +1 -0
  42. package/dist/reputation.d.ts +156 -0
  43. package/dist/reputation.d.ts.map +1 -0
  44. package/dist/reputation.js +432 -0
  45. package/dist/reputation.js.map +1 -0
  46. package/dist/task-guard.d.ts +159 -0
  47. package/dist/task-guard.d.ts.map +1 -0
  48. package/dist/task-guard.js +763 -0
  49. package/dist/task-guard.js.map +1 -0
  50. package/dist/task-queue.d.ts +130 -0
  51. package/dist/task-queue.d.ts.map +1 -0
  52. package/dist/task-queue.js +592 -0
  53. package/dist/task-queue.js.map +1 -0
  54. package/dist/tool-handlers.d.ts +158 -0
  55. package/dist/tool-handlers.d.ts.map +1 -0
  56. package/dist/tool-handlers.js +727 -0
  57. package/dist/tool-handlers.js.map +1 -0
  58. package/dist/types.d.ts +417 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +29 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/webhook-pusher.d.ts +71 -0
  63. package/dist/webhook-pusher.d.ts.map +1 -0
  64. package/dist/webhook-pusher.js +175 -0
  65. package/dist/webhook-pusher.js.map +1 -0
  66. package/dist/webhook-server.d.ts +70 -0
  67. package/dist/webhook-server.d.ts.map +1 -0
  68. package/dist/webhook-server.js +191 -0
  69. package/dist/webhook-server.js.map +1 -0
  70. package/openclaw.plugin.json +107 -0
  71. package/package.json +53 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * 信誉系统
3
+ * 管理 Peer 的信誉分数
4
+ */
5
+ import type { IReputationManager, IReputationEntry } from '@f2a/network';
6
+ import type { ReputationEntry, ReputationConfig } from './types.js';
7
+ export declare class ReputationSystem {
8
+ private config;
9
+ private entries;
10
+ private dataPath;
11
+ private savePending;
12
+ private saveTimer?;
13
+ private lastSaveTime;
14
+ private debounceConfig;
15
+ constructor(config: ReputationConfig, dataDir: string);
16
+ /**
17
+ * 获取 Peer 信誉
18
+ */
19
+ getReputation(peerId: string): ReputationEntry;
20
+ /**
21
+ * 记录任务成功
22
+ */
23
+ recordSuccess(peerId: string, taskId: string, latency: number): void;
24
+ /**
25
+ * 记录任务失败
26
+ */
27
+ recordFailure(peerId: string, taskId: string, reason?: string): void;
28
+ /**
29
+ * 记录任务拒绝
30
+ */
31
+ recordRejection(peerId: string, taskId: string, reason?: string): void;
32
+ /**
33
+ * 记录超时
34
+ */
35
+ recordTimeout(peerId: string, taskId: string): void;
36
+ /**
37
+ * 记录恶意行为
38
+ */
39
+ recordMalicious(peerId: string, reason: string): void;
40
+ /**
41
+ * 检查是否允许服务
42
+ */
43
+ isAllowed(peerId: string): boolean;
44
+ /**
45
+ * 检查节点是否具有指定权限
46
+ * 基于信誉分数判断权限等级
47
+ *
48
+ * 权限等级:
49
+ * - restricted (0-20): 仅可执行
50
+ * - novice (20-40): 可发布、可执行
51
+ * - participant (40-60): 可发布、可执行、可评审
52
+ * - contributor (60-80): 可发布、可执行、可评审,发布优先级更高
53
+ * - core (80-100): 可发布、可执行、可评审,最高发布优先级
54
+ *
55
+ * @param peerId - 节点的唯一标识符
56
+ * @param permission - 要检查的权限类型:'publish'(发布)、'execute'(执行)、'review'(评审)
57
+ * @returns 如果节点具有该权限则返回 true,否则返回 false
58
+ */
59
+ hasPermission(peerId: string, permission: 'publish' | 'execute' | 'review'): boolean;
60
+ /**
61
+ * 记录评审奖励
62
+ * 当节点完成评审任务时调用,会提高信誉分数
63
+ * @param peerId - 节点的唯一标识符
64
+ * @param delta - 分数变化量,默认为 3
65
+ */
66
+ recordReviewReward(peerId: string, delta?: number): void;
67
+ /**
68
+ * 记录评审惩罚
69
+ * 当节点提供低质量评审或违规时调用,会降低信誉分数
70
+ * @param peerId - 节点的唯一标识符
71
+ * @param delta - 分数变化量,默认为 -5
72
+ * @param reason - 可选的惩罚原因描述
73
+ */
74
+ recordReviewPenalty(peerId: string, delta?: number, reason?: string): void;
75
+ /**
76
+ * 获取所有信誉记录
77
+ */
78
+ getAllReputations(): ReputationEntry[];
79
+ /**
80
+ * 清理过期记录
81
+ */
82
+ cleanup(maxAgeDays?: number): void;
83
+ /**
84
+ * 获取高信誉节点
85
+ */
86
+ getHighReputationNodes(minScore: number): ReputationEntry[];
87
+ /**
88
+ * 创建默认条目
89
+ */
90
+ private createDefaultEntry;
91
+ /**
92
+ * 更新平均响应时间
93
+ */
94
+ private updateAvgResponseTime;
95
+ /**
96
+ * 修剪历史记录
97
+ */
98
+ private trimHistory;
99
+ /**
100
+ * 加载数据
101
+ */
102
+ private load;
103
+ /**
104
+ * 保存数据(防抖 + 异步写入)
105
+ *
106
+ * P0 修复:使用防抖机制避免高并发下的阻塞问题
107
+ * - 短时间内多次调用只触发一次实际写入
108
+ * - 使用异步写入避免阻塞主线程
109
+ * - 原子写入保证数据完整性
110
+ */
111
+ private save;
112
+ /**
113
+ * 执行实际的保存操作(异步)
114
+ */
115
+ private doSave;
116
+ /**
117
+ * 强制同步保存(用于关闭时)
118
+ */
119
+ flush(): void;
120
+ /**
121
+ * 同步保存操作(用于关闭时确保数据持久化)
122
+ */
123
+ private doSaveSync;
124
+ }
125
+ /**
126
+ * ReputationManager 适配器
127
+ *
128
+ * 将 ReputationSystem 包装为 ReviewCommittee 所需的 IReputationManager 接口。
129
+ * 用于解决 ReviewCommittee (src/core/) 依赖 IReputationManager 接口,
130
+ * 而 adapter 使用的是 ReputationSystem 的问题。
131
+ */
132
+ export declare class ReputationManagerAdapter implements IReputationManager {
133
+ private reputationSystem;
134
+ constructor(reputationSystem: ReputationSystem);
135
+ /**
136
+ * 检查节点是否具有指定权限
137
+ */
138
+ hasPermission(peerId: string, permission: 'publish' | 'execute' | 'review'): boolean;
139
+ /**
140
+ * 获取高信誉节点
141
+ */
142
+ getHighReputationNodes(minScore: number): IReputationEntry[];
143
+ /**
144
+ * 获取所有信誉记录
145
+ */
146
+ getAllReputations(): IReputationEntry[];
147
+ /**
148
+ * 记录评审惩罚
149
+ */
150
+ recordReviewPenalty(peerId: string, delta: number, reason?: string): void;
151
+ /**
152
+ * 记录评审奖励
153
+ */
154
+ recordReviewReward(peerId: string, delta: number): void;
155
+ }
156
+ //# sourceMappingURL=reputation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../src/reputation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+ /**
3
+ * 信誉系统
4
+ * 管理 Peer 的信誉分数
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ReputationManagerAdapter = exports.ReputationSystem = void 0;
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const types_js_1 = require("./types.js");
11
+ const logger_js_1 = require("./logger.js");
12
+ class ReputationSystem {
13
+ config;
14
+ entries = new Map();
15
+ dataPath;
16
+ // 防抖写入相关
17
+ savePending = false;
18
+ saveTimer;
19
+ lastSaveTime = Date.now(); // 初始化为当前时间,避免首次调用立即触发
20
+ debounceConfig = {
21
+ delayMs: 100, // 100ms 防抖延迟
22
+ maxWaitMs: 1000 // 最多等待 1 秒
23
+ };
24
+ constructor(config, dataDir) {
25
+ this.config = config;
26
+ this.dataPath = (0, path_1.join)(dataDir, 'reputation.json');
27
+ this.load();
28
+ }
29
+ /**
30
+ * 获取 Peer 信誉
31
+ */
32
+ getReputation(peerId) {
33
+ if (!this.entries.has(peerId)) {
34
+ this.entries.set(peerId, this.createDefaultEntry(peerId));
35
+ }
36
+ return this.entries.get(peerId);
37
+ }
38
+ /**
39
+ * 记录任务成功
40
+ */
41
+ recordSuccess(peerId, taskId, latency) {
42
+ const entry = this.getReputation(peerId);
43
+ entry.successfulTasks++;
44
+ entry.totalTasks++;
45
+ entry.score = Math.min(100, entry.score + 10);
46
+ entry.avgResponseTime = this.updateAvgResponseTime(entry, latency);
47
+ entry.lastInteraction = Date.now();
48
+ entry.history.push({
49
+ type: 'task_success',
50
+ taskId,
51
+ delta: +10,
52
+ timestamp: Date.now()
53
+ });
54
+ this.trimHistory(entry);
55
+ this.save();
56
+ }
57
+ /**
58
+ * 记录任务失败
59
+ */
60
+ recordFailure(peerId, taskId, reason) {
61
+ const entry = this.getReputation(peerId);
62
+ entry.failedTasks++;
63
+ entry.totalTasks++;
64
+ entry.score = Math.max(0, entry.score - 20);
65
+ entry.lastInteraction = Date.now();
66
+ entry.history.push({
67
+ type: 'task_failure',
68
+ taskId,
69
+ delta: -20,
70
+ timestamp: Date.now(),
71
+ reason
72
+ });
73
+ this.trimHistory(entry);
74
+ this.save();
75
+ }
76
+ /**
77
+ * 记录任务拒绝
78
+ */
79
+ recordRejection(peerId, taskId, reason) {
80
+ const entry = this.getReputation(peerId);
81
+ entry.totalTasks++;
82
+ entry.score = Math.max(0, entry.score - 5);
83
+ entry.lastInteraction = Date.now();
84
+ entry.history.push({
85
+ type: 'task_rejected',
86
+ taskId,
87
+ delta: -5,
88
+ timestamp: Date.now(),
89
+ reason
90
+ });
91
+ this.trimHistory(entry);
92
+ this.save();
93
+ }
94
+ /**
95
+ * 记录超时
96
+ */
97
+ recordTimeout(peerId, taskId) {
98
+ const entry = this.getReputation(peerId);
99
+ entry.totalTasks++;
100
+ entry.score = Math.max(0, entry.score - 15);
101
+ entry.lastInteraction = Date.now();
102
+ entry.history.push({
103
+ type: 'timeout',
104
+ taskId,
105
+ delta: -15,
106
+ timestamp: Date.now()
107
+ });
108
+ this.trimHistory(entry);
109
+ this.save();
110
+ }
111
+ /**
112
+ * 记录恶意行为
113
+ */
114
+ recordMalicious(peerId, reason) {
115
+ const entry = this.getReputation(peerId);
116
+ entry.score = Math.max(0, entry.score - 50);
117
+ entry.lastInteraction = Date.now();
118
+ entry.history.push({
119
+ type: 'malicious',
120
+ delta: -50,
121
+ timestamp: Date.now(),
122
+ reason
123
+ });
124
+ this.trimHistory(entry);
125
+ this.save();
126
+ }
127
+ /**
128
+ * 检查是否允许服务
129
+ */
130
+ isAllowed(peerId) {
131
+ if (!types_js_1.INTERNAL_REPUTATION_CONFIG.enabled)
132
+ return true;
133
+ const entry = this.getReputation(peerId);
134
+ return entry.score >= types_js_1.INTERNAL_REPUTATION_CONFIG.minScoreForService;
135
+ }
136
+ /**
137
+ * 检查节点是否具有指定权限
138
+ * 基于信誉分数判断权限等级
139
+ *
140
+ * 权限等级:
141
+ * - restricted (0-20): 仅可执行
142
+ * - novice (20-40): 可发布、可执行
143
+ * - participant (40-60): 可发布、可执行、可评审
144
+ * - contributor (60-80): 可发布、可执行、可评审,发布优先级更高
145
+ * - core (80-100): 可发布、可执行、可评审,最高发布优先级
146
+ *
147
+ * @param peerId - 节点的唯一标识符
148
+ * @param permission - 要检查的权限类型:'publish'(发布)、'execute'(执行)、'review'(评审)
149
+ * @returns 如果节点具有该权限则返回 true,否则返回 false
150
+ */
151
+ hasPermission(peerId, permission) {
152
+ const entry = this.getReputation(peerId);
153
+ const score = entry.score;
154
+ // 根据分数确定权限
155
+ switch (permission) {
156
+ case 'publish':
157
+ // 20分以上可发布
158
+ return score >= 20;
159
+ case 'execute':
160
+ // 所有节点都可以执行
161
+ return true;
162
+ case 'review':
163
+ // 40分以上可评审
164
+ return score >= 40;
165
+ default:
166
+ return false;
167
+ }
168
+ }
169
+ /**
170
+ * 记录评审奖励
171
+ * 当节点完成评审任务时调用,会提高信誉分数
172
+ * @param peerId - 节点的唯一标识符
173
+ * @param delta - 分数变化量,默认为 3
174
+ */
175
+ recordReviewReward(peerId, delta = types_js_1.INTERNAL_REPUTATION_CONFIG.reviewReward) {
176
+ const entry = this.getReputation(peerId);
177
+ entry.score = Math.min(100, entry.score + delta);
178
+ entry.lastInteraction = Date.now();
179
+ entry.history.push({
180
+ type: 'review_reward',
181
+ delta,
182
+ timestamp: Date.now()
183
+ });
184
+ this.trimHistory(entry);
185
+ this.save();
186
+ }
187
+ /**
188
+ * 记录评审惩罚
189
+ * 当节点提供低质量评审或违规时调用,会降低信誉分数
190
+ * @param peerId - 节点的唯一标识符
191
+ * @param delta - 分数变化量,默认为 -5
192
+ * @param reason - 可选的惩罚原因描述
193
+ */
194
+ recordReviewPenalty(peerId, delta = -types_js_1.INTERNAL_REPUTATION_CONFIG.reviewPenalty, reason) {
195
+ const entry = this.getReputation(peerId);
196
+ entry.score = Math.max(0, entry.score + delta);
197
+ entry.lastInteraction = Date.now();
198
+ entry.history.push({
199
+ type: 'review_penalty',
200
+ delta,
201
+ timestamp: Date.now(),
202
+ reason
203
+ });
204
+ this.trimHistory(entry);
205
+ this.save();
206
+ }
207
+ /**
208
+ * 获取所有信誉记录
209
+ */
210
+ getAllReputations() {
211
+ return Array.from(this.entries.values());
212
+ }
213
+ /**
214
+ * 清理过期记录
215
+ */
216
+ cleanup(maxAgeDays = 30) {
217
+ const cutoff = Date.now() - (maxAgeDays * 24 * 60 * 60 * 1000);
218
+ for (const [peerId, entry] of this.entries) {
219
+ if (entry.lastInteraction < cutoff && entry.totalTasks === 0) {
220
+ this.entries.delete(peerId);
221
+ }
222
+ }
223
+ this.save();
224
+ }
225
+ /**
226
+ * 获取高信誉节点
227
+ */
228
+ getHighReputationNodes(minScore) {
229
+ return Array.from(this.entries.values())
230
+ .filter(entry => entry.score >= minScore);
231
+ }
232
+ /**
233
+ * 创建默认条目
234
+ */
235
+ createDefaultEntry(peerId) {
236
+ return {
237
+ peerId,
238
+ score: types_js_1.INTERNAL_REPUTATION_CONFIG.initialScore,
239
+ successfulTasks: 0,
240
+ failedTasks: 0,
241
+ totalTasks: 0,
242
+ avgResponseTime: 0,
243
+ lastInteraction: 0,
244
+ history: []
245
+ };
246
+ }
247
+ /**
248
+ * 更新平均响应时间
249
+ */
250
+ updateAvgResponseTime(entry, newLatency) {
251
+ if (entry.avgResponseTime === 0) {
252
+ return newLatency;
253
+ }
254
+ // 指数移动平均
255
+ return entry.avgResponseTime * 0.7 + newLatency * 0.3;
256
+ }
257
+ /**
258
+ * 修剪历史记录
259
+ */
260
+ trimHistory(entry, maxSize = 100) {
261
+ if (entry.history.length > maxSize) {
262
+ entry.history = entry.history.slice(-maxSize);
263
+ }
264
+ }
265
+ /**
266
+ * 加载数据
267
+ */
268
+ load() {
269
+ if ((0, fs_1.existsSync)(this.dataPath)) {
270
+ try {
271
+ const data = JSON.parse((0, fs_1.readFileSync)(this.dataPath, 'utf-8'));
272
+ for (const entry of data) {
273
+ this.entries.set(entry.peerId, entry);
274
+ }
275
+ logger_js_1.pluginLogger.info('加载了 %d 条信誉记录', this.entries.size);
276
+ }
277
+ catch (e) {
278
+ logger_js_1.pluginLogger.error('加载信誉数据失败: error=%s', e);
279
+ }
280
+ }
281
+ }
282
+ /**
283
+ * 保存数据(防抖 + 异步写入)
284
+ *
285
+ * P0 修复:使用防抖机制避免高并发下的阻塞问题
286
+ * - 短时间内多次调用只触发一次实际写入
287
+ * - 使用异步写入避免阻塞主线程
288
+ * - 原子写入保证数据完整性
289
+ */
290
+ save() {
291
+ // 标记有待保存的数据
292
+ this.savePending = true;
293
+ // 如果已有定时器,先清除
294
+ if (this.saveTimer) {
295
+ clearTimeout(this.saveTimer);
296
+ }
297
+ const now = Date.now();
298
+ const timeSinceLastSave = now - this.lastSaveTime;
299
+ // 如果距离上次保存超过 maxWaitMs,立即保存
300
+ if (timeSinceLastSave >= this.debounceConfig.maxWaitMs) {
301
+ this.doSave();
302
+ return;
303
+ }
304
+ // 否则设置防抖定时器
305
+ this.saveTimer = setTimeout(() => {
306
+ if (this.savePending) {
307
+ this.doSave();
308
+ }
309
+ }, this.debounceConfig.delayMs);
310
+ // 防止定时器阻止进程退出
311
+ if (this.saveTimer.unref) {
312
+ this.saveTimer.unref();
313
+ }
314
+ }
315
+ /**
316
+ * 执行实际的保存操作(异步)
317
+ */
318
+ doSave() {
319
+ this.savePending = false;
320
+ this.saveTimer = undefined;
321
+ this.lastSaveTime = Date.now();
322
+ const tempPath = `${this.dataPath}.tmp`;
323
+ // 使用 setImmediate 将文件操作移到下一个事件循环
324
+ // 避免阻塞当前操作
325
+ setImmediate(() => {
326
+ try {
327
+ const data = Array.from(this.entries.values());
328
+ const jsonContent = JSON.stringify(data, null, 2);
329
+ // 1. 写入临时文件
330
+ (0, fs_1.writeFileSync)(tempPath, jsonContent, { encoding: 'utf-8' });
331
+ // 2. 原子重命名(在 POSIX 系统上是原子操作)
332
+ (0, fs_1.renameSync)(tempPath, this.dataPath);
333
+ }
334
+ catch (e) {
335
+ logger_js_1.pluginLogger.error('保存信誉数据失败: error=%s', e);
336
+ // 清理临时文件(如果存在)
337
+ try {
338
+ if ((0, fs_1.existsSync)(tempPath)) {
339
+ (0, fs_1.unlinkSync)(tempPath);
340
+ }
341
+ }
342
+ catch {
343
+ // 忽略清理错误
344
+ }
345
+ }
346
+ });
347
+ }
348
+ /**
349
+ * 强制同步保存(用于关闭时)
350
+ */
351
+ flush() {
352
+ // 清除防抖定时器
353
+ if (this.saveTimer) {
354
+ clearTimeout(this.saveTimer);
355
+ this.saveTimer = undefined;
356
+ }
357
+ // 如果有待保存的数据,立即同步保存
358
+ if (this.savePending) {
359
+ this.savePending = false;
360
+ this.doSaveSync();
361
+ }
362
+ }
363
+ /**
364
+ * 同步保存操作(用于关闭时确保数据持久化)
365
+ */
366
+ doSaveSync() {
367
+ const tempPath = `${this.dataPath}.tmp`;
368
+ try {
369
+ const data = Array.from(this.entries.values());
370
+ const jsonContent = JSON.stringify(data, null, 2);
371
+ (0, fs_1.writeFileSync)(tempPath, jsonContent, { encoding: 'utf-8' });
372
+ (0, fs_1.renameSync)(tempPath, this.dataPath);
373
+ }
374
+ catch (e) {
375
+ logger_js_1.pluginLogger.error('同步保存信誉数据失败: error=%s', e);
376
+ try {
377
+ if ((0, fs_1.existsSync)(tempPath)) {
378
+ (0, fs_1.unlinkSync)(tempPath);
379
+ }
380
+ }
381
+ catch {
382
+ // 忽略清理错误
383
+ }
384
+ }
385
+ }
386
+ }
387
+ exports.ReputationSystem = ReputationSystem;
388
+ /**
389
+ * ReputationManager 适配器
390
+ *
391
+ * 将 ReputationSystem 包装为 ReviewCommittee 所需的 IReputationManager 接口。
392
+ * 用于解决 ReviewCommittee (src/core/) 依赖 IReputationManager 接口,
393
+ * 而 adapter 使用的是 ReputationSystem 的问题。
394
+ */
395
+ class ReputationManagerAdapter {
396
+ reputationSystem;
397
+ constructor(reputationSystem) {
398
+ this.reputationSystem = reputationSystem;
399
+ }
400
+ /**
401
+ * 检查节点是否具有指定权限
402
+ */
403
+ hasPermission(peerId, permission) {
404
+ return this.reputationSystem.hasPermission(peerId, permission);
405
+ }
406
+ /**
407
+ * 获取高信誉节点
408
+ */
409
+ getHighReputationNodes(minScore) {
410
+ return this.reputationSystem.getHighReputationNodes(minScore);
411
+ }
412
+ /**
413
+ * 获取所有信誉记录
414
+ */
415
+ getAllReputations() {
416
+ return this.reputationSystem.getAllReputations();
417
+ }
418
+ /**
419
+ * 记录评审惩罚
420
+ */
421
+ recordReviewPenalty(peerId, delta, reason) {
422
+ this.reputationSystem.recordReviewPenalty(peerId, delta, reason);
423
+ }
424
+ /**
425
+ * 记录评审奖励
426
+ */
427
+ recordReviewReward(peerId, delta) {
428
+ this.reputationSystem.recordReviewReward(peerId, delta);
429
+ }
430
+ }
431
+ exports.ReputationManagerAdapter = ReputationManagerAdapter;
432
+ //# sourceMappingURL=reputation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.js","sourceRoot":"","sources":["../src/reputation.ts"],"names":[],"mappings":"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"}