@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.
- package/README.md +278 -63
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +29 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/config.d.ts +176 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +386 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/daemon.d.ts +54 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +572 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/index.js +90 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +13 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +352 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/core/e2ee-crypto.d.ts +127 -1
- package/dist/core/e2ee-crypto.d.ts.map +1 -1
- package/dist/core/e2ee-crypto.js +446 -12
- package/dist/core/e2ee-crypto.js.map +1 -1
- package/dist/core/f2a.d.ts +2 -1
- package/dist/core/f2a.d.ts.map +1 -1
- package/dist/core/f2a.js +6 -2
- package/dist/core/f2a.js.map +1 -1
- package/dist/core/identity/encrypted-key-store.d.ts +19 -0
- package/dist/core/identity/encrypted-key-store.d.ts.map +1 -0
- package/dist/core/identity/encrypted-key-store.js +72 -0
- package/dist/core/identity/encrypted-key-store.js.map +1 -0
- package/dist/core/identity/identity-manager.d.ts +133 -0
- package/dist/core/identity/identity-manager.d.ts.map +1 -0
- package/dist/core/identity/identity-manager.js +454 -0
- package/dist/core/identity/identity-manager.js.map +1 -0
- package/dist/core/identity/index.d.ts +8 -0
- package/dist/core/identity/index.d.ts.map +1 -0
- package/dist/core/identity/index.js +7 -0
- package/dist/core/identity/index.js.map +1 -0
- package/dist/core/identity/types.d.ts +70 -0
- package/dist/core/identity/types.d.ts.map +1 -0
- package/dist/core/identity/types.js +17 -0
- package/dist/core/identity/types.js.map +1 -0
- package/dist/core/p2p-network.d.ts +26 -0
- package/dist/core/p2p-network.d.ts.map +1 -1
- package/dist/core/p2p-network.js +434 -105
- package/dist/core/p2p-network.js.map +1 -1
- package/dist/core/reputation-security.d.ts +15 -0
- package/dist/core/reputation-security.d.ts.map +1 -1
- package/dist/core/reputation-security.js +73 -3
- package/dist/core/reputation-security.js.map +1 -1
- package/dist/core/reputation.d.ts +129 -4
- package/dist/core/reputation.d.ts.map +1 -1
- package/dist/core/reputation.js +294 -1
- package/dist/core/reputation.js.map +1 -1
- package/dist/core/review-committee.d.ts +2 -2
- package/dist/core/review-committee.d.ts.map +1 -1
- package/dist/core/review-committee.js +17 -0
- package/dist/core/review-committee.js.map +1 -1
- package/dist/daemon/control-server.d.ts.map +1 -1
- package/dist/daemon/control-server.js +44 -1
- package/dist/daemon/control-server.js.map +1 -1
- package/dist/daemon/webhook.d.ts +3 -0
- package/dist/daemon/webhook.d.ts.map +1 -1
- package/dist/daemon/webhook.js +318 -6
- package/dist/daemon/webhook.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/result.d.ts +1 -1
- package/dist/types/result.d.ts.map +1 -1
- package/dist/types/result.js.map +1 -1
- package/dist/utils/crypto-utils.d.ts +17 -0
- package/dist/utils/crypto-utils.d.ts.map +1 -0
- package/dist/utils/crypto-utils.js +28 -0
- package/dist/utils/crypto-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +9 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +3 -1
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/signature.d.ts +47 -1
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/signature.js +166 -11
- package/dist/utils/signature.js.map +1 -1
- 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. [
|
|
10
|
-
2. [
|
|
11
|
-
3. [
|
|
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.
|
|
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.
|
|
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
|
-
|
|
135
|
+
### 2.2 配置
|
|
32
136
|
|
|
33
137
|
```bash
|
|
34
|
-
#
|
|
35
|
-
|
|
138
|
+
# 交互式配置向导
|
|
139
|
+
f2a init
|
|
36
140
|
|
|
37
|
-
#
|
|
38
|
-
f2a
|
|
141
|
+
# 查看当前配置
|
|
142
|
+
f2a config
|
|
39
143
|
```
|
|
40
144
|
|
|
41
|
-
###
|
|
145
|
+
### 2.3 启动节点
|
|
42
146
|
|
|
43
147
|
**方式一:Daemon 模式(推荐)**
|
|
44
148
|
|
|
45
149
|
```bash
|
|
46
|
-
#
|
|
47
|
-
|
|
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
|
-
|
|
167
|
+
f2a status
|
|
55
168
|
|
|
56
169
|
# 查看已连接节点
|
|
57
|
-
|
|
170
|
+
f2a peers
|
|
58
171
|
```
|
|
59
172
|
|
|
60
|
-
###
|
|
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` |
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
253
|
+
## 3. OpenClaw 插件
|
|
92
254
|
|
|
93
|
-
###
|
|
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
|
-
###
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
-
###
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
##
|
|
368
|
+
## 4. 开发指南
|
|
170
369
|
|
|
171
|
-
###
|
|
370
|
+
### 4.1 项目结构
|
|
172
371
|
|
|
173
372
|
```
|
|
174
373
|
F2A/
|
|
@@ -183,7 +382,7 @@ F2A/
|
|
|
183
382
|
└── tests/ # 测试
|
|
184
383
|
```
|
|
185
384
|
|
|
186
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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.
|
|
465
|
+
# 1. 安装
|
|
251
466
|
npm install -g @f2a/network
|
|
252
|
-
f2a-network
|
|
253
467
|
|
|
254
|
-
# 2. 配置
|
|
255
|
-
|
|
468
|
+
# 2. 配置
|
|
469
|
+
f2a init
|
|
256
470
|
|
|
257
|
-
# 3.
|
|
258
|
-
|
|
471
|
+
# 3. 启动
|
|
472
|
+
f2a daemon -d
|
|
259
473
|
```
|
|
260
474
|
|
|
261
|
-
###
|
|
475
|
+
### 方式三:源码安装
|
|
262
476
|
|
|
263
477
|
```bash
|
|
264
|
-
# 1.
|
|
265
|
-
|
|
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. 配置
|
|
270
|
-
|
|
484
|
+
# 2. 配置
|
|
485
|
+
node dist/cli/index.js init
|
|
271
486
|
|
|
272
|
-
# 3.
|
|
273
|
-
|
|
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;
|
|
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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -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
|
-
|
|
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':
|
|
48
|
+
'X-F2A-Token': getControlTokenLazy(),
|
|
22
49
|
'Content-Length': Buffer.byteLength(payload)
|
|
23
50
|
}
|
|
24
51
|
};
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|