a2a-xmtp 1.2.3 → 1.3.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 (51) hide show
  1. package/README.md +8 -7
  2. package/dist/coordination/message-orchestrator.d.ts +55 -0
  3. package/dist/coordination/message-orchestrator.d.ts.map +1 -0
  4. package/dist/coordination/message-orchestrator.js +142 -0
  5. package/dist/coordination/message-orchestrator.js.map +1 -0
  6. package/dist/coordination/policy-engine.d.ts +34 -0
  7. package/dist/coordination/policy-engine.d.ts.map +1 -0
  8. package/dist/coordination/policy-engine.js +92 -0
  9. package/dist/coordination/policy-engine.js.map +1 -0
  10. package/dist/index.d.ts +9 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +163 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/tools/xmtp-agents.d.ts +19 -0
  15. package/dist/tools/xmtp-agents.d.ts.map +1 -0
  16. package/dist/tools/xmtp-agents.js +27 -0
  17. package/dist/tools/xmtp-agents.js.map +1 -0
  18. package/dist/tools/xmtp-group.d.ts +95 -0
  19. package/dist/tools/xmtp-group.d.ts.map +1 -0
  20. package/dist/tools/xmtp-group.js +134 -0
  21. package/dist/tools/xmtp-group.js.map +1 -0
  22. package/dist/tools/xmtp-inbox.d.ts +22 -0
  23. package/dist/tools/xmtp-inbox.d.ts.map +1 -0
  24. package/dist/tools/xmtp-inbox.js +36 -0
  25. package/dist/tools/xmtp-inbox.js.map +1 -0
  26. package/dist/tools/xmtp-send.d.ts +28 -0
  27. package/dist/tools/xmtp-send.d.ts.map +1 -0
  28. package/dist/tools/xmtp-send.js +63 -0
  29. package/dist/tools/xmtp-send.js.map +1 -0
  30. package/dist/transport/identity-registry.d.ts +30 -0
  31. package/dist/transport/identity-registry.d.ts.map +1 -0
  32. package/dist/transport/identity-registry.js +117 -0
  33. package/dist/transport/identity-registry.js.map +1 -0
  34. package/dist/transport/xmtp-bridge.d.ts +55 -0
  35. package/dist/transport/xmtp-bridge.d.ts.map +1 -0
  36. package/dist/transport/xmtp-bridge.js +265 -0
  37. package/dist/transport/xmtp-bridge.js.map +1 -0
  38. package/dist/types.d.ts +100 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +51 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +25 -14
  43. package/src/identity-registry.ts +0 -134
  44. package/src/index.ts +0 -327
  45. package/src/policy-engine.ts +0 -121
  46. package/src/tools/xmtp-agents.ts +0 -38
  47. package/src/tools/xmtp-group.ts +0 -153
  48. package/src/tools/xmtp-inbox.ts +0 -47
  49. package/src/tools/xmtp-send.ts +0 -77
  50. package/src/types.ts +0 -155
  51. package/src/xmtp-bridge.ts +0 -283
