agent-inbox 0.0.1 → 0.1.1

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 +20 -0
  32. package/dist/ipc/ipc-server.d.ts.map +1 -0
  33. package/dist/ipc/ipc-server.js +152 -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 +253 -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 +180 -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 +287 -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 +138 -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
package/dist/index.js CHANGED
@@ -1,19 +1,218 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __copyProps = (to, from, except, desc) => {
7
- if (from && typeof from === "object" || typeof from === "function") {
8
- for (let key of __getOwnPropNames(from))
9
- if (!__hasOwnProp.call(to, key) && key !== except)
10
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
- }
12
- return to;
13
- };
14
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
-
16
- // src/index.ts
17
- var index_exports = {};
18
- module.exports = __toCommonJS(index_exports);
1
+ import { EventEmitter } from "node:events";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ import { InMemoryStorage } from "./storage/memory.js";
5
+ import { SqliteStorage } from "./storage/sqlite.js";
6
+ import { MessageRouter } from "./router/message-router.js";
7
+ import { TraceabilityLayer } from "./traceability/traceability.js";
8
+ import { IpcServer } from "./ipc/ipc-server.js";
9
+ import { MapClient } from "./map/map-client.js";
10
+ import { InboxMcpServer } from "./mcp/mcp-server.js";
11
+ import { MailJsonRpcServer } from "./jsonrpc/mail-server.js";
12
+ import { PushNotifier } from "./push/notifier.js";
13
+ import { ConnectionManager } from "./federation/connection-manager.js";
14
+ import { WarmRegistry } from "./registry/warm-registry.js";
15
+ export { InMemoryStorage } from "./storage/memory.js";
16
+ export { SqliteStorage } from "./storage/sqlite.js";
17
+ export { MessageRouter, normalizeContent } from "./router/message-router.js";
18
+ export { TraceabilityLayer } from "./traceability/traceability.js";
19
+ export { IpcServer } from "./ipc/ipc-server.js";
20
+ export { MapClient } from "./map/map-client.js";
21
+ export { InboxMcpServer } from "./mcp/mcp-server.js";
22
+ export { MailJsonRpcServer } from "./jsonrpc/mail-server.js";
23
+ export { PushNotifier, formatInboxMarkdown } from "./push/notifier.js";
24
+ export { ConnectionManager } from "./federation/connection-manager.js";
25
+ export { WarmRegistry } from "./registry/warm-registry.js";
26
+ export { RoutingEngine } from "./federation/routing-engine.js";
27
+ export { DeliveryQueue } from "./federation/delivery-queue.js";
28
+ export { TrustManager } from "./federation/trust.js";
29
+ export { parseAddress, formatAddress, isRemoteAddress, isBroadcastAddress, } from "./federation/address.js";
30
+ function defaultSocketPath() {
31
+ const home = os.homedir();
32
+ return path.join(home, ".claude", "agent-inbox", "inbox.sock");
33
+ }
34
+ function defaultInboxJsonlPath() {
35
+ const home = os.homedir();
36
+ return path.join(home, ".claude", "agent-inbox", "inbox.jsonl");
37
+ }
38
+ function defaultInboxDir() {
39
+ const home = os.homedir();
40
+ return path.join(home, ".claude", "agent-inbox", "inboxes");
41
+ }
42
+ function defaultSqlitePath() {
43
+ const home = os.homedir();
44
+ return path.join(home, ".claude", "agent-inbox", "inbox.db");
45
+ }
46
+ function loadConfig() {
47
+ return {
48
+ socketPath: process.env.INBOX_SOCKET_PATH ?? defaultSocketPath(),
49
+ scope: process.env.INBOX_SCOPE ?? "default",
50
+ map: {
51
+ enabled: process.env.INBOX_MAP_ENABLED === "true",
52
+ server: process.env.INBOX_MAP_SERVER,
53
+ scope: process.env.INBOX_MAP_SCOPE ?? process.env.INBOX_SCOPE ?? "default",
54
+ systemId: process.env.INBOX_MAP_SYSTEM_ID ?? "agent-inbox",
55
+ },
56
+ };
57
+ }
58
+ export async function createAgentInbox(opts = {}) {
59
+ const config = { ...loadConfig(), ...opts.config };
60
+ // 1. Storage — SQLite if path provided, otherwise in-memory
61
+ const storage = opts.sqlitePath
62
+ ? new SqliteStorage({ path: opts.sqlitePath })
63
+ : new InMemoryStorage();
64
+ // 2. Event bus (internal)
65
+ const events = new EventEmitter();
66
+ // 3. Message router
67
+ const router = new MessageRouter(storage, events, config.scope);
68
+ // 4. Traceability layer (subscribes to message.created events)
69
+ const traceability = new TraceabilityLayer(storage, events);
70
+ // 5. Push notifier (per-agent inbox files + webhooks)
71
+ const notifier = new PushNotifier({ inboxDir: defaultInboxDir(), webhooks: opts.webhooks }, storage, events);
72
+ // 6. MAP client (connects first to obtain SDK class for federation)
73
+ const mapClient = new MapClient(storage, router, events, defaultInboxJsonlPath());
74
+ if (opts.connection) {
75
+ // External connection — borrow it, don't manage its lifecycle
76
+ mapClient.useConnection(opts.connection);
77
+ }
78
+ else if (config.map?.enabled) {
79
+ const connected = await mapClient.connect(config.map);
80
+ if (connected) {
81
+ // Replay missed messages from MAP server
82
+ const replayed = await mapClient.replayMissed();
83
+ if (replayed > 0) {
84
+ console.error(`Replayed ${replayed} missed messages from MAP server`);
85
+ }
86
+ }
87
+ }
88
+ // 7. Federation (optional) — inject SDK class from MapClient if available
89
+ let federation = null;
90
+ let registry = null;
91
+ if (opts.enableFederation || config.federation?.peers?.length) {
92
+ registry = new WarmRegistry(storage, events, config.federation?.registry);
93
+ const sdkClass = mapClient.getAgentConnectionClass() ?? undefined;
94
+ federation = new ConnectionManager(events, config.federation, {
95
+ sdkClass,
96
+ onIncomingMessage: ({ from, peerId, payload, meta }) => {
97
+ // Delegate incoming federation messages to the router.
98
+ // The targetAgent in meta tells us which local agent this is for.
99
+ const targetAgent = meta?.targetAgent ?? from;
100
+ router.routeMessage({
101
+ from: `${from}@${peerId}`,
102
+ to: targetAgent,
103
+ payload,
104
+ scope: meta?.scope,
105
+ subject: meta?.subject,
106
+ importance: meta?.importance,
107
+ threadTag: meta?.threadTag,
108
+ inReplyTo: meta?.inReplyTo,
109
+ metadata: meta,
110
+ }).catch((err) => {
111
+ console.error(`Failed to route incoming federation message from ${from}@${peerId}: ${err instanceof Error ? err.message : err}`);
112
+ });
113
+ },
114
+ });
115
+ router.setFederation(federation);
116
+ // Tier 2 system ID resolution: update from MAP systemInfo if available
117
+ const mapSystemName = mapClient.getSystemName();
118
+ if (mapSystemName) {
119
+ federation.updateSystemIdFromMap(mapSystemName);
120
+ }
121
+ // Connect to configured federation peers
122
+ if (config.federation?.peers) {
123
+ for (const peer of config.federation.peers) {
124
+ try {
125
+ await federation.federate(peer);
126
+ console.error(`Federated with peer: ${peer.systemId} (${peer.url})`);
127
+ }
128
+ catch (err) {
129
+ console.error(`Failed to federate with ${peer.systemId}: ${err instanceof Error ? err.message : err}`);
130
+ }
131
+ }
132
+ }
133
+ // Start delivery queue tick timer
134
+ federation.queue.startTicking();
135
+ }
136
+ // 8. JSON-RPC server (mail/* methods)
137
+ const jsonRpc = new MailJsonRpcServer(storage, router, events);
138
+ if (opts.httpPort && opts.httpPort > 0) {
139
+ await jsonRpc.startHttp(opts.httpPort);
140
+ console.error(`JSON-RPC HTTP server listening on port ${opts.httpPort}`);
141
+ }
142
+ // 9. IPC server (UNIX socket — handles both NDJSON commands and JSON-RPC inline)
143
+ const socketPath = config.socketPath ?? defaultSocketPath();
144
+ const ipcServer = new IpcServer(socketPath, router, storage, jsonRpc);
145
+ await ipcServer.start();
146
+ const stop = async () => {
147
+ await ipcServer.stop();
148
+ await jsonRpc.stopHttp();
149
+ await mapClient.disconnect();
150
+ if (federation)
151
+ await federation.destroy();
152
+ if (registry)
153
+ registry.destroy();
154
+ if ("close" in storage && typeof storage.close === "function") {
155
+ storage.close();
156
+ }
157
+ };
158
+ return {
159
+ storage,
160
+ router,
161
+ traceability,
162
+ ipcServer,
163
+ mapClient,
164
+ jsonRpc,
165
+ notifier,
166
+ federation,
167
+ registry,
168
+ events,
169
+ stop,
170
+ };
171
+ }
172
+ // CLI entry point
173
+ const isMainModule = process.argv[1] &&
174
+ (process.argv[1].endsWith("/index.js") ||
175
+ process.argv[1].endsWith("/index.ts"));
176
+ if (isMainModule) {
177
+ const mode = process.argv[2] ?? "ipc";
178
+ if (mode === "mcp") {
179
+ // MCP-only mode (stdio transport for Claude Code integration)
180
+ const config = loadConfig();
181
+ const sqlitePath = process.env.INBOX_SQLITE_PATH;
182
+ const storage = sqlitePath
183
+ ? new SqliteStorage({ path: sqlitePath })
184
+ : new InMemoryStorage();
185
+ const events = new EventEmitter();
186
+ const router = new MessageRouter(storage, events, config.scope);
187
+ const _traceability = new TraceabilityLayer(storage, events);
188
+ const mcpServer = new InboxMcpServer(router, storage, config.scope);
189
+ mcpServer.start().catch((err) => {
190
+ console.error("MCP server failed:", err);
191
+ process.exit(1);
192
+ });
193
+ }
194
+ else {
195
+ // IPC server mode (default)
196
+ const httpPort = process.env.INBOX_HTTP_PORT
197
+ ? parseInt(process.env.INBOX_HTTP_PORT, 10)
198
+ : 0;
199
+ const sqlitePath = process.env.INBOX_SQLITE_PATH;
200
+ createAgentInbox({ httpPort, sqlitePath })
201
+ .then((inbox) => {
202
+ console.error(`Agent Inbox IPC server listening on ${process.env.INBOX_SOCKET_PATH ?? defaultSocketPath()}`);
203
+ process.on("SIGINT", async () => {
204
+ await inbox.stop();
205
+ process.exit(0);
206
+ });
207
+ process.on("SIGTERM", async () => {
208
+ await inbox.stop();
209
+ process.exit(0);
210
+ });
211
+ })
212
+ .catch((err) => {
213
+ console.error("Failed to start Agent Inbox:", err);
214
+ process.exit(1);
215
+ });
216
+ }
217
+ }
19
218
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {};\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { IpcCommand, IpcResponse } from "../types.js";
2
+ import type { Storage } from "../storage/interface.js";
3
+ import type { MessageRouter } from "../router/message-router.js";
4
+ import type { MailJsonRpcServer } from "../jsonrpc/mail-server.js";
5
+ export declare class IpcServer {
6
+ private socketPath;
7
+ private router;
8
+ private storage;
9
+ private jsonRpc?;
10
+ private server;
11
+ constructor(socketPath: string, router: MessageRouter, storage: Storage, jsonRpc?: MailJsonRpcServer | undefined);
12
+ start(): Promise<void>;
13
+ stop(): Promise<void>;
14
+ private handleConnection;
15
+ private processLine;
16
+ handleCommand(command: IpcCommand): Promise<IpcResponse>;
17
+ private handleSend;
18
+ private handleNotify;
19
+ }
20
+ //# sourceMappingURL=ipc-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/ipc/ipc-server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,qBAAa,SAAS;IAIlB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO,CAAC;IANlB,OAAO,CAAC,MAAM,CAA2B;gBAG/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,iBAAiB,YAAA;IAG/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,OAAO,CAAC,gBAAgB;YA6BV,WAAW;IAqBnB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;YAoBhD,UAAU;IAoBxB,OAAO,CAAC,YAAY;CAkCrB"}
@@ -0,0 +1,152 @@
1
+ import * as net from "node:net";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ export class IpcServer {
5
+ socketPath;
6
+ router;
7
+ storage;
8
+ jsonRpc;
9
+ server = null;
10
+ constructor(socketPath, router, storage, jsonRpc) {
11
+ this.socketPath = socketPath;
12
+ this.router = router;
13
+ this.storage = storage;
14
+ this.jsonRpc = jsonRpc;
15
+ }
16
+ async start() {
17
+ // Clean up stale socket file
18
+ try {
19
+ fs.unlinkSync(this.socketPath);
20
+ }
21
+ catch {
22
+ // Doesn't exist, fine
23
+ }
24
+ // Ensure directory exists
25
+ const dir = path.dirname(this.socketPath);
26
+ fs.mkdirSync(dir, { recursive: true });
27
+ return new Promise((resolve, reject) => {
28
+ this.server = net.createServer((conn) => this.handleConnection(conn));
29
+ this.server.on("error", reject);
30
+ this.server.listen(this.socketPath, () => resolve());
31
+ });
32
+ }
33
+ async stop() {
34
+ return new Promise((resolve) => {
35
+ if (!this.server)
36
+ return resolve();
37
+ this.server.close(() => {
38
+ try {
39
+ fs.unlinkSync(this.socketPath);
40
+ }
41
+ catch {
42
+ // Already gone
43
+ }
44
+ resolve();
45
+ });
46
+ });
47
+ }
48
+ handleConnection(conn) {
49
+ let buffer = "";
50
+ conn.on("data", (data) => {
51
+ buffer += data.toString();
52
+ // Process complete lines (NDJSON)
53
+ let newlineIdx;
54
+ while ((newlineIdx = buffer.indexOf("\n")) !== -1) {
55
+ const line = buffer.slice(0, newlineIdx).trim();
56
+ buffer = buffer.slice(newlineIdx + 1);
57
+ if (!line)
58
+ continue;
59
+ this.processLine(line)
60
+ .then((response) => {
61
+ conn.write(JSON.stringify(response) + "\n");
62
+ })
63
+ .catch((err) => {
64
+ conn.write(JSON.stringify({ ok: false, error: String(err) }) + "\n");
65
+ });
66
+ }
67
+ });
68
+ conn.on("error", () => {
69
+ // Client disconnected, ignore
70
+ });
71
+ }
72
+ async processLine(line) {
73
+ let parsed;
74
+ try {
75
+ parsed = JSON.parse(line);
76
+ }
77
+ catch {
78
+ return { ok: false, error: "Invalid JSON" };
79
+ }
80
+ // Detect JSON-RPC requests (have "jsonrpc" field) vs IPC commands (have "action" field)
81
+ if (parsed.jsonrpc === "2.0" && typeof parsed.method === "string") {
82
+ if (this.jsonRpc) {
83
+ return this.jsonRpc.handleRequest(parsed);
84
+ }
85
+ return { jsonrpc: "2.0", id: parsed.id ?? null, error: { code: -32603, message: "JSON-RPC not configured" } };
86
+ }
87
+ return this.handleCommand(parsed);
88
+ }
89
+ async handleCommand(command) {
90
+ switch (command.action) {
91
+ case "ping":
92
+ return { ok: true, pid: process.pid };
93
+ case "send":
94
+ return this.handleSend(command);
95
+ case "notify":
96
+ return this.handleNotify(command);
97
+ case "emit":
98
+ // For Phase 1, emit is acknowledged but not forwarded to MAP
99
+ return { ok: true };
100
+ default:
101
+ return { ok: false, error: `Unknown action: ${command.action}` };
102
+ }
103
+ }
104
+ async handleSend(command) {
105
+ try {
106
+ const message = await this.router.routeMessage({
107
+ from: command.from,
108
+ to: command.to,
109
+ payload: command.payload,
110
+ scope: command.scope,
111
+ threadTag: command.threadTag,
112
+ inReplyTo: command.inReplyTo,
113
+ importance: command.importance,
114
+ metadata: command.meta,
115
+ });
116
+ return { ok: true, messageId: message.id };
117
+ }
118
+ catch (err) {
119
+ return { ok: false, error: String(err) };
120
+ }
121
+ }
122
+ handleNotify(command) {
123
+ const event = command.event;
124
+ if (event.type === "agent.spawn" && event.agent) {
125
+ const now = new Date().toISOString();
126
+ const agent = {
127
+ agent_id: event.agent.agentId,
128
+ display_name: event.agent.name,
129
+ scope: event.agent.scopes?.[0] ?? "default",
130
+ status: "active",
131
+ metadata: event.agent.metadata ?? {},
132
+ registered_at: now,
133
+ last_active_at: now,
134
+ };
135
+ this.storage.putAgent(agent);
136
+ return { ok: true };
137
+ }
138
+ if (event.type === "agent.done") {
139
+ const agentId = event.agentId ?? event.agent?.agentId;
140
+ if (agentId) {
141
+ const agent = this.storage.getAgent(agentId);
142
+ if (agent) {
143
+ agent.status = "offline";
144
+ this.storage.putAgent(agent);
145
+ }
146
+ }
147
+ return { ok: true };
148
+ }
149
+ return { ok: true };
150
+ }
151
+ }
152
+ //# sourceMappingURL=ipc-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-server.js","sourceRoot":"","sources":["../../src/ipc/ipc-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { Storage } from "../storage/interface.js";
3
+ import type { MessageRouter } from "../router/message-router.js";
4
+ /**
5
+ * MAP mail/* JSON-RPC 2.0 endpoint.
6
+ * Serves over both UNIX socket (IPC inline) and HTTP (dashboard access).
7
+ */
8
+ interface JsonRpcRequest {
9
+ jsonrpc: "2.0";
10
+ id?: string | number | null;
11
+ method: string;
12
+ params?: Record<string, unknown>;
13
+ }
14
+ interface JsonRpcResponse {
15
+ jsonrpc: "2.0";
16
+ id: string | number | null;
17
+ result?: unknown;
18
+ error?: {
19
+ code: number;
20
+ message: string;
21
+ data?: unknown;
22
+ };
23
+ }
24
+ export declare class MailJsonRpcServer {
25
+ private storage;
26
+ private router;
27
+ private events;
28
+ private methods;
29
+ private httpServer;
30
+ private subscribers;
31
+ constructor(storage: Storage, router: MessageRouter, events: EventEmitter);
32
+ private registerMethods;
33
+ /** Process a JSON-RPC request (used by both IPC and HTTP transports) */
34
+ handleRequest(request: JsonRpcRequest): Promise<JsonRpcResponse>;
35
+ /** Start HTTP server for dashboard/external access */
36
+ startHttp(port: number): Promise<void>;
37
+ stopHttp(): Promise<void>;
38
+ /** SSE endpoint: stream events to subscribers */
39
+ private handleSseSubscribe;
40
+ /** Forward internal events to SSE subscribers */
41
+ private setupEventForwarding;
42
+ private broadcast;
43
+ }
44
+ export {};
45
+ //# sourceMappingURL=mail-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-server.d.ts","sourceRoot":"","sources":["../../src/jsonrpc/mail-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE;;;GAGG;AAEH,UAAU,cAAc;IACtB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAMD,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,WAAW,CAAkC;gBAG3C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY;IAM9B,OAAO,CAAC,eAAe;IAmKvB,wEAAwE;IAClE,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAqCtE,sDAAsD;IAChD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDtC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,iDAAiD;IACjD,OAAO,CAAC,kBAAkB;IAc1B,iDAAiD;IACjD,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,SAAS;CAMlB"}