agent-comms 2.5.0 → 2.7.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 (48) 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/bridge-mesh.d.ts.map +1 -1
  5. package/dist/core/bridge-mesh.js +1 -1
  6. package/dist/core/bridge-mesh.js.map +1 -1
  7. package/dist/core/bridge.d.ts +4 -0
  8. package/dist/core/bridge.d.ts.map +1 -1
  9. package/dist/core/bridge.js +29 -0
  10. package/dist/core/bridge.js.map +1 -1
  11. package/dist/core/mesh-store.d.ts +23 -0
  12. package/dist/core/mesh-store.d.ts.map +1 -1
  13. package/dist/core/mesh-store.js +140 -3
  14. package/dist/core/mesh-store.js.map +1 -1
  15. package/dist/core/room-token-verification.d.ts +2 -0
  16. package/dist/core/room-token-verification.d.ts.map +1 -1
  17. package/dist/core/room-token-verification.js +2 -2
  18. package/dist/core/room-token-verification.js.map +1 -1
  19. package/dist/core/tool.d.ts +9 -0
  20. package/dist/core/tool.d.ts.map +1 -1
  21. package/dist/core/tool.js +52 -0
  22. package/dist/core/tool.js.map +1 -1
  23. package/dist/core/transport.d.ts +6 -0
  24. package/dist/core/transport.d.ts.map +1 -1
  25. package/dist/core/types.d.ts +22 -0
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/types.js +12 -0
  28. package/dist/core/types.js.map +1 -1
  29. package/dist/core/wire-mesh-transport.d.ts +5 -2
  30. package/dist/core/wire-mesh-transport.d.ts.map +1 -1
  31. package/dist/core/wire-mesh-transport.js +12 -2
  32. package/dist/core/wire-mesh-transport.js.map +1 -1
  33. package/dist/test/downtime-replay.integration.test.js +1 -1
  34. package/dist/test/downtime-replay.integration.test.js.map +1 -1
  35. package/dist/test/identity-restart.integration.test.js +1 -1
  36. package/dist/test/identity-restart.integration.test.js.map +1 -1
  37. package/dist/test/room-admission-tool-actions.test.d.ts +5 -0
  38. package/dist/test/room-admission-tool-actions.test.d.ts.map +1 -0
  39. package/dist/test/room-admission-tool-actions.test.js +160 -0
  40. package/dist/test/room-admission-tool-actions.test.js.map +1 -0
  41. package/dist/test/room-join-admission.test.d.ts +7 -0
  42. package/dist/test/room-join-admission.test.d.ts.map +1 -0
  43. package/dist/test/room-join-admission.test.js +195 -0
  44. package/dist/test/room-join-admission.test.js.map +1 -0
  45. package/dist/test/test-transport.d.ts.map +1 -1
  46. package/dist/test/test-transport.js +1 -1
  47. package/dist/test/test-transport.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Unit tests for room.join admission (P3.4): the owner-side handler that holds a request open until a human decides, and the requester-side joinRoom path that sends a real wire-level request for a room this store has never seen replicated.