@@ -0,0 +1,95 @@
1
+ import type { XmtpBridge } from "../transport/xmtp-bridge.js";
2
+ import type { IdentityRegistry } from "../transport/identity-registry.js";
3
+ export declare function handleXmtpGroup(bridges: Map<string, XmtpBridge>, registry: IdentityRegistry, params: {
4
+ action: string;
5
+ members?: string[];
6
+ conversationId?: string;
7
+ name?: string;
8
+ }, agentId: string): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ details: null;
14
+ } | {
15
+ content: {
16
+ type: "text";
17
+ text: string;
18
+ }[];
19
+ details: {
20
+ action: string;
21
+ conversationId: string;
22
+ name: string;
23
+ memberCount: number;
24
+ count?: undefined;
25
+ groups?: undefined;
26
+ members?: undefined;
27
+ added?: undefined;
28
+ removed?: undefined;
29
+ };
30
+ } | {
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ details: {
36
+ action: string;
37
+ count: number;
38
+ groups: import("../types.js").GroupInfo[];
39
+ conversationId?: undefined;
40
+ name?: undefined;
41
+ memberCount?: undefined;
42
+ members?: undefined;
43
+ added?: undefined;
44
+ removed?: undefined;
45
+ };
46
+ } | {
47
+ content: {
48
+ type: "text";
49
+ text: string;
50
+ }[];
51
+ details: {
52
+ action: string;
53
+ conversationId: string;
54
+ count: number;
55
+ members: string[];
56
+ name?: undefined;
57
+ memberCount?: undefined;
58
+ groups?: undefined;
59
+ added?: undefined;
60
+ removed?: undefined;
61
+ };
62
+ } | {
63
+ content: {
64
+ type: "text";
65
+ text: string;
66
+ }[];
67
+ details: {
68
+ action: string;
69
+ conversationId: string;
70
+ added: string[];
71
+ name?: undefined;
72
+ memberCount?: undefined;
73
+ count?: undefined;
74
+ groups?: undefined;
75
+ members?: undefined;
76
+ removed?: undefined;
77
+ };
78
+ } | {
79
+ content: {
80
+ type: "text";
81
+ text: string;
82
+ }[];
83
+ details: {
84
+ action: string;
85
+ conversationId: string;
86
+ removed: string[];
87
+ name?: undefined;
88
+ memberCount?: undefined;
89
+ count?: undefined;
90
+ groups?: undefined;
91
+ members?: undefined;
92
+ added?: undefined;
93
+ };
94
+ }>;
95
+ //# sourceMappingURL=xmtp-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-group.d.ts","sourceRoot":"","sources":["../../src/tools/xmtp-group.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAI1E,wBAAsB,eAAe,CACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE;IACN,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,EACD,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsIhB"}
@@ -0,0 +1,134 @@
1
+ // ============================================================
2
+ // Tool: xmtp_group — 群聊管理(创建、列表、成员查看/添加/移除)
3
+ // ============================================================
4
+ export async function handleXmtpGroup(bridges, registry, params, agentId) {
5
+ const bridge = bridges.get(agentId) ?? bridges.values().next().value;
6
+ if (!bridge) {
7
+ return { content: [{ type: "text", text: "No XMTP bridge available. Plugin not initialized." }], details: null };
8
+ }
9
+ const action = params.action;
10
+ try {
11
+ switch (action) {
12
+ case "create": {
13
+ if (!params.members?.length) {
14
+ return { content: [{ type: "text", text: "Parameter 'members' is required for create action. Provide agent IDs or 0x addresses." }], details: null };
15
+ }
16
+ // 解析成员地址
17
+ const addresses = [];
18
+ for (const member of params.members) {
19
+ if (member.startsWith("0x")) {
20
+ addresses.push(member);
21
+ }
22
+ else {
23
+ const addr = registry.getAddress(member);
24
+ if (!addr) {
25
+ return { content: [{ type: "text", text: `Agent "${member}" not found. Use xmtp_agents to discover available agents.` }], details: null };
26
+ }
27
+ addresses.push(addr);
28
+ }
29
+ }
30
+ const result = await bridge.createGroup(addresses, params.name);
31
+ return {
32
+ content: [{ type: "text", text: `Group created${result.name ? ` "${result.name}"` : ""} with ${addresses.length} members.` }],
33
+ details: {
34
+ action: "create",
35
+ conversationId: result.conversationId,
36
+ name: result.name,
37
+ memberCount: addresses.length,
38
+ },
39
+ };
40
+ }
41
+ case "list": {
42
+ const groups = await bridge.listGroups();
43
+ if (groups.length === 0) {
44
+ return { content: [{ type: "text", text: "No group conversations found." }], details: null };
45
+ }
46
+ const lines = groups.map((g) => {
47
+ const nameLabel = g.name ? ` "${g.name}"` : "";
48
+ return `- ${g.conversationId}${nameLabel} (${g.memberAddresses.length} members, created ${g.createdAt})`;
49
+ });
50
+ return {
51
+ content: [{ type: "text", text: `Groups:\n${lines.join("\n")}` }],
52
+ details: { action: "list", count: groups.length, groups },
53
+ };
54
+ }
55
+ case "members": {
56
+ if (!params.conversationId) {
57
+ return { content: [{ type: "text", text: "Parameter 'conversationId' is required for members action." }], details: null };
58
+ }
59
+ const members = await bridge.getGroupMembers(params.conversationId);
60
+ // 尝试解析 agentId
61
+ const resolved = members.map((addr) => {
62
+ const aid = registry.getAgentId(addr);
63
+ return aid ? `${aid} (${addr})` : addr;
64
+ });
65
+ return {
66
+ content: [{ type: "text", text: `Members (${members.length}):\n${resolved.map((m) => `- ${m}`).join("\n")}` }],
67
+ details: { action: "members", conversationId: params.conversationId, count: members.length, members },
68
+ };
69
+ }
70
+ case "add_member": {
71
+ if (!params.conversationId) {
72
+ return { content: [{ type: "text", text: "Parameter 'conversationId' is required for add_member action." }], details: null };
73
+ }
74
+ if (!params.members?.length) {
75
+ return { content: [{ type: "text", text: "Parameter 'members' is required for add_member action." }], details: null };
76
+ }
77
+ const addresses = [];
78
+ for (const member of params.members) {
79
+ if (member.startsWith("0x")) {
80
+ addresses.push(member);
81
+ }
82
+ else {
83
+ const addr = registry.getAddress(member);
84
+ if (!addr) {
85
+ return { content: [{ type: "text", text: `Agent "${member}" not found.` }], details: null };
86
+ }
87
+ addresses.push(addr);
88
+ }
89
+ }
90
+ await bridge.addGroupMembers(params.conversationId, addresses);
91
+ return {
92
+ content: [{ type: "text", text: `Added ${addresses.length} member(s) to group.` }],
93
+ details: { action: "add_member", conversationId: params.conversationId, added: addresses },
94
+ };
95
+ }
96
+ case "remove_member": {
97
+ if (!params.conversationId) {
98
+ return { content: [{ type: "text", text: "Parameter 'conversationId' is required for remove_member action." }], details: null };
99
+ }
100
+ if (!params.members?.length) {
101
+ return { content: [{ type: "text", text: "Parameter 'members' is required for remove_member action." }], details: null };
102
+ }
103
+ const addresses = [];
104
+ for (const member of params.members) {
105
+ if (member.startsWith("0x")) {
106
+ addresses.push(member);
107
+ }
108
+ else {
109
+ const addr = registry.getAddress(member);
110
+ if (!addr) {
111
+ return { content: [{ type: "text", text: `Agent "${member}" not found.` }], details: null };
112
+ }
113
+ addresses.push(addr);
114
+ }
115
+ }
116
+ await bridge.removeGroupMembers(params.conversationId, addresses);
117
+ return {
118
+ content: [{ type: "text", text: `Removed ${addresses.length} member(s) from group.` }],
119
+ details: { action: "remove_member", conversationId: params.conversationId, removed: addresses },
120
+ };
121
+ }
122
+ default:
123
+ return {
124
+ content: [{ type: "text", text: `Unknown action "${action}". Supported: create, list, members, add_member, remove_member.` }],
125
+ details: null,
126
+ };
127
+ }
128
+ }
129
+ catch (err) {
130
+ const msg = err instanceof Error ? err.message : String(err);
131
+ return { content: [{ type: "text", text: `Group operation failed: ${msg}` }], details: null };
132
+ }
133
+ }
134
+ //# sourceMappingURL=xmtp-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-group.js","sourceRoot":"","sources":["../../src/tools/xmtp-group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { XmtpBridge } from "../transport/xmtp-bridge.js";
2
+ import type { IdentityRegistry } from "../transport/identity-registry.js";
3
+ export declare function handleXmtpInbox(bridges: Map<string, XmtpBridge>, registry: IdentityRegistry, params: {
4
+ limit?: number;
5
+ from?: string;
6
+ }, agentId: string): Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ details: null;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ details: {
18
+ count: number;
19
+ myAddress: string;
20
+ };
21
+ }>;
22
+ //# sourceMappingURL=xmtp-inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-inbox.d.ts","sourceRoot":"","sources":["../../src/tools/xmtp-inbox.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,wBAAsB,eAAe,CACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACzC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;GAmChB"}
@@ -0,0 +1,36 @@
1
+ // ============================================================
2
+ // Tool: xmtp_inbox — 查看 XMTP 收件箱消息
3
+ // ============================================================
4
+ export async function handleXmtpInbox(bridges, registry, params, agentId) {
5
+ const bridge = bridges.get(agentId) ?? bridges.values().next().value;
6
+ if (!bridge) {
7
+ return { content: [{ type: "text", text: "No XMTP bridge available." }], details: null };
8
+ }
9
+ // 解析 from
10
+ let fromFilter = params.from;
11
+ if (fromFilter && !fromFilter.startsWith("0x")) {
12
+ const addr = registry.getAddress(fromFilter);
13
+ if (addr)
14
+ fromFilter = addr;
15
+ }
16
+ try {
17
+ const messages = await bridge.getInbox({ limit: params.limit ?? 10, from: fromFilter });
18
+ if (messages.length === 0) {
19
+ return { content: [{ type: "text", text: "No messages in inbox." }], details: null };
20
+ }
21
+ const lines = messages.map((m, i) => {
22
+ const sender = m.from.agentId ?? m.from.xmtpAddress;
23
+ const groupTag = m.isGroup ? " [group]" : "";
24
+ return `${i + 1}. [${m.timestamp}]${groupTag} from ${sender}: ${m.content}`;
25
+ });
26
+ return {
27
+ content: [{ type: "text", text: lines.join("\n") }],
28
+ details: { count: messages.length, myAddress: bridge.address },
29
+ };
30
+ }
31
+ catch (err) {
32
+ const msg = err instanceof Error ? err.message : String(err);
33
+ return { content: [{ type: "text", text: `Failed to fetch inbox: ${msg}` }], details: null };
34
+ }
35
+ }
36
+ //# sourceMappingURL=xmtp-inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-inbox.js","sourceRoot":"","sources":["../../src/tools/xmtp-inbox.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mCAAmC;AACnC,+DAA+D;AAK/D,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgC,EAChC,QAA0B,EAC1B,MAAyC,EACzC,OAAe;IAEf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IACrE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpG,CAAC;IAED,UAAU;IACV,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7B,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,IAAI;YAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAExF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChG,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,SAAS,IAAI,QAAQ,SAAS,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE;SAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxG,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { XmtpBridge } from "../transport/xmtp-bridge.js";
2
+ import type { IdentityRegistry } from "../transport/identity-registry.js";
3
+ import type { PolicyEngine } from "../coordination/policy-engine.js";
4
+ export declare function handleXmtpSend(bridges: Map<string, XmtpBridge>, registry: IdentityRegistry, policyEngine: PolicyEngine, params: {
5
+ to?: string;
6
+ message: string;
7
+ conversationId?: string;
8
+ contentType?: "text" | "markdown";
9
+ }, senderAgentId: string): Promise<{
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ details: null;
15
+ } | {
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ details: {
21
+ status: string;
22
+ conversationId: string;
23
+ messageId: string;
24
+ to: string | undefined;
25
+ toAddress: string | undefined;
26
+ };
27
+ }>;
28
+ //# sourceMappingURL=xmtp-send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-send.d.ts","sourceRoot":"","sources":["../../src/tools/xmtp-send.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,wBAAsB,cAAc,CAClC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,EACpG,aAAa,EAAE,MAAM;;;;;;;;;;;;;;;;;;GA+DtB"}
@@ -0,0 +1,63 @@
1
+ // ============================================================
2
+ // Tool: xmtp_send — 发送 E2EE 消息到另一个 Agent
3
+ // ============================================================
4
+ export async function handleXmtpSend(bridges, registry, policyEngine, params, senderAgentId) {
5
+ // 找到发送者 bridge(使用第一个可用的 bridge)
6
+ const bridge = bridges.get(senderAgentId) ?? bridges.values().next().value;
7
+ if (!bridge) {
8
+ return { content: [{ type: "text", text: "No XMTP bridge available. Plugin not initialized." }], details: null };
9
+ }
10
+ // 当提供 conversationId 时,to 可省略(直接向已有会话发送)
11
+ if (!params.to && !params.conversationId) {
12
+ return { content: [{ type: "text", text: "Either 'to' or 'conversationId' must be provided." }], details: null };
13
+ }
14
+ // 解析目标地址(仅在提供 to 时需要)
15
+ let targetAddress;
16
+ if (params.to) {
17
+ if (params.to.startsWith("0x")) {
18
+ targetAddress = params.to;
19
+ }
20
+ else {
21
+ const addr = registry.getAddress(params.to);
22
+ if (!addr) {
23
+ return {
24
+ content: [{ type: "text", text: `Agent "${params.to}" not found. Use xmtp_agents to discover available agents.` }],
25
+ details: null,
26
+ };
27
+ }
28
+ targetAddress = addr;
29
+ }
30
+ if (targetAddress.toLowerCase() === bridge.address.toLowerCase()) {
31
+ return { content: [{ type: "text", text: "Cannot send message to yourself." }], details: null };
32
+ }
33
+ }
34
+ // Policy 检查
35
+ const toLabel = params.to ?? params.conversationId;
36
+ const convId = params.conversationId ?? `dm:${senderAgentId}:${params.to}`;
37
+ const check = policyEngine.checkOutgoing({ from: senderAgentId, to: toLabel, conversationId: convId });
38
+ if (!check.allowed) {
39
+ return { content: [{ type: "text", text: `Blocked: ${check.reason}` }], details: null };
40
+ }
41
+ try {
42
+ const result = await bridge.sendMessage(targetAddress ?? "", params.message, {
43
+ contentType: params.contentType,
44
+ conversationId: params.conversationId,
45
+ });
46
+ const recipientLabel = params.to ?? `conversation ${result.conversationId}`;
47
+ return {
48
+ content: [{ type: "text", text: `Message sent to ${recipientLabel}.` }],
49
+ details: {
50
+ status: "sent",
51
+ conversationId: result.conversationId,
52
+ messageId: result.messageId,
53
+ to: params.to,
54
+ toAddress: targetAddress,
55
+ },
56
+ };
57
+ }
58
+ catch (err) {
59
+ const msg = err instanceof Error ? err.message : String(err);
60
+ return { content: [{ type: "text", text: `Failed to send: ${msg}` }], details: null };
61
+ }
62
+ }
63
+ //# sourceMappingURL=xmtp-send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-send.js","sourceRoot":"","sources":["../../src/tools/xmtp-send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { XmtpWalletConfig, XmtpEnv } from "../types.js";
2
+ export declare class IdentityRegistry {
3
+ private env;
4
+ private agentToConfig;
5
+ private addressToAgent;
6
+ private storePath;
7
+ constructor(stateDir: string, env?: XmtpEnv);
8
+ /**
9
+ * 为 Agent 初始化 XMTP wallet。
10
+ * 如果已有配置则加载,否则生成新的 wallet。
11
+ */
12
+ initAgent(agentId: string, existingKey?: string): Promise<XmtpWalletConfig>;
13
+ /** 更新 inboxId */
14
+ updateInboxId(agentId: string, inboxId: string): Promise<void>;
15
+ getAddress(agentId: string): string | undefined;
16
+ getConfig(agentId: string): XmtpWalletConfig | undefined;
17
+ getAgentId(address: string): string | undefined;
18
+ resolveAgentId(address: string): Promise<string | null>;
19
+ listAgents(): Array<{
20
+ agentId: string;
21
+ address: string;
22
+ env: XmtpEnv;
23
+ }>;
24
+ has(agentId: string): boolean;
25
+ registerExternal(address: string, agentId: string): void;
26
+ private cacheMapping;
27
+ /** 从磁盘加载所有已有 identity */
28
+ private loadFromDisk;
29
+ }
30
+ //# sourceMappingURL=identity-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-registry.d.ts","sourceRoot":"","sources":["../../src/transport/identity-registry.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7D,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,GAAG;IANb,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,SAAS,CAAS;gBAGxB,QAAQ,EAAE,MAAM,EACR,GAAG,GAAE,OAAe;IAO9B;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwCjF,iBAAiB;IACX,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIxD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7D,UAAU,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IAQvE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIxD,OAAO,CAAC,YAAY;IAKpB,yBAAyB;IACzB,OAAO,CAAC,YAAY;CAgBrB"}
@@ -0,0 +1,117 @@
1
+ // ============================================================
2
+ // Module 3: Identity Registry
3
+ // agentId ↔ XMTP wallet address 双向映射,wallet key 生成/加载
4
+ // 使用文件系统持久化(stateDir)
5
+ // ============================================================
6
+ import { createUser } from "@xmtp/agent-sdk";
7
+ import { privateKeyToAccount } from "viem/accounts";
8
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ export class IdentityRegistry {
11
+ env;
12
+ agentToConfig = new Map();
13
+ addressToAgent = new Map();
14
+ storePath;
15
+ constructor(stateDir, env = "dev") {
16
+ this.env = env;
17
+ this.storePath = join(stateDir, "identities");
18
+ mkdirSync(this.storePath, { recursive: true });
19
+ this.loadFromDisk();
20
+ }
21
+ /**
22
+ * 为 Agent 初始化 XMTP wallet。
23
+ * 如果已有配置则加载,否则生成新的 wallet。
24
+ */
25
+ async initAgent(agentId, existingKey) {
26
+ const cached = this.agentToConfig.get(agentId);
27
+ if (cached)
28
+ return cached;
29
+ // 尝试从磁盘加载
30
+ const filePath = join(this.storePath, `${agentId}.json`);
31
+ if (existsSync(filePath)) {
32
+ const config = JSON.parse(readFileSync(filePath, "utf-8"));
33
+ this.cacheMapping(agentId, config);
34
+ return config;
35
+ }
36
+ // 生成新 wallet 或使用提供的 key
37
+ let privateKey;
38
+ let address;
39
+ if (existingKey) {
40
+ privateKey = existingKey;
41
+ const account = privateKeyToAccount(existingKey);
42
+ address = account.address;
43
+ }
44
+ else {
45
+ const user = createUser();
46
+ privateKey = user.key; // createUser() returns { key, account, wallet }
47
+ address = user.account.address;
48
+ }
49
+ const config = {
50
+ privateKey,
51
+ address,
52
+ xmtpInboxId: "",
53
+ env: this.env,
54
+ };
55
+ // 持久化到磁盘
56
+ writeFileSync(filePath, JSON.stringify(config, null, 2));
57
+ this.cacheMapping(agentId, config);
58
+ return config;
59
+ }
60
+ /** 更新 inboxId */
61
+ async updateInboxId(agentId, inboxId) {
62
+ const config = this.agentToConfig.get(agentId);
63
+ if (!config)
64
+ return;
65
+ config.xmtpInboxId = inboxId;
66
+ const filePath = join(this.storePath, `${agentId}.json`);
67
+ writeFileSync(filePath, JSON.stringify(config, null, 2));
68
+ }
69
+ getAddress(agentId) {
70
+ return this.agentToConfig.get(agentId)?.address;
71
+ }
72
+ getConfig(agentId) {
73
+ return this.agentToConfig.get(agentId);
74
+ }
75
+ getAgentId(address) {
76
+ return this.addressToAgent.get(address.toLowerCase());
77
+ }
78
+ async resolveAgentId(address) {
79
+ return this.addressToAgent.get(address.toLowerCase()) ?? null;
80
+ }
81
+ listAgents() {
82
+ return Array.from(this.agentToConfig.entries()).map(([id, config]) => ({
83
+ agentId: id,
84
+ address: config.address,
85
+ env: config.env,
86
+ }));
87
+ }
88
+ has(agentId) {
89
+ return this.agentToConfig.has(agentId);
90
+ }
91
+ registerExternal(address, agentId) {
92
+ this.addressToAgent.set(address.toLowerCase(), agentId);
93
+ }
94
+ cacheMapping(agentId, config) {
95
+ this.agentToConfig.set(agentId, config);
96
+ this.addressToAgent.set(config.address.toLowerCase(), agentId);
97
+ }
98
+ /** 从磁盘加载所有已有 identity */
99
+ loadFromDisk() {
100
+ if (!existsSync(this.storePath))
101
+ return;
102
+ const { readdirSync } = require("node:fs");
103
+ for (const file of readdirSync(this.storePath)) {
104
+ if (!file.endsWith(".json"))
105
+ continue;
106
+ const agentId = file.replace(".json", "");
107
+ try {
108
+ const config = JSON.parse(readFileSync(join(this.storePath, file), "utf-8"));
109
+ this.cacheMapping(agentId, config);
110
+ }
111
+ catch {
112
+ // skip corrupt files
113
+ }
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=identity-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-registry.js","sourceRoot":"","sources":["../../src/transport/identity-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { IdentityRegistry } from "./identity-registry.js";
2
+ import { PolicyEngine } from "../coordination/policy-engine.js";
3
+ import type { XmtpWalletConfig, InboxMessage, A2AInjectPayload, GroupInfo } from "../types.js";
4
+ export declare class XmtpBridge {
5
+ readonly agentId: string;
6
+ private walletConfig;
7
+ private policyEngine;
8
+ private registry;
9
+ private dbPath;
10
+ private agent;
11
+ private running;
12
+ private syncTimer;
13
+ /** 收件箱缓存 */
14
+ private inboxBuffer;
15
+ private readonly maxInboxBuffer;
16
+ /** 消息回调(由 plugin 入口设置,用于触发 subagent 处理) */
17
+ onMessage?: (agentId: string, payload: A2AInjectPayload) => void;
18
+ constructor(agentId: string, walletConfig: XmtpWalletConfig, policyEngine: PolicyEngine, registry: IdentityRegistry, dbPath: string);
19
+ start(): Promise<void>;
20
+ stop(): Promise<void>;
21
+ sendMessage(toAddress: string, content: string, opts?: {
22
+ contentType?: "text" | "markdown";
23
+ conversationId?: string;
24
+ }): Promise<{
25
+ conversationId: string;
26
+ messageId: string;
27
+ }>;
28
+ getInbox(opts?: {
29
+ limit?: number;
30
+ from?: string;
31
+ }): Promise<InboxMessage[]>;
32
+ /**
33
+ * 获取指定会话的最近消息(供 coordination 层查询)
34
+ */
35
+ getRecentMessages(conversationId: string, limit: number): InboxMessage[];
36
+ createGroup(memberAddresses: string[], name?: string): Promise<{
37
+ conversationId: string;
38
+ name: string;
39
+ }>;
40
+ listGroups(): Promise<GroupInfo[]>;
41
+ getGroupMembers(conversationId: string): Promise<string[]>;
42
+ addGroupMembers(conversationId: string, addresses: string[]): Promise<void>;
43
+ removeGroupMembers(conversationId: string, addresses: string[]): Promise<void>;
44
+ /**
45
+ * 检查群聊中在 afterTimestamp 之后是否有新消息(排除自身和指定 sender)
46
+ * 用于防止多 agent 同时回复同一条消息
47
+ */
48
+ hasNewGroupReplies(conversationId: string, afterTimestamp: string, excludeAddresses: string[]): Promise<boolean>;
49
+ canMessage(address: string): Promise<boolean>;
50
+ private handleIncoming;
51
+ get address(): string;
52
+ get isConnected(): boolean;
53
+ get env(): import("../types.js").XmtpEnv;
54
+ }
55
+ //# sourceMappingURL=xmtp-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmtp-bridge.d.ts","sourceRoot":"","sources":["../../src/transport/xmtp-bridge.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAkB,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM/G,qBAAa,UAAU;IAanB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAhBhB,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAA+C;IAEhE,YAAY;IACZ,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IAEtC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;gBAGtD,OAAO,EAAE,MAAM,EAChB,YAAY,EAAE,gBAAgB,EAC9B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM;IAGlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACpE,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBnD,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAYjF;;OAEG;IACH,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAMlE,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAUxG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBlC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ1D,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpF;;;OAGG;IACG,kBAAkB,CACtB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,OAAO,CAAC;IAmBb,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAQrC,cAAc;IA+D5B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,GAAG,kCAEN;CACF"}