@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/dist/cli/index.js
CHANGED
|
@@ -6,6 +6,8 @@ import { request } from 'http';
|
|
|
6
6
|
import { existsSync, readFileSync } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { homedir } from 'os';
|
|
9
|
+
import { startForeground, startBackground, stopDaemon, showStatus, } from './daemon.js';
|
|
10
|
+
import { initConfig, showConfig } from './init.js';
|
|
9
11
|
const CONTROL_PORT = parseInt(process.env.F2A_CONTROL_PORT || '9001');
|
|
10
12
|
/**
|
|
11
13
|
* 获取控制 Token
|
|
@@ -43,10 +45,16 @@ function parseArgs() {
|
|
|
43
45
|
return { command: 'help' };
|
|
44
46
|
}
|
|
45
47
|
const command = args[0];
|
|
48
|
+
// 解析 daemon 子命令
|
|
49
|
+
let subcommand;
|
|
50
|
+
if (command === 'daemon' && args[1]) {
|
|
51
|
+
subcommand = args[1];
|
|
52
|
+
}
|
|
46
53
|
// 解析 ID 或序号
|
|
47
54
|
let idOrIndex;
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
const idArg = command === 'daemon' ? args[2] : args[1];
|
|
56
|
+
if (idArg) {
|
|
57
|
+
idOrIndex = /^\d+$/.test(idArg) ? parseInt(idArg) : idArg;
|
|
50
58
|
}
|
|
51
59
|
// 解析能力过滤
|
|
52
60
|
let capability;
|
|
@@ -60,7 +68,9 @@ function parseArgs() {
|
|
|
60
68
|
if (reasonIndex !== -1 && args[reasonIndex + 1]) {
|
|
61
69
|
reason = args[reasonIndex + 1];
|
|
62
70
|
}
|
|
63
|
-
|
|
71
|
+
// 解析 detach 标志
|
|
72
|
+
const detach = args.includes('-d') || args.includes('--detach');
|
|
73
|
+
return { command, subcommand, idOrIndex, capability, reason, detach };
|
|
64
74
|
}
|
|
65
75
|
/**
|
|
66
76
|
* 显示帮助信息
|
|
@@ -73,31 +83,54 @@ F2A CLI - Friend-to-Agent P2P Networking
|
|
|
73
83
|
Usage: f2a [command] [options]
|
|
74
84
|
|
|
75
85
|
Commands:
|
|
86
|
+
init 交互式配置向导
|
|
87
|
+
config 显示当前配置
|
|
76
88
|
status 查看节点状态
|
|
77
89
|
peers 查看已连接的 Peers
|
|
78
90
|
discover [options] 发现网络中的 Agents
|
|
79
91
|
pending 查看待确认连接
|
|
80
92
|
confirm [id|index] 确认连接请求
|
|
81
93
|
reject [id|index] 拒绝连接请求
|
|
94
|
+
daemon 启动和管理 daemon 服务
|
|
82
95
|
help 显示帮助
|
|
83
96
|
|
|
97
|
+
Daemon Commands:
|
|
98
|
+
f2a daemon 前台启动 daemon
|
|
99
|
+
f2a daemon -d 后台启动 daemon
|
|
100
|
+
f2a daemon --detach 后台启动 daemon
|
|
101
|
+
f2a daemon stop 停止后台 daemon
|
|
102
|
+
f2a daemon status 查看 daemon 状态
|
|
103
|
+
|
|
84
104
|
Options:
|
|
85
105
|
-c, --capability 按能力过滤 (discover 命令)
|
|
86
106
|
--reason [text] 拒绝原因 (reject 命令)
|
|
107
|
+
-d, --detach 后台启动 daemon (daemon 命令)
|
|
108
|
+
|
|
109
|
+
Configuration:
|
|
110
|
+
配置文件: ~/.f2a/config.json
|
|
111
|
+
运行 f2a init 进行交互式配置
|
|
87
112
|
|
|
88
113
|
Environment Variables:
|
|
89
114
|
F2A_CONTROL_PORT 控制服务器端口 (默认: 9001)
|
|
90
115
|
F2A_CONTROL_TOKEN 控制服务器认证 Token
|
|
91
116
|
(如果不设置,会读取 ~/.f2a/control-token)
|
|
117
|
+
F2A_P2P_PORT P2P 监听端口 (默认: 0 随机分配)
|
|
118
|
+
BOOTSTRAP_PEERS 引导节点地址 (逗号分隔)
|
|
92
119
|
|
|
93
120
|
Examples:
|
|
94
|
-
|
|
95
|
-
f2a
|
|
96
|
-
f2a
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
f2a
|
|
100
|
-
f2a
|
|
121
|
+
# 首次使用
|
|
122
|
+
f2a init # 交互式配置
|
|
123
|
+
f2a daemon -d # 后台启动
|
|
124
|
+
|
|
125
|
+
# 日常使用
|
|
126
|
+
f2a status # 查看状态
|
|
127
|
+
f2a peers # 查看已连接节点
|
|
128
|
+
f2a discover # 发现网络中的 Agents
|
|
129
|
+
|
|
130
|
+
# 连接管理
|
|
131
|
+
f2a pending # 查看待确认连接
|
|
132
|
+
f2a confirm 1 # 确认连接
|
|
133
|
+
f2a reject 2 # 拒绝连接
|
|
101
134
|
`);
|
|
102
135
|
}
|
|
103
136
|
/**
|
|
@@ -148,7 +181,7 @@ async function sendCommand(action, params) {
|
|
|
148
181
|
});
|
|
149
182
|
req.on('error', (err) => {
|
|
150
183
|
console.error('Failed to connect to F2A daemon:', err.message);
|
|
151
|
-
console.log('Make sure the daemon is running (f2a daemon
|
|
184
|
+
console.log('Make sure the daemon is running (f2a daemon)');
|
|
152
185
|
reject(err);
|
|
153
186
|
});
|
|
154
187
|
req.write(payload);
|
|
@@ -163,6 +196,12 @@ async function sendCommand(action, params) {
|
|
|
163
196
|
async function main() {
|
|
164
197
|
const args = parseArgs();
|
|
165
198
|
switch (args.command) {
|
|
199
|
+
case 'init':
|
|
200
|
+
await initConfig();
|
|
201
|
+
break;
|
|
202
|
+
case 'config':
|
|
203
|
+
showConfig();
|
|
204
|
+
break;
|
|
166
205
|
case 'status':
|
|
167
206
|
await sendCommand('status');
|
|
168
207
|
break;
|
|
@@ -177,27 +216,62 @@ async function main() {
|
|
|
177
216
|
break;
|
|
178
217
|
case 'confirm':
|
|
179
218
|
if (args.idOrIndex === undefined) {
|
|
180
|
-
console.error('[F2A]
|
|
181
|
-
console.error('
|
|
219
|
+
console.error('[F2A] Error: ID or index is required');
|
|
220
|
+
console.error('Usage: f2a confirm [id|index]');
|
|
182
221
|
process.exit(1);
|
|
183
222
|
}
|
|
184
223
|
await sendCommand('confirm', { id: args.idOrIndex });
|
|
185
224
|
break;
|
|
186
225
|
case 'reject':
|
|
187
226
|
if (args.idOrIndex === undefined) {
|
|
188
|
-
console.error('[F2A]
|
|
189
|
-
console.error('
|
|
227
|
+
console.error('[F2A] Error: ID or index is required');
|
|
228
|
+
console.error('Usage: f2a reject [id|index]');
|
|
190
229
|
process.exit(1);
|
|
191
230
|
}
|
|
192
231
|
await sendCommand('reject', { id: args.idOrIndex, reason: args.reason });
|
|
193
232
|
break;
|
|
233
|
+
case 'daemon':
|
|
234
|
+
await handleDaemonCommand(args);
|
|
235
|
+
break;
|
|
194
236
|
case 'help':
|
|
195
237
|
default:
|
|
196
238
|
showHelp();
|
|
197
239
|
}
|
|
198
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* 处理 daemon 命令
|
|
243
|
+
* @param args - 解析后的参数
|
|
244
|
+
*/
|
|
245
|
+
async function handleDaemonCommand(args) {
|
|
246
|
+
// 如果指定了 detach 标志,后台启动
|
|
247
|
+
if (args.detach && args.subcommand !== 'stop') {
|
|
248
|
+
await startBackground();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
switch (args.subcommand) {
|
|
252
|
+
case 'stop':
|
|
253
|
+
await stopDaemon();
|
|
254
|
+
break;
|
|
255
|
+
case 'status':
|
|
256
|
+
await showStatus();
|
|
257
|
+
break;
|
|
258
|
+
case '-d':
|
|
259
|
+
case '--detach':
|
|
260
|
+
// f2a daemon -d 或 f2a daemon --detach
|
|
261
|
+
await startBackground();
|
|
262
|
+
break;
|
|
263
|
+
case undefined:
|
|
264
|
+
// f2a daemon (无子命令) - 前台启动
|
|
265
|
+
await startForeground();
|
|
266
|
+
break;
|
|
267
|
+
default:
|
|
268
|
+
console.error(`[F2A] Unknown daemon subcommand: ${args.subcommand}`);
|
|
269
|
+
console.error('Usage: f2a daemon [stop|status|-d|--detach]');
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
199
273
|
main().catch(err => {
|
|
200
|
-
console.error('[F2A]
|
|
274
|
+
console.error('[F2A] Error:', err);
|
|
201
275
|
process.exit(1);
|
|
202
276
|
});
|
|
203
277
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAkB,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2IH;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAuPhD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAWjC"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F2A Init 命令
|
|
3
|
+
* 交互式配置向导
|
|
4
|
+
*/
|
|
5
|
+
import * as readline from 'readline';
|
|
6
|
+
import { hostname } from 'os';
|
|
7
|
+
import { loadConfig, saveConfig, getConfigPath, configExists, validateAgentName, validateMultiaddr, } from './config.js';
|
|
8
|
+
// 端口验证常量
|
|
9
|
+
const MIN_PORT = 1024;
|
|
10
|
+
const MAX_PORT = 65535;
|
|
11
|
+
// 颜色输出
|
|
12
|
+
const colors = {
|
|
13
|
+
reset: '\x1b[0m',
|
|
14
|
+
red: '\x1b[31m',
|
|
15
|
+
green: '\x1b[32m',
|
|
16
|
+
yellow: '\x1b[33m',
|
|
17
|
+
blue: '\x1b[34m',
|
|
18
|
+
cyan: '\x1b[36m',
|
|
19
|
+
bold: '\x1b[1m',
|
|
20
|
+
};
|
|
21
|
+
function color(text, colorName) {
|
|
22
|
+
return `${colors[colorName]}${text}${colors.reset}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 创建 readline 接口
|
|
26
|
+
*/
|
|
27
|
+
function createInterface() {
|
|
28
|
+
return readline.createInterface({
|
|
29
|
+
input: process.stdin,
|
|
30
|
+
output: process.stdout,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 提问函数
|
|
35
|
+
*/
|
|
36
|
+
function question(rl, prompt, defaultValue) {
|
|
37
|
+
return new Promise((resolve) => {
|
|
38
|
+
const displayPrompt = defaultValue
|
|
39
|
+
? `${prompt} ${color(`[${defaultValue}]`, 'cyan')}: `
|
|
40
|
+
: `${prompt}: `;
|
|
41
|
+
rl.question(displayPrompt, (answer) => {
|
|
42
|
+
resolve(answer.trim() || defaultValue || '');
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 选择函数
|
|
48
|
+
*/
|
|
49
|
+
async function select(rl, prompt, options, defaultIndex = 0) {
|
|
50
|
+
console.log(`\n${prompt}`);
|
|
51
|
+
options.forEach((opt, i) => {
|
|
52
|
+
const marker = i === defaultIndex ? color('→', 'cyan') : ' ';
|
|
53
|
+
console.log(` ${marker} ${i + 1}. ${opt}`);
|
|
54
|
+
});
|
|
55
|
+
const answer = await question(rl, '选择', (defaultIndex + 1).toString());
|
|
56
|
+
const index = parseInt(answer) - 1;
|
|
57
|
+
if (index >= 0 && index < options.length) {
|
|
58
|
+
return index;
|
|
59
|
+
}
|
|
60
|
+
return defaultIndex;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 确认函数
|
|
64
|
+
*/
|
|
65
|
+
async function confirm(rl, prompt, defaultValue = false) {
|
|
66
|
+
const hint = defaultValue ? 'Y/n' : 'y/N';
|
|
67
|
+
const answer = await question(rl, `${prompt} ${color(`[${hint}]`, 'cyan')}`);
|
|
68
|
+
if (answer === '')
|
|
69
|
+
return defaultValue;
|
|
70
|
+
return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 显示欢迎信息
|
|
74
|
+
*/
|
|
75
|
+
function showWelcome() {
|
|
76
|
+
console.log('');
|
|
77
|
+
console.log(color('╔════════════════════════════════════════════════╗', 'blue'));
|
|
78
|
+
console.log(color('║ F2A 配置向导 ║', 'blue'));
|
|
79
|
+
console.log(color('║ Friend-to-Agent P2P 网络 ║', 'blue'));
|
|
80
|
+
console.log(color('╚════════════════════════════════════════════════╝', 'blue'));
|
|
81
|
+
console.log('');
|
|
82
|
+
console.log('这个向导将帮助你配置 F2A 网络。');
|
|
83
|
+
console.log('只需要回答几个简单的问题即可完成配置。');
|
|
84
|
+
console.log('');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 显示配置摘要
|
|
88
|
+
*/
|
|
89
|
+
function showSummary(config) {
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(color('══════════════════════════════════════════════════', 'blue'));
|
|
92
|
+
console.log(color('配置摘要', 'bold'));
|
|
93
|
+
console.log(color('══════════════════════════════════════════════════', 'blue'));
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log(`${color('Agent 名称:', 'cyan')} ${config.agentName}`);
|
|
96
|
+
console.log(`${color('自动启动:', 'cyan')} ${config.autoStart ? '是' : '否'}`);
|
|
97
|
+
console.log(`${color('控制端口:', 'cyan')} ${config.controlPort}`);
|
|
98
|
+
console.log(`${color('P2P 端口:', 'cyan')} ${config.p2pPort === 0 ? '随机分配' : config.p2pPort}`);
|
|
99
|
+
console.log(`${color('MDNS 发现:', 'cyan')} ${config.enableMDNS ? '启用' : '禁用'}`);
|
|
100
|
+
console.log(`${color('DHT:', 'cyan')} ${config.enableDHT ? '启用' : '禁用'}`);
|
|
101
|
+
console.log(`${color('日志级别:', 'cyan')} ${config.logLevel}`);
|
|
102
|
+
console.log(`${color('引导节点:', 'cyan')} ${config.network.bootstrapPeers.length > 0 ? config.network.bootstrapPeers.join(', ') : '无'}`);
|
|
103
|
+
// 显示指纹验证配置
|
|
104
|
+
const fingerprints = config.network.bootstrapPeerFingerprints || {};
|
|
105
|
+
const fingerprintCount = Object.keys(fingerprints).length;
|
|
106
|
+
if (config.network.bootstrapPeers.length > 0) {
|
|
107
|
+
console.log(`${color('指纹验证:', 'cyan')} ${fingerprintCount > 0 ? `已配置 ${fingerprintCount} 个节点` : '未配置'}`);
|
|
108
|
+
}
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log(`${color('配置文件:', 'cyan')} ${getConfigPath()}`);
|
|
111
|
+
console.log('');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 主配置流程
|
|
115
|
+
*/
|
|
116
|
+
export async function initConfig() {
|
|
117
|
+
// TTY 检测:确保在交互式环境中运行
|
|
118
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
119
|
+
console.error(color('Error: This command requires an interactive terminal (TTY).', 'red'));
|
|
120
|
+
console.error(color('Please run "f2a init" in a terminal.', 'red'));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
showWelcome();
|
|
124
|
+
const rl = createInterface();
|
|
125
|
+
const existingConfig = loadConfig();
|
|
126
|
+
const hasExisting = configExists();
|
|
127
|
+
if (hasExisting) {
|
|
128
|
+
console.log(color('发现已有配置文件。', 'yellow'));
|
|
129
|
+
const overwrite = await confirm(rl, '是否覆盖现有配置?', false);
|
|
130
|
+
if (!overwrite) {
|
|
131
|
+
console.log(color('\n配置已取消。', 'yellow'));
|
|
132
|
+
rl.close();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
console.log('');
|
|
136
|
+
}
|
|
137
|
+
// ============================================
|
|
138
|
+
// 必需配置
|
|
139
|
+
// ============================================
|
|
140
|
+
console.log(color('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', 'blue'));
|
|
141
|
+
console.log(color('第一步:基本配置', 'bold'));
|
|
142
|
+
console.log(color('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', 'blue'));
|
|
143
|
+
console.log('');
|
|
144
|
+
// Agent 名称
|
|
145
|
+
const hostnameShort = hostname().split('.')[0];
|
|
146
|
+
const defaultName = existingConfig.agentName || `${process.env.USER || 'user'}-${hostnameShort}`;
|
|
147
|
+
let agentName = '';
|
|
148
|
+
let nameAttempts = 0;
|
|
149
|
+
const maxNameAttempts = 3;
|
|
150
|
+
while (nameAttempts < maxNameAttempts) {
|
|
151
|
+
const input = await question(rl, 'Agent name (used to identify in network)', defaultName);
|
|
152
|
+
const validation = validateAgentName(input || defaultName);
|
|
153
|
+
if (validation.valid) {
|
|
154
|
+
agentName = input || defaultName;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(color(` Invalid: ${validation.error}`, 'red'));
|
|
159
|
+
nameAttempts++;
|
|
160
|
+
if (nameAttempts < maxNameAttempts) {
|
|
161
|
+
console.log(color(` Please try again (${maxNameAttempts - nameAttempts} attempts remaining)`, 'yellow'));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (!agentName) {
|
|
166
|
+
console.log(color('Using default name...', 'yellow'));
|
|
167
|
+
agentName = defaultName;
|
|
168
|
+
}
|
|
169
|
+
// 自动启动
|
|
170
|
+
console.log('');
|
|
171
|
+
console.log('是否在后台自动启动 F2A daemon?');
|
|
172
|
+
console.log(' - 选择"是"会在系统启动时自动运行');
|
|
173
|
+
console.log(' - 选择"否"需要手动运行 f2a daemon');
|
|
174
|
+
const autoStart = await confirm(rl, '自动启动', existingConfig.autoStart);
|
|
175
|
+
// ============================================
|
|
176
|
+
// 进阶配置
|
|
177
|
+
// ============================================
|
|
178
|
+
console.log('');
|
|
179
|
+
const configureAdvanced = await confirm(rl, '是否配置进阶选项?(端口、发现等)', false);
|
|
180
|
+
let advancedConfig = {
|
|
181
|
+
controlPort: existingConfig.controlPort ?? 9001,
|
|
182
|
+
p2pPort: existingConfig.p2pPort ?? 0,
|
|
183
|
+
enableMDNS: existingConfig.enableMDNS ?? true,
|
|
184
|
+
enableDHT: existingConfig.enableDHT ?? true,
|
|
185
|
+
logLevel: existingConfig.logLevel ?? 'INFO',
|
|
186
|
+
};
|
|
187
|
+
if (configureAdvanced) {
|
|
188
|
+
console.log('');
|
|
189
|
+
console.log(color('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', 'blue'));
|
|
190
|
+
console.log(color('第二步:进阶配置', 'bold'));
|
|
191
|
+
console.log(color('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', 'blue'));
|
|
192
|
+
console.log('');
|
|
193
|
+
// 控制端口
|
|
194
|
+
console.log(`Port range: ${MIN_PORT}-${MAX_PORT}`);
|
|
195
|
+
const controlPortStr = await question(rl, 'Control port (CLI communicates with daemon)', advancedConfig.controlPort.toString());
|
|
196
|
+
if (controlPortStr === '') {
|
|
197
|
+
// 空输入使用默认值,不需要提示
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const controlPort = parseInt(controlPortStr);
|
|
201
|
+
if (isNaN(controlPort) || controlPort < MIN_PORT || controlPort > MAX_PORT) {
|
|
202
|
+
console.log(color(` Warning: Invalid port "${controlPortStr}". Port must be between ${MIN_PORT} and ${MAX_PORT}. Using default: ${advancedConfig.controlPort}`, 'yellow'));
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
advancedConfig.controlPort = controlPort;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// P2P 端口
|
|
209
|
+
const p2pPortStr = await question(rl, 'P2P port (0 = random assignment)', advancedConfig.p2pPort.toString());
|
|
210
|
+
if (p2pPortStr === '') {
|
|
211
|
+
// 空输入使用默认值,不需要提示
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const p2pPort = parseInt(p2pPortStr);
|
|
215
|
+
if (isNaN(p2pPort) || p2pPort < 0 || p2pPort > MAX_PORT) {
|
|
216
|
+
console.log(color(` Warning: Invalid port "${p2pPortStr}". Port must be between 0 and ${MAX_PORT}. Using default: ${advancedConfig.p2pPort}`, 'yellow'));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
advancedConfig.p2pPort = p2pPort;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// MDNS
|
|
223
|
+
console.log('');
|
|
224
|
+
console.log('MDNS 本地发现可以让局域网内的 Agent 自动发现彼此。');
|
|
225
|
+
advancedConfig.enableMDNS = await confirm(rl, '启用 MDNS 本地发现', advancedConfig.enableMDNS);
|
|
226
|
+
// DHT
|
|
227
|
+
console.log('');
|
|
228
|
+
console.log('DHT 可以帮助查找远程节点(非局域网)。');
|
|
229
|
+
advancedConfig.enableDHT = await confirm(rl, '启用 DHT', advancedConfig.enableDHT);
|
|
230
|
+
// 日志级别
|
|
231
|
+
console.log('');
|
|
232
|
+
const logLevels = ['DEBUG', 'INFO', 'WARN', 'ERROR'];
|
|
233
|
+
const defaultLogLevelIndex = logLevels.indexOf(advancedConfig.logLevel);
|
|
234
|
+
const selectedLogLevelIndex = await select(rl, '日志级别', logLevels, defaultLogLevelIndex >= 0 ? defaultLogLevelIndex : 1);
|
|
235
|
+
advancedConfig.logLevel = logLevels[selectedLogLevelIndex];
|
|
236
|
+
}
|
|
237
|
+
// ============================================
|
|
238
|
+
// 引导节点(可选)
|
|
239
|
+
// ============================================
|
|
240
|
+
console.log('');
|
|
241
|
+
const configureBootstrap = await confirm(rl, '是否配置引导节点?(用于连接远程网络)', false);
|
|
242
|
+
let bootstrapPeers = existingConfig.network?.bootstrapPeers || [];
|
|
243
|
+
let bootstrapPeerFingerprints = existingConfig.network?.bootstrapPeerFingerprints || {};
|
|
244
|
+
if (configureBootstrap) {
|
|
245
|
+
console.log('');
|
|
246
|
+
console.log('Bootstrap peers are used to connect to remote F2A networks.');
|
|
247
|
+
console.log('Enter multiaddr addresses (e.g., /ip4/1.2.3.4/tcp/9000/p2p/PeerID)');
|
|
248
|
+
console.log('Multiple addresses separated by commas, leave empty to skip.');
|
|
249
|
+
console.log('');
|
|
250
|
+
const peersStr = await question(rl, 'Bootstrap peers', bootstrapPeers.join(', '));
|
|
251
|
+
if (peersStr) {
|
|
252
|
+
const peers = peersStr.split(',').map(p => p.trim()).filter(Boolean);
|
|
253
|
+
const validPeers = [];
|
|
254
|
+
const invalidPeers = [];
|
|
255
|
+
for (const peer of peers) {
|
|
256
|
+
if (validateMultiaddr(peer).valid) {
|
|
257
|
+
validPeers.push(peer);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
invalidPeers.push(peer);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (invalidPeers.length > 0) {
|
|
264
|
+
console.log(color(` Warning: Invalid multiaddr format: ${invalidPeers.join(', ')}`, 'yellow'));
|
|
265
|
+
console.log(color(` Valid format: /ip4|ip6|dns/.../tcp|udp/PORT[/p2p/PEERID]`, 'yellow'));
|
|
266
|
+
}
|
|
267
|
+
bootstrapPeers = validPeers;
|
|
268
|
+
if (validPeers.length > 0) {
|
|
269
|
+
console.log(color(` Added ${validPeers.length} valid bootstrap peer(s)`, 'green'));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// 配置指纹验证
|
|
273
|
+
if (bootstrapPeers.length > 0) {
|
|
274
|
+
console.log('');
|
|
275
|
+
const configureFingerprints = await confirm(rl, '是否配置引导节点指纹验证?(推荐,防止中间人攻击)', false);
|
|
276
|
+
if (configureFingerprints) {
|
|
277
|
+
console.log('');
|
|
278
|
+
console.log('指纹验证可以防止中间人攻击。');
|
|
279
|
+
console.log('请输入每个引导节点的预期 PeerID(从引导节点管理员处获取)。');
|
|
280
|
+
console.log('留空跳过该节点的验证。');
|
|
281
|
+
console.log('');
|
|
282
|
+
for (const peer of bootstrapPeers) {
|
|
283
|
+
// 从 multiaddr 提取默认 PeerID
|
|
284
|
+
const existingFingerprint = bootstrapPeerFingerprints[peer] || '';
|
|
285
|
+
const fingerprint = await question(rl, ` ${peer.slice(0, 50)}...`, existingFingerprint);
|
|
286
|
+
if (fingerprint) {
|
|
287
|
+
bootstrapPeerFingerprints[peer] = fingerprint;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
// 用户留空,删除之前可能存在的指纹配置
|
|
291
|
+
delete bootstrapPeerFingerprints[peer];
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const configuredCount = Object.keys(bootstrapPeerFingerprints).length;
|
|
295
|
+
if (configuredCount > 0) {
|
|
296
|
+
console.log(color(` Configured fingerprints for ${configuredCount} peer(s)`, 'green'));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// ============================================
|
|
302
|
+
// 构建最终配置
|
|
303
|
+
// ============================================
|
|
304
|
+
const config = {
|
|
305
|
+
agentName,
|
|
306
|
+
network: {
|
|
307
|
+
bootstrapPeers,
|
|
308
|
+
bootstrapPeerFingerprints: Object.keys(bootstrapPeerFingerprints).length > 0
|
|
309
|
+
? bootstrapPeerFingerprints
|
|
310
|
+
: undefined,
|
|
311
|
+
},
|
|
312
|
+
autoStart,
|
|
313
|
+
controlPort: advancedConfig.controlPort,
|
|
314
|
+
p2pPort: advancedConfig.p2pPort,
|
|
315
|
+
enableMDNS: advancedConfig.enableMDNS,
|
|
316
|
+
enableDHT: advancedConfig.enableDHT,
|
|
317
|
+
logLevel: advancedConfig.logLevel,
|
|
318
|
+
};
|
|
319
|
+
// ============================================
|
|
320
|
+
// 显示摘要并确认
|
|
321
|
+
// ============================================
|
|
322
|
+
showSummary(config);
|
|
323
|
+
const confirmSave = await confirm(rl, '保存配置?', true);
|
|
324
|
+
if (confirmSave) {
|
|
325
|
+
saveConfig(config);
|
|
326
|
+
console.log(color('✅ 配置已保存!', 'green'));
|
|
327
|
+
console.log('');
|
|
328
|
+
console.log('下一步操作:');
|
|
329
|
+
console.log(` ${color('f2a daemon', 'cyan')} # 启动 F2A daemon`);
|
|
330
|
+
console.log(` ${color('f2a status', 'cyan')} # 查看运行状态`);
|
|
331
|
+
console.log(` ${color('f2a peers', 'cyan')} # 查看已连接的节点`);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
console.log(color('配置已取消。', 'yellow'));
|
|
335
|
+
}
|
|
336
|
+
rl.close();
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* 显示配置信息
|
|
340
|
+
*/
|
|
341
|
+
export function showConfig() {
|
|
342
|
+
const config = loadConfig();
|
|
343
|
+
const path = getConfigPath();
|
|
344
|
+
console.log('');
|
|
345
|
+
console.log(color('F2A 配置', 'bold'));
|
|
346
|
+
console.log(color('────────────────────────────────────────', 'blue'));
|
|
347
|
+
console.log(`配置文件: ${path}`);
|
|
348
|
+
console.log('');
|
|
349
|
+
console.log(JSON.stringify(config, null, 2));
|
|
350
|
+
console.log('');
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|