agent-inbox 0.0.1 → 0.1.2

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 (126) hide show
  1. package/CLAUDE.md +113 -0
  2. package/README.md +195 -1
  3. package/dist/federation/address.d.ts +24 -0
  4. package/dist/federation/address.d.ts.map +1 -0
  5. package/dist/federation/address.js +54 -0
  6. package/dist/federation/address.js.map +1 -0
  7. package/dist/federation/connection-manager.d.ts +118 -0
  8. package/dist/federation/connection-manager.d.ts.map +1 -0
  9. package/dist/federation/connection-manager.js +369 -0
  10. package/dist/federation/connection-manager.js.map +1 -0
  11. package/dist/federation/delivery-queue.d.ts +66 -0
  12. package/dist/federation/delivery-queue.d.ts.map +1 -0
  13. package/dist/federation/delivery-queue.js +199 -0
  14. package/dist/federation/delivery-queue.js.map +1 -0
  15. package/dist/federation/index.d.ts +7 -0
  16. package/dist/federation/index.d.ts.map +1 -0
  17. package/dist/federation/index.js +6 -0
  18. package/dist/federation/index.js.map +1 -0
  19. package/dist/federation/routing-engine.d.ts +74 -0
  20. package/dist/federation/routing-engine.d.ts.map +1 -0
  21. package/dist/federation/routing-engine.js +158 -0
  22. package/dist/federation/routing-engine.js.map +1 -0
  23. package/dist/federation/trust.d.ts +39 -0
  24. package/dist/federation/trust.d.ts.map +1 -0
  25. package/dist/federation/trust.js +64 -0
  26. package/dist/federation/trust.js.map +1 -0
  27. package/dist/index.d.ts +60 -2
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +217 -18
  30. package/dist/index.js.map +1 -1
  31. package/dist/ipc/ipc-server.d.ts +21 -0
  32. package/dist/ipc/ipc-server.d.ts.map +1 -0
  33. package/dist/ipc/ipc-server.js +173 -0
  34. package/dist/ipc/ipc-server.js.map +1 -0
  35. package/dist/jsonrpc/mail-server.d.ts +45 -0
  36. package/dist/jsonrpc/mail-server.d.ts.map +1 -0
  37. package/dist/jsonrpc/mail-server.js +284 -0
  38. package/dist/jsonrpc/mail-server.js.map +1 -0
  39. package/dist/map/map-client.d.ts +91 -0
  40. package/dist/map/map-client.d.ts.map +1 -0
  41. package/dist/map/map-client.js +202 -0
  42. package/dist/map/map-client.js.map +1 -0
  43. package/dist/mcp/mcp-server.d.ts +23 -0
  44. package/dist/mcp/mcp-server.d.ts.map +1 -0
  45. package/dist/mcp/mcp-server.js +226 -0
  46. package/dist/mcp/mcp-server.js.map +1 -0
  47. package/dist/push/notifier.d.ts +49 -0
  48. package/dist/push/notifier.d.ts.map +1 -0
  49. package/dist/push/notifier.js +150 -0
  50. package/dist/push/notifier.js.map +1 -0
  51. package/dist/registry/warm-registry.d.ts +63 -0
  52. package/dist/registry/warm-registry.d.ts.map +1 -0
  53. package/dist/registry/warm-registry.js +173 -0
  54. package/dist/registry/warm-registry.js.map +1 -0
  55. package/dist/router/message-router.d.ts +44 -0
  56. package/dist/router/message-router.d.ts.map +1 -0
  57. package/dist/router/message-router.js +137 -0
  58. package/dist/router/message-router.js.map +1 -0
  59. package/dist/storage/interface.d.ts +31 -0
  60. package/dist/storage/interface.d.ts.map +1 -0
  61. package/dist/storage/interface.js +2 -0
  62. package/dist/storage/interface.js.map +1 -0
  63. package/dist/storage/memory.d.ts +28 -0
  64. package/dist/storage/memory.d.ts.map +1 -0
  65. package/dist/storage/memory.js +118 -0
  66. package/dist/storage/memory.js.map +1 -0
  67. package/dist/storage/sqlite.d.ts +35 -0
  68. package/dist/storage/sqlite.d.ts.map +1 -0
  69. package/dist/storage/sqlite.js +445 -0
  70. package/dist/storage/sqlite.js.map +1 -0
  71. package/dist/traceability/traceability.d.ts +29 -0
  72. package/dist/traceability/traceability.d.ts.map +1 -0
  73. package/dist/traceability/traceability.js +150 -0
  74. package/dist/traceability/traceability.js.map +1 -0
  75. package/dist/types.d.ts +261 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +3 -0
  78. package/dist/types.js.map +1 -0
  79. package/docs/DESIGN.md +1156 -0
  80. package/docs/PLAN.md +545 -0
  81. package/hooks/inbox-hook.mjs +119 -0
  82. package/hooks/register-hook.mjs +69 -0
  83. package/package.json +33 -25
  84. package/rules/agent-inbox.md +78 -0
  85. package/src/federation/address.ts +61 -0
  86. package/src/federation/connection-manager.ts +458 -0
  87. package/src/federation/delivery-queue.ts +222 -0
  88. package/src/federation/index.ts +6 -0
  89. package/src/federation/routing-engine.ts +188 -0
  90. package/src/federation/trust.ts +71 -0
  91. package/src/index.ts +299 -0
  92. package/src/ipc/ipc-server.ts +207 -0
  93. package/src/jsonrpc/mail-server.ts +356 -0
  94. package/src/map/map-client.ts +260 -0
  95. package/src/mcp/mcp-server.ts +272 -0
  96. package/src/push/notifier.ts +192 -0
  97. package/src/registry/warm-registry.ts +210 -0
  98. package/src/router/message-router.ts +175 -0
  99. package/src/storage/interface.ts +48 -0
  100. package/src/storage/memory.ts +145 -0
  101. package/src/storage/sqlite.ts +645 -0
  102. package/src/traceability/traceability.ts +183 -0
  103. package/src/types.ts +297 -0
  104. package/test/federation/address.test.ts +101 -0
  105. package/test/federation/connection-manager.test.ts +546 -0
  106. package/test/federation/delivery-queue.test.ts +159 -0
  107. package/test/federation/integration.test.ts +823 -0
  108. package/test/federation/routing-engine.test.ts +117 -0
  109. package/test/federation/sdk-integration.test.ts +748 -0
  110. package/test/federation/trust.test.ts +89 -0
  111. package/test/ipc-jsonrpc.test.ts +113 -0
  112. package/test/ipc-server.test.ts +197 -0
  113. package/test/mail-server.test.ts +208 -0
  114. package/test/map-client.test.ts +408 -0
  115. package/test/message-router.test.ts +184 -0
  116. package/test/push-notifier.test.ts +139 -0
  117. package/test/registry/warm-registry.test.ts +171 -0
  118. package/test/sqlite-storage.test.ts +243 -0
  119. package/test/storage.test.ts +196 -0
  120. package/test/traceability.test.ts +123 -0
  121. package/tsconfig.json +20 -0
  122. package/tsup.config.ts +10 -0
  123. package/vitest.config.ts +8 -0
  124. package/dist/index.d.mts +0 -2
  125. package/dist/index.mjs +0 -1
  126. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,284 @@
