agent-comms 2.21.15 → 2.21.17

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.
@@ -15,7 +15,7 @@
15
15
  "url": "https://github.com/ExaDev/agent-comms.git"
16
16
  },
17
17
  "description": "Cross-harness LLM agent communication mesh — rooms, DMs, and presence",
18
- "version": "2.21.15"
18
+ "version": "2.21.17"
19
19
  }
20
20
  ]
21
21
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-comms",
3
3
  "description": "Cross-harness LLM agent communication mesh — rooms, DMs, and presence",
4
- "version": "2.21.15",
4
+ "version": "2.21.17",
5
5
  "author": {
6
6
  "name": "ExaDev"
7
7
  },
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![GitHub](https://img.shields.io/badge/GitHub-181717?logo=github&logoColor=white)](https://github.com/ExaDev/agent-comms)
4
4
  [![npm](https://img.shields.io/badge/npm-CB3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/agent-comms)
5
- [![version](https://img.shields.io/badge/version-2.21.15-blue)](https://github.com/ExaDev/agent-comms/releases/tag/v2.21.15)
5
+ [![version](https://img.shields.io/badge/version-2.21.17-blue)](https://github.com/ExaDev/agent-comms/releases/tag/v2.21.17)
6
6
  [![CI](https://img.shields.io/github/actions/workflow/status/ExaDev/agent-comms/ci.yml?branch=main)](https://github.com/ExaDev/agent-comms/actions)
7
7
 
8
8
  Cross-harness communication mesh for LLM agents: rooms, DMs, presence, and visibility over TCP with zero filesystem dependencies.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mesh-store-orchestration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-store-orchestration.test.d.ts","sourceRoot":"","sources":["../../src/test/mesh-store-orchestration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,487 @@
1
+ /**
2
+ * Direct unit tests for MeshStore's own orchestration logic -- requireTransport/requireIdentity's guard errors, the connected getter, init()'s connect-vs-becomeCoordinator-vs-EADDRINUSE branching, the events getter's dispatch table, federation/listener/room-join-approval passthroughs, and shutdown() -- as opposed to the collaborator-owned behaviour wireTestTransport-based integration tests already cover end-to-end. MeshStore's constructor takes no injectable deps (unlike its collaborators), so these tests use a hand-built fake MeshTransport passed to the real setTransport(), and reach the private roomProtocol/connectionApproval/peerLifecycle/deliveryEngine/agentRegistry collaborators via a narrow, explicitly-justified cast -- TypeScript's `private` is compile-time only, and asserting a delegating wrapper actually calls through to the collaborator that owns the real implementation is exactly the kind of whitebox check no public-API-only test can express for a one-line pass-through.
3
+ */
4
+ import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { MeshStore } from "../core/mesh-store.js";
6
+ /** A device-id is a 64-character lowercase hex SHA-256 digest; room-path.ts's assertDeviceIdHex rejects anything shorter. */
7
+ const DEVICE_ID_HEX_LENGTH = 64;
8
+ const VALID_DEVICE_ID = "a".repeat(DEVICE_ID_HEX_LENGTH);
9
+ /** Arbitrary, distinctive remote port for a connectToRemote test fixture -- no significance beyond "a real-looking port number". */
10
+ const REMOTE_PORT = 4242;
11
+ function fakeTransport() {
12
+ return {
13
+ dataPort: 4000,
14
+ isCoordinator: false,
15
+ hasCoordinatorConnection: false,
16
+ startDataServer: vi.fn().mockResolvedValue(undefined),
17
+ connectToCoordinator: vi.fn().mockResolvedValue(undefined),
18
+ becomeCoordinator: vi.fn().mockResolvedValue(undefined),
19
+ connectToPeer: vi.fn().mockResolvedValue(undefined),
20
+ send: vi.fn().mockResolvedValue(undefined),
21
+ acceptConnection: vi.fn().mockResolvedValue(undefined),
22
+ rejectConnection: vi.fn().mockResolvedValue(undefined),
23
+ connectToRemote: vi.fn().mockResolvedValue(undefined),
24
+ broadcast: vi.fn().mockResolvedValue(undefined),
25
+ broadcastRevocation: vi.fn().mockResolvedValue(undefined),
26
+ sendRoomRequest: vi.fn().mockResolvedValue({
27
+ result: "error",
28
+ code: "not_connected",
29
+ }),
30
+ addListener: vi.fn().mockResolvedValue("listener-1"),
31
+ removeListener: vi.fn().mockResolvedValue(undefined),
32
+ listListeners: vi.fn().mockReturnValue([]),
33
+ shutdown: vi.fn().mockResolvedValue(undefined),
34
+ unref: vi.fn(),
35
+ };
36
+ }
37
+ /** Reaches a private collaborator for a whitebox delegation check -- see the file header for why this cast is justified rather than avoided. Returns `unknown`; each call site casts to the narrow method slice it actually needs. */
38
+ function collaborator(store, name) {
39
+ return store[name];
40
+ }
41
+ describe("MeshStore — requireTransport/requireIdentity guards", () => {
42
+ it("throws a specific error when a transport-using method is called before setTransport()", () => {
43
+ const store = new MeshStore();
44
+ expect(() => store.listListeners()).toThrow("MeshStore: no transport set; call setTransport() before using the store");
45
+ });
46
+ it("throws a specific error when an identity-using method is called before setIdentity()", async () => {
47
+ const store = new MeshStore();
48
+ store.setTransport(fakeTransport());
49
+ await expect(store.createRoom({
50
+ name: "r",
51
+ type: "public",
52
+ owner: VALID_DEVICE_ID,
53
+ description: "",
54
+ })).rejects.toThrow("MeshStore: no identity set; call setIdentity() before using the store");
55
+ });
56
+ });
57
+ describe("MeshStore — connected getter", () => {
58
+ it("is true when the transport is the coordinator", () => {
59
+ const store = new MeshStore();
60
+ const transport = fakeTransport();
61
+ transport.isCoordinator = true;
62
+ store.setTransport(transport);
63
+ expect(store.connected).toBe(true);
64
+ });
65
+ it("is true when the transport has a live coordinator connection", () => {
66
+ const store = new MeshStore();
67
+ const transport = fakeTransport();
68
+ transport.hasCoordinatorConnection = true;
69
+ store.setTransport(transport);
70
+ expect(store.connected).toBe(true);
71
+ });
72
+ it("is false when neither is true", () => {
73
+ const store = new MeshStore();
74
+ store.setTransport(fakeTransport());
75
+ expect(store.connected).toBe(false);
76
+ });
77
+ });
78
+ describe("MeshStore — init()", () => {
79
+ it("starts the data server, records its own peer info, connects to an existing coordinator, and unrefs -- without becoming coordinator", async () => {
80
+ const store = new MeshStore();
81
+ const transport = fakeTransport();
82
+ store.setTransport(transport);
83
+ await store.init();
84
+ expect(transport.startDataServer).toHaveBeenCalledTimes(1);
85
+ expect(transport.connectToCoordinator).toHaveBeenCalledTimes(1);
86
+ expect(transport.becomeCoordinator).not.toHaveBeenCalled();
87
+ expect(transport.unref).toHaveBeenCalledTimes(1);
88
+ });
89
+ it("falls back to becoming coordinator when no existing coordinator is reachable", async () => {
90
+ const store = new MeshStore();
91
+ const transport = fakeTransport();
92
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
93
+ store.setTransport(transport);
94
+ const staleAgentChecker = collaborator(store, "staleAgentChecker");
95
+ const startSpy = vi.spyOn(staleAgentChecker, "start");
96
+ await store.init();
97
+ expect(transport.becomeCoordinator).toHaveBeenCalledTimes(1);
98
+ expect(startSpy).toHaveBeenCalledTimes(1);
99
+ expect(transport.unref).toHaveBeenCalledTimes(1);
100
+ });
101
+ it("degrades gracefully (no throw, onError fires) when becomeCoordinator fails with EADDRINUSE", async () => {
102
+ const store = new MeshStore();
103
+ const transport = fakeTransport();
104
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
105
+ vi.mocked(transport.becomeCoordinator).mockRejectedValue(new Error("listen EADDRINUSE: address already in use"));
106
+ store.setTransport(transport);
107
+ const onError = vi.fn();
108
+ store.onError = onError;
109
+ await expect(store.init()).resolves.toBeUndefined();
110
+ expect(onError).toHaveBeenCalledTimes(1);
111
+ expect(onError.mock.calls[0]?.[0]?.message).toContain("could not join or create mesh");
112
+ expect(onError.mock.calls[0]?.[0]?.message).toContain("Running without mesh — agent-comms will be unavailable.");
113
+ expect(transport.unref).not.toHaveBeenCalled();
114
+ });
115
+ it("rethrows a becomeCoordinator failure that isn't EADDRINUSE", async () => {
116
+ const store = new MeshStore();
117
+ const transport = fakeTransport();
118
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
119
+ vi.mocked(transport.becomeCoordinator).mockRejectedValue(new Error("EPERM: permission denied"));
120
+ store.setTransport(transport);
121
+ await expect(store.init()).rejects.toThrow("EPERM");
122
+ });
123
+ it("is idempotent -- a second call does nothing", async () => {
124
+ const store = new MeshStore();
125
+ const transport = fakeTransport();
126
+ store.setTransport(transport);
127
+ await store.init();
128
+ await store.init();
129
+ expect(transport.startDataServer).toHaveBeenCalledTimes(1);
130
+ });
131
+ });
132
+ describe("MeshStore — events getter dispatch table", () => {
133
+ it("dispatches every transport event to the collaborator method that owns it", () => {
134
+ const store = new MeshStore();
135
+ store.setTransport(fakeTransport());
136
+ const peerLifecycle = collaborator(store, "peerLifecycle");
137
+ const connectionApproval = collaborator(store, "connectionApproval");
138
+ const deliveryEngine = collaborator(store, "deliveryEngine");
139
+ const spies = {
140
+ handleDataMessage: vi
141
+ .spyOn(peerLifecycle, "handleDataMessage")
142
+ .mockResolvedValue(undefined),
143
+ handlePeerConnected: vi
144
+ .spyOn(peerLifecycle, "handlePeerConnected")
145
+ .mockResolvedValue(undefined),
146
+ handlePeerDisconnected: vi
147
+ .spyOn(peerLifecycle, "handlePeerDisconnected")
148
+ .mockReturnValue(undefined),
149
+ handleIntroduction: vi
150
+ .spyOn(peerLifecycle, "handleIntroduction")
151
+ .mockResolvedValue(undefined),
152
+ handlePeerList: vi
153
+ .spyOn(peerLifecycle, "handlePeerList")
154
+ .mockReturnValue(undefined),
155
+ handlePeerJoined: vi
156
+ .spyOn(peerLifecycle, "handlePeerJoined")
157
+ .mockReturnValue(undefined),
158
+ handleBecomeCoordinator: vi
159
+ .spyOn(peerLifecycle, "handleBecomeCoordinator")
160
+ .mockResolvedValue(undefined),
161
+ handleConnectionRequest: vi
162
+ .spyOn(connectionApproval, "handleConnectionRequest")
163
+ .mockReturnValue(undefined),
164
+ handleRevocationAnnounce: vi
165
+ .spyOn(deliveryEngine, "handleRevocationAnnounce")
166
+ .mockResolvedValue(undefined),
167
+ handlePresenceAdvert: vi
168
+ .spyOn(deliveryEngine, "handlePresenceAdvert")
169
+ .mockReturnValue(undefined),
170
+ };
171
+ const handle = { id: "conn-1" };
172
+ const peer = {
173
+ id: "peer-1",
174
+ port: 1,
175
+ startedAt: "2026-01-01T00:00:00.000Z",
176
+ };
177
+ store.events.onMessage(handle, {
178
+ method: "state_update",
179
+ patch: { type: "room_delete", roomId: "r" },
180
+ });
181
+ expect(spies.handleDataMessage).toHaveBeenCalledWith(handle, {
182
+ method: "state_update",
183
+ patch: { type: "room_delete", roomId: "r" },
184
+ });
185
+ store.events.onPeerConnected(handle, peer);
186
+ expect(spies.handlePeerConnected).toHaveBeenCalledWith(handle, peer);
187
+ store.events.onPeerDisconnected(handle);
188
+ expect(spies.handlePeerDisconnected).toHaveBeenCalledWith(handle);
189
+ store.events.onIntroduction(handle, { peerId: "p", dataPort: 1 });
190
+ expect(spies.handleIntroduction).toHaveBeenCalledWith(handle, {
191
+ peerId: "p",
192
+ dataPort: 1,
193
+ });
194
+ store.events.onPeerList([peer]);
195
+ expect(spies.handlePeerList).toHaveBeenCalledWith([peer]);
196
+ store.events.onPeerJoined(peer);
197
+ expect(spies.handlePeerJoined).toHaveBeenCalledWith(peer);
198
+ store.events.onBecomeCoordinator([peer]);
199
+ expect(spies.handleBecomeCoordinator).toHaveBeenCalledWith([peer]);
200
+ store.events.onConnectionRequest(handle, {
201
+ peerId: "p",
202
+ dataPort: 1,
203
+ name: "n",
204
+ fingerprint: "fp",
205
+ });
206
+ expect(spies.handleConnectionRequest).toHaveBeenCalledWith(handle, {
207
+ peerId: "p",
208
+ dataPort: 1,
209
+ name: "n",
210
+ fingerprint: "fp",
211
+ });
212
+ const revocationEntry = {
213
+ tokenId: new Uint8Array(),
214
+ issuer: new Uint8Array(),
215
+ revokedAt: 0,
216
+ };
217
+ store.events.onRevocationAnnounce(revocationEntry);
218
+ expect(spies.handleRevocationAnnounce).toHaveBeenCalledWith(revocationEntry);
219
+ store.events.onPresenceAdvert(handle, "active");
220
+ expect(spies.handlePresenceAdvert).toHaveBeenCalledWith("conn-1", "active");
221
+ });
222
+ it("forwards a transport-level error to this store's own onError, when one is set", () => {
223
+ const store = new MeshStore();
224
+ store.setTransport(fakeTransport());
225
+ const onError = vi.fn();
226
+ store.onError = onError;
227
+ const error = new Error("transport failure");
228
+ store.events.onError?.(error);
229
+ expect(onError).toHaveBeenCalledWith(error);
230
+ });
231
+ });
232
+ describe("MeshStore — constructor wiring", () => {
233
+ it("registers both the mdns and tailscale discovery backends", async () => {
234
+ const store = new MeshStore();
235
+ await expect(store.discovery.advertise("not-a-real-backend", { name: "x", port: 1 })).rejects.toThrow("Available: mdns, tailscale");
236
+ });
237
+ it("fires onPatch when a broadcasted patch reaches it, via the getOnPatch closure passed to DeliveryEngine", async () => {
238
+ const store = new MeshStore();
239
+ store.setTransport(fakeTransport());
240
+ const onPatch = vi.fn();
241
+ store.onPatch = onPatch;
242
+ await store.registerAgent({
243
+ name: "a",
244
+ harness: "pi",
245
+ cwd: "/tmp",
246
+ pid: 1,
247
+ visibility: "visible",
248
+ tags: [],
249
+ });
250
+ expect(onPatch).toHaveBeenCalledWith(expect.objectContaining({ type: "agent_upsert" }));
251
+ });
252
+ it("wires ConnectionApproval's queueDelivery closure to the real DeliveryEngine, observable via drainDelivery", async () => {
253
+ const store = new MeshStore();
254
+ store.setTransport(fakeTransport());
255
+ store.events.onConnectionRequest({ id: "conn-1" }, { peerId: "remote", dataPort: 1, name: "n", fingerprint: "fp" });
256
+ const drained = await store.drainDelivery(store.peerId);
257
+ expect(drained).toContainEqual(expect.objectContaining({
258
+ type: "connection_request",
259
+ connectionId: "conn-1",
260
+ }));
261
+ });
262
+ it("deliver() actually reaches the real DeliveryEngine, observable via drainDelivery", async () => {
263
+ const store = new MeshStore();
264
+ store.setTransport(fakeTransport());
265
+ const event = {
266
+ type: "connection_request",
267
+ connectionId: "c",
268
+ peerId: "p",
269
+ dataPort: 1,
270
+ name: "n",
271
+ fingerprint: "fp",
272
+ };
273
+ await store.deliver(store.peerId, event);
274
+ const drained = await store.drainDelivery(store.peerId);
275
+ expect(drained).toContainEqual(event);
276
+ });
277
+ });
278
+ describe("MeshStore — identity delegation", () => {
279
+ it("writeIdentity actually persists to the identity cache, readable back by readIdentity", async () => {
280
+ const store = new MeshStore();
281
+ await store.writeIdentity("pi", "/tmp", "written-id");
282
+ await expect(store.readIdentity("pi", "/tmp")).resolves.toEqual({
283
+ id: "written-id",
284
+ });
285
+ });
286
+ });
287
+ describe("MeshStore — agent lifecycle delegation", () => {
288
+ it("setAgentOffline actually marks the agent offline in listAgents' own view", async () => {
289
+ const store = new MeshStore();
290
+ store.setTransport(fakeTransport());
291
+ const agent = await store.registerAgent({
292
+ name: "a",
293
+ harness: "pi",
294
+ cwd: "/tmp",
295
+ pid: 1,
296
+ visibility: "visible",
297
+ tags: [],
298
+ });
299
+ await store.setAgentOffline(agent.id);
300
+ const listed = await store.listAgents(agent.id);
301
+ expect(listed.find((a) => a.id === agent.id)?.status).toBe("offline");
302
+ });
303
+ });
304
+ describe("MeshStore — addListener policy validation", () => {
305
+ it("rejects an invalid policy naming the exact bad value, without ever touching the transport", async () => {
306
+ const store = new MeshStore();
307
+ const transport = fakeTransport();
308
+ store.setTransport(transport);
309
+ await expect(store.addListener("127.0.0.1", 0, "not-a-real-policy")).rejects.toMatchObject({
310
+ message: 'Invalid policy "not-a-real-policy"',
311
+ code: "INVALID_POLICY",
312
+ });
313
+ expect(transport.addListener).not.toHaveBeenCalled();
314
+ });
315
+ it.each(["full", "observe", "rooms-only", "gateway"])("accepts the valid policy %s and forwards it to the transport", async (policy) => {
316
+ const store = new MeshStore();
317
+ const transport = fakeTransport();
318
+ store.setTransport(transport);
319
+ await store.addListener("127.0.0.1", 0, policy);
320
+ expect(transport.addListener).toHaveBeenCalledWith("127.0.0.1", 0, policy);
321
+ });
322
+ });
323
+ describe("MeshStore — room-join approval passthroughs", () => {
324
+ it("acceptRoomJoin/rejectRoomJoin/listPendingRoomJoins all reach the real RoomProtocol collaborator", () => {
325
+ const store = new MeshStore();
326
+ store.setTransport(fakeTransport());
327
+ const roomProtocol = collaborator(store, "roomProtocol");
328
+ const acceptSpy = vi
329
+ .spyOn(roomProtocol, "acceptRoomJoin")
330
+ .mockReturnValue(undefined);
331
+ const rejectSpy = vi
332
+ .spyOn(roomProtocol, "rejectRoomJoin")
333
+ .mockReturnValue(undefined);
334
+ const listSpy = vi
335
+ .spyOn(roomProtocol, "listPendingRoomJoins")
336
+ .mockReturnValue([]);
337
+ store.acceptRoomJoin("room-path", "requester");
338
+ expect(acceptSpy).toHaveBeenCalledWith("room-path", "requester");
339
+ store.rejectRoomJoin("room-path", "requester", "no thanks");
340
+ expect(rejectSpy).toHaveBeenCalledWith("room-path", "requester", "no thanks");
341
+ store.listPendingRoomJoins();
342
+ expect(listSpy).toHaveBeenCalledTimes(1);
343
+ });
344
+ it("connectToRemote reaches the real ConnectionApproval collaborator", async () => {
345
+ const store = new MeshStore();
346
+ store.setTransport(fakeTransport());
347
+ const connectionApproval = collaborator(store, "connectionApproval");
348
+ const spy = vi
349
+ .spyOn(connectionApproval, "connectToRemote")
350
+ .mockResolvedValue(undefined);
351
+ await store.connectToRemote("example.test", REMOTE_PORT);
352
+ expect(spy).toHaveBeenCalledWith("example.test", REMOTE_PORT);
353
+ });
354
+ });
355
+ describe("MeshStore — federation passthroughs", () => {
356
+ it("forwards fedConnect/fedDisconnect/fedLinks/fedTrust/fedUntrust/fedTrustedFingerprints/fedListen/fedStopListening to the real, public federation manager", async () => {
357
+ const store = new MeshStore();
358
+ store.setTransport(fakeTransport());
359
+ const connectSpy = vi
360
+ .spyOn(store.federation, "connect")
361
+ .mockResolvedValue("link-1");
362
+ await expect(store.fedConnect("host", 1, "name")).resolves.toBe("link-1");
363
+ expect(connectSpy).toHaveBeenCalledWith("host", 1, "name");
364
+ const disconnectSpy = vi
365
+ .spyOn(store.federation, "disconnect")
366
+ .mockResolvedValue(undefined);
367
+ await store.fedDisconnect("link-1");
368
+ expect(disconnectSpy).toHaveBeenCalledWith("link-1");
369
+ const linksSpy = vi
370
+ .spyOn(store.federation, "listLinks")
371
+ .mockReturnValue([]);
372
+ store.fedLinks();
373
+ expect(linksSpy).toHaveBeenCalledTimes(1);
374
+ const trustSpy = vi
375
+ .spyOn(store.federation, "addTrustedFingerprint")
376
+ .mockReturnValue(undefined);
377
+ await store.fedTrust("fingerprint-a");
378
+ expect(trustSpy).toHaveBeenCalledWith("fingerprint-a");
379
+ const untrustSpy = vi
380
+ .spyOn(store.federation, "removeTrustedFingerprint")
381
+ .mockReturnValue(undefined);
382
+ await store.fedUntrust("fingerprint-a");
383
+ expect(untrustSpy).toHaveBeenCalledWith("fingerprint-a");
384
+ const listTrustedSpy = vi
385
+ .spyOn(store.federation, "listTrustedFingerprints")
386
+ .mockReturnValue([]);
387
+ store.fedTrustedFingerprints();
388
+ expect(listTrustedSpy).toHaveBeenCalledTimes(1);
389
+ const listenSpy = vi
390
+ .spyOn(store.federation, "listen")
391
+ .mockResolvedValue(undefined);
392
+ await store.fedListen("host", 2);
393
+ expect(listenSpy).toHaveBeenCalledWith("host", 2);
394
+ const stopListeningSpy = vi
395
+ .spyOn(store.federation, "stopListening")
396
+ .mockResolvedValue(undefined);
397
+ await store.fedStopListening();
398
+ expect(stopListeningSpy).toHaveBeenCalledTimes(1);
399
+ });
400
+ });
401
+ describe("MeshStore — shutdown()", () => {
402
+ let store;
403
+ let transport;
404
+ beforeEach(() => {
405
+ store = new MeshStore();
406
+ transport = fakeTransport();
407
+ store.setTransport(transport);
408
+ });
409
+ it("stops the stale-agent checker, shuts down federation, and shuts down the transport", async () => {
410
+ const staleAgentChecker = collaborator(store, "staleAgentChecker");
411
+ const stopSpy = vi.spyOn(staleAgentChecker, "stop");
412
+ const federationShutdownSpy = vi
413
+ .spyOn(store.federation, "shutdown")
414
+ .mockResolvedValue(undefined);
415
+ await store.shutdown();
416
+ expect(stopSpy).toHaveBeenCalledTimes(1);
417
+ expect(federationShutdownSpy).toHaveBeenCalledTimes(1);
418
+ expect(transport.shutdown).toHaveBeenCalledTimes(1);
419
+ });
420
+ it("broadcasts agent_offline for its own self agent when one is registered", async () => {
421
+ vi.spyOn(store.federation, "shutdown").mockResolvedValue(undefined);
422
+ const agent = await store.registerAgent({
423
+ name: "self",
424
+ harness: "pi",
425
+ cwd: "/tmp",
426
+ pid: 1,
427
+ visibility: "visible",
428
+ tags: [],
429
+ });
430
+ store.peerId = agent.id;
431
+ const deliveryEngine = collaborator(store, "deliveryEngine");
432
+ const broadcastSpy = vi
433
+ .spyOn(deliveryEngine, "broadcastPatch")
434
+ .mockResolvedValue(undefined);
435
+ await store.shutdown();
436
+ expect(broadcastSpy).toHaveBeenCalledWith({
437
+ type: "agent_offline",
438
+ agentId: agent.id,
439
+ });
440
+ });
441
+ it("clears every pending markRead timer", async () => {
442
+ vi.spyOn(store.federation, "shutdown").mockResolvedValue(undefined);
443
+ const pending = collaborator(store, "pendingMarkReadTimers");
444
+ // Long enough to guarantee it's still pending (never fires) for the duration of this test.
445
+ const FAR_FUTURE_DELAY_MS = 1_000_000;
446
+ const timer = setTimeout(() => undefined, FAR_FUTURE_DELAY_MS);
447
+ pending.push(timer);
448
+ const clearTimeoutSpy = vi.spyOn(global, "clearTimeout");
449
+ try {
450
+ await store.shutdown();
451
+ expect(clearTimeoutSpy).toHaveBeenCalledWith(timer);
452
+ expect(pending).toHaveLength(0);
453
+ }
454
+ finally {
455
+ clearTimeoutSpy.mockRestore();
456
+ }
457
+ });
458
+ it("actually sets isShutDown, observable via DeliveryEngine no longer scheduling markRead timers afterward", async () => {
459
+ // fireLocalDelivery returns before ever reaching the isShutDown-guarded push unless onDelivery is set -- without this, the test would pass for both real code and a mutant, since it never reaches the line under test.
460
+ store.onDelivery = vi.fn();
461
+ vi.spyOn(store.federation, "shutdown").mockResolvedValue(undefined);
462
+ await store.shutdown();
463
+ const pending = collaborator(store, "pendingMarkReadTimers");
464
+ await store.deliver(store.peerId, {
465
+ type: "room_message",
466
+ message: {
467
+ id: "m",
468
+ from: "a",
469
+ room: "r",
470
+ content: "hi",
471
+ timestamp: "2026-01-01T00:00:00.000Z",
472
+ readBy: [],
473
+ },
474
+ });
475
+ expect(pending).toHaveLength(0);
476
+ });
477
+ it("does not broadcast agent_offline when no self agent was ever registered", async () => {
478
+ vi.spyOn(store.federation, "shutdown").mockResolvedValue(undefined);
479
+ const deliveryEngine = collaborator(store, "deliveryEngine");
480
+ const broadcastSpy = vi
481
+ .spyOn(deliveryEngine, "broadcastPatch")
482
+ .mockResolvedValue(undefined);
483
+ await store.shutdown();
484
+ expect(broadcastSpy).not.toHaveBeenCalled();
485
+ });
486
+ });
487
+ //# sourceMappingURL=mesh-store-orchestration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-store-orchestration.test.js","sourceRoot":"","sources":["../../src/test/mesh-store-orchestration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=room-protocol-admission.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-protocol-admission.test.d.ts","sourceRoot":"","sources":["../../src/test/room-protocol-admission.test.ts"],"names":[],"mappings":""}