agent-comms 2.18.2 → 2.18.4
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/bridges/user/web/dist/bundle.js +1 -1
- package/dist/bridges/user/web/frontend/project-tree.js +3 -3
- package/dist/bridges/user/web/frontend/project-tree.js.map +1 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.js +10 -11
- package/dist/bridges/user/web/test/port-discovery.unit.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js +12 -13
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/identity-store.d.ts.map +1 -1
- package/dist/core/identity-store.js +16 -5
- package/dist/core/identity-store.js.map +1 -1
- package/dist/core/identity.d.ts +6 -5
- package/dist/core/identity.d.ts.map +1 -1
- package/dist/core/identity.js +13 -11
- package/dist/core/identity.js.map +1 -1
- package/dist/core/test/bridge.unit.test.js +11 -12
- package/dist/core/test/bridge.unit.test.js.map +1 -1
- package/dist/core/test/identity.unit.test.js +21 -22
- package/dist/core/test/identity.unit.test.js.map +1 -1
- package/dist/test/approval.integration.test.js +52 -45
- package/dist/test/approval.integration.test.js.map +1 -1
- package/dist/test/become-coordinator-actual-port.integration.test.d.ts +0 -2
- package/dist/test/become-coordinator-actual-port.integration.test.d.ts.map +1 -1
- package/dist/test/become-coordinator-actual-port.integration.test.js +14 -39
- package/dist/test/become-coordinator-actual-port.integration.test.js.map +1 -1
- package/dist/test/bridge-mesh.test.js +9 -10
- package/dist/test/bridge-mesh.test.js.map +1 -1
- package/dist/test/broadcast-window.integration.test.js +4 -7
- package/dist/test/broadcast-window.integration.test.js.map +1 -1
- package/dist/test/coordinator-socket-error.integration.test.js +3 -4
- package/dist/test/coordinator-socket-error.integration.test.js.map +1 -1
- package/dist/test/create-room-mints-owner-grant.test.js +9 -8
- package/dist/test/create-room-mints-owner-grant.test.js.map +1 -1
- package/dist/test/create-room-name-sanitisation.test.js +6 -7
- package/dist/test/create-room-name-sanitisation.test.js.map +1 -1
- package/dist/test/dm-admission.integration.test.js +10 -11
- package/dist/test/dm-admission.integration.test.js.map +1 -1
- package/dist/test/federation.integration.test.js +21 -20
- package/dist/test/federation.integration.test.js.map +1 -1
- package/dist/test/filestore.test.js +16 -17
- package/dist/test/filestore.test.js.map +1 -1
- package/dist/test/handshake.test.js +26 -27
- package/dist/test/handshake.test.js.map +1 -1
- package/dist/test/identity-cert.test.js +3 -4
- package/dist/test/identity-cert.test.js.map +1 -1
- package/dist/test/identity-device-id.test.js +6 -7
- package/dist/test/identity-device-id.test.js.map +1 -1
- package/dist/test/identity-restart.integration.test.js +9 -10
- package/dist/test/identity-restart.integration.test.js.map +1 -1
- package/dist/test/identity-store.test.js +36 -21
- package/dist/test/identity-store.test.js.map +1 -1
- package/dist/test/listener-policy.integration.test.js +63 -56
- package/dist/test/listener-policy.integration.test.js.map +1 -1
- package/dist/test/mcp-registry-retry.test.js +10 -11
- package/dist/test/mcp-registry-retry.test.js.map +1 -1
- package/dist/test/mesh-e2e.integration.test.js +26 -19
- package/dist/test/mesh-e2e.integration.test.js.map +1 -1
- package/dist/test/presence-readvertise.integration.test.js +5 -6
- package/dist/test/presence-readvertise.integration.test.js.map +1 -1
- package/dist/test/random-id.test.js +3 -4
- package/dist/test/random-id.test.js.map +1 -1
- package/dist/test/room-admission-tool-actions.test.js +20 -15
- package/dist/test/room-admission-tool-actions.test.js.map +1 -1
- package/dist/test/room-destroy-revocation.integration.test.js +3 -4
- package/dist/test/room-destroy-revocation.integration.test.js.map +1 -1
- package/dist/test/room-invite-directed.integration.test.js +13 -12
- package/dist/test/room-invite-directed.integration.test.js.map +1 -1
- package/dist/test/room-join-admission.test.js +31 -24
- package/dist/test/room-join-admission.test.js.map +1 -1
- package/dist/test/room-kick-revocation.integration.test.js +5 -6
- package/dist/test/room-kick-revocation.integration.test.js.map +1 -1
- package/dist/test/room-leave-revocation.integration.test.js +10 -9
- package/dist/test/room-leave-revocation.integration.test.js.map +1 -1
- package/dist/test/room-path.test.js +16 -17
- package/dist/test/room-path.test.js.map +1 -1
- package/dist/test/room-read-directed.integration.test.js +14 -11
- package/dist/test/room-read-directed.integration.test.js.map +1 -1
- package/dist/test/room-router.test.js +27 -29
- package/dist/test/room-router.test.js.map +1 -1
- package/dist/test/room-send-directed.integration.test.js +11 -12
- package/dist/test/room-send-directed.integration.test.js.map +1 -1
- package/dist/test/room-send-retry-queue.test.js +10 -11
- package/dist/test/room-send-retry-queue.test.js.map +1 -1
- package/dist/test/room-send-retry.integration.test.js +5 -8
- package/dist/test/room-send-retry.integration.test.js.map +1 -1
- package/dist/test/room-state-sync.integration.test.js +18 -15
- package/dist/test/room-state-sync.integration.test.js.map +1 -1
- package/dist/test/room-token-store.test.js +21 -22
- package/dist/test/room-token-store.test.js.map +1 -1
- package/dist/test/room-token-verification.test.js +19 -20
- package/dist/test/room-token-verification.test.js.map +1 -1
- package/dist/test/state-sync-convergence.test.js +25 -26
- package/dist/test/state-sync-convergence.test.js.map +1 -1
- package/dist/test/visibility.integration.test.js +48 -49
- package/dist/test/visibility.integration.test.js.map +1 -1
- package/dist/test/wire-mesh-identity.test.js +7 -8
- package/dist/test/wire-mesh-identity.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Spawns two MeshStore instances, verifies coordinator discovery,
|
|
5
5
|
* room creation, messaging, and delivery push.
|
|
6
6
|
*/
|
|
7
|
+
import { test, expect } from "vitest";
|
|
7
8
|
import { MeshStore } from "../core/mesh-store.js";
|
|
8
9
|
import { CommsTool } from "../core/tool.js";
|
|
9
10
|
import { buildAction } from "../core/bridge.js";
|
|
10
|
-
import * as assert from "node:assert/strict";
|
|
11
11
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
12
12
|
const E2E_PORT = 19878;
|
|
13
13
|
async function createStore(name, harness) {
|
|
@@ -42,13 +42,13 @@ async function main() {
|
|
|
42
42
|
console.log("Test: list agents from A...");
|
|
43
43
|
const agentsA = await a.store.listAgents(a.store.peerId);
|
|
44
44
|
console.log(` A sees ${String(agentsA.length)} agent(s)`);
|
|
45
|
-
|
|
45
|
+
expect(agentsA.length >= 2, "A should see both agents").toBeTruthy();
|
|
46
46
|
// Wait for state sync
|
|
47
47
|
await sleep(200);
|
|
48
48
|
console.log("Test: list agents from B...");
|
|
49
49
|
const agentsB = await b.store.listAgents(b.store.peerId);
|
|
50
50
|
console.log(` B sees ${String(agentsB.length)} agent(s)`);
|
|
51
|
-
|
|
51
|
+
expect(agentsB.length >= 2, "B should see both agents").toBeTruthy();
|
|
52
52
|
// --- Test: create room ---
|
|
53
53
|
console.log("Test: create room...");
|
|
54
54
|
const roomId = `test-room-${String(Date.now())}`;
|
|
@@ -64,7 +64,7 @@ async function main() {
|
|
|
64
64
|
console.log("Test: B lists rooms...");
|
|
65
65
|
const roomsB = await b.store.listRooms(b.store.peerId);
|
|
66
66
|
console.log(` B sees ${String(roomsB.length)} room(s)`);
|
|
67
|
-
|
|
67
|
+
expect(roomsB.length >= 1, "B should see the room").toBeTruthy();
|
|
68
68
|
// --- Test: B joins room --- The room already replicated to B via legacy full-state-sync, but knowing about a room is not the same as holding a room:member token for it -- B's own join still goes through real wire-level admission, held open until A approves it.
|
|
69
69
|
console.log("Test: B joins room...");
|
|
70
70
|
const joinPromise = b.store.joinRoom(room.id, b.store.peerId);
|
|
@@ -80,19 +80,23 @@ async function main() {
|
|
|
80
80
|
const roomB = await b.store.getRoom(room.id);
|
|
81
81
|
console.log(` A sees ${String(roomA?.members.length)} member(s)`);
|
|
82
82
|
console.log(` B sees ${String(roomB?.members.length)} member(s)`);
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
expect(roomA?.members.length, "A should see 2 room members").toBe(2);
|
|
84
|
+
expect(roomB?.members.length, "B should see 2 room members").toBe(2);
|
|
85
85
|
// --- Test: A sends message, B receives delivery ---
|
|
86
86
|
console.log("Test: A sends message to room...");
|
|
87
87
|
b.deliveries.length = 0;
|
|
88
88
|
await a.store.sendRoomMessage(room.id, a.store.peerId, "Hello from A!");
|
|
89
89
|
await sleep(300);
|
|
90
90
|
console.log(` B received ${String(b.deliveries.length)} delivery event(s)`);
|
|
91
|
-
|
|
91
|
+
expect(b.deliveries.length >= 1, "B should receive the room message").toBeTruthy();
|
|
92
92
|
const roomMsg = b.deliveries[0];
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
expect(roomMsg).toBeTruthy();
|
|
94
|
+
if (roomMsg === undefined)
|
|
95
|
+
throw new Error("expected a delivery event");
|
|
96
|
+
expect(roomMsg.type).toBe("room_message");
|
|
97
|
+
if (roomMsg.type !== "room_message")
|
|
98
|
+
throw new Error("expected a room_message event");
|
|
99
|
+
expect(roomMsg.message.content).toBe("Hello from A!");
|
|
96
100
|
// --- Test: DM from A to B --- The two-round DM consent flow (section 6): A's own outbound room.join is what authorises the DM, and B (the party contacted first) still needs a human decision.
|
|
97
101
|
console.log("Test: A requests DM access from B...");
|
|
98
102
|
const dmAccessPromise = a.store.requestDmAccess(b.store.peerId);
|
|
@@ -102,7 +106,9 @@ async function main() {
|
|
|
102
106
|
const pendingDm = b.store
|
|
103
107
|
.listPendingRoomJoins()
|
|
104
108
|
.find((p) => p.requesterId === a.store.peerId);
|
|
105
|
-
|
|
109
|
+
expect(pendingDm).toBeTruthy();
|
|
110
|
+
if (pendingDm === undefined)
|
|
111
|
+
throw new Error("expected a pending DM request");
|
|
106
112
|
b.store.acceptRoomJoin(pendingDm.roomPath, a.store.peerId);
|
|
107
113
|
await dmAccessPromise;
|
|
108
114
|
console.log("Test: DM from A to B...");
|
|
@@ -110,15 +116,17 @@ async function main() {
|
|
|
110
116
|
await a.store.sendDm(a.store.peerId, b.store.peerId, "Hey B!");
|
|
111
117
|
await sleep(300);
|
|
112
118
|
console.log(` B received ${String(b.deliveries.length)} DM event(s)`);
|
|
113
|
-
|
|
119
|
+
expect(b.deliveries.length >= 1, "B should receive the DM").toBeTruthy();
|
|
114
120
|
const dmEvent = b.deliveries[0];
|
|
115
|
-
|
|
116
|
-
|
|
121
|
+
expect(dmEvent).toBeTruthy();
|
|
122
|
+
if (dmEvent === undefined)
|
|
123
|
+
throw new Error("expected a delivery event");
|
|
124
|
+
expect(dmEvent.type).toBe("dm");
|
|
117
125
|
// --- Test: read room messages ---
|
|
118
126
|
console.log("Test: B reads room messages...");
|
|
119
127
|
const messages = await b.store.readRoomMessages(room.id);
|
|
120
128
|
console.log(` B sees ${String(messages.length)} message(s)`);
|
|
121
|
-
|
|
129
|
+
expect(messages.length >= 1, "B should see the message").toBeTruthy();
|
|
122
130
|
// --- Test: CommsTool integration ---
|
|
123
131
|
console.log("Test: CommsTool send via B...");
|
|
124
132
|
b.deliveries.length = 0;
|
|
@@ -135,7 +143,7 @@ async function main() {
|
|
|
135
143
|
}, action);
|
|
136
144
|
await sleep(300);
|
|
137
145
|
console.log(` A received ${String(a.deliveries.length)} delivery event(s)`);
|
|
138
|
-
|
|
146
|
+
expect(a.deliveries.length >= 1, "A should receive B's message").toBeTruthy();
|
|
139
147
|
// --- Cleanup ---
|
|
140
148
|
console.log("Cleaning up...");
|
|
141
149
|
await a.store.shutdown();
|
|
@@ -145,8 +153,7 @@ async function main() {
|
|
|
145
153
|
function sleep(ms) {
|
|
146
154
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
147
155
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
process.exit(1);
|
|
156
|
+
test("two MeshStore instances discover each other, create a shared room, message, and push-deliver over a real TCP peer mesh", async () => {
|
|
157
|
+
await main();
|
|
151
158
|
});
|
|
152
159
|
//# sourceMappingURL=mesh-e2e.integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-e2e.integration.test.js","sourceRoot":"","sources":["../../src/test/mesh-e2e.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mesh-e2e.integration.test.js","sourceRoot":"","sources":["../../src/test/mesh-e2e.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* P4 presence: WireMeshTransport's periodic self-advert re-send (readvertisePresence) and its counterpart on the receiving side (reportPresenceAdvert -> TransportEvents.onPresenceAdvert). Constructed directly against two real WireMeshTransport instances joined by a genuine data connection, deliberately bypassing MeshStore -- MeshStore's own updateAgent already propagates a status change via the pre-existing broadcastPatch/broadcast() path (P3.8 has not retired that yet), which would make a MeshStore-level test unable to tell whether presence gossip specifically worked, as opposed to the older mechanism that still runs alongside it.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test, describe } from "node:test";
|
|
4
|
+
import { test, describe, expect } from "vitest";
|
|
6
5
|
import { generateIdentity } from "../core/identity.js";
|
|
7
6
|
import { toIdentityPort } from "../core/wire-mesh-identity.js";
|
|
8
7
|
import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
|
|
@@ -24,7 +23,7 @@ function eventsRecordingPresence(onPresence) {
|
|
|
24
23
|
};
|
|
25
24
|
}
|
|
26
25
|
describe("WireMeshTransport presence re-advertisement", () => {
|
|
27
|
-
|
|
26
|
+
test("a session periodically re-sends this side's presence, and the peer surfaces it via onPresenceAdvert", async () => {
|
|
28
27
|
const identityA = generateIdentity();
|
|
29
28
|
const identityB = generateIdentity();
|
|
30
29
|
const peerIdA = deviceIdToHex(await toIdentityPort(identityA).then((p) => p.deviceId));
|
|
@@ -46,14 +45,14 @@ describe("WireMeshTransport presence re-advertisement", () => {
|
|
|
46
45
|
currentStatusA = "idle";
|
|
47
46
|
await waitFor(() => presenceSeenByB.some((seen) => seen.status === "idle"), "B observes A's updated idle presence after the next re-advertisement tick");
|
|
48
47
|
const idleSighting = presenceSeenByB.find((seen) => seen.status === "idle");
|
|
49
|
-
|
|
48
|
+
expect(idleSighting?.handle.id).toBe(peerIdA);
|
|
50
49
|
}
|
|
51
50
|
finally {
|
|
52
51
|
await transportB.shutdown();
|
|
53
52
|
await transportA.shutdown();
|
|
54
53
|
}
|
|
55
54
|
});
|
|
56
|
-
|
|
55
|
+
test("a session with no presence source configured never re-advertises", async () => {
|
|
57
56
|
const identityA = generateIdentity();
|
|
58
57
|
const identityB = generateIdentity();
|
|
59
58
|
const peerIdA = deviceIdToHex(await toIdentityPort(identityA).then((p) => p.deviceId));
|
|
@@ -73,7 +72,7 @@ describe("WireMeshTransport presence re-advertisement", () => {
|
|
|
73
72
|
}, peerIdB);
|
|
74
73
|
// Long enough to comfortably span several presence-readvertise ticks were one wired up (SHORT_PRESENCE_INTERVAL_MS above), short enough to keep the test fast -- the assertion below is a genuine "nothing happened", not a race against a real event we're waiting to observe.
|
|
75
74
|
await new Promise((resolve) => setTimeout(resolve, SHORT_PRESENCE_INTERVAL_MS * 3));
|
|
76
|
-
|
|
75
|
+
expect(presenceSeenByB.length).toBe(0);
|
|
77
76
|
}
|
|
78
77
|
finally {
|
|
79
78
|
await transportB.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence-readvertise.integration.test.js","sourceRoot":"","sources":["../../src/test/presence-readvertise.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"presence-readvertise.integration.test.js","sourceRoot":"","sources":["../../src/test/presence-readvertise.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { describe, it } from "
|
|
2
|
-
import assert from "node:assert/strict";
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
3
2
|
import { randomId } from "../core/random-id.js";
|
|
4
3
|
describe("randomId", () => {
|
|
5
4
|
it("returns 16 bytes", () => {
|
|
6
5
|
const id = randomId();
|
|
7
|
-
|
|
6
|
+
expect(id.length).toBe(16);
|
|
8
7
|
});
|
|
9
8
|
it("returns a different value on each call", () => {
|
|
10
9
|
const a = randomId();
|
|
11
10
|
const b = randomId();
|
|
12
|
-
|
|
11
|
+
expect(a).not.toEqual(b);
|
|
13
12
|
});
|
|
14
13
|
});
|
|
15
14
|
//# sourceMappingURL=random-id.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-id.test.js","sourceRoot":"","sources":["../../src/test/random-id.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"random-id.test.js","sourceRoot":"","sources":["../../src/test/random-id.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unit tests for the room_accept/room_reject/room_pending CommsTool actions -- the human-facing wrapper around MeshStore's own acceptRoomJoin/rejectRoomJoin/listPendingRoomJoins, additive alongside (never replacing) the existing mesh_accept/mesh_reject/mesh_pending connection-level actions.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { describe, it } from "node:test";
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { CommsTool } from "../core/tool.js";
|
|
8
7
|
import { buildAction } from "../core/bridge.js";
|
|
@@ -35,7 +34,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
35
34
|
description: "",
|
|
36
35
|
});
|
|
37
36
|
const handler = store.roomVerbHandlers["room.join"];
|
|
38
|
-
|
|
37
|
+
expect(handler).toBeTruthy();
|
|
38
|
+
if (handler === undefined)
|
|
39
|
+
throw new Error("expected a room.join handler to be registered");
|
|
39
40
|
void handler(fakeJoinRequest(room.id), { id: REQUESTER_ID });
|
|
40
41
|
const tool = new CommsTool(store);
|
|
41
42
|
const ctx = {
|
|
@@ -45,9 +46,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
45
46
|
pid: process.pid,
|
|
46
47
|
};
|
|
47
48
|
const pendingResult = await tool.handle(ctx, buildAction({ action: "room_pending" }));
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
expect(pendingResult.isError).toBe(false);
|
|
50
|
+
expect(pendingResult.content.includes(room.id)).toBeTruthy();
|
|
51
|
+
expect(pendingResult.content.includes(REQUESTER_ID)).toBeTruthy();
|
|
51
52
|
});
|
|
52
53
|
it("room_accept grants the pending request", async () => {
|
|
53
54
|
const store = new MeshStore();
|
|
@@ -67,7 +68,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
67
68
|
description: "",
|
|
68
69
|
});
|
|
69
70
|
const handler = store.roomVerbHandlers["room.join"];
|
|
70
|
-
|
|
71
|
+
expect(handler).toBeTruthy();
|
|
72
|
+
if (handler === undefined)
|
|
73
|
+
throw new Error("expected a room.join handler to be registered");
|
|
71
74
|
const outcomePromise = handler(fakeJoinRequest(room.id), {
|
|
72
75
|
id: REQUESTER_ID,
|
|
73
76
|
});
|
|
@@ -83,11 +86,11 @@ describe("room admission CommsTool actions", () => {
|
|
|
83
86
|
room: room.id,
|
|
84
87
|
requesterId: REQUESTER_ID,
|
|
85
88
|
}));
|
|
86
|
-
|
|
89
|
+
expect(acceptResult.isError).toBe(false);
|
|
87
90
|
const outcome = await outcomePromise;
|
|
88
|
-
|
|
91
|
+
expect(outcome.result).toBe("ok");
|
|
89
92
|
const pendingAfter = await tool.handle(ctx, buildAction({ action: "room_pending" }));
|
|
90
|
-
|
|
93
|
+
expect(pendingAfter.content).toBe("No pending room join requests.");
|
|
91
94
|
});
|
|
92
95
|
it("room_reject denies the pending request with an optional reason", async () => {
|
|
93
96
|
const store = new MeshStore();
|
|
@@ -107,7 +110,9 @@ describe("room admission CommsTool actions", () => {
|
|
|
107
110
|
description: "",
|
|
108
111
|
});
|
|
109
112
|
const handler = store.roomVerbHandlers["room.join"];
|
|
110
|
-
|
|
113
|
+
expect(handler).toBeTruthy();
|
|
114
|
+
if (handler === undefined)
|
|
115
|
+
throw new Error("expected a room.join handler to be registered");
|
|
111
116
|
const outcomePromise = handler(fakeJoinRequest(room.id), {
|
|
112
117
|
id: REQUESTER_ID,
|
|
113
118
|
});
|
|
@@ -124,11 +129,11 @@ describe("room admission CommsTool actions", () => {
|
|
|
124
129
|
requesterId: REQUESTER_ID,
|
|
125
130
|
reason: "not now",
|
|
126
131
|
}));
|
|
127
|
-
|
|
132
|
+
expect(rejectResult.isError).toBe(false);
|
|
128
133
|
const outcome = await outcomePromise;
|
|
129
|
-
|
|
134
|
+
expect(outcome.result).toBe("error");
|
|
130
135
|
if (outcome.result === "error") {
|
|
131
|
-
|
|
136
|
+
expect(outcome.message).toBe("not now");
|
|
132
137
|
}
|
|
133
138
|
});
|
|
134
139
|
it("room_accept on a store with no matching pending request reports failure, not a crash", async () => {
|
|
@@ -154,7 +159,7 @@ describe("room admission CommsTool actions", () => {
|
|
|
154
159
|
room: "not-a-real-room",
|
|
155
160
|
requesterId: REQUESTER_ID,
|
|
156
161
|
}));
|
|
157
|
-
|
|
162
|
+
expect(result.isError).toBe(true);
|
|
158
163
|
});
|
|
159
164
|
});
|
|
160
165
|
//# sourceMappingURL=room-admission-tool-actions.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-admission-tool-actions.test.js","sourceRoot":"","sources":["../../src/test/room-admission-tool-actions.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-admission-tool-actions.test.js","sourceRoot":"","sources":["../../src/test/room-admission-tool-actions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration test for destroy-via-revocation (P3.8): destroying a room revokes every member's own room:member grant for real, the same way kicking one member already does, so a fellow member's own independent token verification rejects a former member's message even after the room itself is gone from the owner's own bookkeeping.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test } from "node:test";
|
|
4
|
+
import { test, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
8
7
|
let nextPort = 21_410;
|
|
@@ -32,7 +31,7 @@ async function joinAndAccept(owner, member, roomId) {
|
|
|
32
31
|
owner.acceptRoomJoin(roomId, member.peerId);
|
|
33
32
|
await joinPromise;
|
|
34
33
|
}
|
|
35
|
-
|
|
34
|
+
test("destroying a room revokes every member's own grant for every peer, not just the owner", async () => {
|
|
36
35
|
const port = freshPort();
|
|
37
36
|
const owner = await makeRegisteredStore(port, "owner");
|
|
38
37
|
const memberA = await makeRegisteredStore(port, "member-a");
|
|
@@ -53,7 +52,7 @@ void test("destroying a room revokes every member's own grant for every peer, no
|
|
|
53
52
|
await owner.destroyRoom(room.id, owner.peerId);
|
|
54
53
|
// Settles the revocation-announce destroyRoom just broadcast for every member: B's own drain loop processes it asynchronously off the wire, with no observable side effect from outside B's own store to wait on affirmatively.
|
|
55
54
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
56
|
-
await
|
|
55
|
+
await expect(memberA.sendRoomMessageDirected(room.id, memberB.peerId, "still here?"), "B must reject a room.send sent under a grant the owner already revoked by destroying the room").rejects.toThrow(/unauthorized/);
|
|
57
56
|
}
|
|
58
57
|
finally {
|
|
59
58
|
await memberB.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-destroy-revocation.integration.test.js","sourceRoot":"","sources":["../../src/test/room-destroy-revocation.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-destroy-revocation.integration.test.js","sourceRoot":"","sources":["../../src/test/room-destroy-revocation.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration test for room.invite's real wire-level path (P3.8): the room owner pushes an already-minted room:member grant to a target directly, over a real, wire-authenticated room.invite -- replacing the legacy broadcastPatch/deliverLocallyAndBroadcast fan-out (which reached every mesh-connected peer with a "delivery" patch, not just the intended target) with a directed request the target itself verifies before persisting the token.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test } from "node:test";
|
|
4
|
+
import { test, expect } from "vitest";
|
|
6
5
|
import { MeshStore } from "../core/mesh-store.js";
|
|
7
6
|
import { loadRoomTokens } from "../core/identity-store.js";
|
|
8
7
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
@@ -37,7 +36,7 @@ async function makeConnectedPair(port) {
|
|
|
37
36
|
await waitFor(() => owner.serialise().agents[target.peerId] !== undefined, "owner sees the target agent");
|
|
38
37
|
return { owner, target, targetSlot };
|
|
39
38
|
}
|
|
40
|
-
|
|
39
|
+
test("inviting a target delivers a real room_invite carrying the room's own name/description and the inviter's own name/cwd", async () => {
|
|
41
40
|
const { owner, target, targetSlot } = await makeConnectedPair(freshPort());
|
|
42
41
|
try {
|
|
43
42
|
const room = await owner.createRoom({
|
|
@@ -53,21 +52,23 @@ void test("inviting a target delivers a real room_invite carrying the room's own
|
|
|
53
52
|
await owner.inviteToRoom(room.id, target.peerId, owner.peerId);
|
|
54
53
|
await waitFor(() => targetDeliveries.some((event) => event.type === "room_invite"), "target receives the invite");
|
|
55
54
|
const invite = targetDeliveries.find((event) => event.type === "room_invite");
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
expect(invite).toBeTruthy();
|
|
56
|
+
if (invite === undefined)
|
|
57
|
+
throw new Error("expected a room_invite delivery event");
|
|
58
|
+
expect(invite.room).toBe(room.id);
|
|
59
|
+
expect(invite.roomDescription).toBe("the main room");
|
|
60
|
+
expect(invite.from).toBe(owner.peerId);
|
|
61
|
+
expect(invite.fromName).toBe("owner");
|
|
62
|
+
expect(invite.fromCwd).toBe("/test/owner");
|
|
62
63
|
// The pushed grant is usable, not just delivered: the target holds a real, persisted room:member token for the room now.
|
|
63
|
-
|
|
64
|
+
expect(loadRoomTokens(targetSlot)[room.id]).toBeTruthy();
|
|
64
65
|
}
|
|
65
66
|
finally {
|
|
66
67
|
await target.shutdown();
|
|
67
68
|
await owner.shutdown();
|
|
68
69
|
}
|
|
69
70
|
});
|
|
70
|
-
|
|
71
|
+
test("inviting an unreachable target throws rather than silently dropping the invite", async () => {
|
|
71
72
|
const owner = new MeshStore(freshPort());
|
|
72
73
|
await wireTestTransport(owner);
|
|
73
74
|
await owner.init();
|
|
@@ -87,7 +88,7 @@ void test("inviting an unreachable target throws rather than silently dropping t
|
|
|
87
88
|
description: "",
|
|
88
89
|
});
|
|
89
90
|
const strangerId = "b".repeat(64);
|
|
90
|
-
await
|
|
91
|
+
await expect(owner.inviteToRoom(room.id, strangerId, owner.peerId)).rejects.toMatchObject({ code: "INVITE_FAILED" });
|
|
91
92
|
}
|
|
92
93
|
finally {
|
|
93
94
|
await owner.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-invite-directed.integration.test.js","sourceRoot":"","sources":["../../src/test/room-invite-directed.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"room-invite-directed.integration.test.js","sourceRoot":"","sources":["../../src/test/room-invite-directed.integration.test.ts"],"names":[],"mappings":"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"}
|