agent-comms 2.21.18 → 2.22.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,391 @@
1
+ /**
2
+ * Direct, DI-based unit tests for RoomLifecycle's own remote-request-sending half -- refreshRoomMembers, requestDmAccess, getRoom, revokeMemberGrant, and declineInvite, moved here from room-lifecycle.test.ts/room-lifecycle-membership.test.ts to stay under this repo's max-lines cap after later gap-closing passes. See room-lifecycle.test.ts for createRoom/listRooms/joinRoom/joinRemoteRoom, and room-lifecycle-membership.test.ts for leaveRoom/leaveRemoteRoom/inviteToRoom/kickFromRoom/destroyRoom -- and either file's own header for the full rationale. 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, loadIssuedRoomGrant, loadRoomTokens, saveIssuedRoomGrant, 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
+ describe("RoomLifecycle — refreshRoomMembers", () => {
167
+ it("throws ROOM_NOT_FOUND for a non-owner-named path", async () => {
168
+ const h = await makeHarness();
169
+ const dmPath = dmRoomPath(h.ids.ownerId, h.ids.memberId);
170
+ await expect(h.lifecycle.refreshRoomMembers(dmPath)).rejects.toMatchObject({
171
+ code: "ROOM_NOT_FOUND",
172
+ });
173
+ });
174
+ it("throws NOT_MEMBER when no room:member token is persisted", async () => {
175
+ const h = await makeHarness();
176
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
177
+ await expect(h.lifecycle.refreshRoomMembers(roomPath)).rejects.toMatchObject({
178
+ message: `No room:member token for ${roomPath}`,
179
+ code: "NOT_MEMBER",
180
+ });
181
+ });
182
+ it("throws REFRESH_FAILED naming the outcome code on a non-ok outcome", async () => {
183
+ const h = await makeHarness();
184
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
185
+ const { slot } = h.deps.requireIdentity();
186
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
187
+ saveRoomToken(slot, roomPath, token);
188
+ h.sendRoomRequest.mockResolvedValue({
189
+ result: "error",
190
+ code: "not_a_member",
191
+ });
192
+ await expect(h.lifecycle.refreshRoomMembers(roomPath)).rejects.toMatchObject({
193
+ message: `room.members refresh for ${roomPath} failed (not_a_member)`,
194
+ code: "REFRESH_FAILED",
195
+ });
196
+ });
197
+ it("throws MALFORMED_RESPONSE when the outcome fails the roomMembersOk schema", async () => {
198
+ const h = await makeHarness();
199
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
200
+ const { slot } = h.deps.requireIdentity();
201
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
202
+ saveRoomToken(slot, roomPath, token);
203
+ h.sendRoomRequest.mockResolvedValue({
204
+ result: "ok",
205
+ nonsense: true,
206
+ });
207
+ await expect(h.lifecycle.refreshRoomMembers(roomPath)).rejects.toMatchObject({
208
+ message: `room.members response for ${roomPath} was malformed`,
209
+ code: "MALFORMED_RESPONSE",
210
+ });
211
+ });
212
+ it("sends the request scoped to the room path, over a room.members verb", async () => {
213
+ const h = await makeHarness();
214
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
215
+ const { slot } = h.deps.requireIdentity();
216
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
217
+ saveRoomToken(slot, roomPath, token);
218
+ h.sendRoomRequest.mockResolvedValue(roomMembersOkOutcome([h.ids.ownerId]));
219
+ await h.lifecycle.refreshRoomMembers(roomPath);
220
+ expect(h.sendRoomRequest).toHaveBeenCalledWith(h.ids.memberId, expect.objectContaining({
221
+ params: expect.objectContaining({ verb: "room.members" }),
222
+ }), { kind: "room", path: roomPath }, token);
223
+ });
224
+ it("starts the version at 1, with an empty description and no existing local copy", async () => {
225
+ const h = await makeHarness();
226
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
227
+ const { slot } = h.deps.requireIdentity();
228
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
229
+ saveRoomToken(slot, roomPath, token);
230
+ h.sendRoomRequest.mockResolvedValue(roomMembersOkOutcome([h.ids.ownerId]));
231
+ const refreshed = await h.lifecycle.refreshRoomMembers(roomPath);
232
+ expect(refreshed.version).toBe(1);
233
+ expect(refreshed.description).toBe("");
234
+ expect(refreshed.federated).toBe(false);
235
+ expect(refreshed.memberJoins).toEqual({ [h.ids.ownerId]: 1 });
236
+ expect(refreshed.invited).toEqual([]);
237
+ });
238
+ it("increments the version relative to the existing local copy, and preserves its federated flag", async () => {
239
+ const h = await makeHarness();
240
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
241
+ h.deps.rooms.set(roomPath, room({ id: roomPath, version: 1, federated: true }));
242
+ const { slot } = h.deps.requireIdentity();
243
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
244
+ saveRoomToken(slot, roomPath, token);
245
+ h.sendRoomRequest.mockResolvedValue(roomMembersOkOutcome([h.ids.ownerId]));
246
+ const refreshed = await h.lifecycle.refreshRoomMembers(roomPath);
247
+ expect(refreshed.version).toBe(2);
248
+ expect(refreshed.federated).toBe(true);
249
+ });
250
+ it("prefers the room-state extension's own fields over the existing local copy's", async () => {
251
+ const h = await makeHarness();
252
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
253
+ h.deps.rooms.set(roomPath, room({ id: roomPath, name: "old-name", description: "old-desc" }));
254
+ const { slot } = h.deps.requireIdentity();
255
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
256
+ saveRoomToken(slot, roomPath, token);
257
+ h.sendRoomRequest.mockResolvedValue(roomMembersOkOutcome([h.ids.ownerId], {
258
+ "room-state": {
259
+ name: "new-name",
260
+ description: "new-desc",
261
+ type: "private",
262
+ },
263
+ }));
264
+ const refreshed = await h.lifecycle.refreshRoomMembers(roomPath);
265
+ expect(refreshed.name).toBe("new-name");
266
+ expect(refreshed.description).toBe("new-desc");
267
+ });
268
+ });
269
+ describe("RoomLifecycle — requestDmAccess", () => {
270
+ it("records the dm path as initiated by this store before sending", async () => {
271
+ const h = await makeHarness();
272
+ h.sendRoomRequest.mockResolvedValue({
273
+ result: "error",
274
+ code: "not_invited",
275
+ });
276
+ await expect(h.lifecycle.requestDmAccess(h.ids.memberId)).rejects.toBeDefined();
277
+ expect(h.deps.dmRequestsInitiatedByMe).toContain(dmRoomPath(h.ids.ownerId, h.ids.memberId));
278
+ });
279
+ it("throws JOIN_REFUSED naming the outcome code on a non-ok outcome", async () => {
280
+ const h = await makeHarness();
281
+ h.sendRoomRequest.mockResolvedValue({
282
+ result: "error",
283
+ code: "not_invited",
284
+ });
285
+ await expect(h.lifecycle.requestDmAccess(h.ids.memberId)).rejects.toMatchObject({
286
+ message: `DM access request to ${h.ids.memberId} was refused (not_invited)`,
287
+ code: "JOIN_REFUSED",
288
+ });
289
+ });
290
+ it("throws MALFORMED_RESPONSE when the outcome fails the roomJoinOk schema", async () => {
291
+ const h = await makeHarness();
292
+ h.sendRoomRequest.mockResolvedValue({
293
+ result: "ok",
294
+ nonsense: true,
295
+ });
296
+ await expect(h.lifecycle.requestDmAccess(h.ids.memberId)).rejects.toMatchObject({
297
+ message: `DM access response from ${h.ids.memberId} was malformed`,
298
+ code: "MALFORMED_RESPONSE",
299
+ });
300
+ });
301
+ it("persists the granted token under the dm path on success", async () => {
302
+ const h = await makeHarness();
303
+ const dmPath = dmRoomPath(h.ids.ownerId, h.ids.memberId);
304
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, dmPath);
305
+ h.sendRoomRequest.mockResolvedValue(roomJoinOkOutcome(token, []));
306
+ await h.lifecycle.requestDmAccess(h.ids.memberId);
307
+ const { slot } = h.deps.requireIdentity();
308
+ expect(loadRoomTokens(slot)[dmPath]).toBeDefined();
309
+ });
310
+ });
311
+ describe("RoomLifecycle — getRoom", () => {
312
+ it("returns the stored room", async () => {
313
+ const h = await makeHarness();
314
+ const r = room({ id: "room-1" });
315
+ h.deps.rooms.set("room-1", r);
316
+ await expect(h.lifecycle.getRoom("room-1")).resolves.toBe(r);
317
+ });
318
+ it("returns undefined for an unknown id", async () => {
319
+ const h = await makeHarness();
320
+ await expect(h.lifecycle.getRoom("no-such-room")).resolves.toBeUndefined();
321
+ });
322
+ });
323
+ /** Persists an issued-grant record for memberId in roomPath as if this store's own identity had genuinely admitted them (invite or join), via the same real crypto path inviteToRoom itself uses -- revokeMemberGrant/kickFromRoom/destroyRoom all read this record by its own token-id, not anything derivable from the token or the in-memory Room object afterward. */
324
+ async function seedIssuedGrant(h, roomPath, memberId) {
325
+ const { slot } = h.deps.requireIdentity();
326
+ const tokenId = randomId();
327
+ const clock = createSystemClock();
328
+ const verdict = await mintCapabilityToken({
329
+ identity: h.ids.ownerPort,
330
+ clock,
331
+ tokenId,
332
+ bearer: deviceIdFromHex(memberId),
333
+ capability: "room:member",
334
+ scope: { kind: "room", path: roomPath },
335
+ expires: clock.now() + TOKEN_TTL_MS,
336
+ delegationsRemaining: 0,
337
+ });
338
+ if (!verdict.ok)
339
+ throw new Error("expected the fixture token to mint successfully");
340
+ saveIssuedRoomGrant(slot, roomPath, memberId, tokenId);
341
+ }
342
+ describe("RoomLifecycle — revokeMemberGrant", () => {
343
+ it("does nothing when no issued-grant record exists for the member", async () => {
344
+ const h = await makeHarness();
345
+ await expect(h.lifecycle.revokeMemberGrant("room-1", h.ids.memberId)).resolves.toBeUndefined();
346
+ expect(h.broadcastRevocation).not.toHaveBeenCalled();
347
+ });
348
+ it("mints and broadcasts a revocation entry, then forgets the issued-grant record", async () => {
349
+ const h = await makeHarness();
350
+ await seedIssuedGrant(h, "room-1", h.ids.memberId);
351
+ await h.lifecycle.revokeMemberGrant("room-1", h.ids.memberId);
352
+ expect(h.broadcastRevocation).toHaveBeenCalledTimes(1);
353
+ const { slot } = h.deps.requireIdentity();
354
+ expect(loadIssuedRoomGrant(slot, "room-1", h.ids.memberId)).toBeUndefined();
355
+ });
356
+ });
357
+ describe("RoomLifecycle — declineInvite", () => {
358
+ it("throws NOT_SELF when declining on behalf of another agent", async () => {
359
+ const h = await makeHarness();
360
+ await expect(h.lifecycle.declineInvite("room-1", h.ids.memberId, "no thanks")).rejects.toMatchObject({
361
+ message: `Cannot decline an invite on behalf of ${h.ids.memberId}`,
362
+ code: "NOT_SELF",
363
+ });
364
+ });
365
+ it("throws ROOM_NOT_FOUND for a non-owner-named path (e.g. a DM path)", async () => {
366
+ const h = await makeHarness();
367
+ const dmPath = dmRoomPath(h.ids.ownerId, h.ids.memberId);
368
+ await expect(h.lifecycle.declineInvite(dmPath, h.ids.ownerId, "no thanks")).rejects.toMatchObject({
369
+ message: `Room ${dmPath} not found`,
370
+ code: "ROOM_NOT_FOUND",
371
+ });
372
+ });
373
+ it("delegates to a real room.leave request against the room's own owner, carrying the decline reason", async () => {
374
+ const h = await makeHarness();
375
+ const roomPath = ownerNamedRoomPath(h.ids.memberId, "r");
376
+ const { slot } = h.deps.requireIdentity();
377
+ const token = await mintRoomToken(h.ids.ownerPort, h.ids.ownerId, roomPath);
378
+ saveRoomToken(slot, roomPath, token);
379
+ h.sendRoomRequest.mockResolvedValue({
380
+ result: "ok",
381
+ });
382
+ await h.lifecycle.declineInvite(roomPath, h.ids.ownerId, "no thanks");
383
+ expect(h.sendRoomRequest).toHaveBeenCalledWith(h.ids.memberId, expect.objectContaining({
384
+ params: expect.objectContaining({
385
+ verb: "room.leave",
386
+ reason: "no thanks",
387
+ }),
388
+ }), { kind: "room", path: roomPath }, token);
389
+ });
390
+ });
391
+ //# sourceMappingURL=room-lifecycle-remote.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-lifecycle-remote.test.js","sourceRoot":"","sources":["../../src/test/room-lifecycle-remote.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=room-lifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-lifecycle.test.d.ts","sourceRoot":"","sources":["../../src/test/room-lifecycle.test.ts"],"names":[],"mappings":""}