agent-comms 2.31.1 → 3.0.0

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 (82) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/core/agent-registry.d.ts +1 -3
  5. package/dist/core/agent-registry.d.ts.map +1 -1
  6. package/dist/core/agent-registry.js +0 -5
  7. package/dist/core/agent-registry.js.map +1 -1
  8. package/dist/core/bridge.d.ts +0 -3
  9. package/dist/core/bridge.d.ts.map +1 -1
  10. package/dist/core/bridge.js +0 -23
  11. package/dist/core/bridge.js.map +1 -1
  12. package/dist/core/comms-store.d.ts +1 -1
  13. package/dist/core/comms-store.js +1 -1
  14. package/dist/core/delivery-engine.d.ts +1 -5
  15. package/dist/core/delivery-engine.d.ts.map +1 -1
  16. package/dist/core/delivery-engine.js +0 -12
  17. package/dist/core/delivery-engine.js.map +1 -1
  18. package/dist/core/index.d.ts +0 -2
  19. package/dist/core/index.d.ts.map +1 -1
  20. package/dist/core/index.js +0 -1
  21. package/dist/core/index.js.map +1 -1
  22. package/dist/core/mesh-store.d.ts +1 -15
  23. package/dist/core/mesh-store.d.ts.map +1 -1
  24. package/dist/core/mesh-store.js +2 -52
  25. package/dist/core/mesh-store.js.map +1 -1
  26. package/dist/core/room-lifecycle.d.ts +1 -4
  27. package/dist/core/room-lifecycle.d.ts.map +1 -1
  28. package/dist/core/room-lifecycle.js +0 -12
  29. package/dist/core/room-lifecycle.js.map +1 -1
  30. package/dist/core/room-messaging.d.ts +1 -3
  31. package/dist/core/room-messaging.d.ts.map +1 -1
  32. package/dist/core/room-messaging.js +0 -4
  33. package/dist/core/room-messaging.js.map +1 -1
  34. package/dist/core/room-router.d.ts.map +1 -1
  35. package/dist/core/room-router.js +2 -11
  36. package/dist/core/room-router.js.map +1 -1
  37. package/dist/core/tool.d.ts +1 -20
  38. package/dist/core/tool.d.ts.map +1 -1
  39. package/dist/core/tool.js +1 -108
  40. package/dist/core/tool.js.map +1 -1
  41. package/dist/core/types.d.ts +0 -54
  42. package/dist/core/types.d.ts.map +1 -1
  43. package/dist/core/types.js +0 -29
  44. package/dist/core/types.js.map +1 -1
  45. package/dist/core/wire-protocol.d.ts +0 -33
  46. package/dist/core/wire-protocol.d.ts.map +1 -1
  47. package/dist/core/wire-protocol.js.map +1 -1
  48. package/dist/test/agent-registry.test.js +1 -40
  49. package/dist/test/agent-registry.test.js.map +1 -1
  50. package/dist/test/delivery-engine-directed-notify.test.js +0 -39
  51. package/dist/test/delivery-engine-directed-notify.test.js.map +1 -1
  52. package/dist/test/delivery-engine.test.js +1 -18
  53. package/dist/test/delivery-engine.test.js.map +1 -1
  54. package/dist/test/mesh-store-orchestration.test.js +2 -56
  55. package/dist/test/mesh-store-orchestration.test.js.map +1 -1
  56. package/dist/test/room-lifecycle-membership.test.js +0 -30
  57. package/dist/test/room-lifecycle-membership.test.js.map +1 -1
  58. package/dist/test/room-lifecycle-remote.test.js +2 -9
  59. package/dist/test/room-lifecycle-remote.test.js.map +1 -1
  60. package/dist/test/room-lifecycle.test.js +0 -49
  61. package/dist/test/room-lifecycle.test.js.map +1 -1
  62. package/dist/test/room-messaging-durable-send.test.js +0 -1
  63. package/dist/test/room-messaging-durable-send.test.js.map +1 -1
  64. package/dist/test/room-messaging.test.js +0 -13
  65. package/dist/test/room-messaging.test.js.map +1 -1
  66. package/package.json +1 -1
  67. package/dist/core/federation-bridge.d.ts +0 -32
  68. package/dist/core/federation-bridge.d.ts.map +0 -1
  69. package/dist/core/federation-bridge.js +0 -112
  70. package/dist/core/federation-bridge.js.map +0 -1
  71. package/dist/core/federation.d.ts +0 -125
  72. package/dist/core/federation.d.ts.map +0 -1
  73. package/dist/core/federation.js +0 -523
  74. package/dist/core/federation.js.map +0 -1
  75. package/dist/test/federation-bridge.test.d.ts +0 -2
  76. package/dist/test/federation-bridge.test.d.ts.map +0 -1
  77. package/dist/test/federation-bridge.test.js +0 -260
  78. package/dist/test/federation-bridge.test.js.map +0 -1
  79. package/dist/test/federation.integration.test.d.ts +0 -16
  80. package/dist/test/federation.integration.test.d.ts.map +0 -1
  81. package/dist/test/federation.integration.test.js +0 -210
  82. package/dist/test/federation.integration.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-comms",
