agent-inbox 0.1.8 → 0.1.9

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 (70) hide show
  1. package/CLAUDE.md +44 -7
  2. package/README.md +67 -24
  3. package/dist/federation/connection-manager.d.ts +13 -2
  4. package/dist/federation/connection-manager.d.ts.map +1 -1
  5. package/dist/federation/connection-manager.js +109 -10
  6. package/dist/federation/connection-manager.js.map +1 -1
  7. package/dist/index.d.mts +2 -0
  8. package/dist/index.d.ts +25 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +58 -5
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +1 -0
  13. package/dist/index.mjs.map +1 -0
  14. package/dist/ipc/ipc-server.d.ts +2 -0
  15. package/dist/ipc/ipc-server.d.ts.map +1 -1
  16. package/dist/ipc/ipc-server.js +48 -0
  17. package/dist/ipc/ipc-server.js.map +1 -1
  18. package/dist/map/map-client.d.ts +100 -0
  19. package/dist/map/map-client.d.ts.map +1 -1
  20. package/dist/map/map-client.js +61 -0
  21. package/dist/map/map-client.js.map +1 -1
  22. package/dist/mcp/mcp-proxy.d.ts +28 -0
  23. package/dist/mcp/mcp-proxy.d.ts.map +1 -0
  24. package/dist/mcp/mcp-proxy.js +280 -0
  25. package/dist/mcp/mcp-proxy.js.map +1 -0
  26. package/dist/mesh/delivery-bridge.d.ts +47 -0
  27. package/dist/mesh/delivery-bridge.d.ts.map +1 -0
  28. package/dist/mesh/delivery-bridge.js +73 -0
  29. package/dist/mesh/delivery-bridge.js.map +1 -0
  30. package/dist/mesh/mesh-connector.d.ts +29 -0
  31. package/dist/mesh/mesh-connector.d.ts.map +1 -0
  32. package/dist/mesh/mesh-connector.js +36 -0
  33. package/dist/mesh/mesh-connector.js.map +1 -0
  34. package/dist/mesh/mesh-transport.d.ts +70 -0
  35. package/dist/mesh/mesh-transport.d.ts.map +1 -0
  36. package/dist/mesh/mesh-transport.js +92 -0
  37. package/dist/mesh/mesh-transport.js.map +1 -0
  38. package/dist/mesh/type-mapper.d.ts +67 -0
  39. package/dist/mesh/type-mapper.d.ts.map +1 -0
  40. package/dist/mesh/type-mapper.js +165 -0
  41. package/dist/mesh/type-mapper.js.map +1 -0
  42. package/dist/types.d.ts +29 -2
  43. package/dist/types.d.ts.map +1 -1
  44. package/docs/CLAUDE-CODE-SWARM-PROPOSAL.md +137 -0
  45. package/package.json +7 -2
  46. package/src/federation/connection-manager.ts +125 -10
  47. package/src/index.ts +96 -5
  48. package/src/ipc/ipc-server.ts +58 -0
  49. package/src/map/map-client.ts +152 -0
  50. package/src/mcp/mcp-proxy.ts +326 -0
  51. package/src/mesh/delivery-bridge.ts +110 -0
  52. package/src/mesh/mesh-connector.ts +41 -0
  53. package/src/mesh/mesh-transport.ts +157 -0
  54. package/src/mesh/type-mapper.ts +239 -0
  55. package/src/types.ts +33 -1
  56. package/test/federation/integration.test.ts +37 -3
  57. package/test/federation/sdk-integration.test.ts +4 -8
  58. package/test/ipc-new-commands.test.ts +200 -0
  59. package/test/mcp-proxy.test.ts +191 -0
  60. package/test/mesh/delivery-bridge.test.ts +178 -0
  61. package/test/mesh/e2e-mesh.test.ts +527 -0
  62. package/test/mesh/e2e-real-meshpeer.test.ts +629 -0
  63. package/test/mesh/federation-mesh.test.ts +269 -0
  64. package/test/mesh/mesh-connector.test.ts +66 -0
  65. package/test/mesh/mesh-transport.test.ts +191 -0
  66. package/test/mesh/meshpeer-integration.test.ts +442 -0
  67. package/test/mesh/mock-mesh.ts +125 -0
  68. package/test/mesh/mock-meshpeer.ts +266 -0
  69. package/test/mesh/type-mapper.test.ts +226 -0
  70. package/docs/PLAN.md +0 -545