3
+ *
4
+ * Deliberately unit-level, not a full two-peer integration test: MeshStore's own legacy full-state-sync (still active per P3.3's "both paths coexist" transition) makes any two mesh-connected stores instantly aware of every room the moment they connect, so a genuinely two-peer test can never actually exercise the "room I've never heard of" case this code exists for -- exactly the scenario section 4 of the design doc names as a real regression, not something a live two-store test can reach today. Testing the handler and the remote-join path directly, against fakes, is the only way to exercise this code before P3.8 retires the legacy path.
5
+ */
6
+ import * as fs from "node:fs";
7
+ import * as path from "node:path";
8
+ import { tmpdir } from "node:os";
9
+ import * as assert from "node:assert/strict";
10
+ import { describe, it } from "node:test";
11
+ import { deviceIdFromHex, deviceIdToHex, } from "wire-mesh-core/domain/device-id";
12
+ import { createSystemClock } from "wire-mesh-core/adapters/system-clock";
13
+ import { mintCapabilityToken } from "wire-mesh-core/domain/tokens";
14
+ import { MeshStore } from "../core/mesh-store.js";
15
+ import { ownerNamedRoomPath } from "../core/room-path.js";
16
+ import { loadOrCreateIdentity, loadRoomTokens, } from "../core/identity-store.js";
17
+ import { toIdentityPort } from "../core/wire-mesh-identity.js";
18
+ import { wireTestTransport } from "./test-transport.js";
19
+ const REQUESTER_ID = "b".repeat(64);
20
+ function fakeRequest(scopePath) {
21
+ const responses = [];
22
+ const request = {
23
+ requestId: 1,
24
+ command: { verb: "room:member", params: { verb: "room.join" } },
25
+ scope: { kind: "room", path: scopePath },
26
+ respond: async (outcome) => {
27
+ responses.push(outcome);
28
+ },
29
+ };
30
+ return { request, responses };
31
+ }
32
+ describe("handleRoomJoin (owner side)", () => {
33
+ it("holds the request open, then grants a working token on acceptance", async () => {
34
+ const store = new MeshStore();
35
+ await wireTestTransport(store);
36
+ const owner = await store.registerAgent({
37
+ name: "owner",
38
+ harness: "pi",
39
+ cwd: "/tmp/p",
40
+ pid: process.pid,
41
+ visibility: "visible",
42
+ tags: [],
43
+ });
44
+ const room = await store.createRoom({
45
+ name: "general",
46
+ type: "public",
47
+ owner: owner.id,
48
+ description: "",
49
+ });
50
+ const handler = store.roomVerbHandlers["room.join"];
51
+ assert.ok(handler, "expected a registered room.join handler");
52
+ const handle = { id: REQUESTER_ID };
53
+ const { request } = fakeRequest(room.id);
54
+ const outcomePromise = handler(request, handle);
55
+ assert.deepEqual(store.listPendingRoomJoins(), [
56
+ { roomPath: room.id, requesterId: REQUESTER_ID },
57
+ ]);
58
+ store.acceptRoomJoin(room.id, REQUESTER_ID);
59
+ const outcome = await outcomePromise;
60
+ assert.equal(outcome.result, "ok");
61
+ if (outcome.result !== "ok")
62
+ return;
63
+ assert.deepEqual(store.listPendingRoomJoins(), []);
64
+ const token = outcome["granted-token"];
65
+ assert.ok(token !== undefined, "expected a granted-token in the outcome");
66
+ const roomAfterJoin = await store.getRoom(room.id);
67
+ assert.ok(roomAfterJoin?.members.includes(REQUESTER_ID));
68
+ });
69
+ it("denies the request without minting anything on rejection", async () => {
70
+ const store = new MeshStore();
71
+ await wireTestTransport(store);
72
+ const owner = await store.registerAgent({
73
+ name: "owner",
74
+ harness: "pi",
75
+ cwd: "/tmp/p",
76
+ pid: process.pid,
77
+ visibility: "visible",
78
+ tags: [],
79
+ });
80
+ const room = await store.createRoom({
81
+ name: "general",
82
+ type: "public",
83
+ owner: owner.id,
84
+ description: "",
85
+ });
86
+ const handler = store.roomVerbHandlers["room.join"];
87
+ assert.ok(handler);
88
+ const handle = { id: REQUESTER_ID };
89
+ const { request } = fakeRequest(room.id);
90
+ const outcomePromise = handler(request, handle);
91
+ store.rejectRoomJoin(room.id, REQUESTER_ID);
92
+ const outcome = await outcomePromise;
93
+ assert.equal(outcome.result, "error");
94
+ const roomAfterReject = await store.getRoom(room.id);
95
+ assert.equal(roomAfterReject?.members.includes(REQUESTER_ID), false);
96
+ });
97
+ it("refuses a DM path outright, with no pending entry created", async () => {
98
+ const store = new MeshStore();
99
+ await wireTestTransport(store);
100
+ const dmPath = `${deviceIdToHex(deviceIdFromHex("c".repeat(64)))}+${deviceIdToHex(deviceIdFromHex("d".repeat(64)))}`;
101
+ const handler = store.roomVerbHandlers["room.join"];
102
+ assert.ok(handler);
103
+ const handle = { id: REQUESTER_ID };
104
+ const { request } = fakeRequest(dmPath);
105
+ const outcome = await handler(request, handle);
106
+ assert.equal(outcome.result, "error");
107
+ assert.deepEqual(store.listPendingRoomJoins(), []);
108
+ });
109
+ it("refuses a named room this store doesn't own", async () => {
110
+ const store = new MeshStore();
111
+ await wireTestTransport(store);
112
+ const someoneElse = "e".repeat(64);
113
+ const roomPath = ownerNamedRoomPath(someoneElse, "general");
114
+ const handler = store.roomVerbHandlers["room.join"];
115
+ assert.ok(handler);
116
+ const handle = { id: REQUESTER_ID };
117
+ const { request } = fakeRequest(roomPath);
118
+ const outcome = await handler(request, handle);
119
+ assert.equal(outcome.result, "error");
120
+ assert.deepEqual(store.listPendingRoomJoins(), []);
121
+ });
122
+ });
123
+ describe("joinRoom (requester side, remote path)", () => {
124
+ it("sends a real room.join request and persists the granted token for a room it has never seen", async () => {
125
+ const store = new MeshStore();
126
+ const slot = {
127
+ harness: "test",
128
+ cwd: "req",
129
+ dir: fs.mkdtempSync(path.join(tmpdir(), "agent-comms-join-remote-")),
130
+ };
131
+ const identity = loadOrCreateIdentity(slot);
132
+ store.peerId = deviceIdToHex(Uint8Array.from(identity.deviceId));
133
+ const identityPort = await toIdentityPort(identity);
134
+ store.setIdentity({
135
+ identity: identityPort,
136
+ clock: createSystemClock(),
137
+ slot,
138
+ });
139
+ const ownerId = "f".repeat(64);
140
+ const roomPath = ownerNamedRoomPath(ownerId, "general");
141
+ // A real, validly-minted token -- roomJoinOkSchema validates the wire response's own granted-token shape against the real CapabilityToken schema, so a hand-rolled fixture would just fail that validation. Minted here by the requester's own identity purely as a stand-in for "any real token the owner could have sent"; who actually signed it plays no part in this test, only that saveRoomToken's own CapabilityToken contract is satisfied.
142
+ const grantedTokenVerdict = await mintCapabilityToken({
143
+ identity: identityPort,
144
+ clock: createSystemClock(),
145
+ tokenId: new Uint8Array([1]),
146
+ bearer: deviceIdFromHex(store.peerId),
147
+ capability: "room:member",
148
+ scope: { kind: "room", path: roomPath },
149
+ expires: Date.now() + 60_000,
150
+ delegationsRemaining: 0,
151
+ });
152
+ assert.ok(grantedTokenVerdict.ok, "expected the fixture token to mint successfully");
153
+ if (!grantedTokenVerdict.ok)
154
+ return;
155
+ const grantedToken = grantedTokenVerdict.token;
156
+ let capturedRoomPath;
157
+ const fakeTransport = {
158
+ dataPort: 0,
159
+ isCoordinator: false,
160
+ hasCoordinatorConnection: false,
161
+ startDataServer: async () => { },
162
+ connectToCoordinator: async () => { },
163
+ becomeCoordinator: async () => { },
164
+ connectToPeer: async () => { },
165
+ send: async () => { },
166
+ acceptConnection: async () => { },
167
+ rejectConnection: async () => { },
168
+ connectToRemote: async () => { },
169
+ broadcast: async () => { },
170
+ sendRoomRequest: async (_memberId, command, scope) => {
171
+ capturedRoomPath = scope.path;
172
+ assert.deepEqual(command.params, { verb: "room.join" });
173
+ return {
174
+ result: "ok",
175
+ "granted-token": grantedToken,
176
+ members: [{ device: deviceIdFromHex(store.peerId) }],
177
+ };
178
+ },
179
+ addListener: async () => "id",
180
+ removeListener: async () => { },
181
+ listListeners: () => [],
182
+ shutdown: async () => { },
183
+ unref: () => { },
184
+ };
185
+ store.setTransport(fakeTransport);
186
+ assert.equal(await store.getRoom(roomPath), undefined);
187
+ const joined = await store.joinRoom(roomPath, store.peerId);
188
+ assert.equal(joined.id, roomPath);
189
+ assert.equal(capturedRoomPath, roomPath);
190
+ assert.ok(joined.members.includes(store.peerId));
191
+ const tokens = loadRoomTokens(slot);
192
+ assert.ok(tokens[roomPath] !== undefined, "expected the granted token to be persisted");
193
+ });
194
+ });
195
+ //# sourceMappingURL=room-join-admission.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-join-admission.test.js","sourceRoot":"","sources":["../../src/test/room-join-admission.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"test-transport.d.ts","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;AASjc,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,6XAA6X;AAC7X,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAoBvB;AAMD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,OAAO,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,SAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAYf"}
1
+ {"version":3,"file":"test-transport.d.ts","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;AASjc,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,6XAA6X;AAC7X,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAsBvB;AAMD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,OAAO,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,SAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -18,7 +18,7 @@ export async function wireTestTransport(store, slot) {
18
18
  const identity = loadOrCreateIdentity(resolvedSlot);
19
19
  // Every real bridge sets peerId to deviceIdToHex(identity.deviceId) before wiring the transport (createBridgeMesh) -- WireMeshTransport's own session bookkeeping is keyed by device-id, so a peer's advertised ID and the identity the other side actually authenticates the connection against must be the same value, or introduction/state-sync never recognises the peer as itself.
20
20
  store.peerId = deviceIdToHex(Uint8Array.from(identity.deviceId));
21
- store.setTransport(new WireMeshTransport(store.events, identity));
21
+ store.setTransport(new WireMeshTransport(store.events, identity, store.roomVerbHandlers));
22
22
  store.setIdentity({
23
23
  identity: await toIdentityPort(identity),
24
24
  clock: createSystemClock(),
@@ -1 +1 @@
1
- {"version":3,"file":"test-transport.js","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;AAEjc,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,6XAA6X;AAC7X,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAgB,EAChB,IAA6B;IAE7B,MAAM,YAAY,GAAiB,IAAI,IAAI;QACzC,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACd,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC;KACvE,CAAC;IACF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACpD,yXAAyX;IACzX,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,YAAY,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClE,KAAK,CAAC,WAAW,CAAC;QAChB,QAAQ,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAC;QACxC,KAAK,EAAE,iBAAiB,EAAE;QAC1B,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;IACH,4PAA4P;IAC5P,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,+cAA+c;AAC/c,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAC3C,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,SAAwB,EACxB,WAAmB,EACnB,SAAS,GAAG,2BAA2B;IAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,SAAS,CAAC,OAAO,WAAW,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"test-transport.js","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;AAEjc,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,6XAA6X;AAC7X,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAgB,EAChB,IAA6B;IAE7B,MAAM,YAAY,GAAiB,IAAI,IAAI;QACzC,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACd,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC;KACvE,CAAC;IACF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACpD,yXAAyX;IACzX,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,YAAY,CAChB,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CACtE,CAAC;IACF,KAAK,CAAC,WAAW,CAAC;QAChB,QAAQ,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAC;QACxC,KAAK,EAAE,iBAAiB,EAAE;QAC1B,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;IACH,4PAA4P;IAC5P,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,+cAA+c;AAC/c,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAC3C,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,SAAwB,EACxB,WAAmB,EACnB,SAAS,GAAG,2BAA2B;IAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,SAAS,CAAC,OAAO,WAAW,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-comms",
3
- "version": "2.5.0",
3
+ "version": "2.7.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@10.33.0",