@f2a/network 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +278 -63
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +29 -2
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/config.d.ts +176 -0
  6. package/dist/cli/config.d.ts.map +1 -0
  7. package/dist/cli/config.js +386 -0
  8. package/dist/cli/config.js.map +1 -0
  9. package/dist/cli/daemon.d.ts +54 -0
  10. package/dist/cli/daemon.d.ts.map +1 -0
  11. package/dist/cli/daemon.js +572 -0
  12. package/dist/cli/daemon.js.map +1 -0
  13. package/dist/cli/index.js +90 -16
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/init.d.ts +13 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +352 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/core/e2ee-crypto.d.ts +127 -1
  20. package/dist/core/e2ee-crypto.d.ts.map +1 -1
  21. package/dist/core/e2ee-crypto.js +446 -12
  22. package/dist/core/e2ee-crypto.js.map +1 -1
  23. package/dist/core/f2a.d.ts +2 -1
  24. package/dist/core/f2a.d.ts.map +1 -1
  25. package/dist/core/f2a.js +6 -2
  26. package/dist/core/f2a.js.map +1 -1
  27. package/dist/core/identity/encrypted-key-store.d.ts +19 -0
  28. package/dist/core/identity/encrypted-key-store.d.ts.map +1 -0
  29. package/dist/core/identity/encrypted-key-store.js +72 -0
  30. package/dist/core/identity/encrypted-key-store.js.map +1 -0
  31. package/dist/core/identity/identity-manager.d.ts +133 -0
  32. package/dist/core/identity/identity-manager.d.ts.map +1 -0
  33. package/dist/core/identity/identity-manager.js +454 -0
  34. package/dist/core/identity/identity-manager.js.map +1 -0
  35. package/dist/core/identity/index.d.ts +8 -0
  36. package/dist/core/identity/index.d.ts.map +1 -0
  37. package/dist/core/identity/index.js +7 -0
  38. package/dist/core/identity/index.js.map +1 -0
  39. package/dist/core/identity/types.d.ts +70 -0
  40. package/dist/core/identity/types.d.ts.map +1 -0
  41. package/dist/core/identity/types.js +17 -0
  42. package/dist/core/identity/types.js.map +1 -0
  43. package/dist/core/p2p-network.d.ts +26 -0
  44. package/dist/core/p2p-network.d.ts.map +1 -1
  45. package/dist/core/p2p-network.js +434 -105
  46. package/dist/core/p2p-network.js.map +1 -1
  47. package/dist/core/reputation-security.d.ts +15 -0
  48. package/dist/core/reputation-security.d.ts.map +1 -1
  49. package/dist/core/reputation-security.js +73 -3
  50. package/dist/core/reputation-security.js.map +1 -1
  51. package/dist/core/reputation.d.ts +129 -4
  52. package/dist/core/reputation.d.ts.map +1 -1
  53. package/dist/core/reputation.js +294 -1
  54. package/dist/core/reputation.js.map +1 -1
  55. package/dist/core/review-committee.d.ts +2 -2
  56. package/dist/core/review-committee.d.ts.map +1 -1
  57. package/dist/core/review-committee.js +17 -0
  58. package/dist/core/review-committee.js.map +1 -1
  59. package/dist/daemon/control-server.d.ts.map +1 -1
  60. package/dist/daemon/control-server.js +44 -1
  61. package/dist/daemon/control-server.js.map +1 -1
  62. package/dist/daemon/webhook.d.ts +3 -0
  63. package/dist/daemon/webhook.d.ts.map +1 -1
  64. package/dist/daemon/webhook.js +318 -6
  65. package/dist/daemon/webhook.js.map +1 -1
  66. package/dist/index.d.ts +3 -3
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +7 -3
  69. package/dist/index.js.map +1 -1
  70. package/dist/types/index.d.ts +4 -0
  71. package/dist/types/index.d.ts.map +1 -1
  72. package/dist/types/index.js.map +1 -1
  73. package/dist/types/result.d.ts +1 -1
  74. package/dist/types/result.d.ts.map +1 -1
  75. package/dist/types/result.js.map +1 -1
  76. package/dist/utils/crypto-utils.d.ts +17 -0
  77. package/dist/utils/crypto-utils.d.ts.map +1 -0
  78. package/dist/utils/crypto-utils.js +28 -0
  79. package/dist/utils/crypto-utils.js.map +1 -0
  80. package/dist/utils/logger.d.ts +1 -0
  81. package/dist/utils/logger.d.ts.map +1 -1
  82. package/dist/utils/logger.js +9 -3
  83. package/dist/utils/logger.js.map +1 -1
  84. package/dist/utils/rate-limiter.d.ts.map +1 -1
  85. package/dist/utils/rate-limiter.js +3 -1
  86. package/dist/utils/rate-limiter.js.map +1 -1
  87. package/dist/utils/signature.d.ts +47 -1
  88. package/dist/utils/signature.d.ts.map +1 -1
  89. package/dist/utils/signature.js +166 -11
  90. package/dist/utils/signature.js.map +1 -1
  91. package/package.json +9 -1
  92. package/.github/workflows/ci.yml +0 -113
  93. package/.github/workflows/publish.yml +0 -60
  94. package/MONOREPO.md +0 -58
  95. package/SKILL.md +0 -137
  96. package/dist/adapters/openclaw.d.ts +0 -103
  97. package/dist/adapters/openclaw.d.ts.map +0 -1
  98. package/dist/adapters/openclaw.js +0 -297
  99. package/dist/adapters/openclaw.js.map +0 -1
  100. package/dist/core/connection-manager.d.ts +0 -80
  101. package/dist/core/connection-manager.d.ts.map +0 -1
  102. package/dist/core/connection-manager.js +0 -235
  103. package/dist/core/connection-manager.js.map +0 -1
  104. package/dist/core/connection-manager.test.d.ts +0 -2
  105. package/dist/core/connection-manager.test.d.ts.map +0 -1
  106. package/dist/core/connection-manager.test.js +0 -52
  107. package/dist/core/connection-manager.test.js.map +0 -1
  108. package/dist/core/identity.d.ts +0 -47
  109. package/dist/core/identity.d.ts.map +0 -1
  110. package/dist/core/identity.js +0 -130
  111. package/dist/core/identity.js.map +0 -1
  112. package/dist/core/identity.test.d.ts +0 -2
  113. package/dist/core/identity.test.d.ts.map +0 -1
  114. package/dist/core/identity.test.js +0 -43
  115. package/dist/core/identity.test.js.map +0 -1
  116. package/dist/core/serverless.d.ts +0 -155
  117. package/dist/core/serverless.d.ts.map +0 -1
  118. package/dist/core/serverless.js +0 -615
  119. package/dist/core/serverless.js.map +0 -1
  120. package/dist/daemon/webhook.test.d.ts +0 -2
  121. package/dist/daemon/webhook.test.d.ts.map +0 -1
  122. package/dist/daemon/webhook.test.js +0 -24
  123. package/dist/daemon/webhook.test.js.map +0 -1
  124. package/dist/protocol/messages.d.ts +0 -739
  125. package/dist/protocol/messages.d.ts.map +0 -1
  126. package/dist/protocol/messages.js +0 -188
  127. package/dist/protocol/messages.js.map +0 -1
  128. package/dist/protocol/messages.test.d.ts +0 -2
  129. package/dist/protocol/messages.test.d.ts.map +0 -1
  130. package/dist/protocol/messages.test.js +0 -55
  131. package/dist/protocol/messages.test.js.map +0 -1
  132. package/docs/F2A-PROTOCOL.md +0 -61
  133. package/docs/MOBILE_BOOTSTRAP_DESIGN.md +0 -126
  134. package/docs/a2a-lessons.md +0 -316
  135. package/docs/middleware-guide.md +0 -448
  136. package/docs/readme-update-checklist.md +0 -90
  137. package/docs/reputation-guide.md +0 -396
  138. package/docs/rfcs/001-reputation-system.md +0 -712
  139. package/docs/security-design.md +0 -247
  140. package/install.sh +0 -231
  141. package/packages/openclaw-adapter/README.md +0 -510
  142. package/packages/openclaw-adapter/openclaw.plugin.json +0 -106
  143. package/packages/openclaw-adapter/package.json +0 -40
  144. package/packages/openclaw-adapter/src/announcement-queue.test.ts +0 -449
  145. package/packages/openclaw-adapter/src/announcement-queue.ts +0 -403
  146. package/packages/openclaw-adapter/src/capability-detector.test.ts +0 -99
  147. package/packages/openclaw-adapter/src/capability-detector.ts +0 -183
  148. package/packages/openclaw-adapter/src/claim-handlers.test.ts +0 -974
  149. package/packages/openclaw-adapter/src/claim-handlers.ts +0 -482
  150. package/packages/openclaw-adapter/src/connector.business.test.ts +0 -583
  151. package/packages/openclaw-adapter/src/connector.ts +0 -795
  152. package/packages/openclaw-adapter/src/index.test.ts +0 -82
  153. package/packages/openclaw-adapter/src/index.ts +0 -18
  154. package/packages/openclaw-adapter/src/integration.e2e.test.ts +0 -829
  155. package/packages/openclaw-adapter/src/logger.ts +0 -51
  156. package/packages/openclaw-adapter/src/network-client.test.ts +0 -266
  157. package/packages/openclaw-adapter/src/network-client.ts +0 -251
  158. package/packages/openclaw-adapter/src/network-recovery.test.ts +0 -465
  159. package/packages/openclaw-adapter/src/node-manager.test.ts +0 -136
  160. package/packages/openclaw-adapter/src/node-manager.ts +0 -429
  161. package/packages/openclaw-adapter/src/plugin.test.ts +0 -439
  162. package/packages/openclaw-adapter/src/plugin.ts +0 -104
  163. package/packages/openclaw-adapter/src/reputation.test.ts +0 -221
  164. package/packages/openclaw-adapter/src/reputation.ts +0 -368
  165. package/packages/openclaw-adapter/src/task-guard.test.ts +0 -502
  166. package/packages/openclaw-adapter/src/task-guard.ts +0 -860
  167. package/packages/openclaw-adapter/src/task-queue.concurrency.test.ts +0 -462
  168. package/packages/openclaw-adapter/src/task-queue.edge-cases.test.ts +0 -284
  169. package/packages/openclaw-adapter/src/task-queue.persistence.test.ts +0 -408
  170. package/packages/openclaw-adapter/src/task-queue.ts +0 -668
  171. package/packages/openclaw-adapter/src/tool-handlers.test.ts +0 -906
  172. package/packages/openclaw-adapter/src/tool-handlers.ts +0 -574
  173. package/packages/openclaw-adapter/src/types.ts +0 -361
  174. package/packages/openclaw-adapter/src/webhook-pusher.test.ts +0 -188
  175. package/packages/openclaw-adapter/src/webhook-pusher.ts +0 -220
  176. package/packages/openclaw-adapter/src/webhook-server.test.ts +0 -580
  177. package/packages/openclaw-adapter/src/webhook-server.ts +0 -202
  178. package/packages/openclaw-adapter/tsconfig.json +0 -20
  179. package/src/cli/commands.test.ts +0 -157
  180. package/src/cli/commands.ts +0 -129
  181. package/src/cli/index.test.ts +0 -77
  182. package/src/cli/index.ts +0 -234
  183. package/src/core/autonomous-economy.test.ts +0 -291
  184. package/src/core/autonomous-economy.ts +0 -428
  185. package/src/core/e2ee-crypto.test.ts +0 -125
  186. package/src/core/e2ee-crypto.ts +0 -246
  187. package/src/core/f2a.test.ts +0 -269
  188. package/src/core/f2a.ts +0 -618
  189. package/src/core/p2p-network.test.ts +0 -199
  190. package/src/core/p2p-network.ts +0 -1432
  191. package/src/core/reputation-security.test.ts +0 -403
  192. package/src/core/reputation-security.ts +0 -562
  193. package/src/core/reputation.test.ts +0 -260
  194. package/src/core/reputation.ts +0 -576
  195. package/src/core/review-committee.test.ts +0 -380
  196. package/src/core/review-committee.ts +0 -401
  197. package/src/core/token-manager.test.ts +0 -133
  198. package/src/core/token-manager.ts +0 -140
  199. package/src/daemon/control-server.test.ts +0 -216
  200. package/src/daemon/control-server.ts +0 -292
  201. package/src/daemon/index.test.ts +0 -85
  202. package/src/daemon/index.ts +0 -89
  203. package/src/daemon/main.ts +0 -44
  204. package/src/daemon/start.ts +0 -29
  205. package/src/daemon/webhook.test.ts +0 -68
  206. package/src/daemon/webhook.ts +0 -105
  207. package/src/index.test.ts +0 -436
  208. package/src/index.ts +0 -72
  209. package/src/types/index.test.ts +0 -87
  210. package/src/types/index.ts +0 -341
  211. package/src/types/result.ts +0 -68
  212. package/src/utils/benchmark.ts +0 -237
  213. package/src/utils/logger.ts +0 -331
  214. package/src/utils/middleware.ts +0 -229
  215. package/src/utils/rate-limiter.ts +0 -207
  216. package/src/utils/signature.ts +0 -136
  217. package/src/utils/validation.ts +0 -186
  218. package/tests/docker/Dockerfile.node +0 -23
  219. package/tests/docker/Dockerfile.runner +0 -18
  220. package/tests/docker/docker-compose.test.yml +0 -73
  221. package/tests/integration/message-passing.test.ts +0 -109
  222. package/tests/integration/multi-node.test.ts +0 -92
  223. package/tests/integration/p2p-connection.test.ts +0 -83
  224. package/tests/integration/test-config.ts +0 -32
  225. package/tsconfig.json +0 -21
  226. package/vitest.config.ts +0 -26