3
- "version": "2.31.1",
3
+ "version": "3.0.0",
4
4
  "description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c",
@@ -1,32 +0,0 @@
1
- /**
2
- * FederationBridge — implements FederationManager's own FedCallbacks contract as a real class rather than a closure bag, so the inbound-from-remote-mesh handling (a federated agent becoming visible/gone, a federated room's message/join/leave) and the two outbound sync queries (getVisibleAgents/getFederatedRoomMemberships) live together instead of scattered across mesh-store.ts. Split out to reduce mesh-store.ts under the repo's max-lines cap.
3
- */
4
- import type { FedCallbacks } from "./federation.js";
5
- import type { DeliveryEngine } from "./delivery-engine.js";
6
- import type { AgentIdentity, Room, RoomMessage } from "./types.js";
7
- /** The state and DeliveryEngine operations FederationBridge needs from MeshStore -- the core agents/rooms/messages Maps are direct references into MeshStore's own fields, and deliveryEngine is the already-constructed instance (construction order: ... -\> deliveryEngine -\> federationBridge -\> federation), narrowed to only the membership/broadcast/delivery operations a federation callback ever needs. */
8
- export interface FederationBridgeDeps {
9
- agents: Map<string, AgentIdentity>;
10
- rooms: Map<string, Room>;
11
- messages: Map<string, RoomMessage[]>;
12
- deliveryEngine: Pick<DeliveryEngine, "bump" | "recordMemberOp" | "refreshMembership" | "broadcastPatch" | "deliverToRoom" | "deliverRoomMessageToMember">;
13
- }
14
- export declare class FederationBridge implements FedCallbacks {
15
- private readonly deps;
16
- constructor(deps: FederationBridgeDeps);
17
- /** Called when a remote agent becomes visible over a federation link -- stores it locally under a `fed:`-prefixed id to avoid collisions with local agents. */
18
- onAgentVisible(agent: AgentIdentity): Promise<void>;
19
- /** Called when a remote agent goes offline/disappears -- the agentId comes from the remote mesh, so this finds the locally prefixed version. */
20
- onAgentGone(agentId: string): Promise<void>;
21
- /** Called when a message arrives for a federated room -- stores it locally and delivers to every local room member. A `fed:`-prefixed member is a shadow record for a remote participant with no addressable mesh device of its own; federation.ts's own link forwarding, not this local fan-out, is what reaches them. */
22
- onRoomMessage(roomId: string, message: RoomMessage): Promise<void>;
23
- /** Called when a remote agent joins a federated room -- creates a shadow `fed:`-prefixed member and notifies local members. */
24
- onRoomJoin(roomId: string, agentId: string, _agentName: string): Promise<void>;
25
- /** Called when a remote agent leaves a federated room. */
26
- onRoomLeave(roomId: string, agentId: string): Promise<void>;
27
- /** Get all visible agents in the local mesh (for syncing to new links) -- excludes agents already federated in from elsewhere, to avoid re-broadcasting them back out. */
28
- getVisibleAgents(): AgentIdentity[];
29
- /** Get all federated rooms and their local member lists (for syncing to new links). */
30
- getFederatedRoomMemberships(): Map<string, string[]>;
31
- }
32
- //# sourceMappingURL=federation-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation-bridge.d.ts","sourceRoot":"","sources":["../../src/core/federation-bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnE,uZAAuZ;AACvZ,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,cAAc,EAAE,IAAI,CAClB,cAAc,EACZ,MAAM,GACN,gBAAgB,GAChB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,4BAA4B,CAC/B,CAAC;CACH;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,oBAAoB;IAEvD,+JAA+J;IACzJ,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAczD,gJAAgJ;IAC1I,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,2TAA2T;IACrT,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxE,+HAA+H;IACzH,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAwBhB,0DAA0D;IACpD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjE,0KAA0K;IAC1K,gBAAgB,IAAI,aAAa,EAAE;IAUnC,uFAAuF;IACvF,2BAA2B,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAUrD"}
@@ -1,112 +0,0 @@
1
- /**
2
- * FederationBridge — implements FederationManager's own FedCallbacks contract as a real class rather than a closure bag, so the inbound-from-remote-mesh handling (a federated agent becoming visible/gone, a federated room's message/join/leave) and the two outbound sync queries (getVisibleAgents/getFederatedRoomMemberships) live together instead of scattered across mesh-store.ts. Split out to reduce mesh-store.ts under the repo's max-lines cap.
3
- */
4
- export class FederationBridge {
5
- deps;
6
- constructor(deps) {
7
- this.deps = deps;
8
- }
9
- /** Called when a remote agent becomes visible over a federation link -- stores it locally under a `fed:`-prefixed id to avoid collisions with local agents. */
10
- async onAgentVisible(agent) {
11
- const remoteId = `fed:${agent.id}@${agent.harness}`;
12
- const remoteAgent = {
13
- ...agent,
14
- id: remoteId,
15
- tags: [...agent.tags, "federated"],
16
- };
17
- this.deps.agents.set(remoteId, remoteAgent);
18
- await this.deps.deliveryEngine.broadcastPatch({
19
- type: "agent_upsert",
20
- agent: remoteAgent,
21
- });
22
- }
23
- /** Called when a remote agent goes offline/disappears -- the agentId comes from the remote mesh, so this finds the locally prefixed version. */
24
- async onAgentGone(agentId) {
25
- const prefix = `fed:${agentId}@`;
26
- for (const [localId, agent] of this.deps.agents) {
27
- if (localId.startsWith(prefix)) {
28
- agent.status = "offline";
29
- this.deps.agents.set(localId, agent);
30
- await this.deps.deliveryEngine.broadcastPatch({
31
- type: "agent_offline",
32
- agentId: localId,
33
- });
34
- break;
35
- }
36
- }
37
- }
38
- /** Called when a message arrives for a federated room -- stores it locally and delivers to every local room member. A `fed:`-prefixed member is a shadow record for a remote participant with no addressable mesh device of its own; federation.ts's own link forwarding, not this local fan-out, is what reaches them. */
39
- async onRoomMessage(roomId, message) {
40
- const room = this.deps.rooms.get(roomId);
41
- if (room?.federated !== true)
42
- return;
43
- const arr = this.deps.messages.get(roomId) ?? [];
44
- arr.push(message);
45
- this.deps.messages.set(roomId, arr);
46
- for (const memberId of room.members) {
47
- if (memberId.startsWith("fed:"))
48
- continue;
49
- await this.deps.deliveryEngine.deliverRoomMessageToMember(roomId, memberId, message);
50
- }
51
- }
52
- /** Called when a remote agent joins a federated room -- creates a shadow `fed:`-prefixed member and notifies local members. */
53
- async onRoomJoin(roomId, agentId, _agentName) {
54
- const room = this.deps.rooms.get(roomId);
55
- if (room?.federated !== true)
56
- return;
57
- const remoteId = `fed:${agentId}`;
58
- if (!room.members.includes(remoteId)) {
59
- this.deps.deliveryEngine.bump(room);
60
- this.deps.deliveryEngine.recordMemberOp(room, "member", "join", remoteId);
61
- this.deps.deliveryEngine.refreshMembership(room);
62
- this.deps.rooms.set(roomId, room);
63
- await this.deps.deliveryEngine.broadcastPatch({
64
- type: "room_upsert",
65
- room,
66
- });
67
- }
68
- await this.deps.deliveryEngine.deliverToRoom(roomId, { type: "member_joined", room: roomId, agent: remoteId }, remoteId);
69
- }
70
- /** Called when a remote agent leaves a federated room. */
71
- async onRoomLeave(roomId, agentId) {
72
- const room = this.deps.rooms.get(roomId);
73
- if (room?.federated !== true)
74
- return;
75
- const remoteId = `fed:${agentId}`;
76
- this.deps.deliveryEngine.bump(room);
77
- this.deps.deliveryEngine.recordMemberOp(room, "member", "leave", remoteId);
78
- this.deps.deliveryEngine.refreshMembership(room);
79
- this.deps.rooms.set(roomId, room);
80
- await this.deps.deliveryEngine.broadcastPatch({
81
- type: "room_upsert",
82
- room,
83
- });
84
- await this.deps.deliveryEngine.deliverToRoom(roomId, {
85
- type: "member_left",
86
- room: roomId,
87
- agent: remoteId,
88
- });
89
- }
90
- /** Get all visible agents in the local mesh (for syncing to new links) -- excludes agents already federated in from elsewhere, to avoid re-broadcasting them back out. */
91
- getVisibleAgents() {
92
- const result = [];
93
- for (const agent of this.deps.agents.values()) {
94
- if (agent.visibility === "visible" && !agent.id.startsWith("fed:")) {
95
- result.push(agent);
96
- }
97
- }
98
- return result;
99
- }
100
- /** Get all federated rooms and their local member lists (for syncing to new links). */
101
- getFederatedRoomMemberships() {
102
- const result = new Map();
103
- for (const [roomId, room] of this.deps.rooms) {
104
- if (room.federated === true) {
105
- const localMembers = room.members.filter((m) => !m.startsWith("fed:"));
106
- result.set(roomId, localMembers);
107
- }
108
- }
109
- return result;
110
- }
111
- }
112
- //# sourceMappingURL=federation-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation-bridge.js","sourceRoot":"","sources":["../../src/core/federation-bridge.ts"],"names":[],"mappings":"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"}
@@ -1,125 +0,0 @@
1
- /**
2
- * FederationManager — manages TLS links between mesh coordinators.
3
- *
4
- * Federation links are persistent TLS connections between coordinators on
5
- * different machines. They forward agent presence, room memberships, and
6
- * messages for rooms marked as federated. Non-federated rooms never leave
7
- * the local mesh.
8
- *
9
- * Each link uses certificate pinning (the same trust model as TlsTransport).
10
- * The wire protocol runs over the same newline-delimited JSON framing as the
11
- * local mesh, but with `fed_*` method types.
12
- */
13
- import * as tls from "node:tls";
14
- import type { AgentIdentity, RoomMessage } from "./types.js";
15
- import type { PeerIdentity } from "./identity.js";
16
- /** Represents an active federation link (outbound or inbound). */
17
- export interface FedLink {
18
- /** Unique ID for this link (assigned locally). */
19
- id: string;
20
- /** Remote mesh ID (received during handshake). */
21
- remoteMeshId: string;
22
- /** Human-readable name for the remote mesh. */
23
- remoteName: string;
24
- /** The TLS socket. */
25
- socket: tls.TLSSocket;
26
- /** Whether the handshake has completed successfully. */
27
- ready: boolean;
28
- /** Direction of the connection. */
29
- direction: "outbound" | "inbound";
30
- }
31
- /** Callbacks the FederationManager uses to interact with local mesh state. */
32
- export interface FedCallbacks {
33
- /** Called when a remote agent becomes visible over a federation link. */
34
- onAgentVisible: (agent: AgentIdentity) => Promise<void>;
35
- /** Called when a remote agent goes offline/disappears. */
36
- onAgentGone: (agentId: string) => Promise<void>;
37
- /** Called when a message arrives for a federated room. */
38
- onRoomMessage: (roomId: string, message: RoomMessage) => Promise<void>;
39
- /** Called when a remote agent joins a federated room. */
40
- onRoomJoin: (roomId: string, agentId: string, agentName: string) => Promise<void>;
41
- /** Called when a remote agent leaves a federated room. */
42
- onRoomLeave: (roomId: string, agentId: string) => Promise<void>;
43
- /** Get all visible agents in the local mesh (for syncing to new links). */
44
- getVisibleAgents: () => AgentIdentity[];
45
- /** Get all federated rooms and their member lists (for syncing to new links). */
46
- getFederatedRoomMemberships: () => Map<string, string[]>;
47
- }
48
- export declare class FederationManager {
49
- private readonly links;
50
- private readonly identity;
51
- private readonly meshId;
52
- private readonly meshName;
53
- private readonly callbacks;
54
- private readonly pingTimers;
55
- private shutDown;
56
- private readonly pendingPongs;
57
- /**
58
- * Certificate fingerprints this instance will federate with, inbound or outbound. Empty by default — federation trusts nobody until an operator explicitly pins a remote mesh's fingerprint, the same no-CA, pin-the-key trust model ordinary peer connections already use.
59
- */
60
- private readonly trustedFingerprints;
61
- private listener;
62
- constructor(meshId: string, meshName: string, callbacks: Readonly<FedCallbacks>);
63
- /** The TLS identity used for federation connections. */
64
- get tlsIdentity(): PeerIdentity;
65
- /** Pin a remote mesh's certificate fingerprint as trusted for federation. */
66
- addTrustedFingerprint(fingerprint: string): void;
67
- /** Remove a previously pinned fingerprint. Existing links using it are not torn down. */
68
- removeTrustedFingerprint(fingerprint: string): void;
69
- /** List currently trusted fingerprints. */
70
- listTrustedFingerprints(): string[];
71
- /**
72
- * Verify the certificate a connected TLS socket presented against the trusted-fingerprint allowlist. Returns the presented fingerprint when trusted, `undefined` (and destroys the socket) otherwise.
73
- *
74
- * This is the check that was missing entirely before: the socket was accepted with `rejectUnauthorized: false` (required, since these are self-signed certs with no CA) but nothing then verified *which* self-signed cert was presented, so any certificate was accepted as a valid federation peer.
75
- */
76
- private verifyPeerOrDestroy;
77
- /**
78
- * Establish an outbound federation link to a remote coordinator.
79
- * Returns the local link ID once the handshake completes.
80
- */
81
- connect(host: string, port: number, name?: string): Promise<string>;
82
- /**
83
- * Handle an incoming TLS connection that sent a fed_handshake.
84
- * Called by the transport layer when a federation connection arrives.
85
- */
86
- handleInbound(socket: tls.TLSSocket): Promise<string>;
87
- /** Disconnect a specific federation link. */
88
- disconnect(linkId: string): Promise<void>;
89
- /** List all active federation links. */
90
- listLinks(): FedLink[];
91
- /** Broadcast an agent visibility event to all ready links. */
92
- broadcastAgentVisible(agent: AgentIdentity): Promise<void>;
93
- /** Broadcast an agent gone event to all ready links. */
94
- broadcastAgentGone(agentId: string): Promise<void>;
95
- /** Forward a room message to all ready links (federated rooms only). */
96
- forwardRoomMessage(roomId: string, message: RoomMessage): Promise<void>;
97
- /** Broadcast a room join to all ready links. */
98
- broadcastRoomJoin(roomId: string, agentId: string, agentName: string): Promise<void>;
99
- /** Broadcast a room leave to all ready links. */
100
- broadcastRoomLeave(roomId: string, agentId: string): Promise<void>;
101
- /**
102
- * Start listening for inbound federation connections. Every accepted connection is routed through `handleInbound()`, which enforces the trusted-fingerprint check before a link is ever created — nothing here bypasses that check.
103
- *
104
- * Previously nothing in the shipped product called `handleInbound()` at all: it existed only as a function the integration test invoked directly against a hand-rolled `tls.createServer`. This is that server, promoted to real code.
105
- */
106
- listen(host: string, port: number): Promise<void>;
107
- /** Stop accepting new inbound federation connections. Existing links are unaffected. */
108
- stopListening(): Promise<void>;
109
- shutdown(): Promise<void>;
110
- private tlsConnect;
111
- private wireSocket;
112
- private handleMessage;
113
- /**
114
- * After handshake, push our visible agents and federated room memberships
115
- * to the newly connected link.
116
- */
117
- private syncStateToLink;
118
- private waitForHandshake;
119
- private startPing;
120
- private sendPing;
121
- private writeToSocket;
122
- private broadcastToReady;
123
- private clearLinkTimers;
124
- }
125
- //# sourceMappingURL=federation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/core/federation.ts"],"names":[],"mappings":"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"}