@f2a/network 0.1.2 → 0.2.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 (226) hide show
  1. package/README.md +278 -63
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +29 -2
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/config.d.ts +176 -0
  6. package/dist/cli/config.d.ts.map +1 -0
  7. package/dist/cli/config.js +386 -0
  8. package/dist/cli/config.js.map +1 -0
  9. package/dist/cli/daemon.d.ts +54 -0
  10. package/dist/cli/daemon.d.ts.map +1 -0
  11. package/dist/cli/daemon.js +572 -0
  12. package/dist/cli/daemon.js.map +1 -0
  13. package/dist/cli/index.js +90 -16
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/init.d.ts +13 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +352 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/core/e2ee-crypto.d.ts +127 -1
  20. package/dist/core/e2ee-crypto.d.ts.map +1 -1
  21. package/dist/core/e2ee-crypto.js +446 -12
  22. package/dist/core/e2ee-crypto.js.map +1 -1
  23. package/dist/core/f2a.d.ts +2 -1
  24. package/dist/core/f2a.d.ts.map +1 -1
  25. package/dist/core/f2a.js +6 -2
  26. package/dist/core/f2a.js.map +1 -1
  27. package/dist/core/identity/encrypted-key-store.d.ts +19 -0
  28. package/dist/core/identity/encrypted-key-store.d.ts.map +1 -0
  29. package/dist/core/identity/encrypted-key-store.js +72 -0
  30. package/dist/core/identity/encrypted-key-store.js.map +1 -0
  31. package/dist/core/identity/identity-manager.d.ts +133 -0
  32. package/dist/core/identity/identity-manager.d.ts.map +1 -0
  33. package/dist/core/identity/identity-manager.js +454 -0
  34. package/dist/core/identity/identity-manager.js.map +1 -0
  35. package/dist/core/identity/index.d.ts +8 -0
  36. package/dist/core/identity/index.d.ts.map +1 -0
  37. package/dist/core/identity/index.js +7 -0
  38. package/dist/core/identity/index.js.map +1 -0
  39. package/dist/core/identity/types.d.ts +70 -0
  40. package/dist/core/identity/types.d.ts.map +1 -0
  41. package/dist/core/identity/types.js +17 -0
  42. package/dist/core/identity/types.js.map +1 -0
  43. package/dist/core/p2p-network.d.ts +26 -0
  44. package/dist/core/p2p-network.d.ts.map +1 -1
  45. package/dist/core/p2p-network.js +434 -105
  46. package/dist/core/p2p-network.js.map +1 -1
  47. package/dist/core/reputation-security.d.ts +15 -0
  48. package/dist/core/reputation-security.d.ts.map +1 -1
  49. package/dist/core/reputation-security.js +73 -3
  50. package/dist/core/reputation-security.js.map +1 -1
  51. package/dist/core/reputation.d.ts +129 -4
  52. package/dist/core/reputation.d.ts.map +1 -1
  53. package/dist/core/reputation.js +294 -1
  54. package/dist/core/reputation.js.map +1 -1
  55. package/dist/core/review-committee.d.ts +2 -2
  56. package/dist/core/review-committee.d.ts.map +1 -1
  57. package/dist/core/review-committee.js +17 -0
  58. package/dist/core/review-committee.js.map +1 -1
  59. package/dist/daemon/control-server.d.ts.map +1 -1
  60. package/dist/daemon/control-server.js +44 -1
  61. package/dist/daemon/control-server.js.map +1 -1
  62. package/dist/daemon/webhook.d.ts +3 -0
  63. package/dist/daemon/webhook.d.ts.map +1 -1
  64. package/dist/daemon/webhook.js +318 -6
  65. package/dist/daemon/webhook.js.map +1 -1
  66. package/dist/index.d.ts +3 -3
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +7 -3
  69. package/dist/index.js.map +1 -1
  70. package/dist/types/index.d.ts +4 -0
  71. package/dist/types/index.d.ts.map +1 -1
  72. package/dist/types/index.js.map +1 -1
  73. package/dist/types/result.d.ts +1 -1
  74. package/dist/types/result.d.ts.map +1 -1
  75. package/dist/types/result.js.map +1 -1
  76. package/dist/utils/crypto-utils.d.ts +17 -0
  77. package/dist/utils/crypto-utils.d.ts.map +1 -0
  78. package/dist/utils/crypto-utils.js +28 -0
  79. package/dist/utils/crypto-utils.js.map +1 -0
  80. package/dist/utils/logger.d.ts +1 -0
  81. package/dist/utils/logger.d.ts.map +1 -1
  82. package/dist/utils/logger.js +9 -3
  83. package/dist/utils/logger.js.map +1 -1
  84. package/dist/utils/rate-limiter.d.ts.map +1 -1
  85. package/dist/utils/rate-limiter.js +3 -1
  86. package/dist/utils/rate-limiter.js.map +1 -1
  87. package/dist/utils/signature.d.ts +47 -1
  88. package/dist/utils/signature.d.ts.map +1 -1
  89. package/dist/utils/signature.js +166 -11
  90. package/dist/utils/signature.js.map +1 -1
  91. package/package.json +9 -1
  92. package/.github/workflows/ci.yml +0 -113
  93. package/.github/workflows/publish.yml +0 -60
  94. package/MONOREPO.md +0 -58
  95. package/SKILL.md +0 -137
  96. package/dist/adapters/openclaw.d.ts +0 -103
  97. package/dist/adapters/openclaw.d.ts.map +0 -1
  98. package/dist/adapters/openclaw.js +0 -297
  99. package/dist/adapters/openclaw.js.map +0 -1
  100. package/dist/core/connection-manager.d.ts +0 -80
  101. package/dist/core/connection-manager.d.ts.map +0 -1
  102. package/dist/core/connection-manager.js +0 -235
  103. package/dist/core/connection-manager.js.map +0 -1
  104. package/dist/core/connection-manager.test.d.ts +0 -2
  105. package/dist/core/connection-manager.test.d.ts.map +0 -1
  106. package/dist/core/connection-manager.test.js +0 -52
  107. package/dist/core/connection-manager.test.js.map +0 -1
  108. package/dist/core/identity.d.ts +0 -47
  109. package/dist/core/identity.d.ts.map +0 -1
  110. package/dist/core/identity.js +0 -130
  111. package/dist/core/identity.js.map +0 -1
  112. package/dist/core/identity.test.d.ts +0 -2
  113. package/dist/core/identity.test.d.ts.map +0 -1
  114. package/dist/core/identity.test.js +0 -43
  115. package/dist/core/identity.test.js.map +0 -1
  116. package/dist/core/serverless.d.ts +0 -155
  117. package/dist/core/serverless.d.ts.map +0 -1
  118. package/dist/core/serverless.js +0 -615
  119. package/dist/core/serverless.js.map +0 -1
  120. package/dist/daemon/webhook.test.d.ts +0 -2
  121. package/dist/daemon/webhook.test.d.ts.map +0 -1
  122. package/dist/daemon/webhook.test.js +0 -24
  123. package/dist/daemon/webhook.test.js.map +0 -1
  124. package/dist/protocol/messages.d.ts +0 -739
  125. package/dist/protocol/messages.d.ts.map +0 -1
  126. package/dist/protocol/messages.js +0 -188
  127. package/dist/protocol/messages.js.map +0 -1
  128. package/dist/protocol/messages.test.d.ts +0 -2
  129. package/dist/protocol/messages.test.d.ts.map +0 -1
  130. package/dist/protocol/messages.test.js +0 -55
  131. package/dist/protocol/messages.test.js.map +0 -1
  132. package/docs/F2A-PROTOCOL.md +0 -61
  133. package/docs/MOBILE_BOOTSTRAP_DESIGN.md +0 -126
  134. package/docs/a2a-lessons.md +0 -316
  135. package/docs/middleware-guide.md +0 -448
  136. package/docs/readme-update-checklist.md +0 -90
  137. package/docs/reputation-guide.md +0 -396
  138. package/docs/rfcs/001-reputation-system.md +0 -712
  139. package/docs/security-design.md +0 -247
  140. package/install.sh +0 -231
  141. package/packages/openclaw-adapter/README.md +0 -510
  142. package/packages/openclaw-adapter/openclaw.plugin.json +0 -106
  143. package/packages/openclaw-adapter/package.json +0 -40
  144. package/packages/openclaw-adapter/src/announcement-queue.test.ts +0 -449
  145. package/packages/openclaw-adapter/src/announcement-queue.ts +0 -403
  146. package/packages/openclaw-adapter/src/capability-detector.test.ts +0 -99
  147. package/packages/openclaw-adapter/src/capability-detector.ts +0 -183
  148. package/packages/openclaw-adapter/src/claim-handlers.test.ts +0 -974
  149. package/packages/openclaw-adapter/src/claim-handlers.ts +0 -482
  150. package/packages/openclaw-adapter/src/connector.business.test.ts +0 -583
  151. package/packages/openclaw-adapter/src/connector.ts +0 -795
  152. package/packages/openclaw-adapter/src/index.test.ts +0 -82
  153. package/packages/openclaw-adapter/src/index.ts +0 -18
  154. package/packages/openclaw-adapter/src/integration.e2e.test.ts +0 -829
  155. package/packages/openclaw-adapter/src/logger.ts +0 -51
  156. package/packages/openclaw-adapter/src/network-client.test.ts +0 -266
  157. package/packages/openclaw-adapter/src/network-client.ts +0 -251
  158. package/packages/openclaw-adapter/src/network-recovery.test.ts +0 -465
  159. package/packages/openclaw-adapter/src/node-manager.test.ts +0 -136
  160. package/packages/openclaw-adapter/src/node-manager.ts +0 -429
  161. package/packages/openclaw-adapter/src/plugin.test.ts +0 -439
  162. package/packages/openclaw-adapter/src/plugin.ts +0 -104
  163. package/packages/openclaw-adapter/src/reputation.test.ts +0 -221
  164. package/packages/openclaw-adapter/src/reputation.ts +0 -368
  165. package/packages/openclaw-adapter/src/task-guard.test.ts +0 -502
  166. package/packages/openclaw-adapter/src/task-guard.ts +0 -860
  167. package/packages/openclaw-adapter/src/task-queue.concurrency.test.ts +0 -462
  168. package/packages/openclaw-adapter/src/task-queue.edge-cases.test.ts +0 -284
  169. package/packages/openclaw-adapter/src/task-queue.persistence.test.ts +0 -408
  170. package/packages/openclaw-adapter/src/task-queue.ts +0 -668
  171. package/packages/openclaw-adapter/src/tool-handlers.test.ts +0 -906
  172. package/packages/openclaw-adapter/src/tool-handlers.ts +0 -574
  173. package/packages/openclaw-adapter/src/types.ts +0 -361
  174. package/packages/openclaw-adapter/src/webhook-pusher.test.ts +0 -188
  175. package/packages/openclaw-adapter/src/webhook-pusher.ts +0 -220
  176. package/packages/openclaw-adapter/src/webhook-server.test.ts +0 -580
  177. package/packages/openclaw-adapter/src/webhook-server.ts +0 -202
  178. package/packages/openclaw-adapter/tsconfig.json +0 -20
  179. package/src/cli/commands.test.ts +0 -157
  180. package/src/cli/commands.ts +0 -129
  181. package/src/cli/index.test.ts +0 -77
  182. package/src/cli/index.ts +0 -234
  183. package/src/core/autonomous-economy.test.ts +0 -291
  184. package/src/core/autonomous-economy.ts +0 -428
  185. package/src/core/e2ee-crypto.test.ts +0 -125
  186. package/src/core/e2ee-crypto.ts +0 -246
  187. package/src/core/f2a.test.ts +0 -269
  188. package/src/core/f2a.ts +0 -618
  189. package/src/core/p2p-network.test.ts +0 -199
  190. package/src/core/p2p-network.ts +0 -1432
  191. package/src/core/reputation-security.test.ts +0 -403
  192. package/src/core/reputation-security.ts +0 -562
  193. package/src/core/reputation.test.ts +0 -260
  194. package/src/core/reputation.ts +0 -576
  195. package/src/core/review-committee.test.ts +0 -380
  196. package/src/core/review-committee.ts +0 -401
  197. package/src/core/token-manager.test.ts +0 -133
  198. package/src/core/token-manager.ts +0 -140
  199. package/src/daemon/control-server.test.ts +0 -216
  200. package/src/daemon/control-server.ts +0 -292
  201. package/src/daemon/index.test.ts +0 -85
  202. package/src/daemon/index.ts +0 -89
  203. package/src/daemon/main.ts +0 -44
  204. package/src/daemon/start.ts +0 -29
  205. package/src/daemon/webhook.test.ts +0 -68
  206. package/src/daemon/webhook.ts +0 -105
  207. package/src/index.test.ts +0 -436
  208. package/src/index.ts +0 -72
  209. package/src/types/index.test.ts +0 -87
  210. package/src/types/index.ts +0 -341
  211. package/src/types/result.ts +0 -68
  212. package/src/utils/benchmark.ts +0 -237
  213. package/src/utils/logger.ts +0 -331
  214. package/src/utils/middleware.ts +0 -229
  215. package/src/utils/rate-limiter.ts +0 -207
  216. package/src/utils/signature.ts +0 -136
  217. package/src/utils/validation.ts +0 -186
  218. package/tests/docker/Dockerfile.node +0 -23
  219. package/tests/docker/Dockerfile.runner +0 -18
  220. package/tests/docker/docker-compose.test.yml +0 -73
  221. package/tests/integration/message-passing.test.ts +0 -109
  222. package/tests/integration/multi-node.test.ts +0 -92
  223. package/tests/integration/p2p-connection.test.ts +0 -83
  224. package/tests/integration/test-config.ts +0 -32
  225. package/tsconfig.json +0 -21
  226. package/vitest.config.ts +0 -26
