@f2a/network 0.1.2 → 0.1.3
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/package.json +8 -1
- package/.github/workflows/ci.yml +0 -113
- package/.github/workflows/publish.yml +0 -60
- package/MONOREPO.md +0 -58
- package/SKILL.md +0 -137
- package/dist/adapters/openclaw.d.ts +0 -103
- package/dist/adapters/openclaw.d.ts.map +0 -1
- package/dist/adapters/openclaw.js +0 -297
- package/dist/adapters/openclaw.js.map +0 -1
- package/dist/core/connection-manager.d.ts +0 -80
- package/dist/core/connection-manager.d.ts.map +0 -1
- package/dist/core/connection-manager.js +0 -235
- package/dist/core/connection-manager.js.map +0 -1
- package/dist/core/connection-manager.test.d.ts +0 -2
- package/dist/core/connection-manager.test.d.ts.map +0 -1
- package/dist/core/connection-manager.test.js +0 -52
- package/dist/core/connection-manager.test.js.map +0 -1
- package/dist/core/identity.d.ts +0 -47
- package/dist/core/identity.d.ts.map +0 -1
- package/dist/core/identity.js +0 -130
- package/dist/core/identity.js.map +0 -1
- package/dist/core/identity.test.d.ts +0 -2
- package/dist/core/identity.test.d.ts.map +0 -1
- package/dist/core/identity.test.js +0 -43
- package/dist/core/identity.test.js.map +0 -1
- package/dist/core/serverless.d.ts +0 -155
- package/dist/core/serverless.d.ts.map +0 -1
- package/dist/core/serverless.js +0 -615
- package/dist/core/serverless.js.map +0 -1
- package/dist/daemon/webhook.test.d.ts +0 -2
- package/dist/daemon/webhook.test.d.ts.map +0 -1
- package/dist/daemon/webhook.test.js +0 -24
- package/dist/daemon/webhook.test.js.map +0 -1
- package/dist/protocol/messages.d.ts +0 -739
- package/dist/protocol/messages.d.ts.map +0 -1
- package/dist/protocol/messages.js +0 -188
- package/dist/protocol/messages.js.map +0 -1
- package/dist/protocol/messages.test.d.ts +0 -2
- package/dist/protocol/messages.test.d.ts.map +0 -1
- package/dist/protocol/messages.test.js +0 -55
- package/dist/protocol/messages.test.js.map +0 -1
- package/docs/F2A-PROTOCOL.md +0 -61
- package/docs/MOBILE_BOOTSTRAP_DESIGN.md +0 -126
- package/docs/a2a-lessons.md +0 -316
- package/docs/middleware-guide.md +0 -448
- package/docs/readme-update-checklist.md +0 -90
- package/docs/reputation-guide.md +0 -396
- package/docs/rfcs/001-reputation-system.md +0 -712
- package/docs/security-design.md +0 -247
- package/install.sh +0 -231
- package/packages/openclaw-adapter/README.md +0 -510
- package/packages/openclaw-adapter/openclaw.plugin.json +0 -106
- package/packages/openclaw-adapter/package.json +0 -40
- package/packages/openclaw-adapter/src/announcement-queue.test.ts +0 -449
- package/packages/openclaw-adapter/src/announcement-queue.ts +0 -403
- package/packages/openclaw-adapter/src/capability-detector.test.ts +0 -99
- package/packages/openclaw-adapter/src/capability-detector.ts +0 -183
- package/packages/openclaw-adapter/src/claim-handlers.test.ts +0 -974
- package/packages/openclaw-adapter/src/claim-handlers.ts +0 -482
- package/packages/openclaw-adapter/src/connector.business.test.ts +0 -583
- package/packages/openclaw-adapter/src/connector.ts +0 -795
- package/packages/openclaw-adapter/src/index.test.ts +0 -82
- package/packages/openclaw-adapter/src/index.ts +0 -18
- package/packages/openclaw-adapter/src/integration.e2e.test.ts +0 -829
- package/packages/openclaw-adapter/src/logger.ts +0 -51
- package/packages/openclaw-adapter/src/network-client.test.ts +0 -266
- package/packages/openclaw-adapter/src/network-client.ts +0 -251
- package/packages/openclaw-adapter/src/network-recovery.test.ts +0 -465
- package/packages/openclaw-adapter/src/node-manager.test.ts +0 -136
- package/packages/openclaw-adapter/src/node-manager.ts +0 -429
- package/packages/openclaw-adapter/src/plugin.test.ts +0 -439
- package/packages/openclaw-adapter/src/plugin.ts +0 -104
- package/packages/openclaw-adapter/src/reputation.test.ts +0 -221
- package/packages/openclaw-adapter/src/reputation.ts +0 -368
- package/packages/openclaw-adapter/src/task-guard.test.ts +0 -502
- package/packages/openclaw-adapter/src/task-guard.ts +0 -860
- package/packages/openclaw-adapter/src/task-queue.concurrency.test.ts +0 -462
- package/packages/openclaw-adapter/src/task-queue.edge-cases.test.ts +0 -284
- package/packages/openclaw-adapter/src/task-queue.persistence.test.ts +0 -408
- package/packages/openclaw-adapter/src/task-queue.ts +0 -668
- package/packages/openclaw-adapter/src/tool-handlers.test.ts +0 -906
- package/packages/openclaw-adapter/src/tool-handlers.ts +0 -574
- package/packages/openclaw-adapter/src/types.ts +0 -361
- package/packages/openclaw-adapter/src/webhook-pusher.test.ts +0 -188
- package/packages/openclaw-adapter/src/webhook-pusher.ts +0 -220
- package/packages/openclaw-adapter/src/webhook-server.test.ts +0 -580
- package/packages/openclaw-adapter/src/webhook-server.ts +0 -202
- package/packages/openclaw-adapter/tsconfig.json +0 -20
- package/src/cli/commands.test.ts +0 -157
- package/src/cli/commands.ts +0 -129
- package/src/cli/index.test.ts +0 -77
- package/src/cli/index.ts +0 -234
- package/src/core/autonomous-economy.test.ts +0 -291
- package/src/core/autonomous-economy.ts +0 -428
- package/src/core/e2ee-crypto.test.ts +0 -125
- package/src/core/e2ee-crypto.ts +0 -246
- package/src/core/f2a.test.ts +0 -269
- package/src/core/f2a.ts +0 -618
- package/src/core/p2p-network.test.ts +0 -199
- package/src/core/p2p-network.ts +0 -1432
- package/src/core/reputation-security.test.ts +0 -403
- package/src/core/reputation-security.ts +0 -562
- package/src/core/reputation.test.ts +0 -260
- package/src/core/reputation.ts +0 -576
- package/src/core/review-committee.test.ts +0 -380
- package/src/core/review-committee.ts +0 -401
- package/src/core/token-manager.test.ts +0 -133
- package/src/core/token-manager.ts +0 -140
- package/src/daemon/control-server.test.ts +0 -216
- package/src/daemon/control-server.ts +0 -292
- package/src/daemon/index.test.ts +0 -85
- package/src/daemon/index.ts +0 -89
- package/src/daemon/main.ts +0 -44
- package/src/daemon/start.ts +0 -29
- package/src/daemon/webhook.test.ts +0 -68
- package/src/daemon/webhook.ts +0 -105
- package/src/index.test.ts +0 -436
- package/src/index.ts +0 -72
- package/src/types/index.test.ts +0 -87
- package/src/types/index.ts +0 -341
- package/src/types/result.ts +0 -68
- package/src/utils/benchmark.ts +0 -237
- package/src/utils/logger.ts +0 -331
- package/src/utils/middleware.ts +0 -229
- package/src/utils/rate-limiter.ts +0 -207
- package/src/utils/signature.ts +0 -136
- package/src/utils/validation.ts +0 -186
- package/tests/docker/Dockerfile.node +0 -23
- package/tests/docker/Dockerfile.runner +0 -18
- package/tests/docker/docker-compose.test.yml +0 -73
- package/tests/integration/message-passing.test.ts +0 -109
- package/tests/integration/multi-node.test.ts +0 -92
- package/tests/integration/p2p-connection.test.ts +0 -83
- package/tests/integration/test-config.ts +0 -32
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -26
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/protocol/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* 协议消息定义和验证
|
|
4
|
-
* 使用 Zod 进行运行时类型验证
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.F2AMessageSchema = exports.KeyExchangeSchema = exports.WebRTCIceSchema = exports.WebRTCAnswerSchema = exports.WebRTCOfferSchema = exports.GroupInviteSchema = exports.GroupMessageSchema = exports.SkillResultSchema = exports.SkillInvokeSchema = exports.SkillResponseSchema = exports.SkillQuerySchema = exports.MessageAckSchema = exports.TextMessageSchema = exports.ConfirmationResultSchema = exports.ConnectionPendingSchema = exports.IdentityResponseSchema = exports.IdentityChallengeSchema = exports.BaseMessageSchema = exports.MessageTypeSchema = void 0;
|
|
8
|
-
exports.validateMessage = validateMessage;
|
|
9
|
-
exports.createMessageId = createMessageId;
|
|
10
|
-
exports.createTimestamp = createTimestamp;
|
|
11
|
-
const zod_1 = require("zod");
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// 基础消息架构
|
|
14
|
-
// ============================================================================
|
|
15
|
-
exports.MessageTypeSchema = zod_1.z.enum([
|
|
16
|
-
'identity_challenge',
|
|
17
|
-
'identity_response',
|
|
18
|
-
'connection_pending',
|
|
19
|
-
'confirmation_result',
|
|
20
|
-
'message',
|
|
21
|
-
'message_ack',
|
|
22
|
-
'skill_query',
|
|
23
|
-
'skill_response',
|
|
24
|
-
'skill_invoke',
|
|
25
|
-
'skill_result',
|
|
26
|
-
'group_message',
|
|
27
|
-
'group_invite',
|
|
28
|
-
'key_exchange',
|
|
29
|
-
'webrtc_offer',
|
|
30
|
-
'webrtc_answer',
|
|
31
|
-
'webrtc_ice'
|
|
32
|
-
]);
|
|
33
|
-
exports.BaseMessageSchema = zod_1.z.object({
|
|
34
|
-
type: exports.MessageTypeSchema,
|
|
35
|
-
id: zod_1.z.string().uuid().optional(),
|
|
36
|
-
timestamp: zod_1.z.number().int().positive()
|
|
37
|
-
});
|
|
38
|
-
// ============================================================================
|
|
39
|
-
// 身份验证消息
|
|
40
|
-
// ============================================================================
|
|
41
|
-
exports.IdentityChallengeSchema = exports.BaseMessageSchema.extend({
|
|
42
|
-
type: zod_1.z.literal('identity_challenge'),
|
|
43
|
-
agentId: zod_1.z.string(),
|
|
44
|
-
publicKey: zod_1.z.string(),
|
|
45
|
-
challenge: zod_1.z.string(),
|
|
46
|
-
timestamp: zod_1.z.number().int()
|
|
47
|
-
});
|
|
48
|
-
exports.IdentityResponseSchema = exports.BaseMessageSchema.extend({
|
|
49
|
-
type: zod_1.z.literal('identity_response'),
|
|
50
|
-
agentId: zod_1.z.string(),
|
|
51
|
-
publicKey: zod_1.z.string(),
|
|
52
|
-
signature: zod_1.z.string()
|
|
53
|
-
});
|
|
54
|
-
// ============================================================================
|
|
55
|
-
// 连接确认消息
|
|
56
|
-
// ============================================================================
|
|
57
|
-
exports.ConnectionPendingSchema = exports.BaseMessageSchema.extend({
|
|
58
|
-
type: zod_1.z.literal('connection_pending'),
|
|
59
|
-
confirmationId: zod_1.z.string().uuid(),
|
|
60
|
-
message: zod_1.z.string(),
|
|
61
|
-
timeout: zod_1.z.number().int().positive()
|
|
62
|
-
});
|
|
63
|
-
exports.ConfirmationResultSchema = exports.BaseMessageSchema.extend({
|
|
64
|
-
type: zod_1.z.literal('confirmation_result'),
|
|
65
|
-
confirmationId: zod_1.z.string().uuid(),
|
|
66
|
-
accepted: zod_1.z.boolean(),
|
|
67
|
-
reason: zod_1.z.string().optional()
|
|
68
|
-
});
|
|
69
|
-
// ============================================================================
|
|
70
|
-
// 文本消息
|
|
71
|
-
// ============================================================================
|
|
72
|
-
exports.TextMessageSchema = exports.BaseMessageSchema.extend({
|
|
73
|
-
type: zod_1.z.literal('message'),
|
|
74
|
-
id: zod_1.z.string().uuid(),
|
|
75
|
-
from: zod_1.z.string(),
|
|
76
|
-
to: zod_1.z.string(),
|
|
77
|
-
content: zod_1.z.string(),
|
|
78
|
-
timestamp: zod_1.z.number().int()
|
|
79
|
-
});
|
|
80
|
-
exports.MessageAckSchema = exports.BaseMessageSchema.extend({
|
|
81
|
-
type: zod_1.z.literal('message_ack'),
|
|
82
|
-
messageId: zod_1.z.string().uuid()
|
|
83
|
-
});
|
|
84
|
-
// ============================================================================
|
|
85
|
-
// Skill 消息
|
|
86
|
-
// ============================================================================
|
|
87
|
-
exports.SkillQuerySchema = exports.BaseMessageSchema.extend({
|
|
88
|
-
type: zod_1.z.literal('skill_query'),
|
|
89
|
-
requestId: zod_1.z.string().uuid()
|
|
90
|
-
});
|
|
91
|
-
exports.SkillResponseSchema = exports.BaseMessageSchema.extend({
|
|
92
|
-
type: zod_1.z.literal('skill_response'),
|
|
93
|
-
requestId: zod_1.z.string().uuid(),
|
|
94
|
-
skills: zod_1.z.array(zod_1.z.object({
|
|
95
|
-
name: zod_1.z.string(),
|
|
96
|
-
description: zod_1.z.string(),
|
|
97
|
-
parameters: zod_1.z.record(zod_1.z.any())
|
|
98
|
-
}))
|
|
99
|
-
});
|
|
100
|
-
exports.SkillInvokeSchema = exports.BaseMessageSchema.extend({
|
|
101
|
-
type: zod_1.z.literal('skill_invoke'),
|
|
102
|
-
requestId: zod_1.z.string().uuid(),
|
|
103
|
-
skill: zod_1.z.string(),
|
|
104
|
-
parameters: zod_1.z.record(zod_1.z.any())
|
|
105
|
-
});
|
|
106
|
-
exports.SkillResultSchema = exports.BaseMessageSchema.extend({
|
|
107
|
-
type: zod_1.z.literal('skill_result'),
|
|
108
|
-
requestId: zod_1.z.string().uuid(),
|
|
109
|
-
status: zod_1.z.enum(['success', 'error']),
|
|
110
|
-
result: zod_1.z.any().optional(),
|
|
111
|
-
error: zod_1.z.string().optional()
|
|
112
|
-
});
|
|
113
|
-
// ============================================================================
|
|
114
|
-
// 群聊消息
|
|
115
|
-
// ============================================================================
|
|
116
|
-
exports.GroupMessageSchema = exports.BaseMessageSchema.extend({
|
|
117
|
-
type: zod_1.z.literal('group_message'),
|
|
118
|
-
groupId: zod_1.z.string(),
|
|
119
|
-
groupName: zod_1.z.string(),
|
|
120
|
-
from: zod_1.z.string(),
|
|
121
|
-
content: zod_1.z.string()
|
|
122
|
-
});
|
|
123
|
-
exports.GroupInviteSchema = exports.BaseMessageSchema.extend({
|
|
124
|
-
type: zod_1.z.literal('group_invite'),
|
|
125
|
-
groupId: zod_1.z.string(),
|
|
126
|
-
groupName: zod_1.z.string(),
|
|
127
|
-
inviter: zod_1.z.string()
|
|
128
|
-
});
|
|
129
|
-
// ============================================================================
|
|
130
|
-
// WebRTC 消息
|
|
131
|
-
// ============================================================================
|
|
132
|
-
exports.WebRTCOfferSchema = exports.BaseMessageSchema.extend({
|
|
133
|
-
type: zod_1.z.literal('webrtc_offer'),
|
|
134
|
-
offer: zod_1.z.any()
|
|
135
|
-
});
|
|
136
|
-
exports.WebRTCAnswerSchema = exports.BaseMessageSchema.extend({
|
|
137
|
-
type: zod_1.z.literal('webrtc_answer'),
|
|
138
|
-
answer: zod_1.z.any()
|
|
139
|
-
});
|
|
140
|
-
exports.WebRTCIceSchema = exports.BaseMessageSchema.extend({
|
|
141
|
-
type: zod_1.z.literal('webrtc_ice'),
|
|
142
|
-
candidate: zod_1.z.any()
|
|
143
|
-
});
|
|
144
|
-
// ============================================================================
|
|
145
|
-
// 加密消息
|
|
146
|
-
// ============================================================================
|
|
147
|
-
exports.KeyExchangeSchema = exports.BaseMessageSchema.extend({
|
|
148
|
-
type: zod_1.z.literal('key_exchange'),
|
|
149
|
-
publicKey: zod_1.z.string()
|
|
150
|
-
});
|
|
151
|
-
// ============================================================================
|
|
152
|
-
// 联合类型
|
|
153
|
-
// ============================================================================
|
|
154
|
-
exports.F2AMessageSchema = zod_1.z.discriminatedUnion('type', [
|
|
155
|
-
exports.IdentityChallengeSchema,
|
|
156
|
-
exports.IdentityResponseSchema,
|
|
157
|
-
exports.ConnectionPendingSchema,
|
|
158
|
-
exports.ConfirmationResultSchema,
|
|
159
|
-
exports.TextMessageSchema,
|
|
160
|
-
exports.MessageAckSchema,
|
|
161
|
-
exports.SkillQuerySchema,
|
|
162
|
-
exports.SkillResponseSchema,
|
|
163
|
-
exports.SkillInvokeSchema,
|
|
164
|
-
exports.SkillResultSchema,
|
|
165
|
-
exports.GroupMessageSchema,
|
|
166
|
-
exports.GroupInviteSchema,
|
|
167
|
-
exports.WebRTCOfferSchema,
|
|
168
|
-
exports.WebRTCAnswerSchema,
|
|
169
|
-
exports.WebRTCIceSchema,
|
|
170
|
-
exports.KeyExchangeSchema
|
|
171
|
-
]);
|
|
172
|
-
// ============================================================================
|
|
173
|
-
// 验证函数
|
|
174
|
-
// ============================================================================
|
|
175
|
-
function validateMessage(data) {
|
|
176
|
-
const result = exports.F2AMessageSchema.safeParse(data);
|
|
177
|
-
if (result.success) {
|
|
178
|
-
return { success: true, data: result.data };
|
|
179
|
-
}
|
|
180
|
-
return { success: false, error: result.error.message };
|
|
181
|
-
}
|
|
182
|
-
function createMessageId() {
|
|
183
|
-
return crypto.randomUUID();
|
|
184
|
-
}
|
|
185
|
-
function createTimestamp() {
|
|
186
|
-
return Date.now();
|
|
187
|
-
}
|
|
188
|
-
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/protocol/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messages.test.d.ts","sourceRoot":"","sources":["../../src/protocol/messages.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const messages_1 = require("./messages");
|
|
5
|
-
(0, vitest_1.describe)('Message Validation', () => {
|
|
6
|
-
(0, vitest_1.it)('should validate identity challenge', () => {
|
|
7
|
-
const message = {
|
|
8
|
-
type: 'identity_challenge',
|
|
9
|
-
agentId: 'test-agent',
|
|
10
|
-
publicKey: 'test-key',
|
|
11
|
-
challenge: 'test-challenge',
|
|
12
|
-
timestamp: Date.now()
|
|
13
|
-
};
|
|
14
|
-
const result = messages_1.IdentityChallengeSchema.safeParse(message);
|
|
15
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
16
|
-
});
|
|
17
|
-
(0, vitest_1.it)('should validate identity response', () => {
|
|
18
|
-
const message = {
|
|
19
|
-
type: 'identity_response',
|
|
20
|
-
agentId: 'test-agent',
|
|
21
|
-
publicKey: 'test-key',
|
|
22
|
-
signature: 'test-signature',
|
|
23
|
-
timestamp: Date.now()
|
|
24
|
-
};
|
|
25
|
-
const result = messages_1.IdentityResponseSchema.safeParse(message);
|
|
26
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
27
|
-
});
|
|
28
|
-
(0, vitest_1.it)('should validate text message', () => {
|
|
29
|
-
const message = {
|
|
30
|
-
type: 'message',
|
|
31
|
-
id: '550e8400-e29b-41d4-a716-446655440000',
|
|
32
|
-
from: 'agent-a',
|
|
33
|
-
to: 'agent-b',
|
|
34
|
-
content: 'Hello',
|
|
35
|
-
timestamp: Date.now()
|
|
36
|
-
};
|
|
37
|
-
const result = messages_1.TextMessageSchema.safeParse(message);
|
|
38
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
39
|
-
});
|
|
40
|
-
(0, vitest_1.it)('should reject invalid message', () => {
|
|
41
|
-
const result = (0, messages_1.validateMessage)({ type: 'invalid_type' });
|
|
42
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
43
|
-
});
|
|
44
|
-
(0, vitest_1.it)('should accept valid message', () => {
|
|
45
|
-
const result = (0, messages_1.validateMessage)({
|
|
46
|
-
type: 'identity_challenge',
|
|
47
|
-
agentId: 'test',
|
|
48
|
-
publicKey: 'key',
|
|
49
|
-
challenge: 'challenge',
|
|
50
|
-
timestamp: Date.now()
|
|
51
|
-
});
|
|
52
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
//# sourceMappingURL=messages.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../src/protocol/messages.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,yCAKoB;AAEpB,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,gBAAgB;YAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,MAAM,MAAM,GAAG,kCAAuB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,gBAAgB;YAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,MAAM,MAAM,GAAG,iCAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzD,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,sCAAsC;YAC1C,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,MAAM,MAAM,GAAG,4BAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACzD,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC;YAC7B,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/docs/F2A-PROTOCOL.md
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# F2A Protocol Specification
|
|
2
|
-
|
|
3
|
-
F2A (Federated Agent Architecture) Protocol 是 Agent 之间的通用通信协议。
|
|
4
|
-
|
|
5
|
-
## 版本
|
|
6
|
-
|
|
7
|
-
当前版本: **1.0.0**
|
|
8
|
-
|
|
9
|
-
## 消息格式
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
interface F2AMessage {
|
|
13
|
-
version: "1.0";
|
|
14
|
-
type: MessageType;
|
|
15
|
-
from: string;
|
|
16
|
-
to?: string;
|
|
17
|
-
timestamp: number;
|
|
18
|
-
payload: unknown;
|
|
19
|
-
signature?: string;
|
|
20
|
-
}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## 消息类型
|
|
24
|
-
|
|
25
|
-
- `discover` - 发现 Agents
|
|
26
|
-
- `announce` - 广播任务(认领模式)
|
|
27
|
-
- `claim` - 认领任务
|
|
28
|
-
- `delegate` - 明确委托
|
|
29
|
-
- `accept` / `reject` - 接受/拒绝委托
|
|
30
|
-
- `response` - 任务响应
|
|
31
|
-
- `review` - 评审提交
|
|
32
|
-
- `heartbeat` - 心跳
|
|
33
|
-
|
|
34
|
-
## 委托模式
|
|
35
|
-
|
|
36
|
-
### 1. 直接委托
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
Agent A --delegate--> Agent B --response--> Agent A
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### 2. 广播并行
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
Agent A --delegate--> All Agents --response--> Agent A
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 3. 广播认领
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
Agent A --announce--> All Agents
|
|
52
|
-
Agent B --claim--> Agent A
|
|
53
|
-
Agent A --delegate--> Agent B --response--> Agent A
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## 安全机制
|
|
57
|
-
|
|
58
|
-
- 白名单/黑名单
|
|
59
|
-
- 信誉系统
|
|
60
|
-
- 评审团(高价值任务)
|
|
61
|
-
- 消息签名验证
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
# 手机作为移动引导节点设计提案
|
|
2
|
-
|
|
3
|
-
## 背景
|
|
4
|
-
|
|
5
|
-
当前 F2A 的 P2P 网络局限于单一局域网,无法实现跨网络(如家里和公司)的 Agent 发现和通信。
|
|
6
|
-
|
|
7
|
-
## 设计目标
|
|
8
|
-
|
|
9
|
-
让手机作为**移动引导节点(Mobile Bootstrap Node)**,连接不同网络的 Agent:
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
场景1: 家里
|
|
13
|
-
┌─────────────────────────┐
|
|
14
|
-
│ 家里的 WiFi 网络 │
|
|
15
|
-
│ ┌─────┐ ┌─────┐ ┌─────┐│
|
|
16
|
-
│ │Agent│ │Agent│ │Agent││
|
|
17
|
-
│ │ 1 │ │ 2 │ │ 3 ││
|
|
18
|
-
│ └──┬──┘ └──┬──┘ └──┬──┘│
|
|
19
|
-
│ └────────┼───────┘ │
|
|
20
|
-
│ ▼ │
|
|
21
|
-
│ ┌─────────┐ │
|
|
22
|
-
│ │ 手机 │◄──────┐
|
|
23
|
-
│ │引导节点 │ │
|
|
24
|
-
│ └─────────┘ │
|
|
25
|
-
└─────────────────────────┘
|
|
26
|
-
|
|
27
|
-
场景2: 公司
|
|
28
|
-
┌─────────────────────────┐
|
|
29
|
-
│ 公司的 WiFi 网络 │
|
|
30
|
-
│ ┌─────┐ ┌─────┐ │
|
|
31
|
-
│ │Agent│ │Agent│ │
|
|
32
|
-
│ │ 4 │ │ 5 │ │
|
|
33
|
-
│ └──┬──┘ └──┬──┘ │
|
|
34
|
-
│ └────────┼───────┐ │
|
|
35
|
-
│ ▼ │ │
|
|
36
|
-
│ ┌─────────┐ │ │
|
|
37
|
-
│ │ 手机 │◄─┘ │
|
|
38
|
-
│ │引导节点 │ │
|
|
39
|
-
│ └────┬────┘ │
|
|
40
|
-
└──────────────┼──────────┘
|
|
41
|
-
│
|
|
42
|
-
▼
|
|
43
|
-
家里的3个Agent 和 公司的2个Agent
|
|
44
|
-
通过手机节点串联
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## 核心机制
|
|
48
|
-
|
|
49
|
-
### 1. 手机作为 DHT 节点
|
|
50
|
-
|
|
51
|
-
- 手机运行 F2A 节点,启用 DHT 服务器模式
|
|
52
|
-
- 在家时:发现并记录家里的 Agent 到 DHT
|
|
53
|
-
- 在公司时:发现并记录公司的 Agent 到 DHT
|
|
54
|
-
- DHT 路由表自动同步,实现跨网络发现
|
|
55
|
-
|
|
56
|
-
### 2. NAT 穿透
|
|
57
|
-
|
|
58
|
-
- 启用 libp2p 的 autoNAT 和 upnpNAT 服务
|
|
59
|
-
- 自动检测 NAT 类型,尝试端口映射
|
|
60
|
-
- 为跨网络直连提供技术支持
|
|
61
|
-
|
|
62
|
-
### 3. 发现流程
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
Agent 4 (公司) 想联系 Agent 1 (家里)
|
|
66
|
-
|
|
67
|
-
1. Agent 4 通过 DHT 查询 Agent 1
|
|
68
|
-
2. 手机作为 DHT 节点,返回 Agent 1 的地址信息
|
|
69
|
-
3. Agent 4 尝试 NAT 穿透直连 Agent 1
|
|
70
|
-
4. 成功:直接 P2P 通信
|
|
71
|
-
5. 失败:需要公共中继节点(未来扩展)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## 技术方案
|
|
75
|
-
|
|
76
|
-
### 依赖添加
|
|
77
|
-
|
|
78
|
-
```json
|
|
79
|
-
{
|
|
80
|
-
"@libp2p/autonat": "^1.0.0",
|
|
81
|
-
"@libp2p/upnp-nat": "^1.0.0"
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### P2P 网络配置
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
services.autonat = autoNAT();
|
|
89
|
-
services.upnp = upnpNAT();
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 部署方式
|
|
93
|
-
|
|
94
|
-
- **Termux** (Android):使用脚本启动
|
|
95
|
-
- **iSH** (iOS):Alpine Linux 环境
|
|
96
|
-
- **原生 App**:未来可选
|
|
97
|
-
|
|
98
|
-
## 待解决问题
|
|
99
|
-
|
|
100
|
-
| 问题 | 状态 | 方案 |
|
|
101
|
-
|------|------|------|
|
|
102
|
-
| NAT 穿透成功率 | 🔴 未验证 | 依赖 autoNAT/upnpNAT,需测试 |
|
|
103
|
-
| 手机后台运行 | 🟡 部分可行 | Termux + 关闭电池优化 |
|
|
104
|
-
| 跨网络直连 | 🔴 未验证 | 需要至少一方有可穿透的 NAT |
|
|
105
|
-
| 公共中继备份 | 🔴 未实现 | 打洞失败时的备选方案 |
|
|
106
|
-
|
|
107
|
-
## 实现状态
|
|
108
|
-
|
|
109
|
-
🚧 **设计阶段** - 等待本地测试验证
|
|
110
|
-
|
|
111
|
-
## 下一步
|
|
112
|
-
|
|
113
|
-
1. 本地局域网测试验证基础功能
|
|
114
|
-
2. Termux 真机测试
|
|
115
|
-
3. NAT 穿透成功率测试
|
|
116
|
-
4. 根据测试结果决定是否继续推进
|
|
117
|
-
|
|
118
|
-
## 相关资源
|
|
119
|
-
|
|
120
|
-
- [Termux 安装指南](./docs/TERMUX.md)(待创建)
|
|
121
|
-
- [libp2p NAT 穿透文档](https://docs.libp2p.io/concepts/nat/)
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
*Created: 2026-03-05*
|
|
126
|
-
*Status: Design Proposal*
|