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.
- 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 +20 -0
- package/dist/ipc/ipc-server.d.ts.map +1 -0
- package/dist/ipc/ipc-server.js +152 -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 +253 -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 +180 -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 +287 -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 +138 -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { parseAddress, formatAddress, isRemoteAddress, isBroadcastAddress } from "./address.js";
|
|
2
|
+
export { ConnectionManager } from "./connection-manager.js";
|
|
3
|
+
export { DeliveryQueue } from "./delivery-queue.js";
|
|
4
|
+
export { RoutingEngine } from "./routing-engine.js";
|
|
5
|
+
export { TrustManager } from "./trust.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { FederatedAddress, FederationRoutingConfig, RoutingEntry, WarmAgentStatus } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Federation routing engine with configurable strategies.
|
|
5
|
+
*
|
|
6
|
+
* - table: In-memory routing table populated from federation exposure data
|
|
7
|
+
* - broadcast: Forward to all peers, first responder wins
|
|
8
|
+
* - hierarchical: Local table first, then delegate to upstream hubs
|
|
9
|
+
*/
|
|
10
|
+
export declare class RoutingEngine {
|
|
11
|
+
private events;
|
|
12
|
+
private table;
|
|
13
|
+
private config;
|
|
14
|
+
constructor(events: EventEmitter, config?: Partial<FederationRoutingConfig>);
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a federated address to a peer system ID.
|
|
17
|
+
* Returns null if no route found.
|
|
18
|
+
*/
|
|
19
|
+
resolveRoute(addr: FederatedAddress): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Look up an agent in the routing table.
|
|
22
|
+
* Respects TTL — expired entries are not returned.
|
|
23
|
+
*/
|
|
24
|
+
lookupAgent(agentId: string): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Update the routing table with exposure data from a peer.
|
|
27
|
+
* Called when federation/connect completes or peer sends updates.
|
|
28
|
+
*/
|
|
29
|
+
updateFromExposure(peerId: string, agents: Array<{
|
|
30
|
+
agentId: string;
|
|
31
|
+
status?: WarmAgentStatus;
|
|
32
|
+
}>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Update status for a specific agent in the routing table.
|
|
35
|
+
*/
|
|
36
|
+
updateAgentStatus(agentId: string, status: WarmAgentStatus): void;
|
|
37
|
+
/**
|
|
38
|
+
* Remove all routing entries for a peer (e.g., on disconnect).
|
|
39
|
+
*/
|
|
40
|
+
removePeer(peerId: string): number;
|
|
41
|
+
/**
|
|
42
|
+
* Get all known peers from the routing table.
|
|
43
|
+
*/
|
|
44
|
+
knownPeers(): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Get all routing entries (for debugging/inspection).
|
|
47
|
+
*/
|
|
48
|
+
getTable(): RoutingEntry[];
|
|
49
|
+
/**
|
|
50
|
+
* Get the routing strategy in use.
|
|
51
|
+
*/
|
|
52
|
+
getStrategy(): FederationRoutingConfig["strategy"];
|
|
53
|
+
/**
|
|
54
|
+
* Get configured upstream hubs (for hierarchical strategy).
|
|
55
|
+
*/
|
|
56
|
+
getUpstream(): string[];
|
|
57
|
+
/**
|
|
58
|
+
* Whether to query peers on cache miss (for table strategy).
|
|
59
|
+
*/
|
|
60
|
+
shouldRefreshOnMiss(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get broadcast timeout (for broadcast strategy).
|
|
63
|
+
*/
|
|
64
|
+
getBroadcastTimeout(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Clean expired entries from the routing table.
|
|
67
|
+
*/
|
|
68
|
+
cleanup(): number;
|
|
69
|
+
/**
|
|
70
|
+
* Clear all state.
|
|
71
|
+
*/
|
|
72
|
+
destroy(): void;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=routing-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-engine.d.ts","sourceRoot":"","sources":["../../src/federation/routing-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC;AASrB;;;;;;GAMG;AACH,qBAAa,aAAa;IAKtB,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,MAAM,CAA0B;gBAG9B,MAAM,EAAE,YAAY,EAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC;IAK3C;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI;IAcnD;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiB3C;;;OAGG;IACH,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC,GAC3D,IAAI;IAaP;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAQjE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWlC;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAQtB;;OAEG;IACH,QAAQ,IAAI,YAAY,EAAE;IAI1B;;OAEG;IACH,WAAW,IAAI,uBAAuB,CAAC,UAAU,CAAC;IAIlD;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,OAAO,IAAI,MAAM;IAejB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
strategy: "table",
|
|
3
|
+
tableTTL: 300_000, // 5 minutes
|
|
4
|
+
refreshOnMiss: true,
|
|
5
|
+
broadcastTimeout: 5_000,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Federation routing engine with configurable strategies.
|
|
9
|
+
*
|
|
10
|
+
* - table: In-memory routing table populated from federation exposure data
|
|
11
|
+
* - broadcast: Forward to all peers, first responder wins
|
|
12
|
+
* - hierarchical: Local table first, then delegate to upstream hubs
|
|
13
|
+
*/
|
|
14
|
+
export class RoutingEngine {
|
|
15
|
+
events;
|
|
16
|
+
table = new Map();
|
|
17
|
+
config;
|
|
18
|
+
constructor(events, config) {
|
|
19
|
+
this.events = events;
|
|
20
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a federated address to a peer system ID.
|
|
24
|
+
* Returns null if no route found.
|
|
25
|
+
*/
|
|
26
|
+
resolveRoute(addr) {
|
|
27
|
+
// If the address specifies a system directly, use it
|
|
28
|
+
if (addr.system) {
|
|
29
|
+
return addr.system;
|
|
30
|
+
}
|
|
31
|
+
// Otherwise, look up the agent in the routing table
|
|
32
|
+
if (addr.agent) {
|
|
33
|
+
return this.lookupAgent(addr.agent);
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Look up an agent in the routing table.
|
|
39
|
+
* Respects TTL — expired entries are not returned.
|
|
40
|
+
*/
|
|
41
|
+
lookupAgent(agentId) {
|
|
42
|
+
const entry = this.table.get(agentId);
|
|
43
|
+
if (!entry)
|
|
44
|
+
return null;
|
|
45
|
+
// Check TTL
|
|
46
|
+
const age = Date.now() - new Date(entry.lastSeen).getTime();
|
|
47
|
+
if (age > (this.config.tableTTL ?? DEFAULT_CONFIG.tableTTL)) {
|
|
48
|
+
this.table.delete(agentId);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
// Only route to active or away agents
|
|
52
|
+
if (entry.status === "expired")
|
|
53
|
+
return null;
|
|
54
|
+
return entry.peerId;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Update the routing table with exposure data from a peer.
|
|
58
|
+
* Called when federation/connect completes or peer sends updates.
|
|
59
|
+
*/
|
|
60
|
+
updateFromExposure(peerId, agents) {
|
|
61
|
+
const now = new Date().toISOString();
|
|
62
|
+
for (const agent of agents) {
|
|
63
|
+
this.table.set(agent.agentId, {
|
|
64
|
+
agentId: agent.agentId,
|
|
65
|
+
peerId,
|
|
66
|
+
lastSeen: now,
|
|
67
|
+
status: agent.status ?? "active",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.events.emit("routing.updated", { peerId, agentCount: agents.length });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Update status for a specific agent in the routing table.
|
|
74
|
+
*/
|
|
75
|
+
updateAgentStatus(agentId, status) {
|
|
76
|
+
const entry = this.table.get(agentId);
|
|
77
|
+
if (entry) {
|
|
78
|
+
entry.status = status;
|
|
79
|
+
entry.lastSeen = new Date().toISOString();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Remove all routing entries for a peer (e.g., on disconnect).
|
|
84
|
+
*/
|
|
85
|
+
removePeer(peerId) {
|
|
86
|
+
let removed = 0;
|
|
87
|
+
for (const [agentId, entry] of this.table.entries()) {
|
|
88
|
+
if (entry.peerId === peerId) {
|
|
89
|
+
this.table.delete(agentId);
|
|
90
|
+
removed++;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return removed;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all known peers from the routing table.
|
|
97
|
+
*/
|
|
98
|
+
knownPeers() {
|
|
99
|
+
const peers = new Set();
|
|
100
|
+
for (const entry of this.table.values()) {
|
|
101
|
+
peers.add(entry.peerId);
|
|
102
|
+
}
|
|
103
|
+
return Array.from(peers);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get all routing entries (for debugging/inspection).
|
|
107
|
+
*/
|
|
108
|
+
getTable() {
|
|
109
|
+
return Array.from(this.table.values());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the routing strategy in use.
|
|
113
|
+
*/
|
|
114
|
+
getStrategy() {
|
|
115
|
+
return this.config.strategy;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get configured upstream hubs (for hierarchical strategy).
|
|
119
|
+
*/
|
|
120
|
+
getUpstream() {
|
|
121
|
+
return this.config.upstream ?? [];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Whether to query peers on cache miss (for table strategy).
|
|
125
|
+
*/
|
|
126
|
+
shouldRefreshOnMiss() {
|
|
127
|
+
return this.config.refreshOnMiss ?? true;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get broadcast timeout (for broadcast strategy).
|
|
131
|
+
*/
|
|
132
|
+
getBroadcastTimeout() {
|
|
133
|
+
return this.config.broadcastTimeout ?? 5_000;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clean expired entries from the routing table.
|
|
137
|
+
*/
|
|
138
|
+
cleanup() {
|
|
139
|
+
const ttl = this.config.tableTTL ?? DEFAULT_CONFIG.tableTTL;
|
|
140
|
+
const now = Date.now();
|
|
141
|
+
let removed = 0;
|
|
142
|
+
for (const [agentId, entry] of this.table.entries()) {
|
|
143
|
+
const age = now - new Date(entry.lastSeen).getTime();
|
|
144
|
+
if (age > ttl) {
|
|
145
|
+
this.table.delete(agentId);
|
|
146
|
+
removed++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return removed;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Clear all state.
|
|
153
|
+
*/
|
|
154
|
+
destroy() {
|
|
155
|
+
this.table.clear();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=routing-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-engine.js","sourceRoot":"","sources":["../../src/federation/routing-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { FederationTrustPolicy } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Federation trust enforcement.
|
|
4
|
+
*
|
|
5
|
+
* Layer 1 (implemented): Server allow-list
|
|
6
|
+
* Layer 2 (stub): Scope-based permissions
|
|
7
|
+
* Layer 3 (stub): Token-based auth
|
|
8
|
+
*/
|
|
9
|
+
export declare class TrustManager {
|
|
10
|
+
private policy;
|
|
11
|
+
constructor(policy?: Partial<FederationTrustPolicy>);
|
|
12
|
+
/**
|
|
13
|
+
* Check if a system is allowed to connect (Layer 1).
|
|
14
|
+
* If allowedServers is empty, all servers are allowed (open federation).
|
|
15
|
+
*/
|
|
16
|
+
canConnect(systemId: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check if routing from a remote system to a local scope is allowed (Layer 2 — stub).
|
|
19
|
+
* Currently always returns true.
|
|
20
|
+
*/
|
|
21
|
+
canRoute(fromSystem: string, toScope: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Validate authentication credentials for a system (Layer 3 — stub).
|
|
24
|
+
* Currently always returns true unless requireAuth is explicitly set.
|
|
25
|
+
*/
|
|
26
|
+
validateAuth(systemId: string, _credentials?: {
|
|
27
|
+
method?: string;
|
|
28
|
+
token?: string;
|
|
29
|
+
}): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Update the trust policy at runtime.
|
|
32
|
+
*/
|
|
33
|
+
updatePolicy(updates: Partial<FederationTrustPolicy>): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get current policy (for inspection/debugging).
|
|
36
|
+
*/
|
|
37
|
+
getPolicy(): Readonly<FederationTrustPolicy>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/federation/trust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAQzD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAInD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKrC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtD;;;OAGG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO;IAQV;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI;IAI3D;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,qBAAqB,CAAC;CAG7C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const DEFAULT_POLICY = {
|
|
2
|
+
allowedServers: [],
|
|
3
|
+
scopePermissions: {},
|
|
4
|
+
requireAuth: false,
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Federation trust enforcement.
|
|
8
|
+
*
|
|
9
|
+
* Layer 1 (implemented): Server allow-list
|
|
10
|
+
* Layer 2 (stub): Scope-based permissions
|
|
11
|
+
* Layer 3 (stub): Token-based auth
|
|
12
|
+
*/
|
|
13
|
+
export class TrustManager {
|
|
14
|
+
policy;
|
|
15
|
+
constructor(policy) {
|
|
16
|
+
this.policy = { ...DEFAULT_POLICY, ...policy };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if a system is allowed to connect (Layer 1).
|
|
20
|
+
* If allowedServers is empty, all servers are allowed (open federation).
|
|
21
|
+
*/
|
|
22
|
+
canConnect(systemId) {
|
|
23
|
+
if (this.policy.allowedServers.length === 0)
|
|
24
|
+
return true;
|
|
25
|
+
return this.policy.allowedServers.includes(systemId);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if routing from a remote system to a local scope is allowed (Layer 2 — stub).
|
|
29
|
+
* Currently always returns true.
|
|
30
|
+
*/
|
|
31
|
+
canRoute(fromSystem, toScope) {
|
|
32
|
+
// Stub: check scope permissions when implemented
|
|
33
|
+
const allowed = this.policy.scopePermissions[toScope];
|
|
34
|
+
if (!allowed)
|
|
35
|
+
return true; // No restrictions defined = allow all
|
|
36
|
+
return allowed.includes(fromSystem);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate authentication credentials for a system (Layer 3 — stub).
|
|
40
|
+
* Currently always returns true unless requireAuth is explicitly set.
|
|
41
|
+
*/
|
|
42
|
+
validateAuth(systemId, _credentials) {
|
|
43
|
+
if (!this.policy.requireAuth)
|
|
44
|
+
return true;
|
|
45
|
+
// Stub: when implemented, validate credentials against authTokens
|
|
46
|
+
const expectedToken = this.policy.authTokens?.[systemId];
|
|
47
|
+
if (!expectedToken)
|
|
48
|
+
return true; // No token configured = allow
|
|
49
|
+
return _credentials?.token === expectedToken;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update the trust policy at runtime.
|
|
53
|
+
*/
|
|
54
|
+
updatePolicy(updates) {
|
|
55
|
+
Object.assign(this.policy, updates);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get current policy (for inspection/debugging).
|
|
59
|
+
*/
|
|
60
|
+
getPolicy() {
|
|
61
|
+
return this.policy;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/federation/trust.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAA0B;IAC5C,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,EAAE;IACpB,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAwB;IAEtC,YAAY,MAAuC;QACjD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,QAAgB;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzD,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,UAAkB,EAAE,OAAe;QAC1C,iDAAiD;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC,sCAAsC;QACjE,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,YAAY,CACV,QAAgB,EAChB,YAAkD;QAElD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC1C,kEAAkE;QAClE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;QAC/D,OAAO,YAAY,EAAE,KAAK,KAAK,aAAa,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAuC;QAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { MessageRouter } from "./router/message-router.js";
|
|
3
|
+
import { TraceabilityLayer } from "./traceability/traceability.js";
|
|
4
|
+
import { IpcServer } from "./ipc/ipc-server.js";
|
|
5
|
+
import { MapClient } from "./map/map-client.js";
|
|
6
|
+
import { MailJsonRpcServer } from "./jsonrpc/mail-server.js";
|
|
7
|
+
import { PushNotifier } from "./push/notifier.js";
|
|
8
|
+
import { ConnectionManager } from "./federation/connection-manager.js";
|
|
9
|
+
import { WarmRegistry } from "./registry/warm-registry.js";
|
|
10
|
+
import type { InboxConfig } from "./types.js";
|
|
11
|
+
import type { Storage } from "./storage/interface.js";
|
|
12
|
+
export { InMemoryStorage } from "./storage/memory.js";
|
|
13
|
+
export { SqliteStorage } from "./storage/sqlite.js";
|
|
14
|
+
export { MessageRouter, normalizeContent } from "./router/message-router.js";
|
|
15
|
+
export { TraceabilityLayer } from "./traceability/traceability.js";
|
|
16
|
+
export { IpcServer } from "./ipc/ipc-server.js";
|
|
17
|
+
export { MapClient } from "./map/map-client.js";
|
|
18
|
+
export { InboxMcpServer } from "./mcp/mcp-server.js";
|
|
19
|
+
export { MailJsonRpcServer } from "./jsonrpc/mail-server.js";
|
|
20
|
+
export { PushNotifier, formatInboxMarkdown } from "./push/notifier.js";
|
|
21
|
+
export { ConnectionManager } from "./federation/connection-manager.js";
|
|
22
|
+
export type { DeliveryResult, IncomingMessageHandler } from "./federation/connection-manager.js";
|
|
23
|
+
export type { MapConnection, MapAgentConnectionClass, IncomingMapMessage } from "./map/map-client.js";
|
|
24
|
+
export { WarmRegistry } from "./registry/warm-registry.js";
|
|
25
|
+
export { RoutingEngine } from "./federation/routing-engine.js";
|
|
26
|
+
export { DeliveryQueue } from "./federation/delivery-queue.js";
|
|
27
|
+
export { TrustManager } from "./federation/trust.js";
|
|
28
|
+
export { parseAddress, formatAddress, isRemoteAddress, isBroadcastAddress, } from "./federation/address.js";
|
|
29
|
+
export type * from "./types.js";
|
|
30
|
+
export type { Storage, InboxQuery, ThreadQuery } from "./storage/interface.js";
|
|
31
|
+
export interface AgentInbox {
|
|
32
|
+
storage: Storage;
|
|
33
|
+
router: MessageRouter;
|
|
34
|
+
traceability: TraceabilityLayer;
|
|
35
|
+
ipcServer: IpcServer;
|
|
36
|
+
mapClient: MapClient;
|
|
37
|
+
jsonRpc: MailJsonRpcServer;
|
|
38
|
+
notifier: PushNotifier;
|
|
39
|
+
federation: ConnectionManager | null;
|
|
40
|
+
registry: WarmRegistry | null;
|
|
41
|
+
events: EventEmitter;
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export interface CreateOptions {
|
|
45
|
+
config?: Partial<InboxConfig>;
|
|
46
|
+
/** Use SQLite storage at this path (":memory:" for in-memory SQLite) */
|
|
47
|
+
sqlitePath?: string;
|
|
48
|
+
/** HTTP port for JSON-RPC endpoint (0 = disabled) */
|
|
49
|
+
httpPort?: number;
|
|
50
|
+
/** Webhook URLs for push notifications */
|
|
51
|
+
webhooks?: string[];
|
|
52
|
+
/** Enable federation with peer systems */
|
|
53
|
+
enableFederation?: boolean;
|
|
54
|
+
/** Use an externally-managed MAP connection instead of creating one.
|
|
55
|
+
* When provided, Agent Inbox borrows this connection for messaging
|
|
56
|
+
* but does not own its lifecycle (won't disconnect it on stop()). */
|
|
57
|
+
connection?: import("./map/map-client.js").MapConnection;
|
|
58
|
+
}
|
|
59
|
+
export declare function createAgentInbox(opts?: CreateOptions): Promise<AgentInbox>;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|