@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,247 +0,0 @@
1
- # F2A 安全设计文档
2
-
3
- **版本**: 0.3.1
4
- **更新日期**: 2026-03-02
5
- **状态**: 已实现
6
-
7
- ---
8
-
9
- ## 概述
10
-
11
- F2A 采用多层安全机制,确保 Agent 间通信的机密性、完整性和身份真实性。
12
-
13
- ## 安全架构
14
-
15
- ```
16
- ┌─────────────────────────────────────────────────────────────┐
17
- │ 应用层 (Application) │
18
- │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
19
- │ │ Messaging│ │ Skills │ │ Files │ │ Groups │ │
20
- │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
21
- ├───────┼─────────────┼─────────────┼─────────────┼──────────┤
22
- │ │ │ │ │ │
23
- │ ┌────┴─────────────┴─────────────┴─────────────┴─────┐ │
24
- │ │ 加密层 (E2E Encryption) │ │
25
- │ │ X25519 密钥交换 + AES-256-GCM │ │
26
- │ └────┬───────────────────────────────────────────────┘ │
27
- ├───────┼────────────────────────────────────────────────────┤
28
- │ │ │
29
- │ ┌────┴───────────────────────────────────────────────┐ │
30
- │ │ 身份层 (Identity) │ │
31
- │ │ Ed25519 签名 + Agent ID 绑定 │ │
32
- │ └────┬───────────────────────────────────────────────┘ │
33
- ├───────┼────────────────────────────────────────────────────┤
34
- │ │ │
35
- │ ┌────┴───────────────────────────────────────────────┐ │
36
- │ │ 传输层 (Transport) │ │
37
- │ │ TCP 直连 / WebRTC / UDP 发现 │ │
38
- │ └────────────────────────────────────────────────────┘ │
39
- └─────────────────────────────────────────────────────────────┘
40
- ```
41
-
42
- ---
43
-
44
- ## 1. 身份验证 (Identity)
45
-
46
- ### 1.1 Agent ID 与密钥绑定
47
-
48
- - Agent ID 由 Ed25519 公钥派生(格式:`f2a-xxxx-xxxx`)
49
- - 身份持久化保存在 `~/.f2a/identity.json`
50
- - 首次启动自动生成密钥对
51
-
52
- ```javascript
53
- // 身份文件结构
54
- {
55
- "agentId": "f2a-78c8-c55b",
56
- "displayName": "CatPuru",
57
- "publicKey": "-----BEGIN PUBLIC KEY-----...",
58
- "privateKey": "-----BEGIN PRIVATE KEY-----...",
59
- "createdAt": "2026-03-01T10:00:00.000Z"
60
- }
61
- ```
62
-
63
- ### 1.2 连接时的身份验证
64
-
65
- ```javascript
66
- // 挑战-响应协议
67
- {
68
- "type": "identity_challenge",
69
- "agentId": "f2a-xxx",
70
- "publicKey": "...",
71
- "challenge": "随机数",
72
- "timestamp": 1709000000000
73
- }
74
-
75
- // 签名响应
76
- {
77
- "type": "identity_response",
78
- "agentId": "f2a-xxx",
79
- "signature": "Ed25519签名(challenge + timestamp)"
80
- }
81
- ```
82
-
83
- ---
84
-
85
- ## 2. 端到端加密 (E2E Encryption)
86
-
87
- ### 2.1 密钥交换
88
-
89
- - 使用 X25519 进行 ECDH 密钥交换
90
- - 每次会话生成新的会话密钥
91
- - 前向保密(Forward Secrecy)
92
-
93
- ### 2.2 消息加密
94
-
95
- - 算法:AES-256-GCM
96
- - 每个消息包含:
97
- - 随机 IV (12 bytes)
98
- - 认证标签 (16 bytes)
99
- - 密文
100
-
101
- ```javascript
102
- // 加密消息格式
103
- {
104
- "type": "encrypted",
105
- "iv": "base64(12字节随机数)",
106
- "ciphertext": "base64(密文)",
107
- "tag": "base64(16字节认证标签)"
108
- }
109
- ```
110
-
111
- ---
112
-
113
- ## 3. 安全等级配置
114
-
115
- ```javascript
116
- const f2a = await F2A.create({
117
- security: {
118
- // low: 仅加密,信任局域网
119
- // medium: 加密 + 白名单(默认)
120
- // high: 加密 + 手动确认 + 签名验证
121
- level: 'medium',
122
-
123
- // 白名单(medium/high 有效)
124
- whitelist: ['f2a-agent-a', 'f2a-agent-b'],
125
-
126
- // 黑名单
127
- blacklist: ['f2a-malicious'],
128
-
129
- // 是否需要手动确认(high 强制 true)
130
- requireConfirmation: true,
131
-
132
- // 是否验证签名
133
- verifySignatures: true,
134
-
135
- // 速率限制
136
- rateLimit: {
137
- maxRequests: 10,
138
- windowMs: 60000 // 1分钟
139
- }
140
- }
141
- });
142
- ```
143
-
144
- ---
145
-
146
- ## 4. 防护措施
147
-
148
- ### 4.1 防重放攻击
149
-
150
- - 每个消息包含唯一 ID (UUID)
151
- - 时间戳有效期:5 分钟
152
- - 已处理消息 ID 缓存(最大 5000 条,LRU 清理)
153
-
154
- ```javascript
155
- // 消息格式
156
- {
157
- "type": "message",
158
- "id": "msg-uuid",
159
- "timestamp": 1709000000000,
160
- "content": "..."
161
- }
162
- ```
163
-
164
- ### 4.2 速率限制
165
-
166
- - 默认:10 请求/分钟
167
- - 超过限制自动断开连接
168
- - 定期清理过期记录
169
-
170
- ### 4.3 消息大小限制
171
-
172
- - 最大消息大小:1MB
173
- - 超过限制的消息直接丢弃
174
-
175
- ### 4.4 输入验证
176
-
177
- - 所有输入参数类型检查
178
- - 路径遍历防护(文件传输)
179
- - JSON 结构验证
180
-
181
- ---
182
-
183
- ## 5. 威胁防护对照表
184
-
185
- | 威胁 | 防护措施 | 实现状态 |
186
- |------|----------|----------|
187
- | 窃听 | AES-256-GCM 加密 | ✅ 已实现 |
188
- | 身份伪造 | Ed25519 签名验证 | ✅ 已实现 |
189
- | 中间人攻击 | ECDH 密钥交换 | ✅ 已实现 |
190
- | 重放攻击 | 消息 ID + 时间戳 | ✅ 已实现 |
191
- | DoS 攻击 | 速率限制 + 消息大小限制 | ✅ 已实现 |
192
- | 恶意连接 | 白名单 + 黑名单 | ✅ 已实现 |
193
- | 未授权访问 | 手动确认机制 | ✅ 已实现 |
194
-
195
- ---
196
-
197
- ## 6. 安全最佳实践
198
-
199
- ### 6.1 生产环境建议
200
-
201
- ```javascript
202
- const f2a = await F2A.create({
203
- security: {
204
- level: 'high',
205
- requireConfirmation: true,
206
- verifySignatures: true,
207
- whitelist: [], // 只接受已配对 Agent
208
- rateLimit: {
209
- maxRequests: 10,
210
- windowMs: 60000
211
- }
212
- }
213
- });
214
- ```
215
-
216
- ### 6.2 敏感操作确认
217
-
218
- - 首次连接需要手动确认
219
- - 文件传输需要接收方确认
220
- - 技能调用可以配置为需要确认
221
-
222
- ### 6.3 日志审计
223
-
224
- - 所有连接/断开事件记录
225
- - 消息发送/接收记录(DEBUG 级别)
226
- - 安全事件记录(WARN/ERROR 级别)
227
-
228
- ---
229
-
230
- ## 7. 已知限制
231
-
232
- 1. **UDP 发现广播**:发现消息未加密(仅包含公开信息)
233
- 2. **WebRTC 依赖**:需要 STUN/TURN 服务器(可配置)
234
- 3. **密钥存储**:私钥以明文存储在文件系统(依赖 OS 权限保护)
235
-
236
- ---
237
-
238
- ## 8. 更新记录
239
-
240
- | 日期 | 版本 | 变更 |
241
- |------|------|------|
242
- | 2026-03-02 | 0.3.1 | 更新文档,添加已实现功能说明 |
243
- | 2026-02-28 | 0.3.0 | 初始安全设计文档 |
244
-
245
- ---
246
-
247
- *文档维护:F2A Team*
package/install.sh DELETED
@@ -1,231 +0,0 @@
1
- #!/bin/bash
2
- #
3
- # F2A 一键安装脚本 (纯 P2P 版本)
4
- #
5
- # 使用方法:
6
- # curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash
7
- #
8
- # 或指定安装目录:
9
- # curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash -s -- --dir /path/to/install
10
-
11
- set -e
12
-
13
- # 颜色输出
14
- RED='\033[0;31m'
15
- GREEN='\033[0;32m'
16
- YELLOW='\033[1;33m'
17
- BLUE='\033[0;34m'
18
- NC='\033[0m' # No Color
19
-
20
- # 默认配置
21
- INSTALL_DIR="${HOME}/.openclaw/workspace/skills/f2a-network"
22
- REPO_URL="https://github.com/LuciusCao/F2A"
23
- P2P_PORT="9000"
24
-
25
- # 解析参数
26
- while [[ $# -gt 0 ]]; do
27
- case $1 in
28
- --dir)
29
- INSTALL_DIR="$2"
30
- shift 2
31
- ;;
32
- --port)
33
- P2P_PORT="$2"
34
- shift 2
35
- ;;
36
- --help)
37
- echo "F2A 纯 P2P Agent 网络安装脚本"
38
- echo ""
39
- echo "用法:"
40
- echo " curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash"
41
- echo ""
42
- echo "选项:"
43
- echo " --dir PATH 指定安装目录 (默认: ~/.openclaw/workspace/skills/f2a-network)"
44
- echo " --port PORT 指定 P2P 端口 (默认: 9000)"
45
- echo " --help 显示帮助"
46
- echo ""
47
- echo "示例:"
48
- echo " # 默认安装"
49
- echo " curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash"
50
- echo ""
51
- echo " # 指定端口"
52
- echo " curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash -s -- --port 9001"
53
- exit 0
54
- ;;
55
- *)
56
- echo "未知选项: $1"
57
- echo "使用 --help 查看帮助"
58
- exit 1
59
- ;;
60
- esac
61
- done
62
-
63
- echo -e "${BLUE}🚀 F2A 纯 P2P Agent 网络安装程序${NC}"
64
- echo -e "${BLUE} 无需服务器,局域网直连${NC}"
65
- echo ""
66
-
67
- # 检查 Node.js
68
- echo -e "${BLUE}📋 检查环境...${NC}"
69
- if ! command -v node &> /dev/null; then
70
- echo -e "${RED}❌ Node.js 未安装${NC}"
71
- echo ""
72
- echo "请先安装 Node.js 18+:"
73
- echo " https://nodejs.org/"
74
- echo ""
75
- echo "或使用包管理器:"
76
- echo " macOS: brew install node"
77
- echo " Ubuntu: sudo apt install nodejs npm"
78
- echo " CentOS: sudo yum install nodejs npm"
79
- exit 1
80
- fi
81
-
82
- NODE_VERSION=$(node --version | cut -d'v' -f2 | cut -d'.' -f1)
83
- if [ "$NODE_VERSION" -lt 18 ]; then
84
- echo -e "${RED}❌ Node.js 版本过低: $(node --version)${NC}"
85
- echo "需要 Node.js 18+"
86
- exit 1
87
- fi
88
-
89
- echo -e "${GREEN}✅ Node.js $(node --version)${NC}"
90
-
91
- # 检查 npm
92
- if ! command -v npm &> /dev/null; then
93
- echo -e "${RED}❌ npm 未安装${NC}"
94
- exit 1
95
- fi
96
-
97
- echo -e "${GREEN}✅ npm $(npm --version)${NC}"
98
- echo ""
99
-
100
- # 检查 git
101
- if ! command -v git &> /dev/null; then
102
- echo -e "${YELLOW}⚠️ git 未安装,将使用 curl 下载${NC}"
103
- USE_GIT=false
104
- else
105
- echo -e "${GREEN}✅ git $(git --version | cut -d' ' -f3)${NC}"
106
- USE_GIT=true
107
- fi
108
- echo ""
109
-
110
- # 创建安装目录
111
- echo -e "${BLUE}📁 创建安装目录...${NC}"
112
- if [ -d "${INSTALL_DIR}" ]; then
113
- echo -e "${YELLOW}⚠️ 目录已存在,将覆盖安装${NC}"
114
- rm -rf "${INSTALL_DIR}"
115
- fi
116
-
117
- mkdir -p "${INSTALL_DIR}"
118
- cd "${INSTALL_DIR}"
119
- echo -e "${GREEN}✅ 目录: ${INSTALL_DIR}${NC}"
120
- echo ""
121
-
122
- # 下载 F2A
123
- echo -e "${BLUE}⬇️ 下载 F2A...${NC}"
124
-
125
- if [ "$USE_GIT" = true ]; then
126
- # 使用 git clone
127
- git clone --depth 1 "${REPO_URL}.git" temp_clone 2>/dev/null || {
128
- echo -e "${YELLOW}⚠️ git clone 失败,尝试使用 curl...${NC}"
129
- USE_GIT=false
130
- }
131
-
132
- if [ "$USE_GIT" = true ]; then
133
- cp -r temp_clone/skill/* .
134
- rm -rf temp_clone
135
- echo -e "${GREEN}✅ 通过 git 下载成功${NC}"
136
- fi
137
- fi
138
-
139
- if [ "$USE_GIT" = false ]; then
140
- # 使用 curl 下载
141
- echo -e "${BLUE}📦 使用 curl 下载...${NC}"
142
-
143
- # 下载最新 release
144
- LATEST_URL="${REPO_URL}/archive/refs/heads/main.tar.gz"
145
-
146
- if curl -fsSL -o f2a.tar.gz "${LATEST_URL}"; then
147
- tar -xzf f2a.tar.gz --strip-components=2 "F2A-main/skill"
148
- rm -f f2a.tar.gz
149
- echo -e "${GREEN}✅ 通过 curl 下载成功${NC}"
150
- else
151
- echo -e "${RED}❌ 下载失败${NC}"
152
- echo ""
153
- echo "可能原因:"
154
- echo " 1. 无法连接到 GitHub"
155
- echo " 2. 网络不稳定"
156
- echo ""
157
- echo "解决方法:"
158
- echo " 1. 检查网络连接"
159
- echo " 2. 手动下载: git clone ${REPO_URL}"
160
- exit 1
161
- fi
162
- fi
163
-
164
- echo ""
165
-
166
- # 安装依赖
167
- echo -e "${BLUE}📚 安装依赖...${NC}"
168
- npm install --production
169
- echo -e "${GREEN}✅ 依赖安装完成${NC}"
170
- echo ""
171
-
172
- # 创建配置文件
173
- mkdir -p "${INSTALL_DIR}/memory/f2a"
174
- cat > "${INSTALL_DIR}/memory/f2a/config.json" << EOF
175
- {
176
- "p2pPort": ${P2P_PORT},
177
- "security": {
178
- "level": "medium",
179
- "requireConfirmation": true
180
- }
181
- }
182
- EOF
183
-
184
- # 创建启动脚本
185
- cat > "${INSTALL_DIR}/start.sh" << EOF
186
- #!/bin/bash
187
- cd "$(dirname "$0")"
188
- echo "🚀 启动 F2A 纯 P2P 网络..."
189
- echo " 端口: ${P2P_PORT}"
190
- echo ""
191
- node examples/serverless-example.js
192
- EOF
193
- chmod +x "${INSTALL_DIR}/start.sh"
194
-
195
- # 创建快速启动命令
196
- if [ -d "${HOME}/.local/bin" ]; then
197
- cat > "${HOME}/.local/bin/f2a" << EOF
198
- #!/bin/bash
199
- cd "${INSTALL_DIR}"
200
- ./start.sh
201
- EOF
202
- chmod +x "${HOME}/.local/bin/f2a"
203
- echo -e "${GREEN}✅ 已创建快捷命令: f2a${NC}"
204
- fi
205
-
206
- echo -e "${GREEN}🎉 F2A 安装完成!${NC}"
207
- echo ""
208
- echo "═══════════════════════════════════════"
209
- echo ""
210
- echo "📂 安装目录: ${INSTALL_DIR}"
211
- echo "🔌 P2P 端口: ${P2P_PORT}"
212
- echo ""
213
- echo "🚀 启动方式:"
214
- echo " cd ${INSTALL_DIR}"
215
- echo " ./start.sh"
216
- echo ""
217
- echo "或直接使用:"
218
- echo " f2a"
219
- echo ""
220
- echo "📖 使用方法:"
221
- echo " 1. 启动后自动发现局域网内的其他 Agent"
222
- echo " 2. 新连接需要手动确认"
223
- echo " 3. 使用命令行交互发送消息"
224
- echo ""
225
- echo "🔐 安全特性:"
226
- echo " - 端到端加密 (ECDH + AES-256-GCM)"
227
- echo " - Ed25519 身份签名验证"
228
- echo " - 白名单/黑名单机制"
229
- echo " - 速率限制防 DoS"
230
- echo ""
231
- echo "═══════════════════════════════════════"