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.
- package/CLAUDE.md +113 -0
- package/README.md +195 -1
- package/dist/federation/address.d.ts +24 -0
- package/dist/federation/address.d.ts.map +1 -0
- package/dist/federation/address.js +54 -0
- package/dist/federation/address.js.map +1 -0
- package/dist/federation/connection-manager.d.ts +118 -0
- package/dist/federation/connection-manager.d.ts.map +1 -0
- package/dist/federation/connection-manager.js +369 -0
- package/dist/federation/connection-manager.js.map +1 -0
- package/dist/federation/delivery-queue.d.ts +66 -0
- package/dist/federation/delivery-queue.d.ts.map +1 -0
- package/dist/federation/delivery-queue.js +199 -0
- package/dist/federation/delivery-queue.js.map +1 -0
- package/dist/federation/index.d.ts +7 -0
- package/dist/federation/index.d.ts.map +1 -0
- package/dist/federation/index.js +6 -0
- package/dist/federation/index.js.map +1 -0
- package/dist/federation/routing-engine.d.ts +74 -0
- package/dist/federation/routing-engine.d.ts.map +1 -0
- package/dist/federation/routing-engine.js +158 -0
- package/dist/federation/routing-engine.js.map +1 -0
- package/dist/federation/trust.d.ts +39 -0
- package/dist/federation/trust.d.ts.map +1 -0
- package/dist/federation/trust.js +64 -0
- package/dist/federation/trust.js.map +1 -0
- package/dist/index.d.ts +60 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -18
- package/dist/index.js.map +1 -1
- package/dist/ipc/ipc-server.d.ts +21 -0
- package/dist/ipc/ipc-server.d.ts.map +1 -0
- package/dist/ipc/ipc-server.js +173 -0
- package/dist/ipc/ipc-server.js.map +1 -0
- package/dist/jsonrpc/mail-server.d.ts +45 -0
- package/dist/jsonrpc/mail-server.d.ts.map +1 -0
- package/dist/jsonrpc/mail-server.js +284 -0
- package/dist/jsonrpc/mail-server.js.map +1 -0
- package/dist/map/map-client.d.ts +91 -0
- package/dist/map/map-client.d.ts.map +1 -0
- package/dist/map/map-client.js +202 -0
- package/dist/map/map-client.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +23 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -0
- package/dist/mcp/mcp-server.js +226 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/push/notifier.d.ts +49 -0
- package/dist/push/notifier.d.ts.map +1 -0
- package/dist/push/notifier.js +150 -0
- package/dist/push/notifier.js.map +1 -0
- package/dist/registry/warm-registry.d.ts +63 -0
- package/dist/registry/warm-registry.d.ts.map +1 -0
- package/dist/registry/warm-registry.js +173 -0
- package/dist/registry/warm-registry.js.map +1 -0
- package/dist/router/message-router.d.ts +44 -0
- package/dist/router/message-router.d.ts.map +1 -0
- package/dist/router/message-router.js +137 -0
- package/dist/router/message-router.js.map +1 -0
- package/dist/storage/interface.d.ts +31 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/memory.d.ts +28 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +118 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/sqlite.d.ts +35 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +445 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/traceability/traceability.d.ts +29 -0
- package/dist/traceability/traceability.d.ts.map +1 -0
- package/dist/traceability/traceability.js +150 -0
- package/dist/traceability/traceability.js.map +1 -0
- package/dist/types.d.ts +261 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/docs/DESIGN.md +1156 -0
- package/docs/PLAN.md +545 -0
- package/hooks/inbox-hook.mjs +119 -0
- package/hooks/register-hook.mjs +69 -0
- package/package.json +33 -25
- package/rules/agent-inbox.md +78 -0
- package/src/federation/address.ts +61 -0
- package/src/federation/connection-manager.ts +458 -0
- package/src/federation/delivery-queue.ts +222 -0
- package/src/federation/index.ts +6 -0
- package/src/federation/routing-engine.ts +188 -0
- package/src/federation/trust.ts +71 -0
- package/src/index.ts +299 -0
- package/src/ipc/ipc-server.ts +207 -0
- package/src/jsonrpc/mail-server.ts +356 -0
- package/src/map/map-client.ts +260 -0
- package/src/mcp/mcp-server.ts +272 -0
- package/src/push/notifier.ts +192 -0
- package/src/registry/warm-registry.ts +210 -0
- package/src/router/message-router.ts +175 -0
- package/src/storage/interface.ts +48 -0
- package/src/storage/memory.ts +145 -0
- package/src/storage/sqlite.ts +645 -0
- package/src/traceability/traceability.ts +183 -0
- package/src/types.ts +297 -0
- package/test/federation/address.test.ts +101 -0
- package/test/federation/connection-manager.test.ts +546 -0
- package/test/federation/delivery-queue.test.ts +159 -0
- package/test/federation/integration.test.ts +823 -0
- package/test/federation/routing-engine.test.ts +117 -0
- package/test/federation/sdk-integration.test.ts +748 -0
- package/test/federation/trust.test.ts +89 -0
- package/test/ipc-jsonrpc.test.ts +113 -0
- package/test/ipc-server.test.ts +197 -0
- package/test/mail-server.test.ts +208 -0
- package/test/map-client.test.ts +408 -0
- package/test/message-router.test.ts +184 -0
- package/test/push-notifier.test.ts +139 -0
- package/test/registry/warm-registry.test.ts +171 -0
- package/test/sqlite-storage.test.ts +243 -0
- package/test/storage.test.ts +196 -0
- package/test/traceability.test.ts +123 -0
- package/tsconfig.json +20 -0
- package/tsup.config.ts +10 -0
- package/vitest.config.ts +8 -0
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
import { RoutingEngine } from "../../src/federation/routing-engine.js";
|
|
4
|
+
|
|
5
|
+
describe("RoutingEngine", () => {
|
|
6
|
+
let events: EventEmitter;
|
|
7
|
+
let engine: RoutingEngine;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
events = new EventEmitter();
|
|
11
|
+
engine = new RoutingEngine(events, {
|
|
12
|
+
strategy: "table",
|
|
13
|
+
tableTTL: 5000,
|
|
14
|
+
refreshOnMiss: true,
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe("updateFromExposure", () => {
|
|
19
|
+
it("should populate routing table from peer exposure", () => {
|
|
20
|
+
engine.updateFromExposure("backend-team", [
|
|
21
|
+
{ agentId: "agent-alpha" },
|
|
22
|
+
{ agentId: "agent-beta", status: "active" },
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
expect(engine.lookupAgent("agent-alpha")).toBe("backend-team");
|
|
26
|
+
expect(engine.lookupAgent("agent-beta")).toBe("backend-team");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should emit routing.updated event", () => {
|
|
30
|
+
const spy = vi.fn();
|
|
31
|
+
events.on("routing.updated", spy);
|
|
32
|
+
engine.updateFromExposure("peer-1", [{ agentId: "a" }]);
|
|
33
|
+
expect(spy).toHaveBeenCalledWith({ peerId: "peer-1", agentCount: 1 });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("lookupAgent", () => {
|
|
38
|
+
it("should return null for unknown agent", () => {
|
|
39
|
+
expect(engine.lookupAgent("unknown")).toBeNull();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("should return null for expired entry", () => {
|
|
43
|
+
vi.useFakeTimers();
|
|
44
|
+
engine.updateFromExposure("peer-1", [{ agentId: "agent-1" }]);
|
|
45
|
+
vi.advanceTimersByTime(5001);
|
|
46
|
+
expect(engine.lookupAgent("agent-1")).toBeNull();
|
|
47
|
+
vi.useRealTimers();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("should not return expired-status agents", () => {
|
|
51
|
+
engine.updateFromExposure("peer-1", [
|
|
52
|
+
{ agentId: "agent-1", status: "expired" },
|
|
53
|
+
]);
|
|
54
|
+
expect(engine.lookupAgent("agent-1")).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should return away agents (still routable)", () => {
|
|
58
|
+
engine.updateFromExposure("peer-1", [
|
|
59
|
+
{ agentId: "agent-1", status: "away" },
|
|
60
|
+
]);
|
|
61
|
+
expect(engine.lookupAgent("agent-1")).toBe("peer-1");
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe("resolveRoute", () => {
|
|
66
|
+
it("should return system directly if specified", () => {
|
|
67
|
+
expect(engine.resolveRoute({ system: "backend-team" })).toBe(
|
|
68
|
+
"backend-team"
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("should look up agent in table", () => {
|
|
73
|
+
engine.updateFromExposure("ml-team", [{ agentId: "trainer" }]);
|
|
74
|
+
expect(engine.resolveRoute({ agent: "trainer" })).toBe("ml-team");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should return null for unresolvable address", () => {
|
|
78
|
+
expect(engine.resolveRoute({ agent: "unknown" })).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe("removePeer", () => {
|
|
83
|
+
it("should remove all entries for a peer", () => {
|
|
84
|
+
engine.updateFromExposure("peer-1", [
|
|
85
|
+
{ agentId: "a" },
|
|
86
|
+
{ agentId: "b" },
|
|
87
|
+
]);
|
|
88
|
+
engine.updateFromExposure("peer-2", [{ agentId: "c" }]);
|
|
89
|
+
|
|
90
|
+
const removed = engine.removePeer("peer-1");
|
|
91
|
+
expect(removed).toBe(2);
|
|
92
|
+
expect(engine.lookupAgent("a")).toBeNull();
|
|
93
|
+
expect(engine.lookupAgent("b")).toBeNull();
|
|
94
|
+
expect(engine.lookupAgent("c")).toBe("peer-2");
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("knownPeers", () => {
|
|
99
|
+
it("should list unique peer IDs", () => {
|
|
100
|
+
engine.updateFromExposure("peer-1", [{ agentId: "a" }]);
|
|
101
|
+
engine.updateFromExposure("peer-2", [{ agentId: "b" }]);
|
|
102
|
+
expect(engine.knownPeers().sort()).toEqual(["peer-1", "peer-2"]);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe("cleanup", () => {
|
|
107
|
+
it("should remove expired entries", () => {
|
|
108
|
+
vi.useFakeTimers();
|
|
109
|
+
engine.updateFromExposure("peer-1", [{ agentId: "old" }]);
|
|
110
|
+
vi.advanceTimersByTime(5001);
|
|
111
|
+
const removed = engine.cleanup();
|
|
112
|
+
expect(removed).toBe(1);
|
|
113
|
+
expect(engine.getTable()).toHaveLength(0);
|
|
114
|
+
vi.useRealTimers();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|