agent-comms 2.10.0 → 2.12.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-state-sync.integration.test.d.ts","sourceRoot":"","sources":["../../src/test/room-state-sync.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Integration test for room-state sync (P3.6): a joiner's own local Room record gets the room's real name/description/type from room.join's response, and a later room.members refresh picks up changes made after the join (here, simulated by mutating the owner's own room record directly, since no rename/re-describe verb exists yet).
3
+ */
4
+ import * as assert from "node:assert/strict";
5
+ import { test } from "node:test";
6
+ import { MeshStore } from "../core/mesh-store.js";
7
+ import { waitFor, wireTestTransport } from "./test-transport.js";
8
+ let nextPort = 21_010;
9
+ function freshPort() {
10
+ nextPort += 1;
11
+ return nextPort;
12
+ }
13
+ async function makeConnectedPair(port) {
14
+ const owner = new MeshStore(port);
15
+ await wireTestTransport(owner);
16
+ await owner.init();
17
+ await owner.registerAgent({
18
+ name: "owner",
19
+ harness: "test",
20
+ cwd: "/test/owner",
21
+ pid: process.pid,
22
+ visibility: "visible",
23
+ tags: [],
24
+ });
25
+ const member = new MeshStore(port);
26
+ await wireTestTransport(member);
27
+ await member.init();
28
+ await member.registerAgent({
29
+ name: "member",
30
+ harness: "test",
31
+ cwd: "/test/member",
32
+ pid: process.pid,
33
+ visibility: "visible",
34
+ tags: [],
35
+ });
36
+ await waitFor(() => owner.serialise().agents[member.peerId] !== undefined, "owner sees the member agent");
37
+ return { owner, member };
38
+ }
39
+ /** Drives a real, admitted room.join round trip: sends the request, waits for the owner to see it pending, accepts it, and waits for the join to resolve. */
40
+ async function joinAndAccept(owner, member, roomId) {
41
+ const joinPromise = member.joinRoom(roomId, member.peerId);
42
+ await waitFor(() => owner
43
+ .listPendingRoomJoins()
44
+ .some((p) => p.roomPath === roomId && p.requesterId === member.peerId), "owner to see member's pending join request");
45
+ owner.acceptRoomJoin(roomId, member.peerId);
46
+ await joinPromise;
47
+ }
48
+ void test("a joiner's own local room record carries the room's real name, description, and type", async () => {
49
+ const { owner, member } = await makeConnectedPair(freshPort());
50
+ try {
51
+ const room = await owner.createRoom({
52
+ name: "General Chat",
53
+ type: "private",
54
+ owner: owner.peerId,
55
+ description: "the main room",
56
+ });
57
+ await joinAndAccept(owner, member, room.id);
58
+ const memberCopy = await member.getRoom(room.id);
59
+ assert.ok(memberCopy);
60
+ // createRoom slugs the raw name before storing it (General-Chat, not General Chat) -- the point of this assertion is that member's own copy matches owner's own stored value exactly, not the pre-slug input.
61
+ assert.equal(memberCopy.name, "General-Chat");
62
+ assert.equal(memberCopy.description, "the main room");
63
+ assert.equal(memberCopy.type, "private");
64
+ }
65
+ finally {
66
+ await member.shutdown();
67
+ await owner.shutdown();
68
+ }
69
+ });
70
+ void test("refreshRoomMembers re-syncs a member's own local room record from the owner", async () => {
71
+ const { owner, member } = await makeConnectedPair(freshPort());
72
+ try {
73
+ const room = await owner.createRoom({
74
+ name: "General Chat",
75
+ type: "public",
76
+ owner: owner.peerId,
77
+ description: "the main room",
78
+ });
79
+ await joinAndAccept(owner, member, room.id);
80
+ // A change on the owner's own side that room.join's own response never carries after the fact -- refreshRoomMembers is the only way member ever learns of it.
81
+ const ownerCopy = await owner.getRoom(room.id);
82
+ assert.ok(ownerCopy);
83
+ ownerCopy.description = "renamed after the join";
84
+ const refreshed = await member.refreshRoomMembers(room.id);
85
+ assert.equal(refreshed.description, "renamed after the join");
86
+ assert.ok(refreshed.members.includes(owner.peerId));
87
+ assert.ok(refreshed.members.includes(member.peerId));
88
+ const memberCopy = await member.getRoom(room.id);
89
+ assert.equal(memberCopy?.description, "renamed after the join");
90
+ }
91
+ finally {
92
+ await member.shutdown();
93
+ await owner.shutdown();
94
+ }
95
+ });
96
+ void test("refreshRoomMembers throws for a DM path -- no Room record exists to refresh", async () => {
97
+ const { owner, member } = await makeConnectedPair(freshPort());
98
+ try {
99
+ await assert.rejects(member.refreshRoomMembers(`${owner.peerId}+${member.peerId}`), /not found/i);
100
+ }
101
+ finally {
102
+ await member.shutdown();
103
+ await owner.shutdown();
104
+ }
105
+ });
106
+ //# sourceMappingURL=room-state-sync.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-state-sync.integration.test.js","sourceRoot":"","sources":["../../src/test/room-state-sync.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,IAAI,QAAQ,GAAG,MAAM,CAAC;AACtB,SAAS,SAAS;IAChB,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAI3C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,aAAa,CAAC;QACxB,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpB,MAAM,MAAM,CAAC,aAAa,CAAC;QACzB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,cAAc;QACnB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,OAAO,CACX,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,EAC3D,6BAA6B,CAC9B,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,6JAA6J;AAC7J,KAAK,UAAU,aAAa,CAC1B,KAAgB,EAChB,MAAiB,EACjB,MAAc;IAEd,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,CACX,GAAG,EAAE,CACH,KAAK;SACF,oBAAoB,EAAE;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,EAC1E,4CAA4C,CAC7C,CAAC;IACF,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,WAAW,CAAC;AACpB,CAAC;AAED,KAAK,IAAI,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;IAC3G,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAC;QAEH,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACtB,8MAA8M;QAC9M,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,KAAK,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;IAClG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAClC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5C,8JAA8J;QAC9J,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACrB,SAAS,CAAC,WAAW,GAAG,wBAAwB,CAAC;QAEjD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QAC9D,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAErD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,KAAK,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;IAClG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAClB,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,EAC7D,YAAY,CACb,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-comms",
3
- "version": "2.10.0",
3
+ "version": "2.12.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",