@f2a/network 0.1.2

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 (234) hide show
  1. package/.github/workflows/ci.yml +113 -0
  2. package/.github/workflows/publish.yml +60 -0
  3. package/LICENSE +21 -0
  4. package/MONOREPO.md +58 -0
  5. package/README.md +280 -0
  6. package/SKILL.md +137 -0
  7. package/dist/adapters/openclaw.d.ts +103 -0
  8. package/dist/adapters/openclaw.d.ts.map +1 -0
  9. package/dist/adapters/openclaw.js +297 -0
  10. package/dist/adapters/openclaw.js.map +1 -0
  11. package/dist/cli/commands.d.ts +17 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +107 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/index.d.ts +6 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +203 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/core/autonomous-economy.d.ts +136 -0
  20. package/dist/core/autonomous-economy.d.ts.map +1 -0
  21. package/dist/core/autonomous-economy.js +255 -0
  22. package/dist/core/autonomous-economy.js.map +1 -0
  23. package/dist/core/connection-manager.d.ts +80 -0
  24. package/dist/core/connection-manager.d.ts.map +1 -0
  25. package/dist/core/connection-manager.js +235 -0
  26. package/dist/core/connection-manager.js.map +1 -0
  27. package/dist/core/connection-manager.test.d.ts +2 -0
  28. package/dist/core/connection-manager.test.d.ts.map +1 -0
  29. package/dist/core/connection-manager.test.js +52 -0
  30. package/dist/core/connection-manager.test.js.map +1 -0
  31. package/dist/core/e2ee-crypto.d.ts +90 -0
  32. package/dist/core/e2ee-crypto.d.ts.map +1 -0
  33. package/dist/core/e2ee-crypto.js +190 -0
  34. package/dist/core/e2ee-crypto.js.map +1 -0
  35. package/dist/core/f2a.d.ts +126 -0
  36. package/dist/core/f2a.d.ts.map +1 -0
  37. package/dist/core/f2a.js +425 -0
  38. package/dist/core/f2a.js.map +1 -0
  39. package/dist/core/identity.d.ts +47 -0
  40. package/dist/core/identity.d.ts.map +1 -0
  41. package/dist/core/identity.js +130 -0
  42. package/dist/core/identity.js.map +1 -0
  43. package/dist/core/identity.test.d.ts +2 -0
  44. package/dist/core/identity.test.d.ts.map +1 -0
  45. package/dist/core/identity.test.js +43 -0
  46. package/dist/core/identity.test.js.map +1 -0
  47. package/dist/core/p2p-network.d.ts +242 -0
  48. package/dist/core/p2p-network.d.ts.map +1 -0
  49. package/dist/core/p2p-network.js +1182 -0
  50. package/dist/core/p2p-network.js.map +1 -0
  51. package/dist/core/reputation-security.d.ts +168 -0
  52. package/dist/core/reputation-security.d.ts.map +1 -0
  53. package/dist/core/reputation-security.js +369 -0
  54. package/dist/core/reputation-security.js.map +1 -0
  55. package/dist/core/reputation.d.ts +179 -0
  56. package/dist/core/reputation.d.ts.map +1 -0
  57. package/dist/core/reputation.js +472 -0
  58. package/dist/core/reputation.js.map +1 -0
  59. package/dist/core/review-committee.d.ts +130 -0
  60. package/dist/core/review-committee.d.ts.map +1 -0
  61. package/dist/core/review-committee.js +251 -0
  62. package/dist/core/review-committee.js.map +1 -0
  63. package/dist/core/serverless.d.ts +155 -0
  64. package/dist/core/serverless.d.ts.map +1 -0
  65. package/dist/core/serverless.js +615 -0
  66. package/dist/core/serverless.js.map +1 -0
  67. package/dist/core/token-manager.d.ts +42 -0
  68. package/dist/core/token-manager.d.ts.map +1 -0
  69. package/dist/core/token-manager.js +122 -0
  70. package/dist/core/token-manager.js.map +1 -0
  71. package/dist/daemon/control-server.d.ts +55 -0
  72. package/dist/daemon/control-server.d.ts.map +1 -0
  73. package/dist/daemon/control-server.js +262 -0
  74. package/dist/daemon/control-server.js.map +1 -0
  75. package/dist/daemon/index.d.ts +35 -0
  76. package/dist/daemon/index.d.ts.map +1 -0
  77. package/dist/daemon/index.js +69 -0
  78. package/dist/daemon/index.js.map +1 -0
  79. package/dist/daemon/main.d.ts +6 -0
  80. package/dist/daemon/main.d.ts.map +1 -0
  81. package/dist/daemon/main.js +38 -0
  82. package/dist/daemon/main.js.map +1 -0
  83. package/dist/daemon/start.d.ts +6 -0
  84. package/dist/daemon/start.d.ts.map +1 -0
  85. package/dist/daemon/start.js +25 -0
  86. package/dist/daemon/start.js.map +1 -0
  87. package/dist/daemon/webhook.d.ts +30 -0
  88. package/dist/daemon/webhook.d.ts.map +1 -0
  89. package/dist/daemon/webhook.js +86 -0
  90. package/dist/daemon/webhook.js.map +1 -0
  91. package/dist/daemon/webhook.test.d.ts +2 -0
  92. package/dist/daemon/webhook.test.d.ts.map +1 -0
  93. package/dist/daemon/webhook.test.js +24 -0
  94. package/dist/daemon/webhook.test.js.map +1 -0
  95. package/dist/index.d.ts +24 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +25 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/protocol/messages.d.ts +739 -0
  100. package/dist/protocol/messages.d.ts.map +1 -0
  101. package/dist/protocol/messages.js +188 -0
  102. package/dist/protocol/messages.js.map +1 -0
  103. package/dist/protocol/messages.test.d.ts +2 -0
  104. package/dist/protocol/messages.test.d.ts.map +1 -0
  105. package/dist/protocol/messages.test.js +55 -0
  106. package/dist/protocol/messages.test.js.map +1 -0
  107. package/dist/types/index.d.ts +247 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +10 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/result.d.ts +28 -0
  112. package/dist/types/result.d.ts.map +1 -0
  113. package/dist/types/result.js +16 -0
  114. package/dist/types/result.js.map +1 -0
  115. package/dist/utils/benchmark.d.ts +67 -0
  116. package/dist/utils/benchmark.d.ts.map +1 -0
  117. package/dist/utils/benchmark.js +179 -0
  118. package/dist/utils/benchmark.js.map +1 -0
  119. package/dist/utils/logger.d.ts +105 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +275 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/dist/utils/middleware.d.ts +85 -0
  124. package/dist/utils/middleware.d.ts.map +1 -0
  125. package/dist/utils/middleware.js +173 -0
  126. package/dist/utils/middleware.js.map +1 -0
  127. package/dist/utils/rate-limiter.d.ts +71 -0
  128. package/dist/utils/rate-limiter.d.ts.map +1 -0
  129. package/dist/utils/rate-limiter.js +160 -0
  130. package/dist/utils/rate-limiter.js.map +1 -0
  131. package/dist/utils/signature.d.ts +57 -0
  132. package/dist/utils/signature.d.ts.map +1 -0
  133. package/dist/utils/signature.js +102 -0
  134. package/dist/utils/signature.js.map +1 -0
  135. package/dist/utils/validation.d.ts +504 -0
  136. package/dist/utils/validation.d.ts.map +1 -0
  137. package/dist/utils/validation.js +159 -0
  138. package/dist/utils/validation.js.map +1 -0
  139. package/docs/F2A-PROTOCOL.md +61 -0
  140. package/docs/MOBILE_BOOTSTRAP_DESIGN.md +126 -0
  141. package/docs/a2a-lessons.md +316 -0
  142. package/docs/middleware-guide.md +448 -0
  143. package/docs/readme-update-checklist.md +90 -0
  144. package/docs/reputation-guide.md +396 -0
  145. package/docs/rfcs/001-reputation-system.md +712 -0
  146. package/docs/security-design.md +247 -0
  147. package/install.sh +231 -0
  148. package/package.json +64 -0
  149. package/packages/openclaw-adapter/README.md +510 -0
  150. package/packages/openclaw-adapter/openclaw.plugin.json +106 -0
  151. package/packages/openclaw-adapter/package.json +40 -0
  152. package/packages/openclaw-adapter/src/announcement-queue.test.ts +449 -0
  153. package/packages/openclaw-adapter/src/announcement-queue.ts +403 -0
  154. package/packages/openclaw-adapter/src/capability-detector.test.ts +99 -0
  155. package/packages/openclaw-adapter/src/capability-detector.ts +183 -0
  156. package/packages/openclaw-adapter/src/claim-handlers.test.ts +974 -0
  157. package/packages/openclaw-adapter/src/claim-handlers.ts +482 -0
  158. package/packages/openclaw-adapter/src/connector.business.test.ts +583 -0
  159. package/packages/openclaw-adapter/src/connector.ts +795 -0
  160. package/packages/openclaw-adapter/src/index.test.ts +82 -0
  161. package/packages/openclaw-adapter/src/index.ts +18 -0
  162. package/packages/openclaw-adapter/src/integration.e2e.test.ts +829 -0
  163. package/packages/openclaw-adapter/src/logger.ts +51 -0
  164. package/packages/openclaw-adapter/src/network-client.test.ts +266 -0
  165. package/packages/openclaw-adapter/src/network-client.ts +251 -0
  166. package/packages/openclaw-adapter/src/network-recovery.test.ts +465 -0
  167. package/packages/openclaw-adapter/src/node-manager.test.ts +136 -0
  168. package/packages/openclaw-adapter/src/node-manager.ts +429 -0
  169. package/packages/openclaw-adapter/src/plugin.test.ts +439 -0
  170. package/packages/openclaw-adapter/src/plugin.ts +104 -0
  171. package/packages/openclaw-adapter/src/reputation.test.ts +221 -0
  172. package/packages/openclaw-adapter/src/reputation.ts +368 -0
  173. package/packages/openclaw-adapter/src/task-guard.test.ts +502 -0
  174. package/packages/openclaw-adapter/src/task-guard.ts +860 -0
  175. package/packages/openclaw-adapter/src/task-queue.concurrency.test.ts +462 -0
  176. package/packages/openclaw-adapter/src/task-queue.edge-cases.test.ts +284 -0
  177. package/packages/openclaw-adapter/src/task-queue.persistence.test.ts +408 -0
  178. package/packages/openclaw-adapter/src/task-queue.ts +668 -0
  179. package/packages/openclaw-adapter/src/tool-handlers.test.ts +906 -0
  180. package/packages/openclaw-adapter/src/tool-handlers.ts +574 -0
  181. package/packages/openclaw-adapter/src/types.ts +361 -0
  182. package/packages/openclaw-adapter/src/webhook-pusher.test.ts +188 -0
  183. package/packages/openclaw-adapter/src/webhook-pusher.ts +220 -0
  184. package/packages/openclaw-adapter/src/webhook-server.test.ts +580 -0
  185. package/packages/openclaw-adapter/src/webhook-server.ts +202 -0
  186. package/packages/openclaw-adapter/tsconfig.json +20 -0
  187. package/src/cli/commands.test.ts +157 -0
  188. package/src/cli/commands.ts +129 -0
  189. package/src/cli/index.test.ts +77 -0
  190. package/src/cli/index.ts +234 -0
  191. package/src/core/autonomous-economy.test.ts +291 -0
  192. package/src/core/autonomous-economy.ts +428 -0
  193. package/src/core/e2ee-crypto.test.ts +125 -0
  194. package/src/core/e2ee-crypto.ts +246 -0
  195. package/src/core/f2a.test.ts +269 -0
  196. package/src/core/f2a.ts +618 -0
  197. package/src/core/p2p-network.test.ts +199 -0
  198. package/src/core/p2p-network.ts +1432 -0
  199. package/src/core/reputation-security.test.ts +403 -0
  200. package/src/core/reputation-security.ts +562 -0
  201. package/src/core/reputation.test.ts +260 -0
  202. package/src/core/reputation.ts +576 -0
  203. package/src/core/review-committee.test.ts +380 -0
  204. package/src/core/review-committee.ts +401 -0
  205. package/src/core/token-manager.test.ts +133 -0
  206. package/src/core/token-manager.ts +140 -0
  207. package/src/daemon/control-server.test.ts +216 -0
  208. package/src/daemon/control-server.ts +292 -0
  209. package/src/daemon/index.test.ts +85 -0
  210. package/src/daemon/index.ts +89 -0
  211. package/src/daemon/main.ts +44 -0
  212. package/src/daemon/start.ts +29 -0
  213. package/src/daemon/webhook.test.ts +68 -0
  214. package/src/daemon/webhook.ts +105 -0
  215. package/src/index.test.ts +436 -0
  216. package/src/index.ts +72 -0
  217. package/src/types/index.test.ts +87 -0
  218. package/src/types/index.ts +341 -0
  219. package/src/types/result.ts +68 -0
  220. package/src/utils/benchmark.ts +237 -0
  221. package/src/utils/logger.ts +331 -0
  222. package/src/utils/middleware.ts +229 -0
  223. package/src/utils/rate-limiter.ts +207 -0
  224. package/src/utils/signature.ts +136 -0
  225. package/src/utils/validation.ts +186 -0
  226. package/tests/docker/Dockerfile.node +23 -0
  227. package/tests/docker/Dockerfile.runner +18 -0
  228. package/tests/docker/docker-compose.test.yml +73 -0
  229. package/tests/integration/message-passing.test.ts +109 -0
  230. package/tests/integration/multi-node.test.ts +92 -0
  231. package/tests/integration/p2p-connection.test.ts +83 -0
  232. package/tests/integration/test-config.ts +32 -0
  233. package/tsconfig.json +21 -0
  234. package/vitest.config.ts +26 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * F2A 信誉系统
