@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/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
- if (args[1]) {
49
- idOrIndex = /^\d+$/.test(args[1]) ? parseInt(args[1]) : args[1];
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
- return { command, idOrIndex, capability, reason };
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
- f2a status
95
- f2a peers
96
- f2a discover
97
- f2a discover --capability code-generation
98
- f2a pending
99
- f2a confirm 1
100
- f2a reject 2 --reason "unknown"
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 start)');
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] 错误: 需要指定 ID 或序号');
181
- console.error('用法: f2a confirm [id|index]');
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] 错误: 需要指定 ID 或序号');
189
- console.error('用法: f2a reject [id|index]');
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] 错误:', err);
274
+ console.error('[F2A] Error:', err);
201
275
  process.exit(1);
202
276
  });
203
277
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * F2A Init 命令
3
+ * 交互式配置向导
4
+ */
5
+ /**
6
+ * 主配置流程
7
+ */
8
+ export declare function initConfig(): Promise<void>;
9
+ /**
10
+ * 显示配置信息
11
+ */
12
+ export declare function showConfig(): void;
13
+ //# sourceMappingURL=init.d.ts.map
@@ -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"}
@@ -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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"}