agent-comms 2.21.17 → 2.21.19
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-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/test/delivery-engine-delivery.test.d.ts +2 -0
- package/dist/test/delivery-engine-delivery.test.d.ts.map +1 -0
- package/dist/test/delivery-engine-delivery.test.js +740 -0
- package/dist/test/delivery-engine-delivery.test.js.map +1 -0
- package/dist/test/delivery-engine.test.d.ts +2 -0
- package/dist/test/delivery-engine.test.d.ts.map +1 -0
- package/dist/test/delivery-engine.test.js +690 -0
- package/dist/test/delivery-engine.test.js.map +1 -0
- package/dist/test/room-lifecycle-membership.test.d.ts +2 -0
- package/dist/test/room-lifecycle-membership.test.d.ts.map +1 -0
- package/dist/test/room-lifecycle-membership.test.js +577 -0
- package/dist/test/room-lifecycle-membership.test.js.map +1 -0
- package/dist/test/room-lifecycle-remote.test.d.ts +2 -0
- package/dist/test/room-lifecycle-remote.test.d.ts.map +1 -0
- package/dist/test/room-lifecycle-remote.test.js +391 -0
- package/dist/test/room-lifecycle-remote.test.js.map +1 -0
- package/dist/test/room-lifecycle.test.d.ts +2 -0
- package/dist/test/room-lifecycle.test.d.ts.map +1 -0
- package/dist/test/room-lifecycle.test.js +523 -0
- package/dist/test/room-lifecycle.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct, DI-based unit tests for RoomLifecycle -- room CRUD and the requester's own outbound half of the wire protocol, split across three files to stay under this repo's max-lines cap: this file covers createRoom, listRooms, and joinRoom/joinRemoteRoom. See room-lifecycle-remote.test.ts for refreshRoomMembers/requestDmAccess and room-lifecycle-membership.test.ts for getRoom/leaveRoom/leaveRemoteRoom/inviteToRoom/declineInvite/revokeMemberGrant/kickFromRoom/destroyRoom (both moved out to rebalance line counts after later gap-closing passes). Real identities and real minted tokens throughout (not opaque placeholders): RoomLifecycle genuinely mints capability tokens and parses roomJoinOkSchema/roomMembersOkSchema's own structural shape (a real COSE_Sign1 tuple, though never signature-verified by this class), so an arbitrary placeholder string fails the schema outright where room-messaging.test.ts's forwarding-only case could get away with one.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { bytesToHex, deviceIdFromHex } from "wire-mesh-core/domain/device-id";
|
|
9
|
+
import { mintCapabilityToken } from "wire-mesh-core/domain/tokens";
|
|
10
|
+
import { createSystemClock } from "wire-mesh-core/adapters/system-clock";
|
|
11
|
+
import { createRevocationView } from "wire-mesh-core/domain/revocation-view";
|
|
12
|
+
import { generateIdentity } from "../core/identity.js";
|
|
13
|
+
import { loadOrCreateIdentity, loadRoomTokens, saveRoomToken, } from "../core/identity-store.js";
|
|
14
|
+
import { toIdentityPort } from "../core/wire-mesh-identity.js";
|
|
15
|
+
import { dmRoomPath, ownerNamedRoomPath } from "../core/room-path.js";
|
|
16
|
+
import { randomId } from "../core/random-id.js";
|
|
17
|
+
import { RoomLifecycle, } from "../core/room-lifecycle.js";
|
|
18
|
+
const TOKEN_TTL_MS = 60_000;
|
|
19
|
+
function room(overrides = {}) {
|
|
20
|
+
return {
|
|
21
|
+
id: "room-1",
|
|
22
|
+
version: 1,
|
|
23
|
+
name: "room-name",
|
|
24
|
+
type: "public",
|
|
25
|
+
owner: "",
|
|
26
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
27
|
+
description: "a room",
|
|
28
|
+
members: [],
|
|
29
|
+
invited: [],
|
|
30
|
+
memberJoins: {},
|
|
31
|
+
memberLeaves: {},
|
|
32
|
+
invitedJoins: {},
|
|
33
|
+
invitedLeaves: {},
|
|
34
|
+
...overrides,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function agent(overrides = {}) {
|
|
38
|
+
return {
|
|
39
|
+
id: "",
|
|
40
|
+
version: 1,
|
|
41
|
+
name: "agent-name",
|
|
42
|
+
harness: "pi",
|
|
43
|
+
cwd: "/tmp/agent",
|
|
44
|
+
pid: 1,
|
|
45
|
+
startedAt: "2026-01-01T00:00:00.000Z",
|
|
46
|
+
visibility: "visible",
|
|
47
|
+
status: "active",
|
|
48
|
+
tags: [],
|
|
49
|
+
subscribedRooms: [],
|
|
50
|
+
...overrides,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function makeIdentities() {
|
|
54
|
+
const owner = generateIdentity();
|
|
55
|
+
const member = generateIdentity();
|
|
56
|
+
return {
|
|
57
|
+
ownerId: bytesToHex(Uint8Array.from(owner.deviceId)),
|
|
58
|
+
ownerPort: await toIdentityPort(owner),
|
|
59
|
+
memberId: bytesToHex(Uint8Array.from(member.deviceId)),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function mintRoomToken(issuerPort, bearerHex, roomPath) {
|
|
63
|
+
const clock = createSystemClock();
|
|
64
|
+
const verdict = await mintCapabilityToken({
|
|
65
|
+
identity: issuerPort,
|
|
66
|
+
clock,
|
|
67
|
+
tokenId: randomId(),
|
|
68
|
+
bearer: deviceIdFromHex(bearerHex),
|
|
69
|
+
capability: "room:member",
|
|
70
|
+
scope: { kind: "room", path: roomPath },
|
|
71
|
+
expires: clock.now() + TOKEN_TTL_MS,
|
|
72
|
+
delegationsRemaining: 0,
|
|
73
|
+
});
|
|
74
|
+
if (!verdict.ok)
|
|
75
|
+
throw new Error("expected the fixture token to mint successfully");
|
|
76
|
+
return verdict.token;
|
|
77
|
+
}
|
|
78
|
+
async function makeHarness() {
|
|
79
|
+
const ids = await makeIdentities();
|
|
80
|
+
const slotDir = fs.mkdtempSync(path.join(tmpdir(), "room-lifecycle-test-"));
|
|
81
|
+
const slot = { harness: "test", cwd: "room-lifecycle", dir: slotDir };
|
|
82
|
+
// saveRoomToken/saveIssuedRoomGrant write into this slot's own persisted identity file, which must already exist on disk -- unrelated to which crypto identity requireIdentity() uses for minting/verifying, purely a filesystem bookkeeping precondition.
|
|
83
|
+
loadOrCreateIdentity(slot);
|
|
84
|
+
const bump = vi.fn((readonlyEntity) => {
|
|
85
|
+
const entity = readonlyEntity;
|
|
86
|
+
entity.version += 1;
|
|
87
|
+
return entity;
|
|
88
|
+
});
|
|
89
|
+
const recordMemberOp = vi.fn((r, list, op, agentId) => {
|
|
90
|
+
const joins = list === "member" ? r.memberJoins : r.invitedJoins;
|
|
91
|
+
const leaves = list === "member" ? r.memberLeaves : r.invitedLeaves;
|
|
92
|
+
if (op === "join")
|
|
93
|
+
joins[agentId] = r.version;
|
|
94
|
+
else
|
|
95
|
+
leaves[agentId] = r.version;
|
|
96
|
+
});
|
|
97
|
+
const refreshMembership = vi.fn((r) => {
|
|
98
|
+
r.members = Object.keys(r.memberJoins).filter((id) => (r.memberJoins[id] ?? 0) > (r.memberLeaves[id] ?? 0));
|
|
99
|
+
r.invited = Object.keys(r.invitedJoins).filter((id) => (r.invitedJoins[id] ?? 0) > (r.invitedLeaves[id] ?? 0));
|
|
100
|
+
});
|
|
101
|
+
const broadcastPatch = vi.fn().mockResolvedValue(undefined);
|
|
102
|
+
const deliverToRoom = vi.fn().mockResolvedValue(undefined);
|
|
103
|
+
const deliverLocallyAndBroadcast = vi.fn().mockResolvedValue(undefined);
|
|
104
|
+
const broadcastRoomJoin = vi.fn().mockResolvedValue(undefined);
|
|
105
|
+
const broadcastRoomLeave = vi.fn().mockResolvedValue(undefined);
|
|
106
|
+
const broadcastRevocation = vi.fn().mockResolvedValue(undefined);
|
|
107
|
+
const sendRoomRequest = vi.fn().mockResolvedValue({
|
|
108
|
+
result: "error",
|
|
109
|
+
code: "not_connected",
|
|
110
|
+
});
|
|
111
|
+
const deps = {
|
|
112
|
+
rooms: new Map(),
|
|
113
|
+
messages: new Map(),
|
|
114
|
+
agents: new Map(),
|
|
115
|
+
dmRequestsInitiatedByMe: new Set(),
|
|
116
|
+
getPeerId: () => ids.ownerId,
|
|
117
|
+
requireIdentity: () => ({
|
|
118
|
+
identity: ids.ownerPort,
|
|
119
|
+
clock: createSystemClock(),
|
|
120
|
+
slot,
|
|
121
|
+
revocation: createRevocationView(),
|
|
122
|
+
}),
|
|
123
|
+
requireTransport: () => ({ sendRoomRequest, broadcastRevocation }),
|
|
124
|
+
deliveryEngine: {
|
|
125
|
+
bump,
|
|
126
|
+
recordMemberOp,
|
|
127
|
+
refreshMembership,
|
|
128
|
+
broadcastPatch,
|
|
129
|
+
deliverToRoom,
|
|
130
|
+
deliverLocallyAndBroadcast,
|
|
131
|
+
},
|
|
132
|
+
federation: { broadcastRoomJoin, broadcastRoomLeave },
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
deps,
|
|
136
|
+
lifecycle: new RoomLifecycle(deps),
|
|
137
|
+
ids,
|
|
138
|
+
slotDir,
|
|
139
|
+
bump,
|
|
140
|
+
recordMemberOp,
|
|
141
|
+
refreshMembership,
|
|
142
|
+
broadcastPatch,
|
|
143
|
+
deliverToRoom,
|
|
144
|
+
deliverLocallyAndBroadcast,
|
|
145
|
+
broadcastRoomJoin,
|
|
146
|
+
broadcastRoomLeave,
|
|
147
|
+
sendRoomRequest,
|
|
148
|
+
broadcastRevocation,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function roomJoinOkOutcome(token, members, extra = {}) {
|
|
152
|
+
return {
|
|
153
|
+
result: "ok",
|
|
154
|
+
"granted-token": token,
|
|
155
|
+
members: members.map((hex) => ({ device: deviceIdFromHex(hex) })),
|
|
156
|
+
...extra,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function roomMembersOkOutcome(members, extra = {}) {
|
|
160
|
+
return {
|
|
161
|
+
result: "ok",
|
|
162
|
+
members: members.map((hex) => ({ device: deviceIdFromHex(hex) })),
|
|
163
|
+
...extra,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// mintOwnerRootGrant's `if (!verdict.ok)` failure branch (and the two StringLiteral mutants Stryker raises inside its error message) is genuinely unreachable with the real crypto this test suite uses throughout: mintCapabilityToken only fails its own internal delegation-narrowing checks, and a parent-less, delegationsRemaining:0 root mint against a validly-generated identity has no narrowing to fail. Forcing a failure here would need either a fake identity port (defeating the whole point of using real crypto to catch real signature/schema bugs elsewhere in this file) or reaching into mintCapabilityToken's own internals -- left undocumented-but-untested rather than chased with a contrived fixture, matching this session's own diminishing-returns precedent for similarly unreachable mint-failure branches.
|
|
167
|
+
describe("RoomLifecycle — createRoom", () => {
|
|
168
|
+
it("mints and persists the owner's own root grant", async () => {
|
|
169
|
+
const h = await makeHarness();
|
|
170
|
+
const created = await h.lifecycle.createRoom({
|
|
171
|
+
name: "My Room",
|
|
172
|
+
type: "public",
|
|
173
|
+
owner: h.ids.ownerId,
|
|
174
|
+
description: "a room",
|
|
175
|
+
});
|
|
176
|
+
const { slot } = h.deps.requireIdentity();
|
|
177
|
+
expect(loadRoomTokens(slot)[created.id]).toBeDefined();
|
|
178
|
+
});
|
|
179
|
+
it("slugs the given name into the room-path grammar", async () => {
|
|
180
|
+
const h = await makeHarness();
|
|
181
|
+
const created = await h.lifecycle.createRoom({
|
|
182
|
+
name: "My Cool Room!",
|
|
183
|
+
type: "public",
|
|
184
|
+
owner: h.ids.ownerId,
|
|
185
|
+
description: "",
|
|
186
|
+
});
|
|
187
|
+
expect(created.name).toBe("My-Cool-Room");
|
|
188
|
+
});
|
|
189
|
+
it("prefixes the local name with an underscore for a secret room", async () => {
|
|
190
|
+
const h = await makeHarness();
|
|
191
|
+
const created = await h.lifecycle.createRoom({
|
|
192
|
+
name: "hidden",
|
|
193
|
+
type: "secret",
|
|
194
|
+
owner: h.ids.ownerId,
|
|
195
|
+
description: "",
|
|
196
|
+
});
|
|
197
|
+
expect(created.id).toBe(ownerNamedRoomPath(h.ids.ownerId, "_hidden"));
|
|
198
|
+
});
|
|
199
|
+
it("throws ROOM_EXISTS naming the exact id when the room already exists", async () => {
|
|
200
|
+
const h = await makeHarness();
|
|
201
|
+
await h.lifecycle.createRoom({
|
|
202
|
+
name: "dup",
|
|
203
|
+
type: "public",
|
|
204
|
+
owner: h.ids.ownerId,
|
|
205
|
+
description: "",
|
|
206
|
+
});
|
|
207
|
+
const id = ownerNamedRoomPath(h.ids.ownerId, "dup");
|
|
208
|
+
await expect(h.lifecycle.createRoom({
|
|
209
|
+
name: "dup",
|
|
210
|
+
type: "public",
|
|
211
|
+
owner: h.ids.ownerId,
|
|
212
|
+
description: "",
|
|
213
|
+
})).rejects.toMatchObject({
|
|
214
|
+
message: `Room ${id} already exists`,
|
|
215
|
+
code: "ROOM_EXISTS",
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
it("defaults federated to false when omitted", async () => {
|
|
219
|
+
const h = await makeHarness();
|
|
220
|
+
const created = await h.lifecycle.createRoom({
|
|
221
|
+
name: "r",
|
|
222
|
+
type: "public",
|
|
223
|
+
owner: h.ids.ownerId,
|
|
224
|
+
description: "",
|
|
225
|
+
});
|
|
226
|
+
expect(created.federated).toBe(false);
|
|
227
|
+
});
|
|
228
|
+
it("honours an explicit federated: true", async () => {
|
|
229
|
+
const h = await makeHarness();
|
|
230
|
+
const created = await h.lifecycle.createRoom({
|
|
231
|
+
name: "r",
|
|
232
|
+
type: "public",
|
|
233
|
+
owner: h.ids.ownerId,
|
|
234
|
+
description: "",
|
|
235
|
+
federated: true,
|
|
236
|
+
});
|
|
237
|
+
expect(created.federated).toBe(true);
|
|
238
|
+
});
|
|
239
|
+
it("seeds an empty message history and broadcasts a room_upsert", async () => {
|
|
240
|
+
const h = await makeHarness();
|
|
241
|
+
const created = await h.lifecycle.createRoom({
|
|
242
|
+
name: "r",
|
|
243
|
+
type: "public",
|
|
244
|
+
owner: h.ids.ownerId,
|
|
245
|
+
description: "",
|
|
246
|
+
});
|
|
247
|
+
expect(h.deps.messages.get(created.id)).toEqual([]);
|
|
248
|
+
expect(h.broadcastPatch).toHaveBeenCalledWith({
|
|
249
|
+
type: "room_upsert",
|
|
250
|
+
room: created,
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
it("seeds members/memberJoins with exactly the owner", async () => {
|
|
254
|
+
const h = await makeHarness();
|
|
255
|
+
const created = await h.lifecycle.createRoom({
|
|
256
|
+
name: "r",
|
|
257
|
+
type: "public",
|
|
258
|
+
owner: h.ids.ownerId,
|
|
259
|
+
description: "",
|
|
260
|
+
});
|
|
261
|
+
expect(created.members).toEqual([h.ids.ownerId]);
|
|
262
|
+
expect(created.memberJoins).toEqual({ [h.ids.ownerId]: 1 });
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe("RoomLifecycle — listRooms", () => {
|
|
266
|
+
it("includes public and private rooms regardless of membership", async () => {
|
|
267
|
+
const h = await makeHarness();
|
|
268
|
+
h.deps.rooms.set("pub", room({ id: "pub", type: "public", members: [] }));
|
|
269
|
+
h.deps.rooms.set("priv", room({ id: "priv", type: "private", members: [] }));
|
|
270
|
+
const result = await h.lifecycle.listRooms(h.ids.memberId);
|
|
271
|
+
expect(result.map((r) => r.id).sort()).toEqual(["priv", "pub"]);
|
|
272
|
+
});
|
|
273
|
+
it("excludes a secret room the requester is not a member of", async () => {
|
|
274
|
+
const h = await makeHarness();
|
|
275
|
+
h.deps.rooms.set("sec", room({ id: "sec", type: "secret", members: [h.ids.ownerId] }));
|
|
276
|
+
const result = await h.lifecycle.listRooms(h.ids.memberId);
|
|
277
|
+
expect(result).toEqual([]);
|
|
278
|
+
});
|
|
279
|
+
it("includes a secret room the requester is a member of", async () => {
|
|
280
|
+
const h = await makeHarness();
|
|
281
|
+
h.deps.rooms.set("sec", room({ id: "sec", type: "secret", members: [h.ids.memberId] }));
|
|
282
|
+
const result = await h.lifecycle.listRooms(h.ids.memberId);
|
|
283
|
+
expect(result.map((r) => r.id)).toEqual(["sec"]);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
// joinRoom's own `this.deps.rooms.set(roomId, room)` and `this.deps.agents.set(agentId, agent)` calls each have one provable equivalent mutant Stryker still raises: removing them. Both `room` and `agent` are the same object references already fetched via `.get()`, and every mutation up to each call (bump/recordMemberOp/refreshMembership for room; push/bump for agent) already happened in place on that reference -- so re-setting the map entry to the identical reference it already holds changes nothing observable, the same Map.set-same-reference pattern documented throughout this repo's own mutation-testing work (agent-registry.ts's setAgentOffline, delivery-engine.ts's applyPatch(agent_offline)).
|
|
287
|
+
describe("RoomLifecycle — joinRoom / joinRemoteRoom", () => {
|
|
288
|
+
it("goes remote when this store's own agent has no local token, even if a local room record exists", async () => {
|
|
289
|
+
const h = await makeHarness();
|
|
290
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "shared");
|
|
291
|
+
h.deps.rooms.set(roomPath, room({ id: roomPath, owner: h.ids.memberId }));
|
|
292
|
+
const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
|
|
293
|
+
h.sendRoomRequest.mockResolvedValue(roomJoinOkOutcome(token, [h.ids.ownerId]));
|
|
294
|
+
await h.lifecycle.joinRoom(roomPath, h.ids.ownerId);
|
|
295
|
+
expect(h.sendRoomRequest).toHaveBeenCalled();
|
|
296
|
+
});
|
|
297
|
+
it("skips the remote round trip when a local token already exists and the room is known", async () => {
|
|
298
|
+
const h = await makeHarness();
|
|
299
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "shared");
|
|
300
|
+
h.deps.rooms.set(roomPath, room({
|
|
301
|
+
id: roomPath,
|
|
302
|
+
owner: h.ids.memberId,
|
|
303
|
+
members: [h.ids.memberId],
|
|
304
|
+
memberJoins: { [h.ids.memberId]: 1 },
|
|
305
|
+
}));
|
|
306
|
+
const { slot } = h.deps.requireIdentity();
|
|
307
|
+
const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
|
|
308
|
+
saveRoomToken(slot, roomPath, token);
|
|
309
|
+
await h.lifecycle.joinRoom(roomPath, h.ids.ownerId);
|
|
310
|
+
expect(h.sendRoomRequest).not.toHaveBeenCalled();
|
|
311
|
+
});
|
|
312
|
+
it("always takes the local CRDT path for an agent other than this store's own peer, regardless of tokens", async () => {
|
|
313
|
+
const h = await makeHarness();
|
|
314
|
+
h.deps.rooms.set("room-1", room({
|
|
315
|
+
id: "room-1",
|
|
316
|
+
owner: h.ids.ownerId,
|
|
317
|
+
members: [h.ids.ownerId],
|
|
318
|
+
memberJoins: { [h.ids.ownerId]: 1 },
|
|
319
|
+
}));
|
|
320
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
321
|
+
expect(h.sendRoomRequest).not.toHaveBeenCalled();
|
|
322
|
+
expect(h.deps.rooms.get("room-1")?.members).toContain(h.ids.memberId);
|
|
323
|
+
});
|
|
324
|
+
it("goes remote when the room isn't known locally at all", async () => {
|
|
325
|
+
const h = await makeHarness();
|
|
326
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "unseen");
|
|
327
|
+
const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
|
|
328
|
+
h.sendRoomRequest.mockResolvedValue(roomJoinOkOutcome(token, [h.ids.ownerId]));
|
|
329
|
+
await h.lifecycle.joinRoom(roomPath, h.ids.ownerId);
|
|
330
|
+
expect(h.sendRoomRequest).toHaveBeenCalled();
|
|
331
|
+
});
|
|
332
|
+
it("joinRemoteRoom throws ROOM_NOT_FOUND when joining on behalf of a different agent", async () => {
|
|
333
|
+
const h = await makeHarness();
|
|
334
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "unseen");
|
|
335
|
+
await expect(h.lifecycle.joinRoom(roomPath, h.ids.memberId)).rejects.toMatchObject({
|
|
336
|
+
message: `Room ${roomPath} not found`,
|
|
337
|
+
code: "ROOM_NOT_FOUND",
|
|
338
|
+
});
|
|
339
|
+
// (h.ids.memberId isn't this store's own peer, so joinRemoteRoom's own agentId-mismatch guard fires.)
|
|
340
|
+
});
|
|
341
|
+
it("joinRemoteRoom throws ROOM_NOT_FOUND for a non-owner-named path (e.g. a DM path)", async () => {
|
|
342
|
+
const h = await makeHarness();
|
|
343
|
+
const dmPath = dmRoomPath(h.ids.ownerId, h.ids.memberId);
|
|
344
|
+
await expect(h.lifecycle.joinRoom(dmPath, h.ids.ownerId)).rejects.toMatchObject({
|
|
345
|
+
message: `Room ${dmPath} not found`,
|
|
346
|
+
code: "ROOM_NOT_FOUND",
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
it("joinRemoteRoom throws JOIN_REFUSED naming the outcome code on a non-ok outcome", async () => {
|
|
350
|
+
const h = await makeHarness();
|
|
351
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "unseen");
|
|
352
|
+
h.sendRoomRequest.mockResolvedValue({
|
|
353
|
+
result: "error",
|
|
354
|
+
code: "not_invited",
|
|
355
|
+
});
|
|
356
|
+
await expect(h.lifecycle.joinRoom(roomPath, h.ids.ownerId)).rejects.toMatchObject({
|
|
357
|
+
message: `Join request for ${roomPath} was refused (not_invited)`,
|
|
358
|
+
code: "JOIN_REFUSED",
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
it("joinRemoteRoom throws MALFORMED_RESPONSE when the outcome fails the roomJoinOk schema", async () => {
|
|
362
|
+
const h = await makeHarness();
|
|
363
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "unseen");
|
|
364
|
+
h.sendRoomRequest.mockResolvedValue({
|
|
365
|
+
result: "ok",
|
|
366
|
+
nonsense: true,
|
|
367
|
+
});
|
|
368
|
+
await expect(h.lifecycle.joinRoom(roomPath, h.ids.ownerId)).rejects.toMatchObject({
|
|
369
|
+
message: `Join response for ${roomPath} was malformed`,
|
|
370
|
+
code: "MALFORMED_RESPONSE",
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
it("joinRemoteRoom persists the granted token and builds the room from the response, including its memberJoins", async () => {
|
|
374
|
+
const h = await makeHarness();
|
|
375
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "unseen");
|
|
376
|
+
const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
|
|
377
|
+
h.sendRoomRequest.mockResolvedValue(roomJoinOkOutcome(token, [h.ids.ownerId, h.ids.memberId], {
|
|
378
|
+
"room-state": {
|
|
379
|
+
name: "real-name",
|
|
380
|
+
description: "real-desc",
|
|
381
|
+
type: "private",
|
|
382
|
+
},
|
|
383
|
+
}));
|
|
384
|
+
await h.lifecycle.joinRoom(roomPath, h.ids.ownerId);
|
|
385
|
+
const stored = h.deps.rooms.get(roomPath);
|
|
386
|
+
expect(stored?.name).toBe("real-name");
|
|
387
|
+
expect(stored?.type).toBe("private");
|
|
388
|
+
expect(stored?.members.sort()).toEqual([h.ids.ownerId, h.ids.memberId].sort());
|
|
389
|
+
expect(stored?.memberJoins).toEqual({
|
|
390
|
+
[h.ids.ownerId]: 1,
|
|
391
|
+
[h.ids.memberId]: 1,
|
|
392
|
+
});
|
|
393
|
+
expect(stored?.federated).toBe(false);
|
|
394
|
+
const { slot } = h.deps.requireIdentity();
|
|
395
|
+
expect(loadRoomTokens(slot)[roomPath]).toBeDefined();
|
|
396
|
+
});
|
|
397
|
+
it("joinRemoteRoom falls back to public/localName/empty-description when no room-state extension is present", async () => {
|
|
398
|
+
const h = await makeHarness();
|
|
399
|
+
const roomPath = ownerNamedRoomPath(h.ids.memberId, "unseen");
|
|
400
|
+
const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
|
|
401
|
+
h.sendRoomRequest.mockResolvedValue(roomJoinOkOutcome(token, [h.ids.ownerId]));
|
|
402
|
+
await h.lifecycle.joinRoom(roomPath, h.ids.ownerId);
|
|
403
|
+
const stored = h.deps.rooms.get(roomPath);
|
|
404
|
+
expect(stored?.type).toBe("public");
|
|
405
|
+
expect(stored?.name).toBe("unseen");
|
|
406
|
+
expect(stored?.description).toBe("");
|
|
407
|
+
});
|
|
408
|
+
it("throws NOT_INVITED for a non-public room the joiner isn't invited to and doesn't own", async () => {
|
|
409
|
+
const h = await makeHarness();
|
|
410
|
+
h.deps.rooms.set("room-1", room({
|
|
411
|
+
id: "room-1",
|
|
412
|
+
type: "private",
|
|
413
|
+
owner: h.ids.ownerId,
|
|
414
|
+
members: [],
|
|
415
|
+
}));
|
|
416
|
+
await expect(h.lifecycle.joinRoom("room-1", h.ids.memberId)).rejects.toMatchObject({
|
|
417
|
+
message: "Not invited to room room-1",
|
|
418
|
+
code: "NOT_INVITED",
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
it("allows joining a private room when invited", async () => {
|
|
422
|
+
const h = await makeHarness();
|
|
423
|
+
h.deps.rooms.set("room-1", room({
|
|
424
|
+
id: "room-1",
|
|
425
|
+
type: "private",
|
|
426
|
+
owner: h.ids.ownerId,
|
|
427
|
+
members: [],
|
|
428
|
+
invited: [h.ids.memberId],
|
|
429
|
+
invitedJoins: { [h.ids.memberId]: 1 },
|
|
430
|
+
}));
|
|
431
|
+
await expect(h.lifecycle.joinRoom("room-1", h.ids.memberId)).resolves.toBeDefined();
|
|
432
|
+
});
|
|
433
|
+
it("allows the room's own owner to join a private room without being separately invited", async () => {
|
|
434
|
+
const h = await makeHarness();
|
|
435
|
+
h.deps.rooms.set("room-1", room({
|
|
436
|
+
id: "room-1",
|
|
437
|
+
type: "private",
|
|
438
|
+
owner: h.ids.memberId,
|
|
439
|
+
members: [],
|
|
440
|
+
}));
|
|
441
|
+
await expect(h.lifecycle.joinRoom("room-1", h.ids.memberId)).resolves.toBeDefined();
|
|
442
|
+
});
|
|
443
|
+
it("retires the invited entry when consuming an invitation", async () => {
|
|
444
|
+
const h = await makeHarness();
|
|
445
|
+
h.deps.rooms.set("room-1", room({
|
|
446
|
+
id: "room-1",
|
|
447
|
+
type: "private",
|
|
448
|
+
owner: h.ids.ownerId,
|
|
449
|
+
members: [],
|
|
450
|
+
invited: [h.ids.memberId],
|
|
451
|
+
invitedJoins: { [h.ids.memberId]: 1 },
|
|
452
|
+
}));
|
|
453
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
454
|
+
expect(h.deps.rooms.get("room-1")?.invited).not.toContain(h.ids.memberId);
|
|
455
|
+
});
|
|
456
|
+
it("does not touch the invited list for a fresh join to an already-public room", async () => {
|
|
457
|
+
const h = await makeHarness();
|
|
458
|
+
h.deps.rooms.set("room-1", room({ id: "room-1", type: "public", owner: h.ids.ownerId, members: [] }));
|
|
459
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
460
|
+
expect(h.recordMemberOp).not.toHaveBeenCalledWith(expect.anything(), "invited", "leave", h.ids.memberId);
|
|
461
|
+
});
|
|
462
|
+
it("updates subscribedRooms, bumps the agent's version, and broadcasts agent_upsert only for a known agent not already subscribed", async () => {
|
|
463
|
+
const h = await makeHarness();
|
|
464
|
+
h.deps.rooms.set("room-1", room({ id: "room-1", type: "public", owner: h.ids.ownerId, members: [] }));
|
|
465
|
+
h.deps.agents.set(h.ids.memberId, agent({ id: h.ids.memberId, subscribedRooms: [], version: 1 }));
|
|
466
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
467
|
+
const updated = h.deps.agents.get(h.ids.memberId);
|
|
468
|
+
expect(updated?.subscribedRooms).toContain("room-1");
|
|
469
|
+
expect(updated?.version).toBe(2);
|
|
470
|
+
expect(h.broadcastPatch).toHaveBeenCalledWith(expect.objectContaining({ type: "agent_upsert" }));
|
|
471
|
+
});
|
|
472
|
+
it("skips the agent_upsert broadcast when the joining agent has no local record", async () => {
|
|
473
|
+
const h = await makeHarness();
|
|
474
|
+
h.deps.rooms.set("room-1", room({ id: "room-1", type: "public", owner: h.ids.ownerId, members: [] }));
|
|
475
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
476
|
+
expect(h.broadcastPatch).not.toHaveBeenCalledWith(expect.objectContaining({ type: "agent_upsert" }));
|
|
477
|
+
});
|
|
478
|
+
it("delivers a room_members list built only from agents actually present locally", async () => {
|
|
479
|
+
const h = await makeHarness();
|
|
480
|
+
h.deps.rooms.set("room-1", room({
|
|
481
|
+
id: "room-1",
|
|
482
|
+
type: "public",
|
|
483
|
+
owner: h.ids.ownerId,
|
|
484
|
+
members: [h.ids.ownerId],
|
|
485
|
+
memberJoins: { [h.ids.ownerId]: 1 },
|
|
486
|
+
}));
|
|
487
|
+
h.deps.agents.set(h.ids.ownerId, agent({ id: h.ids.ownerId, name: "owner" }));
|
|
488
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
489
|
+
expect(h.deliverLocallyAndBroadcast).toHaveBeenCalledWith(h.ids.memberId, expect.objectContaining({
|
|
490
|
+
type: "room_members",
|
|
491
|
+
members: [expect.objectContaining({ id: h.ids.ownerId })],
|
|
492
|
+
}));
|
|
493
|
+
});
|
|
494
|
+
it("notifies existing room members of the join, excluding the joiner itself", async () => {
|
|
495
|
+
const h = await makeHarness();
|
|
496
|
+
h.deps.rooms.set("room-1", room({ id: "room-1", type: "public", owner: h.ids.ownerId, members: [] }));
|
|
497
|
+
await h.lifecycle.joinRoom("room-1", h.ids.memberId);
|
|
498
|
+
expect(h.deliverToRoom).toHaveBeenCalledWith("room-1", expect.objectContaining({ type: "member_joined", agent: h.ids.memberId }), h.ids.memberId);
|
|
499
|
+
});
|
|
500
|
+
it("notifies federated links only when the room is federated", async () => {
|
|
501
|
+
const federated = await makeHarness();
|
|
502
|
+
federated.deps.rooms.set("room-1", room({
|
|
503
|
+
id: "room-1",
|
|
504
|
+
type: "public",
|
|
505
|
+
owner: federated.ids.ownerId,
|
|
506
|
+
members: [],
|
|
507
|
+
federated: true,
|
|
508
|
+
}));
|
|
509
|
+
await federated.lifecycle.joinRoom("room-1", federated.ids.memberId);
|
|
510
|
+
expect(federated.broadcastRoomJoin).toHaveBeenCalledTimes(1);
|
|
511
|
+
const plain = await makeHarness();
|
|
512
|
+
plain.deps.rooms.set("room-1", room({
|
|
513
|
+
id: "room-1",
|
|
514
|
+
type: "public",
|
|
515
|
+
owner: plain.ids.ownerId,
|
|
516
|
+
members: [],
|
|
517
|
+
federated: false,
|
|
518
|
+
}));
|
|
519
|
+
await plain.lifecycle.joinRoom("room-1", plain.ids.memberId);
|
|
520
|
+
expect(plain.broadcastRoomJoin).not.toHaveBeenCalled();
|
|
521
|
+
});
|
|
522
|
+
});
|
|
523
|
+
//# sourceMappingURL=room-lifecycle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-lifecycle.test.js","sourceRoot":"","sources":["../../src/test/room-lifecycle.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
|
-
"version": "2.21.
|
|
3
|
+
"version": "2.21.19",
|
|
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",
|