@@ -0,0 +1,280 @@
1
+ /**
2
+ * mcp-proxy.ts — MCP server that proxies all tools to an existing inbox IPC socket.
3
+ *
4
+ * Instead of creating its own storage/router, this connects to a running
5
+ * agent-inbox IPC server (e.g., the sidecar's inbox instance) and translates
6
+ * MCP tool calls into IPC commands.
7
+ *
8
+ * This ensures a single source of truth for messages, agents, and routing.
9
+ */
10
+ import * as net from "node:net";
11
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { z } from "zod";
14
+ const IPC_TIMEOUT_MS = 5000;
15
+ const CONNECT_RETRY_MS = 500;
16
+ const CONNECT_MAX_RETRIES = 10;
17
+ export class InboxMcpProxy {
18
+ socketPath;
19
+ defaultAgentId;
20
+ defaultScope;
21
+ mcp;
22
+ constructor(socketPath, defaultAgentId = "anonymous", defaultScope = "default") {
23
+ this.socketPath = socketPath;
24
+ this.defaultAgentId = defaultAgentId;
25
+ this.defaultScope = defaultScope;
26
+ this.mcp = new McpServer({
27
+ name: "agent-inbox",
28
+ version: "0.1.0",
29
+ });
30
+ this.registerTools();
31
+ }
32
+ /**
33
+ * Send an IPC command to the inbox socket and return the response.
34
+ * Retries connection if socket is not yet available.
35
+ */
36
+ async sendIpc(command) {
37
+ let lastError = null;
38
+ for (let attempt = 0; attempt < CONNECT_MAX_RETRIES; attempt++) {
39
+ try {
40
+ return await this.sendIpcOnce(command);
41
+ }
42
+ catch (err) {
43
+ lastError = err instanceof Error ? err : new Error(String(err));
44
+ // Only retry on connection errors (socket not ready yet)
45
+ if (lastError.message.includes("ENOENT") || lastError.message.includes("ECONNREFUSED")) {
46
+ if (attempt < CONNECT_MAX_RETRIES - 1) {
47
+ await new Promise((r) => setTimeout(r, CONNECT_RETRY_MS));
48
+ continue;
49
+ }
50
+ }
51
+ break;
52
+ }
53
+ }
54
+ return { ok: false, error: `Inbox unavailable: ${lastError?.message ?? "unknown error"}` };
55
+ }
56
+ sendIpcOnce(command) {
57
+ return new Promise((resolve, reject) => {
58
+ const client = net.createConnection(this.socketPath);
59
+ let buffer = "";
60
+ let settled = false;
61
+ const timer = setTimeout(() => {
62
+ if (!settled) {
63
+ settled = true;
64
+ client.destroy();
65
+ reject(new Error("IPC timeout"));
66
+ }
67
+ }, IPC_TIMEOUT_MS);
68
+ client.on("connect", () => {
69
+ client.write(JSON.stringify(command) + "\n");
70
+ });
71
+ client.on("data", (data) => {
72
+ buffer += data.toString();
73
+ const newlineIdx = buffer.indexOf("\n");
74
+ if (newlineIdx !== -1) {
75
+ clearTimeout(timer);
76
+ settled = true;
77
+ const line = buffer.slice(0, newlineIdx).trim();
78
+ client.destroy();
79
+ try {
80
+ resolve(JSON.parse(line));
81
+ }
82
+ catch {
83
+ reject(new Error("Invalid IPC response"));
84
+ }
85
+ }
86
+ });
87
+ client.on("error", (err) => {
88
+ if (!settled) {
89
+ clearTimeout(timer);
90
+ settled = true;
91
+ reject(err);
92
+ }
93
+ });
94
+ });
95
+ }
96
+ registerTools() {
97
+ this.mcp.tool("send_message", "Send a message to one or more agents. Supports replies (inReplyTo), threading (threadTag), and federated addressing (agent@system).", {
98
+ to: z
99
+ .union([z.string(), z.array(z.string())])
100
+ .describe("Recipient agent ID(s). Use 'agent@system' for federated addressing."),
101
+ body: z
102
+ .string()
103
+ .optional()
104
+ .describe("Plain text message body (shorthand for content)"),
105
+ content: z
106
+ .object({ type: z.string() })
107
+ .passthrough()
108
+ .optional()
109
+ .describe("Structured message content"),
110
+ from: z
111
+ .string()
112
+ .optional()
113
+ .describe("Sender agent ID (defaults to caller)"),
114
+ threadTag: z
115
+ .string()
116
+ .optional()
117
+ .describe("Thread tag for grouping related messages"),
118
+ inReplyTo: z
119
+ .string()
120
+ .optional()
121
+ .describe("Message ID this is a reply to"),
122
+ importance: z
123
+ .enum(["low", "normal", "high", "urgent"])
124
+ .optional()
125
+ .describe("Message importance level"),
126
+ subject: z.string().optional().describe("Message subject"),
127
+ }, async ({ to, body, content, from, threadTag, inReplyTo, importance, subject }) => {
128
+ const payload = content ?? body ?? "";
129
+ const senderId = from ?? this.defaultAgentId;
130
+ const resp = await this.sendIpc({
131
+ action: "send",
132
+ from: senderId,
133
+ to,
134
+ payload,
135
+ threadTag,
136
+ inReplyTo,
137
+ importance,
138
+ subject,
139
+ });
140
+ return {
141
+ content: [
142
+ {
143
+ type: "text",
144
+ text: JSON.stringify(resp.ok
145
+ ? { ok: true, messageId: resp.messageId }
146
+ : { ok: false, error: resp.error }),
147
+ },
148
+ ],
149
+ };
150
+ });
151
+ this.mcp.tool("check_inbox", "Check inbox for messages addressed to an agent. Auto-registers the agent if not already registered.", {
152
+ agentId: z.string().describe("Agent ID to check inbox for"),
153
+ unreadOnly: z
154
+ .boolean()
155
+ .optional()
156
+ .describe("Only return unread messages (default true)"),
157
+ limit: z
158
+ .number()
159
+ .optional()
160
+ .describe("Max messages to return"),
161
+ }, async ({ agentId, unreadOnly, limit }) => {
162
+ const resp = await this.sendIpc({
163
+ action: "check_inbox",
164
+ agentId,
165
+ unreadOnly: unreadOnly ?? true,
166
+ clear: true, // Mark as read after retrieval
167
+ });
168
+ if (!resp.ok) {
169
+ return {
170
+ content: [
171
+ { type: "text", text: JSON.stringify({ ok: false, error: resp.error }) },
172
+ ],
173
+ };
174
+ }
175
+ let messages = resp.messages ?? [];
176
+ if (limit && messages.length > limit) {
177
+ messages = messages.slice(0, limit);
178
+ }
179
+ return {
180
+ content: [
181
+ {
182
+ type: "text",
183
+ text: JSON.stringify({
184
+ count: messages.length,
185
+ messages: messages.map((m) => ({
186
+ id: m.id,
187
+ from: m.sender_id,
188
+ subject: m.subject,
189
+ content: m.content,
190
+ threadTag: m.thread_tag,
191
+ importance: m.importance,
192
+ createdAt: m.created_at,
193
+ inReplyTo: m.in_reply_to,
194
+ })),
195
+ }),
196
+ },
197
+ ],
198
+ };
199
+ });
200
+ this.mcp.tool("read_thread", "Read all messages in a thread (by thread_tag)", {
201
+ threadTag: z.string().describe("Thread tag to read"),
202
+ scope: z
203
+ .string()
204
+ .optional()
205
+ .describe("Scope (defaults to 'default')"),
206
+ }, async ({ threadTag, scope }) => {
207
+ const resp = await this.sendIpc({
208
+ action: "read_thread",
209
+ threadTag,
210
+ scope: scope ?? this.defaultScope,
211
+ });
212
+ if (!resp.ok) {
213
+ return {
214
+ content: [
215
+ { type: "text", text: JSON.stringify({ ok: false, error: resp.error }) },
216
+ ],
217
+ };
218
+ }
219
+ const messages = resp.messages ?? [];
220
+ return {
221
+ content: [
222
+ {
223
+ type: "text",
224
+ text: JSON.stringify({
225
+ threadTag,
226
+ count: messages.length,
227
+ messages: messages.map((m) => ({
228
+ id: m.id,
229
+ from: m.sender_id,
230
+ content: m.content,
231
+ createdAt: m.created_at,
232
+ inReplyTo: m.in_reply_to,
233
+ })),
234
+ }),
235
+ },
236
+ ],
237
+ };
238
+ });
239
+ this.mcp.tool("list_agents", "List agents registered in the inbox (local and optionally federated)", {
240
+ scope: z.string().optional().describe("Filter by scope"),
241
+ includeFederated: z
242
+ .boolean()
243
+ .optional()
244
+ .describe("Include agents known from federation routing table"),
245
+ }, async ({ scope, includeFederated }) => {
246
+ const resp = await this.sendIpc({
247
+ action: "list_agents",
248
+ scope,
249
+ includeFederated,
250
+ });
251
+ if (!resp.ok) {
252
+ return {
253
+ content: [
254
+ { type: "text", text: JSON.stringify({ ok: false, error: resp.error }) },
255
+ ],
256
+ };
257
+ }
258
+ return {
259
+ content: [
260
+ {
261
+ type: "text",
262
+ text: JSON.stringify({
263
+ count: resp.count ?? resp.agents?.length ?? 0,
264
+ agents: resp.agents ?? [],
265
+ }),
266
+ },
267
+ ],
268
+ };
269
+ });
270
+ }
271
+ async start() {
272
+ const transport = new StdioServerTransport();
273
+ await this.mcp.connect(transport);
274
+ }
275
+ /** Expose for testing */
276
+ get server() {
277
+ return this.mcp;
278
+ }
279
+ }
280
+ //# sourceMappingURL=mcp-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-proxy.js","sourceRoot":"","sources":["../../src/mcp/mcp-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * DeliveryHandler bridge: connects agentic-mesh's MapServer message routing
3
+ * to agent-inbox's storage layer.
4
+ *
5
+ * When MapServer's MessageRouter resolves a message to a local agent,
6
+ * it calls `deliverToAgent()`. This bridge translates the MAP Message
7
+ * into an agent-inbox Message and stores it, triggering the full inbox
8
+ * pipeline (traceability, push notifications, etc.).
9
+ *
10
+ * For `forwardToPeer()` and `routeToFederation()`, we delegate back to
11
+ * the previous (default) handler so MeshPeer's own transport handles it.
12
+ */
13
+ import { EventEmitter } from "node:events";
14
+ import type { Storage } from "../storage/interface.js";
15
+ import type { MapMessage } from "./type-mapper.js";
16
+ /**
17
+ * Subset of agentic-mesh's DeliveryHandler interface.
18
+ * We define it here to avoid importing the full package at compile time.
19
+ */
20
+ export interface MeshDeliveryHandler {
21
+ deliverToAgent(agentId: string, message: MapMessage): Promise<boolean>;
22
+ forwardToPeer(peerId: string, agentIds: string[], message: MapMessage): Promise<boolean>;
23
+ routeToFederation?(systemId: string, agentIds: string[], message: MapMessage): Promise<boolean>;
24
+ }
25
+ export declare class DeliveryBridge implements MeshDeliveryHandler {
26
+ private storage;
27
+ private events;
28
+ private scope;
29
+ private previousHandler?;
30
+ constructor(storage: Storage, events: EventEmitter, scope?: string, previousHandler?: MeshDeliveryHandler | undefined);
31
+ /**
32
+ * Called by MapServer's MessageRouter when a message is resolved
33
+ * to a local agent. Translates and stores in agent-inbox.
34
+ */
35
+ deliverToAgent(agentId: string, message: MapMessage): Promise<boolean>;
36
+ /**
37
+ * Forward to a connected peer. Delegates to the previous handler
38
+ * (MeshPeer's default transport handles actual peer forwarding).
39
+ */
40
+ forwardToPeer(peerId: string, agentIds: string[], message: MapMessage): Promise<boolean>;
41
+ /**
42
+ * Route to a federated system. Delegates to the previous handler
43
+ * (FederationGateway handles cross-mesh routing).
44
+ */
45
+ routeToFederation(systemId: string, agentIds: string[], message: MapMessage): Promise<boolean>;
46
+ }
47
+ //# sourceMappingURL=delivery-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-bridge.d.ts","sourceRoot":"","sources":["../../src/mesh/delivery-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,aAAa,CACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,iBAAiB,CAAC,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAMD,qBAAa,cAAe,YAAW,mBAAmB;IAEtD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,eAAe,CAAC;gBAHhB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,KAAK,GAAE,MAAkB,EACzB,eAAe,CAAC,EAAE,mBAAmB,YAAA;IAG/C;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB5E;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC;IAOnB;;;OAGG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC;CAMpB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * DeliveryHandler bridge: connects agentic-mesh's MapServer message routing
3
+ * to agent-inbox's storage layer.
4
+ *
5
+ * When MapServer's MessageRouter resolves a message to a local agent,
6
+ * it calls `deliverToAgent()`. This bridge translates the MAP Message
7
+ * into an agent-inbox Message and stores it, triggering the full inbox
8
+ * pipeline (traceability, push notifications, etc.).
9
+ *
10
+ * For `forwardToPeer()` and `routeToFederation()`, we delegate back to
11
+ * the previous (default) handler so MeshPeer's own transport handles it.
12
+ */
13
+ import { mapMessageToInbox } from "./type-mapper.js";
14
+ // ---------------------------------------------------------------------------
15
+ // DeliveryBridge
16
+ // ---------------------------------------------------------------------------
17
+ export class DeliveryBridge {
18
+ storage;
19
+ events;
20
+ scope;
21
+ previousHandler;
22
+ constructor(storage, events, scope = "default", previousHandler) {
23
+ this.storage = storage;
24
+ this.events = events;
25
+ this.scope = scope;
26
+ this.previousHandler = previousHandler;
27
+ }
28
+ /**
29
+ * Called by MapServer's MessageRouter when a message is resolved
30
+ * to a local agent. Translates and stores in agent-inbox.
31
+ */
32
+ async deliverToAgent(agentId, message) {
33
+ try {
34
+ const inboxMsg = mapMessageToInbox(message, this.scope);
35
+ // Ensure the target agent is in the recipients list
36
+ const hasAgent = inboxMsg.recipients.some((r) => r.agent_id === agentId);
37
+ if (!hasAgent) {
38
+ inboxMsg.recipients.push({
39
+ agent_id: agentId,
40
+ kind: "to",
41
+ delivered_at: new Date().toISOString(),
42
+ });
43
+ }
44
+ this.storage.putMessage(inboxMsg);
45
+ this.events.emit("message.created", inboxMsg);
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Forward to a connected peer. Delegates to the previous handler
54
+ * (MeshPeer's default transport handles actual peer forwarding).
55
+ */
56
+ async forwardToPeer(peerId, agentIds, message) {
57
+ if (this.previousHandler) {
58
+ return this.previousHandler.forwardToPeer(peerId, agentIds, message);
59
+ }
60
+ return false;
61
+ }
62
+ /**
63
+ * Route to a federated system. Delegates to the previous handler
64
+ * (FederationGateway handles cross-mesh routing).
65
+ */
66
+ async routeToFederation(systemId, agentIds, message) {
67
+ if (this.previousHandler?.routeToFederation) {
68
+ return this.previousHandler.routeToFederation(systemId, agentIds, message);
69
+ }
70
+ return false;
71
+ }
72
+ }
73
+ //# sourceMappingURL=delivery-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-bridge.js","sourceRoot":"","sources":["../../src/mesh/delivery-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAyBrD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,OAAO,cAAc;IAEf;IACA;IACA;IACA;IAJV,YACU,OAAgB,EAChB,MAAoB,EACpB,QAAgB,SAAS,EACzB,eAAqC;QAHrC,YAAO,GAAP,OAAO,CAAS;QAChB,WAAM,GAAN,MAAM,CAAc;QACpB,UAAK,GAAL,KAAK,CAAoB;QACzB,oBAAe,GAAf,eAAe,CAAsB;IAC5C,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,OAAmB;QACvD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAExD,oDAAoD;YACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAC9B,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;oBACvB,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,IAAI;oBACV,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACvC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,MAAc,EACd,QAAkB,EAClB,OAAmB;QAEnB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,QAAkB,EAClB,OAAmB;QAEnB,IAAI,IAAI,CAAC,eAAe,EAAE,iBAAiB,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import type { MapAgentConnectionClass, MapConnection } from "../map/map-client.js";
2
+ import type { MeshContextLike } from "./mesh-transport.js";
3
+ /**
4
+ * Factory for creating MeshTransport connections to remote peers.
5
+ *
6
+ * Implements MapAgentConnectionClass so it can be injected into
7
+ * ConnectionManager alongside (or instead of) the MAP SDK class.
8
+ *
9
+ * Usage:
10
+ * ```ts
11
+ * const connector = new MeshConnector(mesh, "my-peer-id");
12
+ * const conn = await connector.connect("remote-peer-id");
13
+ * ```
14
+ */
15
+ export declare class MeshConnector implements MapAgentConnectionClass {
16
+ private mesh;
17
+ private localPeerId;
18
+ private channelName;
19
+ constructor(mesh: MeshContextLike, localPeerId: string, channelName?: string);
20
+ /**
21
+ * Create a MeshTransport connection to a remote peer.
22
+ *
23
+ * The `server` parameter is the remote peer ID (not a URL).
24
+ * The `opts` parameter is ignored — mesh peers don't need
25
+ * MAP handshake parameters.
26
+ */
27
+ connect(server: string, _opts?: unknown): Promise<MapConnection>;
28
+ }
29
+ //# sourceMappingURL=mesh-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-connector.d.ts","sourceRoot":"","sources":["../../src/mesh/mesh-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,uBAAuB;IAEzD,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW;gBAFX,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAA6B;IAGpD;;;;;;OAMG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;CAUvE"}
@@ -0,0 +1,36 @@
1
+ import { MeshTransport, DEFAULT_CHANNEL_NAME } from "./mesh-transport.js";
2
+ /**
3
+ * Factory for creating MeshTransport connections to remote peers.
4
+ *
5
+ * Implements MapAgentConnectionClass so it can be injected into
6
+ * ConnectionManager alongside (or instead of) the MAP SDK class.
7
+ *
8
+ * Usage:
9
+ * ```ts
10
+ * const connector = new MeshConnector(mesh, "my-peer-id");
11
+ * const conn = await connector.connect("remote-peer-id");
12
+ * ```
13
+ */
14
+ export class MeshConnector {
15
+ mesh;
16
+ localPeerId;
17
+ channelName;
18
+ constructor(mesh, localPeerId, channelName = DEFAULT_CHANNEL_NAME) {
19
+ this.mesh = mesh;
20
+ this.localPeerId = localPeerId;
21
+ this.channelName = channelName;
22
+ }
23
+ /**
24
+ * Create a MeshTransport connection to a remote peer.
25
+ *
26
+ * The `server` parameter is the remote peer ID (not a URL).
27
+ * The `opts` parameter is ignored — mesh peers don't need
28
+ * MAP handshake parameters.
29
+ */
30
+ async connect(server, _opts) {
31
+ const transport = new MeshTransport(this.mesh, this.localPeerId, server, this.channelName);
32
+ await transport.open();
33
+ return transport;
34
+ }
35
+ }
36
+ //# sourceMappingURL=mesh-connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-connector.js","sourceRoot":"","sources":["../../src/mesh/mesh-connector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,aAAa;IAEd;IACA;IACA;IAHV,YACU,IAAqB,EACrB,WAAmB,EACnB,cAAsB,oBAAoB;QAF1C,SAAI,GAAJ,IAAI,CAAiB;QACrB,gBAAW,GAAX,WAAW,CAAQ;QACnB,gBAAW,GAAX,WAAW,CAA+B;IACjD,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,KAAe;QAC3C,MAAM,SAAS,GAAG,IAAI,aAAa,CACjC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,MAAM,EACN,IAAI,CAAC,WAAW,CACjB,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,70 @@
1
+ import type { MapConnection, IncomingMapMessage } from "../map/map-client.js";
2
+ /** Subset of agentic-mesh PeerInfo used by MeshTransport. */
3
+ export interface MeshPeerInfo {
4
+ id: string;
5
+ name?: string;
6
+ groups: string[];
7
+ }
8
+ /** Subset of agentic-mesh IMessageChannel<T>. */
9
+ export interface MeshChannel<T> {
10
+ readonly name: string;
11
+ readonly isOpen: boolean;
12
+ open(): Promise<void>;
13
+ close(): Promise<void>;
14
+ send(peerId: string, message: T): boolean;
15
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
16
+ off(event: string | symbol, listener: (...args: any[]) => void): this;
17
+ }
18
+ /** Subset of agentic-mesh MeshContext used by MeshTransport. */
19
+ export interface MeshContextLike {
20
+ createChannel<T>(name: string): MeshChannel<T>;
21
+ _getPeerId(): string;
22
+ }
23
+ /**
24
+ * Payload exchanged over the mesh channel between agent-inbox instances.
25
+ * Flat structure that maps 1-to-1 with IncomingMapMessage.
26
+ */
27
+ export interface InboxWireMessage {
28
+ to?: {
29
+ agentId?: string;
30
+ scope?: string;
31
+ };
32
+ payload: unknown;
33
+ from: string;
34
+ timestamp?: string;
35
+ meta?: Record<string, unknown>;
36
+ }
37
+ /** Default channel name used for agent-inbox federation traffic.
38
+ * Uses the "proto:" prefix to distinguish protocol channels from
39
+ * application channels on the same mesh. */
40
+ export declare const DEFAULT_CHANNEL_NAME = "proto:agent-inbox";
41
+ /**
42
+ * Implements the MapConnection interface over an agentic-mesh MessageChannel.
43
+ *
44
+ * Each instance represents a connection to a single remote peer. Multiple
45
+ * MeshTransport instances share the same underlying channel (one channel
46
+ * per mesh, not per peer) and filter incoming messages by remotePeerId.
47
+ */
48
+ export declare class MeshTransport implements MapConnection {
49
+ private mesh;
50
+ private localPeerId;
51
+ private remotePeerId;
52
+ private channel;
53
+ private handlers;
54
+ private messageListener;
55
+ private closed;
56
+ readonly systemName: string;
57
+ constructor(mesh: MeshContextLike, localPeerId: string, remotePeerId: string, channelName?: string);
58
+ /**
59
+ * Open the underlying channel and start listening for messages.
60
+ * Must be called before send() or onMessage().
61
+ */
62
+ open(): Promise<void>;
63
+ send(to: {
64
+ agentId?: string;
65
+ scope?: string;
66
+ }, payload: unknown, meta?: Record<string, unknown>): Promise<void>;
67
+ onMessage(handler: (msg: IncomingMapMessage) => void): void;
68
+ disconnect(): Promise<void>;
69
+ }
70
+ //# sourceMappingURL=mesh-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-transport.d.ts","sourceRoot":"","sources":["../../src/mesh/mesh-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAS9B,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAE1C,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAErE,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CACvE;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/C,UAAU,IAAI,MAAM,CAAC;CACtB;AAMD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAMD;;6CAE6C;AAC7C,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,aAAa;IAQ/C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,YAAY;IATtB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,eAAe,CAA0E;IACjG,OAAO,CAAC,MAAM,CAAS;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAGlB,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAC5B,WAAW,GAAE,MAA6B;IAM5C;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI,CACR,EAAE,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EACxC,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAmBhB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAIrD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAQlC"}
@@ -0,0 +1,92 @@
1
+ // ---------------------------------------------------------------------------
2
+ // MeshTransport
3
+ // ---------------------------------------------------------------------------
4
+ /** Default channel name used for agent-inbox federation traffic.
5
+ * Uses the "proto:" prefix to distinguish protocol channels from
6
+ * application channels on the same mesh. */
7
+ export const DEFAULT_CHANNEL_NAME = "proto:agent-inbox";
8
+ /**
9
+ * Implements the MapConnection interface over an agentic-mesh MessageChannel.
10
+ *
11
+ * Each instance represents a connection to a single remote peer. Multiple
12
+ * MeshTransport instances share the same underlying channel (one channel
13
+ * per mesh, not per peer) and filter incoming messages by remotePeerId.
14
+ */
15
+ export class MeshTransport {
16
+ mesh;
17
+ localPeerId;
18
+ remotePeerId;
19
+ channel;
20
+ handlers = [];
21
+ messageListener = null;
22
+ closed = false;
23
+ systemName;
24
+ constructor(mesh, localPeerId, remotePeerId, channelName = DEFAULT_CHANNEL_NAME) {
25
+ this.mesh = mesh;
26
+ this.localPeerId = localPeerId;
27
+ this.remotePeerId = remotePeerId;
28
+ this.systemName = remotePeerId;
29
+ this.channel = mesh.createChannel(channelName);
30
+ }
31
+ /**
32
+ * Open the underlying channel and start listening for messages.
33
+ * Must be called before send() or onMessage().
34
+ */
35
+ async open() {
36
+ if (!this.channel.isOpen) {
37
+ await this.channel.open();
38
+ }
39
+ this.messageListener = (message, from) => {
40
+ if (this.closed)
41
+ return;
42
+ // Only process messages from our remote peer
43
+ if (from.id !== this.remotePeerId)
44
+ return;
45
+ const incoming = wireToIncoming(message);
46
+ for (const handler of this.handlers) {
47
+ handler(incoming);
48
+ }
49
+ };
50
+ this.channel.on("message", this.messageListener);
51
+ }
52
+ async send(to, payload, meta) {
53
+ if (this.closed) {
54
+ throw new Error("MeshTransport is closed");
55
+ }
56
+ const wire = {
57
+ to,
58
+ payload,
59
+ from: this.localPeerId,
60
+ timestamp: new Date().toISOString(),
61
+ meta,
62
+ };
63
+ const sent = this.channel.send(this.remotePeerId, wire);
64
+ if (!sent) {
65
+ throw new Error(`Failed to send to peer "${this.remotePeerId}" — peer may be offline`);
66
+ }
67
+ }
68
+ onMessage(handler) {
69
+ this.handlers.push(handler);
70
+ }
71
+ async disconnect() {
72
+ this.closed = true;
73
+ if (this.messageListener) {
74
+ this.channel.off("message", this.messageListener);
75
+ this.messageListener = null;
76
+ }
77
+ this.handlers = [];
78
+ }
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Helpers
82
+ // ---------------------------------------------------------------------------
83
+ function wireToIncoming(wire) {
84
+ return {
85
+ from: wire.from,
86
+ to: wire.to,
87
+ payload: wire.payload,
88
+ timestamp: wire.timestamp,
89
+ meta: wire.meta,
90
+ };
91
+ }
92
+ //# sourceMappingURL=mesh-transport.js.map