@f2a/network 0.1.3 → 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 (91) 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 +2 -1
package/README.md CHANGED
@@ -4,69 +4,183 @@
4
4
 
5
5
  ---
6
6
 
7
+ **🚀 [5 分钟快速开始](./QUICKSTART.md)**
8
+
9
+ ---
10
+
7
11
  ## 目录
8
12
 
9
- 1. [运行 F2A 节点](#1-运行-f2a-节点) - 把机器变成一个 P2P 节点
10
- 2. [OpenClaw 插件](#2-openclaw-插件) - OpenClaw 里使用 F2A
11
- 3. [开发指南](#3-开发指南) - 基于 F2A 开发
13
+ 1. [快速开始](#1-快速开始) - 一键安装和配置
14
+ 2. [运行 F2A 节点](#2-运行-f2a-节点) - 把机器变成一个 P2P 节点
15
+ 3. [OpenClaw 插件](#3-openclaw-插件) - OpenClaw 里使用 F2A
16
+ 4. [开发指南](#4-开发指南) - 基于 F2A 开发
12
17
 
13
18
  ---
14
19
 
15
- ## 1. 运行 F2A 节点
20
+ ## 1. 快速开始
21
+
22
+ ### 1.1 选择安装方式
23
+
24
+ **方式一:NPM 全局安装**
25
+
26
+ 适用场景:
27
+ - 已有 Node.js 18+ 环境
28
+ - 快速安装,无需额外依赖
29
+ - 适合本地测试和体验
30
+
31
+ ```bash
32
+ npm install -g @f2a/network
33
+ ```
34
+
35
+ **方式二:一键安装脚本**
36
+
37
+ 适用场景:
38
+ - 无 Node.js 环境(脚本自动安装 Node.js)
39
+ - 生产服务器部署(支持 systemd 服务)
40
+ - 系统级安装(/usr/local/bin)
41
+
42
+ ```bash
43
+ curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash -s -- --global
44
+ ```
45
+
46
+ **两种方式对比:**
47
+
48
+ | 特性 | NPM 安装 | install.sh |
49
+ |------|----------|------------|
50
+ | 需要 Node.js | ✅ 是(18+) | ❌ 否(自动安装) |
51
+ | 安装速度 | ⚡ 快 | 🐢 较慢 |
52
+ | 系统服务 | ❌ 无 | ✅ systemd 支持 |
53
+ | 安装位置 | npm global | /usr/local |
54
+ | 推荐场景 | 已有 Node.js | 生产部署/无 Node.js |
16
55
 
17
- ### 1.1 安装
56
+ ### 1.2 配置向导
57
+
58
+ 安装后运行交互式配置向导:
18
59
 
19
60
  ```bash
20
- # 克隆仓库
61
+ f2a init
62
+ ```
63
+
64
+ 只需回答 3 个必需问题即可完成基本配置:
65
+
66
+ | 配置项 | 说明 | 默认值 |
67
+ |--------|------|--------|
68
+ | agentName | Agent 名称(网络中显示) | 用户名-主机名 |
69
+ | network.bootstrapPeers | 引导节点列表 | 空(本地网络) |
70
+ | autoStart | 是否自动启动 | false |
71
+
72
+ ### 1.3 启动 F2A
73
+
74
+ ```bash
75
+ # 后台启动
76
+ f2a daemon -d
77
+
78
+ # 查看状态
79
+ f2a status
80
+
81
+ # 查看已连接节点
82
+ f2a peers
83
+ ```
84
+
85
+ ### 1.4 配置文件
86
+
87
+ 配置文件位于 `~/.f2a/config.json`:
88
+
89
+ ```json
90
+ {
91
+ "agentName": "my-agent",
92
+ "network": {
93
+ "bootstrapPeers": [],
94
+ "bootstrapPeerFingerprints": {}
95
+ },
96
+ "autoStart": false
97
+ }
98
+ ```
99
+
100
+ **分层配置说明:**
101
+
102
+ | 层级 | 配置项 | 必需性 |
103
+ |------|--------|--------|
104
+ | **必需** | agentName, network, autoStart | 必须配置 |
105
+ | **进阶** | controlPort, p2pPort, enableMDNS, enableDHT, logLevel | 可选 |
106
+ | **专家** | security, rateLimit, dataDir | 极少需要 |
107
+
108
+ **network 配置详解:**
109
+
110
+ | 字段 | 类型 | 说明 |
111
+ |------|------|------|
112
+ | `bootstrapPeers` | `string[]` | 引导节点列表(multiaddr 格式) |
113
+ | `bootstrapPeerFingerprints` | `Record<string, string>` | 引导节点指纹映射,key 为 multiaddr,value 为预期 PeerID |
114
+
115
+ ---
116
+
117
+ ## 2. 运行 F2A 节点
118
+
119
+ ### 2.1 安装
120
+
121
+ ```bash
122
+ # 方式一:一键安装(推荐)
123
+ curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash -s -- --global
124
+
125
+ # 方式二:源码安装
21
126
  git clone https://github.com/LuciusCao/F2A.git
22
127
  cd F2A
23
-
24
- # 安装依赖
25
128
  npm install
26
-
27
- # 构建
28
129
  npm run build
130
+
131
+ # 方式三:NPM 全局安装
132
+ npm install -g @f2a/network
29
133
  ```
30
134
 
31
- 或者通过 NPM 安装:
135
+ ### 2.2 配置
32
136
 
33
137
  ```bash
34
- # 安装 F2A 网络
35
- npm install -g @f2a/network
138
+ # 交互式配置向导
139
+ f2a init
36
140
 
37
- # 启动节点
38
- f2a-network
141
+ # 查看当前配置
142
+ f2a config
39
143
  ```
40
144
 
41
- ### 1.2 启动节点
145
+ ### 2.3 启动节点
42
146
 
43
147
  **方式一:Daemon 模式(推荐)**
44
148
 
45
149
  ```bash
46
- # 启动后台服务
47
- node dist/daemon/index.js
150
+ # 后台启动 daemon
151
+ f2a daemon -d
152
+
153
+ # 前台启动(用于调试)
154
+ f2a daemon
155
+
156
+ # 查看 daemon 状态
157
+ f2a daemon status
158
+
159
+ # 停止 daemon
160
+ f2a daemon stop
48
161
  ```
49
162
 
50
163
  **方式二:CLI 模式**
51
164
 
52
165
  ```bash
53
166
  # 查看状态
54
- node dist/cli/index.js status
167
+ f2a status
55
168
 
56
169
  # 查看已连接节点
57
- node dist/cli/index.js peers
170
+ f2a peers
58
171
  ```
59
172
 
60
- ### 1.3 配置
173
+ ### 2.4 环境变量
61
174
 
62
- 通过环境变量配置:
175
+ 通过环境变量可以覆盖配置文件:
63
176
 
64
177
  | 变量 | 默认值 | 说明 |
65
178
  |------|--------|------|
66
179
  | `F2A_CONTROL_PORT` | 9001 | HTTP 控制端口 |
67
180
  | `F2A_CONTROL_TOKEN` | 自动生成 | 认证 Token(生产环境必须设置) |
68
- | `F2A_P2P_PORT` | 9000 | P2P 网络端口 |
181
+ | `F2A_P2P_PORT` | 0 | P2P 网络端口(0=随机分配) |
69
182
  | `F2A_SIGNATURE_KEY` | - | 请求签名密钥(可选) |
183
+ | `F2A_HEALTH_TIMEOUT` | 15000 | Daemon 启动健康检查超时(毫秒) |
70
184
 
71
185
  **生产环境配置示例:**
72
186
 
@@ -75,10 +189,58 @@ export F2A_CONTROL_TOKEN=$(openssl rand -hex 32)
75
189
  export F2A_SIGNATURE_KEY=$(openssl rand -hex 32)
76
190
  export NODE_ENV=production
77
191
 
78
- node dist/daemon/index.js
192
+ f2a daemon
193
+ ```
194
+
195
+ ### 2.5 引导节点指纹验证
196
+
197
+ 为了防止中间人攻击,F2A 支持引导节点公钥指纹验证。当连接到引导节点时,会验证远程节点的 PeerID 是否与预期一致。
198
+
199
+ **配置示例:**
200
+
201
+ ```json
202
+ {
203
+ "agentName": "my-agent",
204
+ "network": {
205
+ "bootstrapPeers": [
206
+ "/ip4/1.2.3.4/tcp/9000/p2p/12D3KooWExample"
207
+ ],
208
+ "bootstrapPeerFingerprints": {
209
+ "/ip4/1.2.3.4/tcp/9000/p2p/12D3KooWExample": "12D3KooWExample"
210
+ }
211
+ }
212
+ }
79
213
  ```
80
214
 
81
- ### 1.4 验证运行
215
+ **指纹验证行为:**
216
+
217
+ | 场景 | 行为 |
218
+ |------|------|
219
+ | 指纹匹配 | 连接成功,记录验证成功日志 |
220
+ | 指纹不匹配 | 断开连接,记录错误日志 |
221
+ | 未配置指纹 | 连接成功,记录警告日志(推荐配置) |
222
+
223
+ **获取引导节点指纹:**
224
+
225
+ 引导节点的 PeerID 可以从节点管理员处获取,或者通过以下方式查看:
226
+
227
+ ```bash
228
+ # 在引导节点上运行
229
+ f2a status
230
+
231
+ # 输出示例
232
+ # PeerID: 12D3KooWExample...
233
+ ```
234
+
235
+ **交互式配置:**
236
+
237
+ 运行 `f2a init` 时,配置引导节点后会询问是否配置指纹验证:
238
+
239
+ ```
240
+ ? 是否配置引导节点指纹验证?(推荐,防止中间人攻击) (y/N)
241
+ ```
242
+
243
+ ### 2.6 验证运行
82
244
 
83
245
  ```bash
84
246
  # 查看节点状态
@@ -88,9 +250,9 @@ curl http://localhost:9001/status \
88
250
 
89
251
  ---
90
252
 
91
- ## 2. OpenClaw 插件
253
+ ## 3. OpenClaw 插件
92
254
 
93
- ### 2.1 安装插件
255
+ ### 3.1 安装插件
94
256
 
95
257
  ```bash
96
258
  # 通过 OpenClaw 安装
@@ -118,18 +280,30 @@ npm install -g @f2a/openclaw-adapter
118
280
  }
119
281
  ```
120
282
 
121
- ### 2.2 配置详解
283
+ ### 3.2 配置详解
284
+
285
+ **基础配置:**
286
+
287
+ ```json
288
+ {
289
+ "agentName": "显示名称", // 在网络中显示的名称
290
+ "autoStart": true, // 自动启动 F2A daemon
291
+ "p2pPort": 9000, // P2P 网络端口
292
+ "enableMDNS": true // 启用本地网络自动发现
293
+ }
294
+ ```
295
+
296
+ **完整配置(可选):**
122
297
 
123
298
  ```json
124
299
  {
125
300
  "agentName": "显示名称",
126
- "f2aPath": "F2A项目路径",
127
301
  "autoStart": true,
128
- "webhookPort": 9002,
129
- "controlPort": 9001,
302
+ "controlPort": 9001, // HTTP 控制端口
130
303
  "p2pPort": 9000,
304
+ "webhookPort": 9002, // Webhook 接收端口
131
305
  "enableMDNS": true,
132
- "bootstrapPeers": [],
306
+ "bootstrapPeers": [], // 引导节点(用于连接远程节点)
133
307
  "maxQueuedTasks": 100,
134
308
  "reputation": {
135
309
  "enabled": true,
@@ -139,11 +313,14 @@ npm install -g @f2a/openclaw-adapter
139
313
  "requireConfirmation": false,
140
314
  "whitelist": [],
141
315
  "blacklist": []
142
- }
316
+ },
317
+ "f2aPath": "/path/to/F2A" // 仅开发调试时需要
143
318
  }
144
319
  ```
145
320
 
146
- ### 2.3 使用方式
321
+ > **提示**:`f2aPath` 仅在开发调试时需要,用于指定本地 F2A 源码路径。通过 `openclaw plugins install` 安装时不需要配置。
322
+
323
+ ### 3.3 使用方式
147
324
 
148
325
  安装后,直接在 OpenClaw 对话中使用:
149
326
 
@@ -154,21 +331,43 @@ npm install -g @f2a/openclaw-adapter
154
331
  | 广播任务 | "让所有人帮我检查这段代码的bug" |
155
332
  | 查看状态 | "查看F2A网络状态" |
156
333
 
157
- ### 2.4 提供的工具
158
-
159
- - `f2a_discover` - 发现网络中的 Agents
160
- - `f2a_delegate` - 委托任务给指定 Agent
161
- - `f2a_broadcast` - 广播任务给多个 Agents
162
- - `f2a_announce` - 广播任务(认领模式)
163
- - `f2a_claim` - 认领任务
164
- - `f2a_status` - 查看网络状态
165
- - `f2a_reputation` - 管理信誉
334
+ ### 3.4 提供的工具
335
+
336
+ **Agent 发现与任务分发**:
337
+ | 工具 | 功能 |
338
+ |------|------|
339
+ | `f2a_discover` | 发现网络中的 Agents,支持按能力过滤 |
340
+ | `f2a_delegate` | 委托任务给指定 Agent |
341
+ | `f2a_broadcast` | 广播任务给多个 Agents(并行执行) |
342
+
343
+ **任务队列管理**:
344
+ | 工具 | 功能 |
345
+ |------|------|
346
+ | `f2a_poll_tasks` | 查询本节点收到的远程任务队列 |
347
+ | `f2a_submit_result` | 提交任务执行结果 |
348
+ | `f2a_task_stats` | 查看任务队列统计信息 |
349
+
350
+ **任务认领模式**:
351
+ | 工具 | 功能 |
352
+ |------|------|
353
+ | `f2a_announce` | 发布任务(认领模式) |
354
+ | `f2a_list_announcements` | 列出可认领的任务 |
355
+ | `f2a_claim` | 认领任务 |
356
+ | `f2a_manage_claims` | 管理认领的任务 |
357
+ | `f2a_my_claims` | 查看我认领的任务 |
358
+ | `f2a_announcement_stats` | 查看任务发布统计 |
359
+
360
+ **网络与信誉管理**:
361
+ | 工具 | 功能 |
362
+ |------|------|
363
+ | `f2a_status` | 查看 F2A 网络状态和已连接 Peers |
364
+ | `f2a_reputation` | 查看或管理 Peer 信誉 |
166
365
 
167
366
  ---
168
367
 
169
- ## 3. 开发指南
368
+ ## 4. 开发指南
170
369
 
171
- ### 3.1 项目结构
370
+ ### 4.1 项目结构
172
371
 
173
372
  ```
174
373
  F2A/
@@ -183,7 +382,7 @@ F2A/
183
382
  └── tests/ # 测试
184
383
  ```
185
384
 
186
- ### 3.2 核心 API
385
+ ### 4.2 核心 API
187
386
 
188
387
  ```typescript
189
388
  import { F2A } from 'f2a-network';
@@ -220,7 +419,7 @@ const result = await f2a.delegateTask({
220
419
  });
221
420
  ```
222
421
 
223
- ### 3.3 开发命令
422
+ ### 4.3 开发命令
224
423
 
225
424
  ```bash
226
425
  # 构建
@@ -234,7 +433,7 @@ npm run test:coverage
234
433
  npm run build:all
235
434
  ```
236
435
 
237
- ### 3.4 文档
436
+ ### 4.4 文档
238
437
 
239
438
  - [协议规范](docs/F2A-PROTOCOL.md)
240
439
  - [中间件指南](docs/middleware-guide.md)
@@ -244,33 +443,49 @@ npm run build:all
244
443
 
245
444
  ## 快速开始(最小步骤)
246
445
 
247
- ### 方式一:NPM 安装(推荐)
446
+ ### 方式一:一键安装(推荐)
447
+
448
+ ```bash
449
+ # 1. 安装 F2A
450
+ curl -fsSL https://raw.githubusercontent.com/LuciusCao/F2A/main/install.sh | bash -s -- --global
451
+
452
+ # 2. 配置
453
+ f2a init
454
+
455
+ # 3. 启动
456
+ f2a daemon -d
457
+
458
+ # 4. 验证
459
+ f2a status
460
+ ```
461
+
462
+ ### 方式二:NPM 安装
248
463
 
249
464
  ```bash
250
- # 1. 安装并启动 F2A 节点
465
+ # 1. 安装
251
466
  npm install -g @f2a/network
252
- f2a-network
253
467
 
254
- # 2. 配置 OpenClaw 插件
255
- openclaw plugins install @f2a/openclaw-adapter
468
+ # 2. 配置
469
+ f2a init
256
470
 
257
- # 3. 编辑配置文件,启用插件
258
- # ~/.openclaw/config.json
471
+ # 3. 启动
472
+ f2a daemon -d
259
473
  ```
260
474
 
261
- ### 方式二:源码安装
475
+ ### 方式三:源码安装
262
476
 
263
477
  ```bash
264
- # 1. 启动 F2A 节点
265
- cd ~/projects/F2A
478
+ # 1. 克隆并构建
479
+ git clone https://github.com/LuciusCao/F2A.git
480
+ cd F2A
481
+ npm install
266
482
  npm run build
267
- node dist/daemon/index.js
268
483
 
269
- # 2. 配置 OpenClaw 插件
270
- # 编辑 ~/.openclaw/config.json,添加插件配置
484
+ # 2. 配置
485
+ node dist/cli/index.js init
271
486
 
272
- # 3. 开始使用
273
- # OpenClaw 中对话:"帮我找一下网络里的Agents"
487
+ # 3. 启动
488
+ node dist/cli/index.js daemon -d
274
489
  ```
275
490
 
276
491
  ---
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgEH;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBjD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAevE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAevF"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgGH;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBjD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAevE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAevF"}
@@ -4,7 +4,34 @@
4
4
  */
5
5
  import { request } from 'http';
6
6
  const CONTROL_PORT = parseInt(process.env.F2A_CONTROL_PORT || '9001');
7
- const CONTROL_TOKEN = process.env.F2A_CONTROL_TOKEN || 'f2a-default-token';
7
+ /**
8
+ * 获取并验证控制 Token
9
+ * 生产环境强制要求设置 F2A_CONTROL_TOKEN
10
+ */
11
+ function getControlToken() {
12
+ const token = process.env.F2A_CONTROL_TOKEN;
13
+ if (!token) {
14
+ console.error('[F2A] 错误:必须设置 F2A_CONTROL_TOKEN 环境变量');
15
+ console.error('[F2A] 请运行:export F2A_CONTROL_TOKEN=$(openssl rand -hex 32)');
16
+ console.error('[F2A] 或者在 daemon 启动时设置:F2A_CONTROL_TOKEN=your-secure-token f2a start');
17
+ process.exit(1);
18
+ }
19
+ // 安全检查:禁止使用不安全的默认值
20
+ if (token === 'f2a-default-token') {
21
+ console.error('[F2A] 错误:F2A_CONTROL_TOKEN 不能使用默认值 "f2a-default-token"');
22
+ console.error('[F2A] 请设置一个安全的 token:export F2A_CONTROL_TOKEN=$(openssl rand -hex 32)');
23
+ process.exit(1);
24
+ }
25
+ return token;
26
+ }
27
+ // 惰性获取 token,避免模块加载时立即验证(便于测试)
28
+ let _controlToken;
29
+ function getControlTokenLazy() {
30
+ if (!_controlToken) {
31
+ _controlToken = getControlToken();
32
+ }
33
+ return _controlToken;
34
+ }
8
35
  /**
9
36
  * 发送控制命令
10
37
  */
@@ -18,7 +45,7 @@ async function sendControlCommand(action, idOrIndex, reason) {
18
45
  method: 'POST',
19
46
  headers: {
20
47
  'Content-Type': 'application/json',
21
- 'X-F2A-Token': CONTROL_TOKEN,
48
+ 'X-F2A-Token': getControlTokenLazy(),
22
49
  'Content-Length': Buffer.byteLength(payload)
23
50
  }
24
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAkB,MAAM,MAAM,CAAC;AAE/C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;AAEtE;;;GAGG;AACH,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+BAA+B;AAC/B,IAAI,aAAiC,CAAC;AACtC,SAAS,mBAAmB;IAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,eAAe,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAeD;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,SAA2B,EAC3B,MAAe;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAmB;YAC9B,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,mBAAmB,EAAE;gBACpC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;aAC7C;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACnC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;YACvC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,YAAY,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC;YACrG,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAA0B;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,SAA0B,EAAE,MAAe;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}