@@ -1,260 +0,0 @@
1
- /**
2
- * 信誉系统测试
3
- */
4
-
5
- import { describe, it, expect, beforeEach } from 'vitest';
6
- import { ReputationManager, REPUTATION_TIERS, ReputationLevel } from './reputation.js';
7
-
8
- describe('ReputationManager', () => {
9
- let manager: ReputationManager;
10
-
11
- beforeEach(() => {
12
- manager = new ReputationManager();
13
- });
14
-
15
- describe('初始信誉', () => {
16
- it('should assign initial score of 70', () => {
17
- const entry = manager.getReputation('peer-1');
18
- expect(entry.score).toBe(70);
19
- expect(entry.level).toBe('contributor');
20
- });
21
-
22
- it('should create same entry for same peer', () => {
23
- const entry1 = manager.getReputation('peer-1');
24
- const entry2 = manager.getReputation('peer-1');
25
- expect(entry1).toBe(entry2);
26
- });
27
-
28
- it('should create different entries for different peers', () => {
29
- const entry1 = manager.getReputation('peer-1');
30
- const entry2 = manager.getReputation('peer-2');
31
- expect(entry1).not.toBe(entry2);
32
- expect(entry1.peerId).toBe('peer-1');
33
- expect(entry2.peerId).toBe('peer-2');
34
- });
35
- });
36
-
37
- describe('信誉等级', () => {
38
- it('should return correct tier for score', () => {
39
- const tier0 = manager.getTier(10);
40
- expect(tier0.level).toBe('restricted');
41
-
42
- const tier1 = manager.getTier(30);
43
- expect(tier1.level).toBe('novice');
44
-
45
- const tier2 = manager.getTier(50);
46
- expect(tier2.level).toBe('participant');
47
-
48
- const tier3 = manager.getTier(70);
49
- expect(tier3.level).toBe('contributor');
50
-
51
- const tier4 = manager.getTier(90);
52
- expect(tier4.level).toBe('core');
53
- });
54
-
55
- it('should have correct permissions for each tier', () => {
56
- // restricted
57
- expect(manager.getTier(10).permissions.canPublish).toBe(false);
58
- expect(manager.getTier(10).permissions.canExecute).toBe(true);
59
- expect(manager.getTier(10).permissions.canReview).toBe(false);
60
-
61
- // novice
62
- expect(manager.getTier(30).permissions.canPublish).toBe(true);
63
- expect(manager.getTier(30).permissions.canReview).toBe(false);
64
-
65
- // participant+
66
- expect(manager.getTier(50).permissions.canReview).toBe(true);
67
-
68
- // contributor
69
- expect(manager.getTier(70).permissions.publishDiscount).toBe(0.9);
70
-
71
- // core
72
- expect(manager.getTier(90).permissions.publishDiscount).toBe(0.7);
73
- expect(manager.getTier(90).permissions.publishPriority).toBe(5);
74
- });
75
- });
76
-
77
- describe('权限检查', () => {
78
- it('should check publish permission correctly', () => {
79
- // 70 分应该可以发布
80
- expect(manager.hasPermission('peer-1', 'publish')).toBe(true);
81
-
82
- // 降低到受限者
83
- manager.recordFailure('peer-1', 'task-1', 'test');
84
- manager.recordFailure('peer-1', 'task-2', 'test');
85
- manager.recordFailure('peer-1', 'task-3', 'test');
86
- manager.recordFailure('peer-1', 'task-4', 'test');
87
-
88
- // 多次失败后可能降到受限者
89
- const entry = manager.getReputation('peer-1');
90
- if (entry.score < 20) {
91
- expect(manager.hasPermission('peer-1', 'publish')).toBe(false);
92
- }
93
- });
94
-
95
- it('should always allow execute permission', () => {
96
- expect(manager.hasPermission('peer-1', 'execute')).toBe(true);
97
- });
98
-
99
- it('should check review permission correctly', () => {
100
- // 70 分是参与者,可以评审
101
- expect(manager.hasPermission('peer-1', 'review')).toBe(true);
102
- });
103
- });
104
-
105
- describe('EWMA 分数更新', () => {
106
- it('should update score with EWMA on success', () => {
107
- manager.recordSuccess('peer-1', 'task-1');
108
- const entry = manager.getReputation('peer-1');
109
-
110
- // EWMA: newScore = 0.3 * 80 + 0.7 * 70 = 24 + 49 = 73
111
- expect(entry.score).toBeCloseTo(73, 1);
112
- });
113
-
114
- it('should update score with EWMA on failure', () => {
115
- manager.recordFailure('peer-1', 'task-1', 'test');
116
- const entry = manager.getReputation('peer-1');
117
-
118
- // EWMA: newScore = 0.3 * 50 + 0.7 * 70 = 15 + 49 = 64
119
- expect(entry.score).toBeCloseTo(64, 1);
120
- });
121
-
122
- it('should cap score at 100', () => {
123
- // 多次成功应该封顶在 100
124
- for (let i = 0; i < 20; i++) {
125
- manager.recordSuccess('peer-1', `task-${i}`);
126
- }
127
- const entry = manager.getReputation('peer-1');
128
- expect(entry.score).toBeLessThanOrEqual(100);
129
- });
130
-
131
- it('should not go below 0', () => {
132
- // 多次失败应该保底在 0
133
- for (let i = 0; i < 20; i++) {
134
- manager.recordFailure('peer-1', `task-${i}`, 'test');
135
- }
136
- const entry = manager.getReputation('peer-1');
137
- expect(entry.score).toBeGreaterThanOrEqual(0);
138
- });
139
- });
140
-
141
- describe('事件历史', () => {
142
- it('should record success events', () => {
143
- manager.recordSuccess('peer-1', 'task-1');
144
- const entry = manager.getReputation('peer-1');
145
-
146
- expect(entry.history.length).toBe(2); // initial + success
147
- expect(entry.history[1].type).toBe('task_success');
148
- expect(entry.history[1].taskId).toBe('task-1');
149
- });
150
-
151
- it('should record failure events with reason', () => {
152
- manager.recordFailure('peer-1', 'task-1', 'timeout');
153
- const entry = manager.getReputation('peer-1');
154
-
155
- expect(entry.history.length).toBe(2);
156
- expect(entry.history[1].type).toBe('task_failure');
157
- expect(entry.history[1].reason).toBe('timeout');
158
- });
159
-
160
- it('should record rejection events', () => {
161
- manager.recordRejection('peer-1', 'task-1', 'busy');
162
- const entry = manager.getReputation('peer-1');
163
-
164
- expect(entry.history.some(e => e.type === 'task_rejected')).toBe(true);
165
- });
166
-
167
- it('should record review rewards', () => {
168
- manager.recordReviewReward('peer-1', 3);
169
- const entry = manager.getReputation('peer-1');
170
-
171
- expect(entry.history.some(e => e.type === 'review_given')).toBe(true);
172
- });
173
-
174
- it('should record review penalties', () => {
175
- manager.recordReviewPenalty('peer-1', -5, 'outlier');
176
- const entry = manager.getReputation('peer-1');
177
-
178
- expect(entry.history.some(e => e.type === 'review_penalty')).toBe(true);
179
- });
180
- });
181
-
182
- describe('排序和查询', () => {
183
- it('should return reputations sorted by score', () => {
184
- manager.recordSuccess('peer-1', 'task-1');
185
- manager.recordFailure('peer-2', 'task-2', 'test');
186
- manager.recordSuccess('peer-3', 'task-3');
187
- manager.recordSuccess('peer-3', 'task-4');
188
-
189
- const all = manager.getAllReputations();
190
- expect(all[0].score).toBeGreaterThanOrEqual(all[1].score);
191
- expect(all[1].score).toBeGreaterThanOrEqual(all[2].score);
192
- });
193
-
194
- it('should filter high reputation nodes', () => {
195
- // peer-1 保持高信誉
196
- manager.recordSuccess('peer-1', 'task-1');
197
-
198
- // peer-2 降低信誉
199
- for (let i = 0; i < 5; i++) {
200
- manager.recordFailure('peer-2', `task-${i}`, 'test');
201
- }
202
-
203
- const highReputation = manager.getHighReputationNodes(50);
204
- expect(highReputation.some(e => e.peerId === 'peer-1')).toBe(true);
205
- });
206
- });
207
-
208
- describe('发布折扣和优先级', () => {
209
- it('should return correct publish discount', () => {
210
- // 70 分是 contributor,折扣 0.9
211
- expect(manager.getPublishDiscount('peer-1')).toBe(0.9);
212
-
213
- // 提升到 core
214
- for (let i = 0; i < 10; i++) {
215
- manager.recordSuccess('peer-1', `task-${i}`);
216
- }
217
- const entry = manager.getReputation('peer-1');
218
- if (entry.level === 'core') {
219
- expect(manager.getPublishDiscount('peer-1')).toBe(0.7);
220
- }
221
- });
222
-
223
- it('should return correct publish priority', () => {
224
- // 70 分是 contributor,优先级 3
225
- expect(manager.getPublishPriority('peer-1')).toBe(3);
226
- });
227
- });
228
-
229
- describe('自定义配置', () => {
230
- it('should use custom initial score', () => {
231
- const customManager = new ReputationManager({ initialScore: 50 });
232
- const entry = customManager.getReputation('peer-1');
233
- expect(entry.score).toBe(50);
234
- });
235
-
236
- it('should use custom alpha for EWMA', () => {
237
- const customManager = new ReputationManager({ alpha: 0.5 });
238
- customManager.recordSuccess('peer-1', 'task-1');
239
- const entry = customManager.getReputation('peer-1');
240
-
241
- // EWMA: newScore = 0.5 * 80 + 0.5 * 70 = 40 + 35 = 75
242
- expect(entry.score).toBeCloseTo(75, 1);
243
- });
244
- });
245
- });
246
-
247
- describe('REPUTATION_TIERS', () => {
248
- it('should have 5 tiers', () => {
249
- expect(REPUTATION_TIERS.length).toBe(5);
250
- });
251
-
252
- it('should cover all score ranges', () => {
253
- const levels = REPUTATION_TIERS.map(t => t.level);
254
- expect(levels).toContain('restricted');
255
- expect(levels).toContain('novice');
256
- expect(levels).toContain('participant');
257
- expect(levels).toContain('contributor');
258
- expect(levels).toContain('core');
259
- });
260
- });