@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,502 +0,0 @@
1
- /**
2
- * TaskGuard 测试
3
- */
4
-
5
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
6
- import { TaskGuard, DEFAULT_TASK_GUARD_CONFIG, type TaskGuardRule, type TaskGuardContext } from './task-guard.js';
7
- import type { TaskRequest, TaskAnnouncement, ReputationEntry } from './types.js';
8
-
9
- describe('TaskGuard', () => {
10
- let guard: TaskGuard;
11
-
12
- beforeEach(() => {
13
- guard = new TaskGuard();
14
- });
15
-
16
- // 创建测试任务
17
- const createTask = (overrides: Partial<TaskRequest> = {}): TaskRequest => ({
18
- taskId: 'test-task-1',
19
- taskType: 'test',
20
- description: 'A test task',
21
- from: 'peer-1',
22
- timestamp: Date.now(),
23
- timeout: 5000,
24
- ...overrides
25
- });
26
-
27
- const createAnnouncement = (overrides: Partial<TaskAnnouncement> = {}): TaskAnnouncement => ({
28
- announcementId: 'ann-test-1',
29
- taskType: 'test',
30
- description: 'A test announcement',
31
- from: 'peer-1',
32
- timestamp: Date.now(),
33
- timeout: 5000,
34
- status: 'open',
35
- ...overrides
36
- });
37
-
38
- describe('check() - 基础功能', () => {
39
- it('应该返回检查报告', () => {
40
- const task = createTask();
41
- const report = guard.check(task);
42
-
43
- expect(report.taskId).toBe('test-task-1');
44
- expect(report.passed).toBe(true);
45
- expect(report.timestamp).toBeGreaterThan(0);
46
- expect(Array.isArray(report.results)).toBe(true);
47
- });
48
-
49
- it('应该运行所有启用的规则', () => {
50
- const task = createTask();
51
- const report = guard.check(task);
52
-
53
- // 7 个默认规则
54
- expect(report.results).toHaveLength(7);
55
- });
56
-
57
- it('应该正确分类 blocks 和 warnings', () => {
58
- const task = createTask({ description: 'rm -rf /' });
59
- const report = guard.check(task);
60
-
61
- expect(report.passed).toBe(false);
62
- expect(report.blocks.length).toBeGreaterThan(0);
63
- });
64
-
65
- it('应该记录任务以用于频率限制', () => {
66
- const task = createTask();
67
-
68
- guard.check(task);
69
- guard.check(task);
70
- guard.check(task);
71
-
72
- // 第四次检查应该在 recentTaskCount 中看到 3
73
- const report = guard.check(task, { isWhitelisted: false, isBlacklisted: false });
74
-
75
- // 频率限制规则应该通过(3 < 10)
76
- const rateLimitResult = report.results.find(r => r.ruleId === 'rate-limit');
77
- expect(rateLimitResult?.passed).toBe(true);
78
- });
79
- });
80
-
81
- describe('规则 1: 黑名单检查', () => {
82
- it('应该阻止黑名单用户', () => {
83
- const task = createTask();
84
- const report = guard.check(task, { isBlacklisted: true });
85
-
86
- expect(report.passed).toBe(false);
87
- expect(report.blocks.some(r => r.ruleId === 'blacklist')).toBe(true);
88
- });
89
-
90
- it('应该允许非黑名单用户', () => {
91
- const task = createTask();
92
- const report = guard.check(task, { isBlacklisted: false });
93
-
94
- const blacklistResult = report.results.find(r => r.ruleId === 'blacklist');
95
- expect(blacklistResult?.passed).toBe(true);
96
- });
97
- });
98
-
99
- describe('规则 2: 频率限制', () => {
100
- it('应该阻止频率过高的请求', () => {
101
- const task = createTask();
102
-
103
- // 发送 11 次请求(超过默认限制 10)
104
- for (let i = 0; i < 11; i++) {
105
- guard.check(task);
106
- }
107
-
108
- const report = guard.check(task);
109
-
110
- const rateLimitResult = report.results.find(r => r.ruleId === 'rate-limit');
111
- expect(rateLimitResult?.passed).toBe(false);
112
- expect(report.passed).toBe(false);
113
- });
114
-
115
- it('应该允许正常频率的请求', () => {
116
- const task = createTask();
117
- const report = guard.check(task);
118
-
119
- const rateLimitResult = report.results.find(r => r.ruleId === 'rate-limit');
120
- expect(rateLimitResult?.passed).toBe(true);
121
- });
122
-
123
- it('应该使用自定义的 maxTasksPerMinute', () => {
124
- const strictGuard = new TaskGuard({ maxTasksPerMinute: 2 });
125
- const task = createTask();
126
-
127
- // 第一次检查:recentTaskCount = 0,通过
128
- strictGuard.check(task);
129
- // 第二次检查:recentTaskCount = 1,通过
130
- strictGuard.check(task);
131
- // 第三次检查:recentTaskCount = 2,2 > 2 = false,通过
132
- strictGuard.check(task);
133
- // 第四次检查:recentTaskCount = 3,3 > 2 = true,被阻止
134
- const report = strictGuard.check(task);
135
-
136
- expect(report.passed).toBe(false);
137
- expect(report.blocks.some(r => r.ruleId === 'rate-limit')).toBe(true);
138
- });
139
- });
140
-
141
- describe('规则 3: 危险关键词检查', () => {
142
- it('应该检测危险关键词', () => {
143
- const dangerousTasks = [
144
- 'rm -rf /',
145
- 'format the disk',
146
- 'delete all files',
147
- 'destroy everything',
148
- 'wipe the system'
149
- ];
150
-
151
- for (const desc of dangerousTasks) {
152
- const task = createTask({ description: desc });
153
- const report = guard.check(task);
154
-
155
- const keywordResult = report.results.find(r => r.ruleId === 'dangerous-keywords');
156
- expect(keywordResult?.passed).toBe(false);
157
- }
158
- });
159
-
160
- it('应该允许安全描述', () => {
161
- const task = createTask({ description: 'Read a file and process data' });
162
- const report = guard.check(task);
163
-
164
- const keywordResult = report.results.find(r => r.ruleId === 'dangerous-keywords');
165
- expect(keywordResult?.passed).toBe(true);
166
- });
167
-
168
- it('应该检测关键词(不区分大小写)', () => {
169
- const task = createTask({ description: 'FORMAT the disk' });
170
- const report = guard.check(task);
171
-
172
- const keywordResult = report.results.find(r => r.ruleId === 'dangerous-keywords');
173
- expect(keywordResult?.passed).toBe(false);
174
- });
175
- });
176
-
177
- describe('规则 4: 危险模式检查', () => {
178
- it('应该检测危险正则模式', () => {
179
- const dangerousPatterns = [
180
- 'rm -rf /',
181
- 'format c:',
182
- 'delete all records',
183
- 'drop database users',
184
- 'shutdown -h now'
185
- ];
186
-
187
- for (const desc of dangerousPatterns) {
188
- const task = createTask({ description: desc });
189
- const report = guard.check(task);
190
-
191
- const patternResult = report.results.find(r => r.ruleId === 'dangerous-patterns');
192
- expect(patternResult?.passed).toBe(false);
193
- }
194
- });
195
-
196
- it('应该允许安全模式', () => {
197
- const task = createTask({ description: 'delete a single item from list' });
198
- const report = guard.check(task);
199
-
200
- const patternResult = report.results.find(r => r.ruleId === 'dangerous-patterns');
201
- expect(patternResult?.passed).toBe(true);
202
- });
203
- });
204
-
205
- describe('规则 5: 信誉检查', () => {
206
- it('应该检查信誉是否足够执行危险任务', () => {
207
- const reputation: ReputationEntry = {
208
- peerId: 'peer-1',
209
- score: 50, // 低于默认的 minReputationForDangerous (70)
210
- successfulTasks: 10,
211
- failedTasks: 5,
212
- totalTasks: 15,
213
- avgResponseTime: 100,
214
- lastInteraction: Date.now(),
215
- history: []
216
- };
217
-
218
- const task = createTask({ description: 'rm -rf /' });
219
- const report = guard.check(task, { requesterReputation: reputation });
220
-
221
- const repResult = report.results.find(r => r.ruleId === 'reputation');
222
- expect(repResult?.passed).toBe(false);
223
- });
224
-
225
- it('应该允许高信誉用户执行危险任务', () => {
226
- const reputation: ReputationEntry = {
227
- peerId: 'peer-1',
228
- score: 80,
229
- successfulTasks: 100,
230
- failedTasks: 5,
231
- totalTasks: 105,
232
- avgResponseTime: 50,
233
- lastInteraction: Date.now(),
234
- history: []
235
- };
236
-
237
- const task = createTask({ description: 'rm -rf /' });
238
- const report = guard.check(task, { requesterReputation: reputation });
239
-
240
- // 注意:虽然信誉通过了,但危险关键词检查仍然会阻止
241
- const repResult = report.results.find(r => r.ruleId === 'reputation');
242
- expect(repResult?.passed).toBe(true);
243
- });
244
-
245
- it('应该处理无信誉记录的情况', () => {
246
- const task = createTask();
247
- const report = guard.check(task);
248
-
249
- const repResult = report.results.find(r => r.ruleId === 'reputation');
250
- expect(repResult?.passed).toBe(true);
251
- });
252
- });
253
-
254
- describe('规则 6: 文件操作检查', () => {
255
- it('应该检测系统路径文件操作', () => {
256
- const dangerousPaths = [
257
- 'read /etc/passwd',
258
- 'write to /sys/config',
259
- 'delete /proc/123',
260
- 'edit /dev/null'
261
- ];
262
-
263
- for (const desc of dangerousPaths) {
264
- const task = createTask({ description: desc });
265
- const report = guard.check(task);
266
-
267
- const fileResult = report.results.find(r => r.ruleId === 'file-operation');
268
- expect(fileResult?.passed).toBe(false);
269
- }
270
- });
271
-
272
- it('应该允许普通文件操作', () => {
273
- const task = createTask({ description: 'read ~/documents/file.txt' });
274
- const report = guard.check(task);
275
-
276
- const fileResult = report.results.find(r => r.ruleId === 'file-operation');
277
- expect(fileResult?.passed).toBe(true);
278
- });
279
- });
280
-
281
- describe('规则 7: 网络操作检查', () => {
282
- it('应该检测可疑的网络下载', () => {
283
- // 更新测试用例:只检测真正的可执行文件扩展名
284
- const suspiciousOps = [
285
- 'download malware.exe from http://example.com',
286
- 'fetch tool.dll via curl',
287
- 'wget http://example.com/backdoor.app',
288
- 'download payload.deb from api'
289
- ];
290
-
291
- for (const desc of suspiciousOps) {
292
- const task = createTask({ description: desc });
293
- const report = guard.check(task);
294
-
295
- const networkResult = report.results.find(r => r.ruleId === 'network-operation');
296
- expect(networkResult?.passed).toBe(false);
297
- }
298
- });
299
-
300
- it('应该允许正常的网络操作', () => {
301
- // 更新测试:python script 不再被标记为可疑
302
- const normalOps = [
303
- 'fetch data from http://api.example.com/data',
304
- 'download python script from api',
305
- 'download script.sh from http://example.com'
306
- ];
307
-
308
- for (const desc of normalOps) {
309
- const task = createTask({ description: desc });
310
- const report = guard.check(task);
311
-
312
- const networkResult = report.results.find(r => r.ruleId === 'network-operation');
313
- expect(networkResult?.passed).toBe(true);
314
- }
315
- });
316
- });
317
-
318
- describe('quickCheck()', () => {
319
- it('应该只返回布尔值', () => {
320
- const task = createTask();
321
- expect(guard.quickCheck(task)).toBe(true);
322
- });
323
-
324
- it('应该对危险任务返回 false', () => {
325
- const task = createTask({ description: 'rm -rf /' });
326
- expect(guard.quickCheck(task)).toBe(false);
327
- });
328
- });
329
-
330
- describe('addRule()', () => {
331
- it('应该添加自定义规则', () => {
332
- const customRule: TaskGuardRule = {
333
- id: 'custom-rule',
334
- name: '自定义规则',
335
- description: '测试自定义规则',
336
- enabled: true,
337
- severity: 'warn',
338
- check: (task, context) => ({
339
- passed: true,
340
- severity: 'warn',
341
- ruleId: 'custom-rule',
342
- message: '自定义规则检查通过'
343
- })
344
- };
345
-
346
- guard.addRule(customRule);
347
-
348
- const task = createTask();
349
- const report = guard.check(task);
350
-
351
- expect(report.results.some(r => r.ruleId === 'custom-rule')).toBe(true);
352
- });
353
-
354
- it('自定义规则应该能阻止任务', () => {
355
- const blockRule: TaskGuardRule = {
356
- id: 'block-all',
357
- name: '阻止所有',
358
- description: '测试阻止规则',
359
- enabled: true,
360
- severity: 'block',
361
- check: (task, context) => ({
362
- passed: false,
363
- severity: 'block',
364
- ruleId: 'block-all',
365
- message: '阻止所有任务'
366
- })
367
- };
368
-
369
- guard.addRule(blockRule);
370
-
371
- const task = createTask();
372
- const report = guard.check(task);
373
-
374
- expect(report.passed).toBe(false);
375
- expect(report.blocks.some(r => r.ruleId === 'block-all')).toBe(true);
376
- });
377
- });
378
-
379
- describe('setRuleEnabled()', () => {
380
- it('应该禁用规则', () => {
381
- guard.setRuleEnabled('blacklist', false);
382
-
383
- const task = createTask();
384
- const report = guard.check(task, { isBlacklisted: true });
385
-
386
- // 黑名单规则被禁用,应该通过
387
- expect(report.passed).toBe(true);
388
- });
389
-
390
- it('应该重新启用规则', () => {
391
- guard.setRuleEnabled('blacklist', false);
392
- guard.setRuleEnabled('blacklist', true);
393
-
394
- const task = createTask();
395
- const report = guard.check(task, { isBlacklisted: true });
396
-
397
- expect(report.passed).toBe(false);
398
- });
399
-
400
- it('应该忽略不存在的规则 ID', () => {
401
- // 不应该抛出错误
402
- guard.setRuleEnabled('non-existent-rule', true);
403
- guard.setRuleEnabled('non-existent-rule', false);
404
- });
405
- });
406
-
407
- describe('updateConfig()', () => {
408
- it('应该更新配置', () => {
409
- guard.updateConfig({ maxTasksPerMinute: 5 });
410
-
411
- const task = createTask();
412
- for (let i = 0; i < 6; i++) {
413
- guard.check(task);
414
- }
415
-
416
- const report = guard.check(task);
417
- expect(report.passed).toBe(false);
418
- });
419
-
420
- it('应该合并配置', () => {
421
- const originalBlocked = DEFAULT_TASK_GUARD_CONFIG.blockedKeywords.length;
422
- guard.updateConfig({ blockedKeywords: ['custom-dangerous-word'] });
423
-
424
- const task = createTask({ description: 'custom-dangerous-word' });
425
- const report = guard.check(task);
426
-
427
- expect(report.passed).toBe(false);
428
- });
429
- });
430
-
431
- describe('requiresConfirmation', () => {
432
- it('应该在有 warn 级别失败时要求确认', () => {
433
- const reputation: ReputationEntry = {
434
- peerId: 'peer-1',
435
- score: 50,
436
- successfulTasks: 10,
437
- failedTasks: 5,
438
- totalTasks: 15,
439
- avgResponseTime: 100,
440
- lastInteraction: Date.now(),
441
- history: []
442
- };
443
-
444
- const task = createTask({ description: 'rm -rf /' });
445
- const report = guard.check(task, { requesterReputation: reputation });
446
-
447
- // 危险任务会被 block,但如果只是 warn 级别,应该要求确认
448
- expect(report.requiresConfirmation).toBeDefined();
449
- });
450
-
451
- it('应该遵循 requireConfirmationForDangerous 配置', () => {
452
- const noConfirmGuard = new TaskGuard({ requireConfirmationForDangerous: false });
453
-
454
- const task = createTask({ description: 'download script.sh' });
455
- const report = noConfirmGuard.check(task);
456
-
457
- // 即使有 warn 级别的问题,也不需要确认
458
- // 注意:需要找一个是 warn 而不是 block 的场景
459
- });
460
- });
461
-
462
- describe('处理 TaskAnnouncement', () => {
463
- it('应该正确处理 TaskAnnouncement 类型', () => {
464
- const announcement = createAnnouncement();
465
- const report = guard.check(announcement);
466
-
467
- expect(report.taskId).toBe('ann-test-1');
468
- expect(report.passed).toBe(true);
469
- });
470
-
471
- it('应该检测 TaskAnnouncement 中的危险描述', () => {
472
- const announcement = createAnnouncement({ description: 'rm -rf /' });
473
- const report = guard.check(announcement);
474
-
475
- expect(report.passed).toBe(false);
476
- });
477
- });
478
-
479
- describe('规则执行错误处理', () => {
480
- it('应该处理规则执行中的错误', () => {
481
- const errorRule: TaskGuardRule = {
482
- id: 'error-rule',
483
- name: '错误规则',
484
- description: '测试错误处理',
485
- enabled: true,
486
- severity: 'warn',
487
- check: (task, context) => {
488
- throw new Error('规则执行失败');
489
- }
490
- };
491
-
492
- guard.addRule(errorRule);
493
-
494
- const task = createTask();
495
- const report = guard.check(task);
496
-
497
- const errorResult = report.results.find(r => r.ruleId === 'error-rule');
498
- expect(errorResult?.passed).toBe(false);
499
- expect(errorResult?.message).toContain('规则执行错误');
500
- });
501
- });
502
- });