3
+ * Phase 1: 基础信誉管理
4
+ */
5
+ export type ReputationLevel = 'restricted' | 'novice' | 'participant' | 'contributor' | 'core';
6
+ export interface ReputationTier {
7
+ min: number;
8
+ max: number;
9
+ level: ReputationLevel;
10
+ title: string;
11
+ permissions: {
12
+ canPublish: boolean;
13
+ canExecute: boolean;
14
+ canReview: boolean;
15
+ publishPriority: number;
16
+ publishDiscount: number;
17
+ };
18
+ }
19
+ export interface ReputationEntry {
20
+ peerId: string;
21
+ score: number;
22
+ level: ReputationLevel;
23
+ lastUpdated: number;
24
+ history: ReputationEvent[];
25
+ }
26
+ export interface ReputationEvent {
27
+ type: 'task_success' | 'task_failure' | 'task_rejected' | 'review_given' | 'review_penalty' | 'initial';
28
+ delta: number;
29
+ timestamp: number;
30
+ reason?: string;
31
+ taskId?: string;
32
+ }
33
+ export interface ReputationConfig {
34
+ initialScore: number;
35
+ alpha: number;
36
+ minScore: number;
37
+ maxScore: number;
38
+ maxHistory: number;
39
+ decayRate: number;
40
+ decayIntervalMs: number;
41
+ maxLatency: number;
42
+ }
43
+ export interface ReputationStorage {
44
+ save(entries: Map<string, ReputationEntry>): Promise<void>;
45
+ load(): Promise<Map<string, ReputationEntry>>;
46
+ }
47
+ export declare const REPUTATION_TIERS: ReputationTier[];
48
+ export declare class ReputationManager implements Disposable {
49
+ private config;
50
+ private entries;
51
+ private logger;
52
+ private decayTimer?;
53
+ private disposed;
54
+ constructor(config?: Partial<ReputationConfig>);
55
+ /**
56
+ * 实现 Disposable 接口
57
+ */
58
+ [Symbol.dispose](): void;
59
+ /**
60
+ * 停止定时器和清理资源
61
+ */
62
+ stop(): void;
63
+ /**
64
+ * 启动衰减定时器
65
+ */
66
+ private startDecayTimer;
67
+ /**
68
+ * 应用信誉衰减
69
+ * 每个节点的信誉分数按 decayRate 比例衰减
70
+ */
71
+ private applyDecay;
72
+ /**
73
+ * 获取节点信誉信息
74
+ * 如果节点不存在,会自动创建一个带有初始分数的条目
75
+ * @param peerId - 节点的唯一标识符
76
+ * @returns 节点的信誉条目,包含分数、等级和历史记录
77
+ */
78
+ getReputation(peerId: string): ReputationEntry;
79
+ /**
80
+ * 获取信誉等级信息
81
+ * 根据分数返回对应的信誉等级和权限配置
82
+ * @param score - 信誉分数 (0-100)
83
+ * @returns 对应的信誉等级配置
84
+ */
85
+ getTier(score: number): ReputationTier;
86
+ /**
87
+ * 检查节点是否具有指定权限
88
+ * @param peerId - 节点的唯一标识符
89
+ * @param permission - 要检查的权限类型:'publish'(发布)、'execute'(执行)、'review'(评审)
90
+ * @returns 如果节点具有该权限则返回 true,否则返回 false
91
+ */
92
+ hasPermission(peerId: string, permission: 'publish' | 'execute' | 'review'): boolean;
93
+ /**
94
+ * 记录任务成功
95
+ * @param peerId 节点 ID
96
+ * @param taskId 任务 ID
97
+ * @param delta 分数变化量
98
+ * @param latency 响应延迟(毫秒),可选,用于未来优化
99
+ */
100
+ recordSuccess(peerId: string, taskId: string, delta?: number, latency?: number): void;
101
+ /**
102
+ * 记录任务失败
103
+ * 会降低节点的信誉分数
104
+ * @param peerId - 节点的唯一标识符
105
+ * @param taskId - 失败任务的 ID
106
+ * @param reason - 可选的失败原因描述
107
+ * @param delta - 分数变化量,默认为 -20
108
+ */
109
+ recordFailure(peerId: string, taskId: string, reason?: string, delta?: number): void;
110
+ /**
111
+ * 记录任务拒绝
112
+ * 当节点拒绝接受任务时调用,会轻微降低信誉分数
113
+ * @param peerId - 节点的唯一标识符
114
+ * @param taskId - 被拒绝任务的 ID
115
+ * @param reason - 可选的拒绝原因描述
116
+ * @param delta - 分数变化量,默认为 -5
117
+ */
118
+ recordRejection(peerId: string, taskId: string, reason?: string, delta?: number): void;
119
+ /**
120
+ * 记录评审奖励
121
+ * 当节点完成评审任务时调用,会提高信誉分数
122
+ * @param peerId - 节点的唯一标识符
123
+ * @param delta - 分数变化量,默认为 3
124
+ */
125
+ recordReviewReward(peerId: string, delta?: number): void;
126
+ /**
127
+ * 记录评审惩罚
128
+ * 当节点提供低质量评审或违规时调用,会降低信誉分数
129
+ * @param peerId - 节点的唯一标识符
130
+ * @param delta - 分数变化量,默认为 -5
131
+ * @param reason - 可选的惩罚原因描述
132
+ */
133
+ recordReviewPenalty(peerId: string, delta?: number, reason?: string): void;
134
+ /**
135
+ * 获取所有信誉条目
136
+ * 返回按分数从高到低排序的所有节点信誉信息
137
+ * @returns 排序后的信誉条目数组
138
+ */
139
+ getAllReputations(): ReputationEntry[];
140
+ /**
141
+ * 获取高信誉节点
142
+ * 返回分数达到指定阈值的节点列表,可用于评审任务分配
143
+ * @param minScore - 最低信誉分数阈值,默认为 50
144
+ * @returns 符合条件的信誉条目数组,按分数排序
145
+ */
146
+ getHighReputationNodes(minScore?: number): ReputationEntry[];
147
+ /**
148
+ * 获取节点的发布优先级
149
+ * 优先级越高,任务分配时越优先被考虑
150
+ * @param peerId - 节点的唯一标识符
151
+ * @returns 发布优先级 (0-5)
152
+ */
153
+ getPublishPriority(peerId: string): number;
154
+ /**
155
+ * 获取节点的发布折扣
156
+ * 高信誉节点可享受更低的服务费用折扣
157
+ * @param peerId - 节点的唯一标识符
158
+ * @returns 发布折扣率 (0.7-1.0,数值越小折扣越大)
159
+ */
160
+ getPublishDiscount(peerId: string): number;
161
+ /**
162
+ * 设置节点的初始信誉分数
163
+ * 用于邀请机制设置被邀请者的初始分数,可覆盖默认初始分数
164
+ * @param peerId - 节点的唯一标识符
165
+ * @param score - 要设置的分数 (0-100),会自动限制在有效范围内
166
+ */
167
+ setInitialScore(peerId: string, score: number): void;
168
+ /**
169
+ * 创建初始信誉条目
170
+ */
171
+ private createInitialEntry;
172
+ /**
173
+ * EWMA 分数更新
174
+ * newScore = α * observation + (1 - α) * currentScore
175
+ */
176
+ private updateScoreEWMA;
177
+ }
178
+ export default ReputationManager;
179
+ //# sourceMappingURL=reputation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../../src/core/reputation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,472 @@
1
+ /**
2
+ * F2A 信誉系统
3
+ * Phase 1: 基础信誉管理
4
+ */
5
+ import { Logger } from '../utils/logger.js';
6
+ // ============================================================================
7
+ // 信誉等级定义
8
+ // ============================================================================
9
+ export const REPUTATION_TIERS = [
10
+ {
11
+ min: 0,
12
+ max: 20,
13
+ level: 'restricted',
14
+ title: '受限者',
15
+ permissions: {
16
+ canPublish: false,
17
+ canExecute: true,
18
+ canReview: false,
19
+ publishPriority: 0,
20
+ publishDiscount: 1.0,
21
+ },
22
+ },
23
+ {
24
+ min: 20,
25
+ max: 40,
26
+ level: 'novice',
27
+ title: '新手',
28
+ permissions: {
29
+ canPublish: true,
30
+ canExecute: true,
31
+ canReview: false,
32
+ publishPriority: 1,
33
+ publishDiscount: 1.0,
34
+ },
35
+ },
36
+ {
37
+ min: 40,
38
+ max: 60,
39
+ level: 'participant',
40
+ title: '参与者',
41
+ permissions: {
42
+ canPublish: true,
43
+ canExecute: true,
44
+ canReview: true,
45
+ publishPriority: 2,
46
+ publishDiscount: 1.0,
47
+ },
48
+ },
49
+ {
50
+ min: 60,
51
+ max: 80,
52
+ level: 'contributor',
53
+ title: '贡献者',
54
+ permissions: {
55
+ canPublish: true,
56
+ canExecute: true,
57
+ canReview: true,
58
+ publishPriority: 3,
59
+ publishDiscount: 0.9,
60
+ },
61
+ },
62
+ {
63
+ min: 80,
64
+ max: 100,
65
+ level: 'core',
66
+ title: '核心成员',
67
+ permissions: {
68
+ canPublish: true,
69
+ canExecute: true,
70
+ canReview: true,
71
+ publishPriority: 5,
72
+ publishDiscount: 0.7,
73
+ },
74
+ },
75
+ ];
76
+ // ============================================================================
77
+ // 默认配置
78
+ // ============================================================================
79
+ const DEFAULT_CONFIG = {
80
+ initialScore: 70,
81
+ alpha: 0.3,
82
+ minScore: 0,
83
+ maxScore: 100,
84
+ maxHistory: 100,
85
+ decayRate: 0.01, // 每天衰减 1%
86
+ decayIntervalMs: 24 * 60 * 60 * 1000, // 每 24 小时检查一次
87
+ maxLatency: 300000, // 最大可接受延迟 5 分钟
88
+ };
89
+ // ============================================================================
90
+ // 信誉管理器
91
+ // ============================================================================
92
+ export class ReputationManager {
93
+ config;
94
+ entries = new Map();
95
+ logger;
96
+ decayTimer;
97
+ disposed = false;
98
+ constructor(config = {}) {
99
+ this.config = { ...DEFAULT_CONFIG, ...config };
100
+ this.logger = new Logger({ component: 'Reputation' });
101
+ // 启动衰减定时器
102
+ if (this.config.decayRate > 0) {
103
+ this.startDecayTimer();
104
+ }
105
+ }
106
+ /**
107
+ * 实现 Disposable 接口
108
+ */
109
+ [Symbol.dispose]() {
110
+ this.stop();
111
+ }
112
+ /**
113
+ * 停止定时器和清理资源
114
+ */
115
+ stop() {
116
+ if (this.disposed)
117
+ return;
118
+ this.disposed = true;
119
+ if (this.decayTimer) {
120
+ clearInterval(this.decayTimer);
121
+ this.decayTimer = undefined;
122
+ }
123
+ }
124
+ /**
125
+ * 启动衰减定时器
126
+ */
127
+ startDecayTimer() {
128
+ this.decayTimer = setInterval(() => {
129
+ this.applyDecay();
130
+ }, this.config.decayIntervalMs);
131
+ }
132
+ /**
133
+ * 应用信誉衰减
134
+ * 每个节点的信誉分数按 decayRate 比例衰减
135
+ */
136
+ applyDecay() {
137
+ const decayFactor = 1 - this.config.decayRate;
138
+ for (const [peerId, entry] of this.entries) {
139
+ // 不衰减初始分数以下的值
140
+ if (entry.score > this.config.initialScore) {
141
+ const newScore = entry.score * decayFactor;
142
+ // 确保不低于初始分数
143
+ entry.score = Math.max(this.config.initialScore, newScore);
144
+ entry.level = this.getTier(entry.score).level;
145
+ entry.lastUpdated = Date.now();
146
+ }
147
+ }
148
+ this.logger.debug('Applied reputation decay', {
149
+ decayRate: this.config.decayRate,
150
+ entriesAffected: this.entries.size
151
+ });
152
+ }
153
+ /**
154
+ * 获取节点信誉信息
155
+ * 如果节点不存在,会自动创建一个带有初始分数的条目
156
+ * @param peerId - 节点的唯一标识符
157
+ * @returns 节点的信誉条目,包含分数、等级和历史记录
158
+ */
159
+ getReputation(peerId) {
160
+ if (!this.entries.has(peerId)) {
161
+ this.entries.set(peerId, this.createInitialEntry(peerId));
162
+ }
163
+ return this.entries.get(peerId);
164
+ }
165
+ /**
166
+ * 获取信誉等级信息
167
+ * 根据分数返回对应的信誉等级和权限配置
168
+ * @param score - 信誉分数 (0-100)
169
+ * @returns 对应的信誉等级配置
170
+ */
171
+ getTier(score) {
172
+ for (const tier of REPUTATION_TIERS) {
173
+ if (score >= tier.min && score < tier.max) {
174
+ return tier;
175
+ }
176
+ }
177
+ return REPUTATION_TIERS[REPUTATION_TIERS.length - 1]; // core
178
+ }
179
+ /**
180
+ * 检查节点是否具有指定权限
181
+ * @param peerId - 节点的唯一标识符
182
+ * @param permission - 要检查的权限类型:'publish'(发布)、'execute'(执行)、'review'(评审)
183
+ * @returns 如果节点具有该权限则返回 true,否则返回 false
184
+ */
185
+ hasPermission(peerId, permission) {
186
+ const entry = this.getReputation(peerId);
187
+ const tier = this.getTier(entry.score);
188
+ switch (permission) {
189
+ case 'publish':
190
+ return tier.permissions.canPublish;
191
+ case 'execute':
192
+ return tier.permissions.canExecute;
193
+ case 'review':
194
+ return tier.permissions.canReview;
195
+ }
196
+ }
197
+ /**
198
+ * 记录任务成功
199
+ * @param peerId 节点 ID
200
+ * @param taskId 任务 ID
201
+ * @param delta 分数变化量
202
+ * @param latency 响应延迟(毫秒),可选,用于未来优化
203
+ */
204
+ recordSuccess(peerId, taskId, delta = 10, latency) {
205
+ // 验证 latency 参数
206
+ if (latency !== undefined) {
207
+ if (typeof latency !== 'number' || !Number.isFinite(latency)) {
208
+ this.logger.warn('Invalid latency value, ignoring', {
209
+ peerId: peerId.slice(0, 16),
210
+ latency
211
+ });
212
+ latency = undefined;
213
+ }
214
+ else if (latency < 0) {
215
+ this.logger.warn('Negative latency value, treating as 0', {
216
+ peerId: peerId.slice(0, 16),
217
+ latency
218
+ });
219
+ latency = 0;
220
+ }
221
+ else if (latency > this.config.maxLatency) {
222
+ this.logger.warn('Latency exceeds max, capping', {
223
+ peerId: peerId.slice(0, 16),
224
+ latency,
225
+ maxLatency: this.config.maxLatency
226
+ });
227
+ latency = this.config.maxLatency;
228
+ }
229
+ }
230
+ const entry = this.getReputation(peerId);
231
+ const newScore = this.updateScoreEWMA(entry.score, delta);
232
+ entry.score = newScore;
233
+ entry.level = this.getTier(newScore).level;
234
+ entry.lastUpdated = Date.now();
235
+ entry.history.push({
236
+ type: 'task_success',
237
+ delta,
238
+ timestamp: Date.now(),
239
+ taskId,
240
+ });
241
+ // 截断历史记录,防止无限增长
242
+ if (entry.history.length > this.config.maxHistory) {
243
+ entry.history = entry.history.slice(-this.config.maxHistory);
244
+ }
245
+ this.logger.info('Reputation updated', {
246
+ peerId: peerId.slice(0, 16),
247
+ delta,
248
+ newScore,
249
+ level: entry.level,
250
+ latency
251
+ });
252
+ }
253
+ /**
254
+ * 记录任务失败
255
+ * 会降低节点的信誉分数
256
+ * @param peerId - 节点的唯一标识符
257
+ * @param taskId - 失败任务的 ID
258
+ * @param reason - 可选的失败原因描述
259
+ * @param delta - 分数变化量,默认为 -20
260
+ */
261
+ recordFailure(peerId, taskId, reason, delta = -20) {
262
+ const entry = this.getReputation(peerId);
263
+ const newScore = this.updateScoreEWMA(entry.score, delta);
264
+ entry.score = newScore;
265
+ entry.level = this.getTier(newScore).level;
266
+ entry.lastUpdated = Date.now();
267
+ entry.history.push({
268
+ type: 'task_failure',
269
+ delta,
270
+ timestamp: Date.now(),
271
+ reason,
272
+ taskId,
273
+ });
274
+ // 截断历史记录
275
+ if (entry.history.length > this.config.maxHistory) {
276
+ entry.history = entry.history.slice(-this.config.maxHistory);
277
+ }
278
+ this.logger.warn('Reputation decreased', {
279
+ peerId: peerId.slice(0, 16),
280
+ delta,
281
+ newScore,
282
+ level: entry.level,
283
+ reason,
284
+ });
285
+ }
286
+ /**
287
+ * 记录任务拒绝
288
+ * 当节点拒绝接受任务时调用,会轻微降低信誉分数
289
+ * @param peerId - 节点的唯一标识符
290
+ * @param taskId - 被拒绝任务的 ID
291
+ * @param reason - 可选的拒绝原因描述
292
+ * @param delta - 分数变化量,默认为 -5
293
+ */
294
+ recordRejection(peerId, taskId, reason, delta = -5) {
295
+ const entry = this.getReputation(peerId);
296
+ const newScore = this.updateScoreEWMA(entry.score, delta);
297
+ entry.score = newScore;
298
+ entry.level = this.getTier(newScore).level;
299
+ entry.lastUpdated = Date.now();
300
+ entry.history.push({
301
+ type: 'task_rejected',
302
+ delta,
303
+ timestamp: Date.now(),
304
+ reason,
305
+ taskId,
306
+ });
307
+ // 截断历史记录
308
+ if (entry.history.length > this.config.maxHistory) {
309
+ entry.history = entry.history.slice(-this.config.maxHistory);
310
+ }
311
+ this.logger.info('Reputation updated (rejection)', {
312
+ peerId: peerId.slice(0, 16),
313
+ delta,
314
+ newScore,
315
+ });
316
+ }
317
+ /**
318
+ * 记录评审奖励
319
+ * 当节点完成评审任务时调用,会提高信誉分数
320
+ * @param peerId - 节点的唯一标识符
321
+ * @param delta - 分数变化量,默认为 3
322
+ */
323
+ recordReviewReward(peerId, delta = 3) {
324
+ const entry = this.getReputation(peerId);
325
+ const newScore = this.updateScoreEWMA(entry.score, delta);
326
+ entry.score = newScore;
327
+ entry.level = this.getTier(newScore).level;
328
+ entry.lastUpdated = Date.now();
329
+ entry.history.push({
330
+ type: 'review_given',
331
+ delta,
332
+ timestamp: Date.now(),
333
+ });
334
+ // 截断历史记录
335
+ if (entry.history.length > this.config.maxHistory) {
336
+ entry.history = entry.history.slice(-this.config.maxHistory);
337
+ }
338
+ this.logger.info('Review reward', {
339
+ peerId: peerId.slice(0, 16),
340
+ delta,
341
+ newScore,
342
+ });
343
+ }
344
+ /**
345
+ * 记录评审惩罚
346
+ * 当节点提供低质量评审或违规时调用,会降低信誉分数
347
+ * @param peerId - 节点的唯一标识符
348
+ * @param delta - 分数变化量,默认为 -5
349
+ * @param reason - 可选的惩罚原因描述
350
+ */
351
+ recordReviewPenalty(peerId, delta = -5, reason) {
352
+ const entry = this.getReputation(peerId);
353
+ const newScore = this.updateScoreEWMA(entry.score, delta);
354
+ entry.score = newScore;
355
+ entry.level = this.getTier(newScore).level;
356
+ entry.lastUpdated = Date.now();
357
+ entry.history.push({
358
+ type: 'review_penalty',
359
+ delta,
360
+ timestamp: Date.now(),
361
+ reason,
362
+ });
363
+ // 截断历史记录
364
+ if (entry.history.length > this.config.maxHistory) {
365
+ entry.history = entry.history.slice(-this.config.maxHistory);
366
+ }
367
+ this.logger.warn('Review penalty', {
368
+ peerId: peerId.slice(0, 16),
369
+ delta,
370
+ newScore,
371
+ reason,
372
+ });
373
+ }
374
+ /**
375
+ * 获取所有信誉条目
376
+ * 返回按分数从高到低排序的所有节点信誉信息
377
+ * @returns 排序后的信誉条目数组
378
+ */
379
+ getAllReputations() {
380
+ return Array.from(this.entries.values()).sort((a, b) => b.score - a.score);
381
+ }
382
+ /**
383
+ * 获取高信誉节点
384
+ * 返回分数达到指定阈值的节点列表,可用于评审任务分配
385
+ * @param minScore - 最低信誉分数阈值,默认为 50
386
+ * @returns 符合条件的信誉条目数组,按分数排序
387
+ */
388
+ getHighReputationNodes(minScore = 50) {
389
+ return this.getAllReputations().filter(e => e.score >= minScore);
390
+ }
391
+ /**
392
+ * 获取节点的发布优先级
393
+ * 优先级越高,任务分配时越优先被考虑
394
+ * @param peerId - 节点的唯一标识符
395
+ * @returns 发布优先级 (0-5)
396
+ */
397
+ getPublishPriority(peerId) {
398
+ const entry = this.getReputation(peerId);
399
+ return this.getTier(entry.score).permissions.publishPriority;
400
+ }
401
+ /**
402
+ * 获取节点的发布折扣
403
+ * 高信誉节点可享受更低的服务费用折扣
404
+ * @param peerId - 节点的唯一标识符
405
+ * @returns 发布折扣率 (0.7-1.0,数值越小折扣越大)
406
+ */
407
+ getPublishDiscount(peerId) {
408
+ const entry = this.getReputation(peerId);
409
+ return this.getTier(entry.score).permissions.publishDiscount;
410
+ }
411
+ /**
412
+ * 设置节点的初始信誉分数
413
+ * 用于邀请机制设置被邀请者的初始分数,可覆盖默认初始分数
414
+ * @param peerId - 节点的唯一标识符
415
+ * @param score - 要设置的分数 (0-100),会自动限制在有效范围内
416
+ */
417
+ setInitialScore(peerId, score) {
418
+ const entry = this.getReputation(peerId);
419
+ const clampedScore = Math.max(this.config.minScore, Math.min(this.config.maxScore, score));
420
+ entry.score = clampedScore;
421
+ entry.level = this.getTier(clampedScore).level;
422
+ entry.lastUpdated = Date.now();
423
+ entry.history.push({
424
+ type: 'initial',
425
+ delta: clampedScore - this.config.initialScore,
426
+ timestamp: Date.now(),
427
+ reason: 'Set by invitation system'
428
+ });
429
+ // 截断历史记录
430
+ if (entry.history.length > this.config.maxHistory) {
431
+ entry.history = entry.history.slice(-this.config.maxHistory);
432
+ }
433
+ this.logger.info('Initial score set', {
434
+ peerId: peerId.slice(0, 16),
435
+ score: clampedScore,
436
+ level: entry.level
437
+ });
438
+ }
439
+ // ============================================================================
440
+ // 私有方法
441
+ // ============================================================================
442
+ /**
443
+ * 创建初始信誉条目
444
+ */
445
+ createInitialEntry(peerId) {
446
+ return {
447
+ peerId,
448
+ score: this.config.initialScore,
449
+ level: this.getTier(this.config.initialScore).level,
450
+ lastUpdated: Date.now(),
451
+ history: [
452
+ {
453
+ type: 'initial',
454
+ delta: 0,
455
+ timestamp: Date.now(),
456
+ },
457
+ ],
458
+ };
459
+ }
460
+ /**
461
+ * EWMA 分数更新
462
+ * newScore = α * observation + (1 - α) * currentScore
463
+ */
464
+ updateScoreEWMA(currentScore, delta) {
465
+ const observation = currentScore + delta;
466
+ const newScore = this.config.alpha * observation + (1 - this.config.alpha) * currentScore;
467
+ return Math.max(this.config.minScore, Math.min(this.config.maxScore, newScore));
468
+ }
469
+ }
470
+ // 默认导出
471
+ export default ReputationManager;
472
+ //# sourceMappingURL=reputation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../src/core/reputation.ts"],"names":[],"mappings":"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"}