@@ -0,0 +1,176 @@
1
+ /**
2
+ * F2A CLI 配置管理
3
+ */
4
+ import { z } from 'zod';
5
+ /**
6
+ * Agent 名称过滤正则
7
+ * 只允许字母、数字、连字符和下划线
8
+ */
9
+ export declare const AGENT_NAME_REGEX: RegExp;
10
+ /**
11
+ * Multiaddr 格式正则
12
+ * 支持 /ip4/..., /ip6/..., /dns/..., /dns4/..., /dns6/..., /dnsaddr/... 等格式
13
+ * 必须包含 /p2p/<peer-id> 或 /ipfs/<peer-id>
14
+ */
15
+ export declare const MULTIADDR_REGEX: RegExp;
16
+ /**
17
+ * 验证 Agent 名称格式
18
+ */
19
+ export declare function validateAgentName(name: string): {
20
+ valid: boolean;
21
+ error?: string;
22
+ };
23
+ /**
24
+ * 验证 multiaddr 格式
25
+ */
26
+ export declare function validateMultiaddr(addr: string): {
27
+ valid: boolean;
28
+ error?: string;
29
+ };
30
+ /**
31
+ * 验证路径安全性
32
+ * 禁止路径遍历(..)和危险字符
33
+ */
34
+ export declare function validatePath(path: string): {
35
+ valid: boolean;
36
+ error?: string;
37
+ };
38
+ /**
39
+ * 完整配置 Schema
40
+ */
41
+ export declare const F2AConfigSchema: z.ZodObject<{
42
+ /** Agent 名称 */
43
+ agentName: z.ZodString;
44
+ /** 网络配置 */
45
+ network: z.ZodObject<{
46
+ /** 引导节点列表 - 必须是有效的 multiaddr 格式 */
47
+ bootstrapPeers: z.ZodEffects<z.ZodDefault<z.ZodArray<z.ZodString, "many">>, string[], string[] | undefined>;
48
+ /** 引导节点指纹映射 - key为multiaddr,value为预期的PeerID */
49
+ bootstrapPeerFingerprints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ bootstrapPeers: string[];
52
+ bootstrapPeerFingerprints?: Record<string, string> | undefined;
53
+ }, {
54
+ bootstrapPeers?: string[] | undefined;
55
+ bootstrapPeerFingerprints?: Record<string, string> | undefined;
56
+ }>;
57
+ /** 是否自动启动 */
58
+ autoStart: z.ZodDefault<z.ZodBoolean>;
59
+ } & {
60
+ /** 控制端口 */
61
+ controlPort: z.ZodDefault<z.ZodNumber>;
62
+ /** P2P 端口 (0 = 随机分配) */
63
+ p2pPort: z.ZodDefault<z.ZodNumber>;
64
+ /** 是否启用 MDNS 本地发现 */
65
+ enableMDNS: z.ZodDefault<z.ZodBoolean>;
66
+ /** 是否启用 DHT */
67
+ enableDHT: z.ZodDefault<z.ZodBoolean>;
68
+ /** 日志级别 */
69
+ logLevel: z.ZodDefault<z.ZodEnum<["DEBUG", "INFO", "WARN", "ERROR"]>>;
70
+ } & {
71
+ /** 数据目录 */
72
+ dataDir: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
73
+ /** 安全级别 */
74
+ security: z.ZodOptional<z.ZodObject<{
75
+ level: z.ZodDefault<z.ZodEnum<["low", "medium", "high"]>>;
76
+ requireConfirmation: z.ZodDefault<z.ZodBoolean>;
77
+ }, "strip", z.ZodTypeAny, {
78
+ level: "low" | "medium" | "high";
79
+ requireConfirmation: boolean;
80
+ }, {
81
+ level?: "low" | "medium" | "high" | undefined;
82
+ requireConfirmation?: boolean | undefined;
83
+ }>>;
84
+ /** 速率限制 */
85
+ rateLimit: z.ZodOptional<z.ZodObject<{
86
+ maxRequests: z.ZodDefault<z.ZodNumber>;
87
+ windowMs: z.ZodDefault<z.ZodNumber>;
88
+ }, "strip", z.ZodTypeAny, {
89
+ maxRequests: number;
90
+ windowMs: number;
91
+ }, {
92
+ maxRequests?: number | undefined;
93
+ windowMs?: number | undefined;
94
+ }>>;
95
+ }, "strip", z.ZodTypeAny, {
96
+ enableMDNS: boolean;
97
+ enableDHT: boolean;
98
+ network: {
99
+ bootstrapPeers: string[];
100
+ bootstrapPeerFingerprints?: Record<string, string> | undefined;
101
+ };
102
+ logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
103
+ agentName: string;
104
+ autoStart: boolean;
105
+ controlPort: number;
106
+ p2pPort: number;
107
+ rateLimit?: {
108
+ maxRequests: number;
109
+ windowMs: number;
110
+ } | undefined;
111
+ security?: {
112
+ level: "low" | "medium" | "high";
113
+ requireConfirmation: boolean;
114
+ } | undefined;
115
+ dataDir?: string | undefined;
116
+ }, {
117
+ network: {
118
+ bootstrapPeers?: string[] | undefined;
119
+ bootstrapPeerFingerprints?: Record<string, string> | undefined;
120
+ };
121
+ agentName: string;
122
+ enableMDNS?: boolean | undefined;
123
+ enableDHT?: boolean | undefined;
124
+ rateLimit?: {
125
+ maxRequests?: number | undefined;
126
+ windowMs?: number | undefined;
127
+ } | undefined;
128
+ security?: {
129
+ level?: "low" | "medium" | "high" | undefined;
130
+ requireConfirmation?: boolean | undefined;
131
+ } | undefined;
132
+ logLevel?: "DEBUG" | "INFO" | "WARN" | "ERROR" | undefined;
133
+ dataDir?: string | undefined;
134
+ autoStart?: boolean | undefined;
135
+ controlPort?: number | undefined;
136
+ p2pPort?: number | undefined;
137
+ }>;
138
+ export type F2AConfig = z.infer<typeof F2AConfigSchema>;
139
+ /**
140
+ * 获取配置文件路径
141
+ */
142
+ export declare function getConfigPath(): string;
143
+ /**
144
+ * 获取默认配置
145
+ */
146
+ export declare function getDefaultConfig(): F2AConfig;
147
+ /**
148
+ * 加载配置文件
149
+ * 如果文件不存在,返回默认配置
150
+ */
151
+ export declare function loadConfig(): F2AConfig;
152
+ /**
153
+ * 保存配置文件
154
+ * 会自动备份旧配置并设置安全权限
155
+ */
156
+ export declare function saveConfig(config: F2AConfig): void;
157
+ /**
158
+ * 更新部分配置
159
+ * 支持深度合并嵌套对象(network, security, rateLimit)
160
+ */
161
+ export declare function updateConfig(partial: Partial<F2AConfig>): F2AConfig;
162
+ /**
163
+ * 检查配置是否存在
164
+ */
165
+ export declare function configExists(): boolean;
166
+ /**
167
+ * 验证配置完整性
168
+ * 验证所有 Schema(Required + Advanced + Expert)
169
+ * 返回 { valid: boolean, missing: string[]; errors: string[] }
170
+ */
171
+ export declare function validateConfig(config: F2AConfig): {
172
+ valid: boolean;
173
+ missing: string[];
174
+ errors: string[];
175
+ };
176
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAqB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAuF,CAAC;AAepH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAWlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQlF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAa7E;AAoGD;;GAEG;AACH,eAAO,MAAM,eAAe;IAjE1B,eAAe;;IAKf,WAAW;;QAET,mCAAmC;;QAKnC,+CAA+C;;;;;;;;;IAGjD,aAAa;;;IAQb,WAAW;;IAEX,wBAAwB;;IAExB,qBAAqB;;IAErB,eAAe;;IAEf,WAAW;;;IAQX,WAAW;;IAWX,WAAW;;;;;;;;;;;IAKX,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU4F,CAAC;AAE1G,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAcxD;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAYD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,SAAS,CAc5C;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAiCtC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoClD;AAuCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAMnE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAwDzG"}
@@ -0,0 +1,386 @@
1
+ /**
2
+ * F2A CLI 配置管理
3
+ */
4
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, copyFileSync, readdirSync, statSync, unlinkSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { homedir } from 'os';
7
+ import { z } from 'zod';
8
+ // ============================================================================
9
+ // 常量
10
+ // ============================================================================
11
+ /**
12
+ * Agent 名称过滤正则
13
+ * 只允许字母、数字、连字符和下划线
14
+ */
15
+ export const AGENT_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;
16
+ /**
17
+ * Multiaddr 格式正则
18
+ * 支持 /ip4/..., /ip6/..., /dns/..., /dns4/..., /dns6/..., /dnsaddr/... 等格式
19
+ * 必须包含 /p2p/<peer-id> 或 /ipfs/<peer-id>
20
+ */
21
+ export const MULTIADDR_REGEX = /^\/(ip4|ip6|dns|dns4|dns6|dnsaddr)(\/[a-zA-Z0-9.\-:]+)+\/(p2p|ipfs)\/[a-zA-Z0-9]+$/;
22
+ // ============================================================================
23
+ // 辅助函数
24
+ // ============================================================================
25
+ /**
26
+ * 调试日志(仅在 DEBUG 模式下输出详细信息)
27
+ */
28
+ function debugLog(message, data) {
29
+ if (process.env.F2A_DEBUG === 'true') {
30
+ console.warn(`[F2A DEBUG] ${message}`, data !== undefined ? data : '');
31
+ }
32
+ }
33
+ /**
34
+ * 验证 Agent 名称格式
35
+ */
36
+ export function validateAgentName(name) {
37
+ if (!name || name.trim().length === 0) {
38
+ return { valid: false, error: 'Agent name cannot be empty' };
39
+ }
40
+ if (name.length > 50) {
41
+ return { valid: false, error: 'Agent name cannot exceed 50 characters' };
42
+ }
43
+ if (!AGENT_NAME_REGEX.test(name)) {
44
+ return { valid: false, error: 'Agent name can only contain letters, numbers, hyphens, and underscores' };
45
+ }
46
+ return { valid: true };
47
+ }
48
+ /**
49
+ * 验证 multiaddr 格式
50
+ */
51
+ export function validateMultiaddr(addr) {
52
+ if (!addr || typeof addr !== 'string') {
53
+ return { valid: false, error: 'Invalid multiaddr: empty or not a string' };
54
+ }
55
+ if (!MULTIADDR_REGEX.test(addr)) {
56
+ return { valid: false, error: 'Invalid multiaddr format. Expected: /ip4|ip6|dns|dns4|dns6|dnsaddr/<host>/p2p/<peer-id>' };
57
+ }
58
+ return { valid: true };
59
+ }
60
+ /**
61
+ * 验证路径安全性
62
+ * 禁止路径遍历(..)和危险字符
63
+ */
64
+ export function validatePath(path) {
65
+ if (!path || typeof path !== 'string') {
66
+ return { valid: false, error: 'Invalid path: empty or not a string' };
67
+ }
68
+ if (path.includes('..')) {
69
+ return { valid: false, error: 'Invalid path: path traversal (..) is not allowed' };
70
+ }
71
+ // 检查是否为绝对路径或有效的相对路径
72
+ // 允许字母、数字、连字符、下划线、斜杠、点(但不能连续)、波浪号
73
+ if (!/^[a-zA-Z0-9_./\-~]+$/.test(path)) {
74
+ return { valid: false, error: 'Invalid path: contains disallowed characters' };
75
+ }
76
+ return { valid: true };
77
+ }
78
+ /**
79
+ * 清理旧备份文件,保留最近 N 个
80
+ */
81
+ function cleanupOldBackups(configDir, keepCount = 5) {
82
+ try {
83
+ const backupFiles = readdirSync(configDir)
84
+ .filter((f) => f.startsWith('config.json.backup-'))
85
+ .map((f) => ({
86
+ name: f,
87
+ path: join(configDir, f),
88
+ time: statSync(join(configDir, f)).mtime.getTime(),
89
+ }))
90
+ .sort((a, b) => b.time - a.time);
91
+ // 删除超出保留数量的备份
92
+ for (let i = keepCount; i < backupFiles.length; i++) {
93
+ try {
94
+ unlinkSync(backupFiles[i].path);
95
+ debugLog('Removed old backup', backupFiles[i].name);
96
+ }
97
+ catch {
98
+ // 删除失败不阻止保存
99
+ }
100
+ }
101
+ }
102
+ catch {
103
+ // 清理失败不阻止保存
104
+ }
105
+ }
106
+ // ============================================================================
107
+ // 配置 Schema
108
+ // ============================================================================
109
+ /**
110
+ * 必需配置(仅 3 项)
111
+ */
112
+ const RequiredConfigSchema = z.object({
113
+ /** Agent 名称 */
114
+ agentName: z.string()
115
+ .min(1, 'Agent name cannot be empty')
116
+ .max(50, 'Agent name cannot exceed 50 characters')
117
+ .regex(AGENT_NAME_REGEX, 'Agent name can only contain letters, numbers, hyphens, and underscores'),
118
+ /** 网络配置 */
119
+ network: z.object({
120
+ /** 引导节点列表 - 必须是有效的 multiaddr 格式 */
121
+ bootstrapPeers: z.array(z.string()).default([]).refine((peers) => peers.every((peer) => validateMultiaddr(peer).valid), { message: 'Invalid bootstrap peer format. Expected multiaddr: /ip4|ip6|dns*/<host>/p2p/<peer-id>' }),
122
+ /** 引导节点指纹映射 - key为multiaddr,value为预期的PeerID */
123
+ bootstrapPeerFingerprints: z.record(z.string(), z.string()).optional(),
124
+ }),
125
+ /** 是否自动启动 */
126
+ autoStart: z.boolean().default(false),
127
+ });
128
+ /**
129
+ * 进阶配置(可选)
130
+ */
131
+ const AdvancedConfigSchema = z.object({
132
+ /** 控制端口 */
133
+ controlPort: z.number().int().min(1024).max(65535).default(9001),
134
+ /** P2P 端口 (0 = 随机分配) */
135
+ p2pPort: z.number().int().min(0).max(65535).default(0),
136
+ /** 是否启用 MDNS 本地发现 */
137
+ enableMDNS: z.boolean().default(true),
138
+ /** 是否启用 DHT */
139
+ enableDHT: z.boolean().default(true),
140
+ /** 日志级别 */
141
+ logLevel: z.enum(['DEBUG', 'INFO', 'WARN', 'ERROR']).default('INFO'),
142
+ });
143
+ /**
144
+ * 专家配置(极少需要)
145
+ */
146
+ const ExpertConfigSchema = z.object({
147
+ /** 数据目录 */
148
+ dataDir: z.string()
149
+ .refine((val) => val.startsWith('/'), 'dataDir must be an absolute path')
150
+ .refine((val) => !val.includes('..') && !/[<>:"|?*\x00-\x1f]/.test(val), 'dataDir contains forbidden characters or path traversal patterns')
151
+ .optional(),
152
+ /** 安全级别 */
153
+ security: z.object({
154
+ level: z.enum(['low', 'medium', 'high']).default('medium'),
155
+ requireConfirmation: z.boolean().default(true),
156
+ }).optional(),
157
+ /** 速率限制 */
158
+ rateLimit: z.object({
159
+ maxRequests: z.number().default(100),
160
+ windowMs: z.number().default(60000),
161
+ }).optional(),
162
+ });
163
+ /**
164
+ * 完整配置 Schema
165
+ */
166
+ export const F2AConfigSchema = RequiredConfigSchema.merge(AdvancedConfigSchema).merge(ExpertConfigSchema);
167
+ // ============================================================================
168
+ // 配置管理器
169
+ // ============================================================================
170
+ /**
171
+ * 获取配置目录路径
172
+ * 支持通过环境变量 F2A_CONFIG_DIR 注入测试目录
173
+ */
174
+ function getConfigDir() {
175
+ return process.env.F2A_CONFIG_DIR || join(homedir(), '.f2a');
176
+ }
177
+ /**
178
+ * 获取配置文件路径
179
+ */
180
+ export function getConfigPath() {
181
+ return join(getConfigDir(), 'config.json');
182
+ }
183
+ /**
184
+ * 确保配置目录存在
185
+ */
186
+ function ensureConfigDir() {
187
+ const configDir = getConfigDir();
188
+ if (!existsSync(configDir)) {
189
+ mkdirSync(configDir, { recursive: true });
190
+ }
191
+ }
192
+ /**
193
+ * 获取默认配置
194
+ */
195
+ export function getDefaultConfig() {
196
+ return {
197
+ agentName: 'my-agent',
198
+ network: {
199
+ bootstrapPeers: [],
200
+ bootstrapPeerFingerprints: {},
201
+ },
202
+ autoStart: false,
203
+ controlPort: 9001,
204
+ p2pPort: 0,
205
+ enableMDNS: true,
206
+ enableDHT: true,
207
+ logLevel: 'INFO',
208
+ };
209
+ }
210
+ /**
211
+ * 加载配置文件
212
+ * 如果文件不存在,返回默认配置
213
+ */
214
+ export function loadConfig() {
215
+ const configFile = getConfigPath();
216
+ if (!existsSync(configFile)) {
217
+ return getDefaultConfig();
218
+ }
219
+ try {
220
+ const content = readFileSync(configFile, 'utf-8');
221
+ const rawConfig = JSON.parse(content);
222
+ // 合并默认配置
223
+ const mergedConfig = {
224
+ ...getDefaultConfig(),
225
+ ...rawConfig,
226
+ };
227
+ // 验证配置
228
+ const result = F2AConfigSchema.safeParse(mergedConfig);
229
+ if (!result.success) {
230
+ // 仅输出通用提示,详细错误写入调试日志
231
+ console.warn('[F2A] Invalid config file format, using defaults. Please run "f2a init" to reconfigure.');
232
+ debugLog('Config validation failed', result.error.issues);
233
+ return getDefaultConfig();
234
+ }
235
+ return result.data;
236
+ }
237
+ catch (error) {
238
+ // 仅输出通用提示,详细错误写入调试日志
239
+ console.warn('[F2A] Failed to read config file, using defaults. Please check file permissions and format.');
240
+ debugLog('Config load error', error instanceof Error ? error.message : String(error));
241
+ return getDefaultConfig();
242
+ }
243
+ }
244
+ /**
245
+ * 保存配置文件
246
+ * 会自动备份旧配置并设置安全权限
247
+ */
248
+ export function saveConfig(config) {
249
+ ensureConfigDir();
250
+ const configFile = getConfigPath();
251
+ const configDir = getConfigDir();
252
+ // 验证配置
253
+ const result = F2AConfigSchema.safeParse(config);
254
+ if (!result.success) {
255
+ // 仅输出简化错误信息,详细错误写入调试日志
256
+ debugLog('Config validation failed', result.error.issues);
257
+ throw new Error('Configuration validation failed. Please check your configuration values.');
258
+ }
259
+ // 备份现有配置文件
260
+ if (existsSync(configFile)) {
261
+ const backupFile = join(configDir, `config.json.backup-${Date.now()}`);
262
+ try {
263
+ copyFileSync(configFile, backupFile);
264
+ // 清理旧备份文件,保留最近 5 个
265
+ cleanupOldBackups(configDir, 5);
266
+ }
267
+ catch {
268
+ // 备份失败不阻止保存
269
+ }
270
+ }
271
+ // 写入配置文件
272
+ writeFileSync(configFile, JSON.stringify(result.data, null, 2), 'utf-8');
273
+ // 设置文件权限为 600 (仅所有者可读写)
274
+ try {
275
+ chmodSync(configFile, 0o600);
276
+ }
277
+ catch {
278
+ // 权限设置失败不阻止保存
279
+ }
280
+ }
281
+ /**
282
+ * 深度合并两个对象
283
+ * 对于嵌套对象,递归合并而不是覆盖
284
+ */
285
+ function deepMerge(target, source) {
286
+ const result = { ...target };
287
+ for (const key in source) {
288
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
289
+ const sourceValue = source[key];
290
+ const targetValue = target[key];
291
+ if (sourceValue !== undefined &&
292
+ typeof sourceValue === 'object' &&
293
+ sourceValue !== null &&
294
+ !Array.isArray(sourceValue) &&
295
+ targetValue !== undefined &&
296
+ typeof targetValue === 'object' &&
297
+ targetValue !== null &&
298
+ !Array.isArray(targetValue)) {
299
+ // 递归合并嵌套对象
300
+ result[key] = deepMerge(targetValue, sourceValue);
301
+ }
302
+ else {
303
+ // 直接赋值(包括数组和基本类型)
304
+ result[key] = sourceValue;
305
+ }
306
+ }
307
+ }
308
+ return result;
309
+ }
310
+ /**
311
+ * 更新部分配置
312
+ * 支持深度合并嵌套对象(network, security, rateLimit)
313
+ */
314
+ export function updateConfig(partial) {
315
+ const current = loadConfig();
316
+ const updated = deepMerge(current, partial);
317
+ saveConfig(updated);
318
+ return updated;
319
+ }
320
+ /**
321
+ * 检查配置是否存在
322
+ */
323
+ export function configExists() {
324
+ return existsSync(getConfigPath());
325
+ }
326
+ // ============================================================================
327
+ // 配置验证
328
+ // ============================================================================
329
+ /**
330
+ * 验证配置完整性
331
+ * 验证所有 Schema(Required + Advanced + Expert)
332
+ * 返回 { valid: boolean, missing: string[]; errors: string[] }
333
+ */
334
+ export function validateConfig(config) {
335
+ const errors = [];
336
+ const missing = [];
337
+ // 验证必需配置
338
+ const requiredResult = RequiredConfigSchema.safeParse(config);
339
+ if (!requiredResult.success) {
340
+ for (const issue of requiredResult.error.issues) {
341
+ const path = issue.path.join('.');
342
+ if (issue.code === 'invalid_type' && issue.expected === 'string') {
343
+ missing.push(path);
344
+ }
345
+ errors.push(`${path}: ${issue.message}`);
346
+ }
347
+ }
348
+ // 验证进阶配置(如果存在相关字段)
349
+ const advancedFields = ['controlPort', 'p2pPort', 'enableMDNS', 'enableDHT', 'logLevel'];
350
+ const hasAdvancedFields = advancedFields.some(field => field in config);
351
+ if (hasAdvancedFields) {
352
+ const advancedResult = AdvancedConfigSchema.safeParse(config);
353
+ if (!advancedResult.success) {
354
+ for (const issue of advancedResult.error.issues) {
355
+ const path = issue.path.join('.');
356
+ errors.push(`${path}: ${issue.message}`);
357
+ }
358
+ }
359
+ }
360
+ // 验证专家配置(如果存在相关字段)
361
+ const expertFields = ['dataDir', 'security', 'rateLimit'];
362
+ const hasExpertFields = expertFields.some(field => field in config);
363
+ if (hasExpertFields) {
364
+ const expertResult = ExpertConfigSchema.safeParse(config);
365
+ if (!expertResult.success) {
366
+ for (const issue of expertResult.error.issues) {
367
+ const path = issue.path.join('.');
368
+ errors.push(`${path}: ${issue.message}`);
369
+ }
370
+ }
371
+ }
372
+ // 额外的 dataDir 路径安全验证(使用 validatePath 函数)
373
+ if (config.dataDir) {
374
+ const pathValidation = validatePath(config.dataDir);
375
+ if (!pathValidation.valid) {
376
+ errors.push(`dataDir: ${pathValidation.error}`);
377
+ }
378
+ // 必须是绝对路径
379
+ if (!config.dataDir.startsWith('/')) {
380
+ errors.push('dataDir: Must be an absolute path');
381
+ }
382
+ }
383
+ const valid = errors.length === 0 && missing.length === 0;
384
+ return { valid, missing, errors };
385
+ }
386
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * F2A CLI Daemon Commands
3
+ * Daemon 启动和管理命令
4
+ */
5
+ /**
6
+ * 获取 PID 文件路径
7
+ */
8
+ export declare function getPidFile(): string;
9
+ /**
10
+ * 获取日志文件路径
11
+ */
12
+ export declare function getLogFile(): string;
13
+ /**
14
+ * 获取文件锁(防止竞态条件)
15
+ * @returns 是否成功获取锁
16
+ */
17
+ export declare function acquireLock(): boolean;
18
+ /**
19
+ * 释放文件锁(仅释放当前进程持有的锁)
20
+ */
21
+ export declare function releaseLock(): void;
22
+ /**
23
+ * 检查日志文件大小并轮转
24
+ */
25
+ export declare function rotateLogIfNeeded(): void;
26
+ /**
27
+ * 检查 daemon 是否在运行
28
+ */
29
+ export declare function isDaemonRunning(): boolean;
30
+ /**
31
+ * 获取 daemon 状态信息
32
+ */
33
+ export declare function getDaemonStatus(): {
34
+ running: boolean;
35
+ pid?: number;
36
+ port: number;
37
+ };
38
+ /**
39
+ * 前台启动 daemon
40
+ */
41
+ export declare function startForeground(): Promise<void>;
42
+ /**
43
+ * 后台启动 daemon
44
+ */
45
+ export declare function startBackground(): Promise<void>;
46
+ /**
47
+ * 停止后台 daemon
48
+ */
49
+ export declare function stopDaemon(): Promise<void>;
50
+ /**
51
+ * 显示 daemon 状态
52
+ */
53
+ export declare function showStatus(): Promise<void>;
54
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAiDD;;;GAGG;AACH,wBAAgB,WAAW,IAAI,OAAO,CA6BrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAelC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAiBxC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AASD;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAQlF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAoErD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA6IrD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA4EhD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBhD"}