1
+ import * as http from "node:http";
2
+ import { ulid } from "ulid";
3
+ export class MailJsonRpcServer {
4
+ storage;
5
+ router;
6
+ events;
7
+ methods = new Map();
8
+ httpServer = null;
9
+ subscribers = new Set();
10
+ constructor(storage, router, events) {
11
+ this.storage = storage;
12
+ this.router = router;
13
+ this.events = events;
14
+ this.registerMethods();
15
+ this.setupEventForwarding();
16
+ }
17
+ registerMethods() {
18
+ // mail/create — create a conversation
19
+ this.methods.set("mail/create", (params) => {
20
+ const now = new Date().toISOString();
21
+ const conv = {
22
+ id: params.id ?? `conv-${ulid()}`,
23
+ scope: params.scope ?? "default",
24
+ subject: params.subject,
25
+ status: "active",
26
+ participants: [],
27
+ metadata: params.metadata ?? {},
28
+ created_at: now,
29
+ updated_at: now,
30
+ };
31
+ this.storage.putConversation(conv);
32
+ return conv;
33
+ });
34
+ // mail/get — get conversation details
35
+ this.methods.set("mail/get", (params) => {
36
+ const conv = this.storage.getConversation(params.id);
37
+ if (!conv)
38
+ throw rpcError(-32001, "Conversation not found");
39
+ const turns = this.storage.getTurns(conv.id);
40
+ const threads = this.storage.getThreadsByConversation(conv.id);
41
+ return { conversation: conv, turns, threads };
42
+ });
43
+ // mail/list — list conversations
44
+ this.methods.set("mail/list", (params) => {
45
+ const conversations = this.storage.listConversations(params.scope);
46
+ return { conversations };
47
+ });
48
+ // mail/close — close a conversation
49
+ this.methods.set("mail/close", (params) => {
50
+ const conv = this.storage.getConversation(params.id);
51
+ if (!conv)
52
+ throw rpcError(-32001, "Conversation not found");
53
+ conv.status = "completed";
54
+ conv.updated_at = new Date().toISOString();
55
+ this.storage.putConversation(conv);
56
+ return { ok: true };
57
+ });
58
+ // mail/join — add self as participant
59
+ this.methods.set("mail/join", (params) => {
60
+ const conv = this.storage.getConversation(params.conversationId);
61
+ if (!conv)
62
+ throw rpcError(-32001, "Conversation not found");
63
+ const agentId = params.agentId;
64
+ if (!conv.participants.some((p) => p.agent_id === agentId)) {
65
+ conv.participants.push({
66
+ agent_id: agentId,
67
+ joined_at: new Date().toISOString(),
68
+ });
69
+ conv.updated_at = new Date().toISOString();
70
+ this.storage.putConversation(conv);
71
+ }
72
+ return { ok: true };
73
+ });
74
+ // mail/leave — remove self from conversation
75
+ this.methods.set("mail/leave", (params) => {
76
+ const conv = this.storage.getConversation(params.conversationId);
77
+ if (!conv)
78
+ throw rpcError(-32001, "Conversation not found");
79
+ const agentId = params.agentId;
80
+ conv.participants = conv.participants.filter((p) => p.agent_id !== agentId);
81
+ conv.updated_at = new Date().toISOString();
82
+ this.storage.putConversation(conv);
83
+ return { ok: true };
84
+ });
85
+ // mail/invite — add agent to conversation
86
+ this.methods.set("mail/invite", (params) => {
87
+ const conv = this.storage.getConversation(params.conversationId);
88
+ if (!conv)
89
+ throw rpcError(-32001, "Conversation not found");
90
+ const agentId = params.agentId;
91
+ if (!conv.participants.some((p) => p.agent_id === agentId)) {
92
+ conv.participants.push({
93
+ agent_id: agentId,
94
+ role: params.role,
95
+ joined_at: new Date().toISOString(),
96
+ });
97
+ conv.updated_at = new Date().toISOString();
98
+ this.storage.putConversation(conv);
99
+ }
100
+ return { ok: true };
101
+ });
102
+ // mail/turn — add a turn to a conversation
103
+ this.methods.set("mail/turn", async (params) => {
104
+ const conv = this.storage.getConversation(params.conversationId);
105
+ if (!conv)
106
+ throw rpcError(-32001, "Conversation not found");
107
+ const turn = {
108
+ id: `turn-${ulid()}`,
109
+ conversation_id: conv.id,
110
+ participant_id: params.participantId,
111
+ source_message_id: params.sourceMessageId,
112
+ content_type: params.contentType ?? "text",
113
+ content: params.content,
114
+ thread_id: params.threadId,
115
+ in_reply_to: params.inReplyTo,
116
+ created_at: new Date().toISOString(),
117
+ };
118
+ this.storage.addTurn(turn);
119
+ conv.updated_at = turn.created_at;
120
+ this.storage.putConversation(conv);
121
+ return turn;
122
+ });
123
+ // mail/turns/list — list turns in a conversation
124
+ this.methods.set("mail/turns/list", (params) => {
125
+ const turns = this.storage.getTurns(params.conversationId);
126
+ return { turns };
127
+ });
128
+ // mail/thread/create — create a thread
129
+ this.methods.set("mail/thread/create", (params) => {
130
+ const thread = {
131
+ id: `thread-${ulid()}`,
132
+ conversation_id: params.conversationId,
133
+ root_turn_id: params.rootTurnId,
134
+ parent_thread_id: params.parentThreadId,
135
+ subject: params.subject,
136
+ created_at: new Date().toISOString(),
137
+ };
138
+ this.storage.putThread(thread);
139
+ return thread;
140
+ });
141
+ // mail/thread/list — list threads in a conversation
142
+ this.methods.set("mail/thread/list", (params) => {
143
+ const threads = this.storage.getThreadsByConversation(params.conversationId);
144
+ return { threads };
145
+ });
146
+ // mail/replay — replay conversation history (all turns, ordered)
147
+ this.methods.set("mail/replay", (params) => {
148
+ const conv = this.storage.getConversation(params.id);
149
+ if (!conv)
150
+ throw rpcError(-32001, "Conversation not found");
151
+ const turns = this.storage.getTurns(conv.id);
152
+ return {
153
+ conversation: conv,
154
+ turns,
155
+ threads: this.storage.getThreadsByConversation(conv.id),
156
+ };
157
+ });
158
+ }
159
+ /** Process a JSON-RPC request (used by both IPC and HTTP transports) */
160
+ async handleRequest(request) {
161
+ if (request.jsonrpc !== "2.0") {
162
+ return {
163
+ jsonrpc: "2.0",
164
+ id: request.id ?? null,
165
+ error: { code: -32600, message: "Invalid JSON-RPC version" },
166
+ };
167
+ }
168
+ const handler = this.methods.get(request.method);
169
+ if (!handler) {
170
+ return {
171
+ jsonrpc: "2.0",
172
+ id: request.id ?? null,
173
+ error: { code: -32601, message: `Method not found: ${request.method}` },
174
+ };
175
+ }
176
+ try {
177
+ const result = await handler(request.params ?? {});
178
+ return { jsonrpc: "2.0", id: request.id ?? null, result };
179
+ }
180
+ catch (err) {
181
+ if (isRpcError(err)) {
182
+ return {
183
+ jsonrpc: "2.0",
184
+ id: request.id ?? null,
185
+ error: { code: err.code, message: err.message },
186
+ };
187
+ }
188
+ return {
189
+ jsonrpc: "2.0",
190
+ id: request.id ?? null,
191
+ error: { code: -32603, message: String(err) },
192
+ };
193
+ }
194
+ }
195
+ /** Start HTTP server for dashboard/external access */
196
+ async startHttp(port) {
197
+ return new Promise((resolve) => {
198
+ this.httpServer = http.createServer((req, res) => {
199
+ // SSE endpoint for map/subscribe
200
+ if (req.url === "/subscribe" && req.method === "GET") {
201
+ this.handleSseSubscribe(res);
202
+ return;
203
+ }
204
+ // JSON-RPC endpoint
205
+ if (req.method !== "POST") {
206
+ res.writeHead(405, { "Content-Type": "application/json" });
207
+ res.end(JSON.stringify({
208
+ jsonrpc: "2.0",
209
+ id: null,
210
+ error: { code: -32600, message: "Method not allowed" },
211
+ }));
212
+ return;
213
+ }
214
+ let body = "";
215
+ req.on("data", (chunk) => {
216
+ body += chunk;
217
+ });
218
+ req.on("end", async () => {
219
+ try {
220
+ const request = JSON.parse(body);
221
+ const response = await this.handleRequest(request);
222
+ res.writeHead(200, { "Content-Type": "application/json" });
223
+ res.end(JSON.stringify(response));
224
+ }
225
+ catch {
226
+ res.writeHead(400, { "Content-Type": "application/json" });
227
+ res.end(JSON.stringify({
228
+ jsonrpc: "2.0",
229
+ id: null,
230
+ error: { code: -32700, message: "Parse error" },
231
+ }));
232
+ }
233
+ });
234
+ });
235
+ this.httpServer.listen(port, () => resolve());
236
+ });
237
+ }
238
+ async stopHttp() {
239
+ // Close all SSE connections
240
+ for (const res of this.subscribers) {
241
+ res.end();
242
+ }
243
+ this.subscribers.clear();
244
+ return new Promise((resolve) => {
245
+ if (!this.httpServer)
246
+ return resolve();
247
+ this.httpServer.close(() => resolve());
248
+ });
249
+ }
250
+ /** SSE endpoint: stream events to subscribers */
251
+ handleSseSubscribe(res) {
252
+ res.writeHead(200, {
253
+ "Content-Type": "text/event-stream",
254
+ "Cache-Control": "no-cache",
255
+ Connection: "keep-alive",
256
+ });
257
+ res.write(":\n\n"); // SSE comment to establish connection
258
+ this.subscribers.add(res);
259
+ res.on("close", () => {
260
+ this.subscribers.delete(res);
261
+ });
262
+ }
263
+ /** Forward internal events to SSE subscribers */
264
+ setupEventForwarding() {
265
+ this.events.on("message.created", (msg) => {
266
+ this.broadcast("message.created", msg);
267
+ });
268
+ }
269
+ broadcast(eventType, data) {
270
+ const payload = `event: ${eventType}\ndata: ${JSON.stringify(data)}\n\n`;
271
+ for (const res of this.subscribers) {
272
+ res.write(payload);
273
+ }
274
+ }
275
+ }
276
+ function rpcError(code, message) {
277
+ const err = new Error(message);
278
+ err.code = code;
279
+ return err;
280
+ }
281
+ function isRpcError(err) {
282
+ return err instanceof Error && typeof err.code === "number";
283
+ }
284
+ //# sourceMappingURL=mail-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-server.js","sourceRoot":"","sources":["../../src/jsonrpc/mail-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { Storage } from "../storage/interface.js";
3
+ import type { MessageRouter } from "../router/message-router.js";
4
+ import type { InboxConfig } from "../types.js";
5
+ /**
6
+ * Wrapper around @multi-agent-protocol/sdk for Agent Inbox's MAP connection.
7
+ *
8
+ * The MAP SDK is an optional peer dependency. This client gracefully degrades
9
+ * to a no-op when the SDK is not installed.
10
+ */
11
+ export declare class MapClient {
12
+ private storage;
13
+ private router;
14
+ private events;
15
+ private inboxJsonlPath?;
16
+ private conn;
17
+ private agentConnectionClass;
18
+ private externalConn;
19
+ constructor(storage: Storage, router: MessageRouter, events: EventEmitter, inboxJsonlPath?: string | undefined);
20
+ connect(config: NonNullable<InboxConfig["map"]>): Promise<boolean>;
21
+ /**
22
+ * Use an externally-created MAP connection instead of creating one.
23
+ * The caller owns the connection lifecycle — disconnect() will detach
24
+ * but not close it. Incoming messages are still routed into storage.
25
+ */
26
+ useConnection(conn: MapConnection): void;
27
+ disconnect(): Promise<void>;
28
+ sendViaMap(target: {
29
+ agentId?: string;
30
+ scope?: string;
31
+ }, payload: unknown): Promise<boolean>;
32
+ get connected(): boolean;
33
+ /**
34
+ * Get the underlying MAP connection, if connected.
35
+ * Returns the full AgentConnection instance from the SDK, exposing
36
+ * lifecycle methods (spawn, updateState, callExtension) beyond
37
+ * what Agent Inbox uses internally for messaging.
38
+ */
39
+ getConnection(): MapConnection | null;
40
+ /**
41
+ * Get the system name from the MAP connection, if available.
42
+ * This is used for Tier 2 system ID resolution (MAP systemInfo).
43
+ */
44
+ getSystemName(): string | undefined;
45
+ /**
46
+ * Get the AgentConnection class from the MAP SDK, if available.
47
+ * Used to inject the SDK into ConnectionManager for federation peer connections.
48
+ */
49
+ getAgentConnectionClass(): MapAgentConnectionClass | null;
50
+ /**
51
+ * Startup replay: query MAP server for messages received while offline.
52
+ * Compares MAP server's message history against local storage and ingests
53
+ * any missing messages. Falls back to trusting local storage if the query fails.
54
+ */
55
+ replayMissed(): Promise<number>;
56
+ private findExistingMessage;
57
+ private handleIncoming;
58
+ private appendToInboxJsonl;
59
+ }
60
+ export interface IncomingMapMessage {
61
+ from: string;
62
+ payload: unknown;
63
+ timestamp?: string;
64
+ meta?: {
65
+ priority?: string;
66
+ [key: string]: unknown;
67
+ };
68
+ }
69
+ export interface MapConnection {
70
+ send(to: {
71
+ agentId?: string;
72
+ scope?: string;
73
+ }, payload: unknown, meta?: Record<string, unknown>): Promise<void>;
74
+ onMessage(handler: (msg: IncomingMapMessage) => void): void;
75
+ disconnect(): Promise<void>;
76
+ spawn?(opts: {
77
+ agentId: string;
78
+ name?: string;
79
+ role?: string;
80
+ scopes?: string[];
81
+ metadata?: Record<string, unknown>;
82
+ }): Promise<unknown>;
83
+ updateState?(state: string): Promise<void>;
84
+ updateMetadata?(metadata: Record<string, unknown>): Promise<void>;
85
+ callExtension?(name: string, params: Record<string, unknown>): Promise<unknown>;
86
+ systemName?: string;
87
+ }
88
+ export interface MapAgentConnectionClass {
89
+ connect(server: string, opts: unknown): Promise<MapConnection>;
90
+ }
91
+ //# sourceMappingURL=map-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-client.d.ts","sourceRoot":"","sources":["../../src/map/map-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { normalizeContent } from "../router/message-router.js";
4
+ import { ulid } from "ulid";
5
+ /**
6
+ * Wrapper around @multi-agent-protocol/sdk for Agent Inbox's MAP connection.
7
+ *
8
+ * The MAP SDK is an optional peer dependency. This client gracefully degrades
9
+ * to a no-op when the SDK is not installed.
10
+ */
11
+ export class MapClient {
12
+ storage;
13
+ router;
14
+ events;
15
+ inboxJsonlPath;
16
+ conn = null;
17
+ agentConnectionClass = null;
18
+ externalConn = false;
19
+ constructor(storage, router, events, inboxJsonlPath) {
20
+ this.storage = storage;
21
+ this.router = router;
22
+ this.events = events;
23
+ this.inboxJsonlPath = inboxJsonlPath;
24
+ }
25
+ async connect(config) {
26
+ if (!config.enabled || !config.server)
27
+ return false;
28
+ let AgentConnection;
29
+ try {
30
+ // Dynamic import — optional peer dependency
31
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
32
+ const sdk = await Function('return import("@multi-agent-protocol/sdk")')();
33
+ AgentConnection = sdk.AgentConnection;
34
+ this.agentConnectionClass = AgentConnection;
35
+ }
36
+ catch {
37
+ // MAP SDK not installed — standalone mode
38
+ return false;
39
+ }
40
+ try {
41
+ this.conn = await AgentConnection.connect(config.server, {
42
+ name: "agent-inbox",
43
+ role: "inbox",
44
+ scopes: [config.scope ?? "default"],
45
+ capabilities: { trajectory: { canReport: false } },
46
+ metadata: {
47
+ systemId: config.systemId ?? "agent-inbox",
48
+ type: "agent-inbox",
49
+ },
50
+ reconnection: {
51
+ enabled: true,
52
+ maxRetries: 5,
53
+ baseDelayMs: 1000,
54
+ maxDelayMs: 30000,
55
+ },
56
+ });
57
+ this.conn.onMessage((msg) => {
58
+ this.handleIncoming(msg);
59
+ });
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ /**
67
+ * Use an externally-created MAP connection instead of creating one.
68
+ * The caller owns the connection lifecycle — disconnect() will detach
69
+ * but not close it. Incoming messages are still routed into storage.
70
+ */
71
+ useConnection(conn) {
72
+ this.conn = conn;
73
+ this.externalConn = true;
74
+ conn.onMessage((msg) => {
75
+ this.handleIncoming(msg);
76
+ });
77
+ }
78
+ async disconnect() {
79
+ if (this.conn) {
80
+ if (!this.externalConn) {
81
+ await this.conn.disconnect();
82
+ }
83
+ this.conn = null;
84
+ }
85
+ }
86
+ async sendViaMap(target, payload) {
87
+ if (!this.conn)
88
+ return false;
89
+ try {
90
+ await this.conn.send(target, payload);
91
+ return true;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ get connected() {
98
+ return this.conn !== null;
99
+ }
100
+ /**
101
+ * Get the underlying MAP connection, if connected.
102
+ * Returns the full AgentConnection instance from the SDK, exposing
103
+ * lifecycle methods (spawn, updateState, callExtension) beyond
104
+ * what Agent Inbox uses internally for messaging.
105
+ */
106
+ getConnection() {
107
+ return this.conn;
108
+ }
109
+ /**
110
+ * Get the system name from the MAP connection, if available.
111
+ * This is used for Tier 2 system ID resolution (MAP systemInfo).
112
+ */
113
+ getSystemName() {
114
+ if (!this.conn)
115
+ return undefined;
116
+ return this.conn.systemName;
117
+ }
118
+ /**
119
+ * Get the AgentConnection class from the MAP SDK, if available.
120
+ * Used to inject the SDK into ConnectionManager for federation peer connections.
121
+ */
122
+ getAgentConnectionClass() {
123
+ return this.agentConnectionClass;
124
+ }
125
+ /**
126
+ * Startup replay: query MAP server for messages received while offline.
127
+ * Compares MAP server's message history against local storage and ingests
128
+ * any missing messages. Falls back to trusting local storage if the query fails.
129
+ */
130
+ async replayMissed() {
131
+ if (!this.conn)
132
+ return 0;
133
+ try {
134
+ // Query MAP server for recent messages via extension
135
+ const result = await this.conn.callExtension?.("mail/recent", { limit: 200 });
136
+ if (!result || !Array.isArray(result.messages))
137
+ return 0;
138
+ let ingested = 0;
139
+ for (const msg of result.messages) {
140
+ // Check if we already have this message (by timestamp + sender dedup)
141
+ const existing = this.findExistingMessage(msg);
142
+ if (!existing) {
143
+ this.handleIncoming(msg);
144
+ ingested++;
145
+ }
146
+ }
147
+ return ingested;
148
+ }
149
+ catch {
150
+ // MAP server doesn't support mail/recent or query failed
151
+ // Fall back to trusting local storage
152
+ return 0;
153
+ }
154
+ }
155
+ findExistingMessage(msg) {
156
+ // Simple dedup: check if a message with the same sender and timestamp exists
157
+ if (!msg.timestamp)
158
+ return false;
159
+ const candidates = this.storage.searchMessages(msg.from);
160
+ return candidates.some((m) => m.sender_id === msg.from && m.created_at === msg.timestamp);
161
+ }
162
+ handleIncoming(msg) {
163
+ const now = new Date().toISOString();
164
+ const content = normalizeContent(msg.payload);
165
+ // Store as a message
166
+ const message = {
167
+ id: ulid(),
168
+ scope: "default",
169
+ sender_id: msg.from,
170
+ recipients: [],
171
+ content,
172
+ importance: msg.meta?.priority === "high" ? "high" : "normal",
173
+ metadata: msg.meta ?? {},
174
+ created_at: msg.timestamp ?? now,
175
+ };
176
+ this.storage.putMessage(message);
177
+ this.events.emit("message.created", message);
178
+ // Append to inbox.jsonl if configured
179
+ if (this.inboxJsonlPath) {
180
+ this.appendToInboxJsonl(msg);
181
+ }
182
+ }
183
+ appendToInboxJsonl(msg) {
184
+ if (!this.inboxJsonlPath)
185
+ return;
186
+ try {
187
+ const dir = path.dirname(this.inboxJsonlPath);
188
+ fs.mkdirSync(dir, { recursive: true });
189
+ const line = JSON.stringify({
190
+ from: msg.from,
191
+ timestamp: msg.timestamp ?? new Date().toISOString(),
192
+ payload: msg.payload,
193
+ meta: msg.meta,
194
+ });
195
+ fs.appendFileSync(this.inboxJsonlPath, line + "\n");
196
+ }
197
+ catch {
198
+ // Best-effort write
199
+ }
200
+ }
201
+ }
202
+ //# sourceMappingURL=map-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-client.js","sourceRoot":"","sources":["../../src/map/map-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Storage } from "../storage/interface.js";
3
+ import type { MessageRouter } from "../router/message-router.js";
4
+ import type { WarmRegistry } from "../registry/warm-registry.js";
5
+ export declare class InboxMcpServer {
6
+ private router;
7
+ private storage;
8
+ private defaultScope;
9
+ private mcp;
10
+ private registry;
11
+ constructor(router: MessageRouter, storage: Storage, defaultScope?: string);
12
+ /**
13
+ * Attach a warm registry for federation-aware agent registration.
14
+ */
15
+ setRegistry(registry: WarmRegistry): void;
16
+ private registerTools;
17
+ /** Auto-register an agent if not already known (lazy registration on first inbox check) */
18
+ private ensureAgent;
19
+ start(): Promise<void>;
20
+ /** Expose for testing — returns the underlying McpServer */
21
+ get server(): McpServer;
22
+ }
23
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,qBAAa,cAAc;IAKvB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;IANtB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,QAAQ,CAA6B;gBAGnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,MAAkB;IAU1C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIzC,OAAO,CAAC,aAAa;IA8MrB,2FAA2F;IAC3F,OAAO,CAAC,WAAW;IAuBb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,4DAA4D;IAC5D,IAAI,MAAM,IAAI,SAAS,CAEtB;CACF"}