agent-comms 2.18.3 → 2.19.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.
- 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/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 +27 -24
- 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 +9 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcast-window.integration.test.js","sourceRoot":"","sources":["../../src/test/broadcast-window.integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"broadcast-window.integration.test.js","sourceRoot":"","sources":["../../src/test/broadcast-window.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as net from "node:net";
|
|
8
8
|
import { MeshStore } from "../core/mesh-store.js";
|
|
9
|
-
import
|
|
10
|
-
import { test } from "node:test";
|
|
9
|
+
import { test, expect } from "vitest";
|
|
11
10
|
import { wireTestTransport } from "./test-transport.js";
|
|
12
11
|
const TEST_PORT = 19879;
|
|
13
12
|
/**
|
|
@@ -18,7 +17,7 @@ const TEST_PORT = 19879;
|
|
|
18
17
|
* .on("data") but no .on("error"), so an ECONNRESET became an unhandled
|
|
19
18
|
* error event on the socket → uncaught exception → process crash.
|
|
20
19
|
*/
|
|
21
|
-
|
|
20
|
+
test("coordinator survives ECONNRESET on accepted socket", async () => {
|
|
22
21
|
const store = new MeshStore(TEST_PORT);
|
|
23
22
|
await wireTestTransport(store);
|
|
24
23
|
await store.init();
|
|
@@ -37,7 +36,7 @@ void test("coordinator survives ECONNRESET on accepted socket", async () => {
|
|
|
37
36
|
// If we reach here, the process didn't crash from the unhandled error.
|
|
38
37
|
// Verify the store is still functional.
|
|
39
38
|
const agents = await store.listAgents(store.peerId);
|
|
40
|
-
|
|
39
|
+
expect(Array.isArray(agents), "Store should still be functional").toBeTruthy();
|
|
41
40
|
await store.shutdown();
|
|
42
41
|
});
|
|
43
42
|
//# sourceMappingURL=coordinator-socket-error.integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator-socket-error.integration.test.js","sourceRoot":"","sources":["../../src/test/coordinator-socket-error.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"coordinator-socket-error.integration.test.js","sourceRoot":"","sources":["../../src/test/coordinator-socket-error.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnB,+CAA+C;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC;QAClC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;KAClB,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,kDAAkD;IAClD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzD,uEAAuE;IACvE,wCAAwC;IACxC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,CACJ,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EACrB,kCAAkC,CACnC,CAAC,UAAU,EAAE,CAAC;IAEf,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* createRoom must mint and persist the owner's own self-signed room:member grant, so the owner has a token to present for its own room actions uniformly with every other member (rather than being implicitly exempt from the check every other member's actions go through).
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import { test } from "node:test";
|
|
4
|
+
import { test, expect } from "vitest";
|
|
6
5
|
import { deviceIdFromHex } from "wire-mesh-core/domain/device-id";
|
|
7
6
|
import { verifyCapabilityToken } from "wire-mesh-core/domain/tokens";
|
|
8
7
|
import { createSystemClock } from "wire-mesh-core/adapters/system-clock";
|
|
@@ -16,7 +15,7 @@ async function makeStore() {
|
|
|
16
15
|
const slot = await wireTestTransport(store);
|
|
17
16
|
return { store, slot };
|
|
18
17
|
}
|
|
19
|
-
|
|
18
|
+
test("createRoom persists a self-signed room:member grant for the owner", async () => {
|
|
20
19
|
const { store, slot } = await makeStore();
|
|
21
20
|
const owner = await store.registerAgent({
|
|
22
21
|
name: "owner",
|
|
@@ -34,7 +33,9 @@ void test("createRoom persists a self-signed room:member grant for the owner", a
|
|
|
34
33
|
});
|
|
35
34
|
const tokens = loadRoomTokens(slot);
|
|
36
35
|
const token = tokens[room.id];
|
|
37
|
-
|
|
36
|
+
expect(token, "expected a persisted token for the new room").toBeDefined();
|
|
37
|
+
if (token === undefined)
|
|
38
|
+
throw new Error("expected a persisted token for the new room");
|
|
38
39
|
// Any IdentityPort supplies verification-only crypto primitives -- verifyCapabilityToken never trusts the caller's own identity, only the token's self-certifying issuer-key, so a throwaway identity works here exactly as well as the owner's real one.
|
|
39
40
|
const verifierIdentity = await toIdentityPort(generateIdentity());
|
|
40
41
|
const verdict = await verifyCapabilityToken(token, {
|
|
@@ -43,11 +44,11 @@ void test("createRoom persists a self-signed room:member grant for the owner", a
|
|
|
43
44
|
revocation: { isRevoked: async () => false },
|
|
44
45
|
expectedBearer: deviceIdFromHex(owner.id),
|
|
45
46
|
});
|
|
46
|
-
|
|
47
|
+
expect(verdict.ok, `expected the owner grant to verify, got ${JSON.stringify(verdict)}`).toBeTruthy();
|
|
47
48
|
if (!verdict.ok)
|
|
48
49
|
return;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
expect(verdict.claims.capability).toBe("room:member");
|
|
51
|
+
expect(verdict.claims.scope).toEqual({ kind: "room", path: room.id });
|
|
52
|
+
expect(verdict.rootIssuer).toEqual(deviceIdFromHex(owner.id));
|
|
52
53
|
});
|
|
53
54
|
//# sourceMappingURL=create-room-mints-owner-grant.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-room-mints-owner-grant.test.js","sourceRoot":"","sources":["../../src/test/create-room-mints-owner-grant.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"create-room-mints-owner-grant.test.js","sourceRoot":"","sources":["../../src/test/create-room-mints-owner-grant.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,UAAU,SAAS;IACtB,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;QACtC,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,WAAW,EAAE,EAAE;KAChB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3E,IAAI,KAAK,KAAK,SAAS;QACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,0PAA0P;IAC1P,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE;QACjD,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,iBAAiB,EAAE;QAC1B,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE;QAC5C,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,MAAM,CACJ,OAAO,CAAC,EAAE,EACV,2CAA2C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CACrE,CAAC,UAAU,EAAE,CAAC;IACf,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO;IACxB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* createRoom must accept an arbitrary caller-supplied name -- e.g. from a live create_room tool call, not just an internal cwd basename -- and sanitise it into the room-path grammar's [A-Za-z0-9_-]+ charset itself, rather than throwing on whatever a user happened to type. This is the one choke point every room creation goes through, so it is the right place to slug, not something every caller must remember to pre-slug.
|
|
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 { ownerNamedRoomPath } from "../core/room-path.js";
|
|
8
7
|
import { wireTestTransport } from "./test-transport.js";
|
|
@@ -11,7 +10,7 @@ async function makeStore() {
|
|
|
11
10
|
await wireTestTransport(store);
|
|
12
11
|
return store;
|
|
13
12
|
}
|
|
14
|
-
|
|
13
|
+
test("createRoom sanitises a name containing spaces and dots instead of throwing", async () => {
|
|
15
14
|
const store = await makeStore();
|
|
16
15
|
const owner = await store.registerAgent({
|
|
17
16
|
name: "owner",
|
|
@@ -27,10 +26,10 @@ void test("createRoom sanitises a name containing spaces and dots instead of thr
|
|
|
27
26
|
owner: owner.id,
|
|
28
27
|
description: "x",
|
|
29
28
|
});
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
expect(room.name).toBe("my-project-docs");
|
|
30
|
+
expect(room.id).toBe(ownerNamedRoomPath(owner.id, "my-project-docs"));
|
|
32
31
|
});
|
|
33
|
-
|
|
32
|
+
test("createRoom's sanitised id is what getRoom must be looked up by", async () => {
|
|
34
33
|
const store = await makeStore();
|
|
35
34
|
const owner = await store.registerAgent({
|
|
36
35
|
name: "owner",
|
|
@@ -47,6 +46,6 @@ void test("createRoom's sanitised id is what getRoom must be looked up by", asyn
|
|
|
47
46
|
description: "x",
|
|
48
47
|
});
|
|
49
48
|
const found = await store.getRoom(room.id);
|
|
50
|
-
|
|
49
|
+
expect(found?.name).toBe("team-chat");
|
|
51
50
|
});
|
|
52
51
|
//# sourceMappingURL=create-room-name-sanitisation.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-room-name-sanitisation.test.js","sourceRoot":"","sources":["../../src/test/create-room-name-sanitisation.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"create-room-name-sanitisation.test.js","sourceRoot":"","sources":["../../src/test/create-room-name-sanitisation.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,UAAU,SAAS;IACtB,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;IAC9B,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC5F,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;QACtC,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;QACtC,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Unlike named-room admission, a real two-peer test can actually exercise this: dmRequestsInitiatedByMe and the persisted room-token store are both purely local state legacy full-state-sync never touches, so two ordinarily mesh-connected peers stay in the "never DM'd before" state this flow exists for.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
7
|
-
import { test } from "node:test";
|
|
6
|
+
import { test, expect } from "vitest";
|
|
8
7
|
import { MeshStore } from "../core/mesh-store.js";
|
|
9
8
|
import { dmRoomPath } from "../core/room-path.js";
|
|
10
9
|
import { waitFor, wireTestTransport } from "./test-transport.js";
|
|
@@ -39,7 +38,7 @@ async function makeConnectedPair(port) {
|
|
|
39
38
|
await waitFor(() => a.serialise().agents[b.peerId] !== undefined, "a sees b's agent");
|
|
40
39
|
return { a, b };
|
|
41
40
|
}
|
|
42
|
-
|
|
41
|
+
test("A's DM request holds open for B's decision; B's reply back auto-approves", async () => {
|
|
43
42
|
const { a, b } = await makeConnectedPair(freshPort());
|
|
44
43
|
try {
|
|
45
44
|
const dmPath = dmRoomPath(a.peerId, b.peerId);
|
|
@@ -47,29 +46,29 @@ void test("A's DM request holds open for B's decision; B's reply back auto-appro
|
|
|
47
46
|
const aRequestPromise = a.requestDmAccess(b.peerId);
|
|
48
47
|
await waitFor(() => b.listPendingRoomJoins().length === 1, "B sees A's pending DM request");
|
|
49
48
|
const [pending] = b.listPendingRoomJoins();
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
expect(pending?.roomPath).toBe(dmPath);
|
|
50
|
+
expect(pending?.requesterId).toBe(a.peerId);
|
|
52
51
|
b.acceptRoomJoin(dmPath, a.peerId);
|
|
53
52
|
await aRequestPromise;
|
|
54
53
|
// B's own reply, to the identical path, must NOT surface as a second pending decision on A's side -- A's own outbound request already covers it.
|
|
55
54
|
const bRequestPromise = b.requestDmAccess(a.peerId);
|
|
56
55
|
await bRequestPromise;
|
|
57
|
-
|
|
56
|
+
expect(a.listPendingRoomJoins()).toEqual([]);
|
|
58
57
|
}
|
|
59
58
|
finally {
|
|
60
59
|
await b.shutdown();
|
|
61
60
|
await a.shutdown();
|
|
62
61
|
}
|
|
63
62
|
});
|
|
64
|
-
|
|
63
|
+
test("an unsolicited DM request (no prior outbound request) still needs a human decision", async () => {
|
|
65
64
|
const { a, b } = await makeConnectedPair(freshPort());
|
|
66
65
|
try {
|
|
67
66
|
const dmPath = dmRoomPath(a.peerId, b.peerId);
|
|
68
67
|
const requestPromise = b.requestDmAccess(a.peerId);
|
|
69
68
|
await waitFor(() => a.listPendingRoomJoins().length === 1, "A sees B's pending DM request");
|
|
70
69
|
const [pending] = a.listPendingRoomJoins();
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
expect(pending?.roomPath).toBe(dmPath);
|
|
71
|
+
expect(pending?.requesterId).toBe(b.peerId);
|
|
73
72
|
a.acceptRoomJoin(dmPath, b.peerId);
|
|
74
73
|
await requestPromise;
|
|
75
74
|
}
|
|
@@ -78,14 +77,14 @@ void test("an unsolicited DM request (no prior outbound request) still needs a h
|
|
|
78
77
|
await a.shutdown();
|
|
79
78
|
}
|
|
80
79
|
});
|
|
81
|
-
|
|
80
|
+
test("a rejected DM request throws, and never auto-approves the reciprocal reply", async () => {
|
|
82
81
|
const { a, b } = await makeConnectedPair(freshPort());
|
|
83
82
|
try {
|
|
84
83
|
const dmPath = dmRoomPath(a.peerId, b.peerId);
|
|
85
84
|
const aRequestPromise = a.requestDmAccess(b.peerId);
|
|
86
85
|
await waitFor(() => b.listPendingRoomJoins().length === 1, "B sees A's pending DM request");
|
|
87
86
|
b.rejectRoomJoin(dmPath, a.peerId, "not interested");
|
|
88
|
-
await
|
|
87
|
+
await expect(aRequestPromise).rejects.toThrow(/was refused \(denied\)/);
|
|
89
88
|
}
|
|
90
89
|
finally {
|
|
91
90
|
await b.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dm-admission.integration.test.js","sourceRoot":"","sources":["../../src/test/dm-admission.integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"dm-admission.integration.test.js","sourceRoot":"","sources":["../../src/test/dm-admission.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* Run: node dist/test/federation.integration.test.js
|
|
14
14
|
*/
|
|
15
15
|
import { MeshStore } from "../core/mesh-store.js";
|
|
16
|
-
import * as assert from "node:assert/strict";
|
|
17
16
|
import * as net from "node:net";
|
|
17
|
+
import { test, expect } from "vitest";
|
|
18
18
|
import { wireTestTransport } from "./test-transport.js";
|
|
19
19
|
// Use high ports to avoid collisions with real meshes
|
|
20
20
|
const MESH_A_PORT = 28876;
|
|
@@ -78,40 +78,42 @@ async function main() {
|
|
|
78
78
|
await sleep(100);
|
|
79
79
|
// --- Test 0: untrusted inbound connection is rejected ---
|
|
80
80
|
console.log("\nTest 0: untrusted connection is rejected...");
|
|
81
|
-
await
|
|
82
|
-
|
|
81
|
+
await expect(b.store.fedConnect("127.0.0.1", fedPort), "Connecting before either side has pinned the other's fingerprint should be rejected").rejects.toThrow(/rejected|not in the trusted-fingerprint allowlist/i);
|
|
82
|
+
expect(b.store.fedLinks().length, "B should have no federation links after a rejected attempt").toBe(0);
|
|
83
83
|
console.log(" Rejected as expected — no link was created.");
|
|
84
84
|
// --- Pin fingerprints on both sides, mirroring what an operator does out of band ---
|
|
85
85
|
console.log("\nPinning fingerprints on both sides...");
|
|
86
86
|
const fingerprintA = a.store.getFederationFingerprint();
|
|
87
87
|
const fingerprintB = b.store.getFederationFingerprint();
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
expect(fingerprintA.length > 0, "A should report its own fingerprint").toBeTruthy();
|
|
89
|
+
expect(fingerprintB.length > 0, "B should report its own fingerprint").toBeTruthy();
|
|
90
90
|
await a.store.fedTrust(fingerprintB);
|
|
91
91
|
await b.store.fedTrust(fingerprintA);
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
expect(a.store.fedTrustedFingerprints()).toEqual([fingerprintB]);
|
|
93
|
+
expect(b.store.fedTrustedFingerprints()).toEqual([fingerprintA]);
|
|
94
94
|
// --- Test 1: Establish federation link now that both sides trust each other ---
|
|
95
95
|
console.log("\nTest 1: Establish federation link...");
|
|
96
96
|
const linkId = await b.store.fedConnect("127.0.0.1", fedPort);
|
|
97
97
|
console.log(` Link established: ${linkId}`);
|
|
98
|
-
|
|
98
|
+
expect(linkId, "Should return a link ID").toBeTruthy();
|
|
99
99
|
const linksB = b.store.fedLinks();
|
|
100
|
-
|
|
100
|
+
expect(linksB.length, "B should have 1 federation link").toBe(1);
|
|
101
101
|
const link = linksB[0];
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
expect(link, "Link should exist").toBeTruthy();
|
|
103
|
+
if (link === undefined)
|
|
104
|
+
throw new Error("Link should exist");
|
|
105
|
+
expect(link.remoteMeshId.length > 0, "Remote mesh ID should be present").toBeTruthy();
|
|
104
106
|
await sleep(200);
|
|
105
107
|
// --- Test 2: Agent presence propagates ---
|
|
106
108
|
console.log("Test 2: Agent presence propagates...");
|
|
107
109
|
const agentsB = await b.store.listAgents(b.store.peerId);
|
|
108
110
|
console.log(` B sees ${String(agentsB.length)} agent(s)`);
|
|
109
111
|
const fedAgentsB = agentsB.filter((ag) => ag.tags.includes("federated"));
|
|
110
|
-
|
|
112
|
+
expect(fedAgentsB.length >= 1, "B should see at least 1 federated agent from A").toBeTruthy();
|
|
111
113
|
const agentsA = await a.store.listAgents(a.store.peerId);
|
|
112
114
|
console.log(` A sees ${String(agentsA.length)} agent(s)`);
|
|
113
115
|
const fedAgentsA = agentsA.filter((ag) => ag.tags.includes("federated"));
|
|
114
|
-
|
|
116
|
+
expect(fedAgentsA.length >= 1, "A should see at least 1 federated agent from B").toBeTruthy();
|
|
115
117
|
// --- Test 3: Federated room messages propagate ---
|
|
116
118
|
console.log("Test 3: Federated room messages propagate...");
|
|
117
119
|
const fedRoomId = `fed-room-${String(Date.now())}`;
|
|
@@ -143,7 +145,7 @@ async function main() {
|
|
|
143
145
|
await sleep(500);
|
|
144
146
|
const fedMsgs = b.deliveries.filter((e) => e.type === "room_message" && e.message.content === "Hello from mesh A!");
|
|
145
147
|
console.log(` B received ${String(fedMsgs.length)} federated message(s)`);
|
|
146
|
-
|
|
148
|
+
expect(fedMsgs.length >= 1, "B should receive the federated room message").toBeTruthy();
|
|
147
149
|
// --- Test 4: Non-federated rooms are isolated ---
|
|
148
150
|
console.log("Test 4: Non-federated rooms are isolated...");
|
|
149
151
|
const localRoomId = `local-room-${String(Date.now())}`;
|
|
@@ -164,18 +166,18 @@ async function main() {
|
|
|
164
166
|
await sleep(100);
|
|
165
167
|
const leakedMsgs = b.deliveries.filter((e) => e.type === "room_message" && e.message.content === "Secret local message");
|
|
166
168
|
console.log(` B received ${String(leakedMsgs.length)} leaked message(s)`);
|
|
167
|
-
|
|
169
|
+
expect(leakedMsgs.length, "B should NOT receive non-federated room messages").toBe(0);
|
|
168
170
|
// --- Test 5: Federation link listing ---
|
|
169
171
|
console.log("Test 5: Federation link listing...");
|
|
170
172
|
const linksA = a.store.fedLinks();
|
|
171
|
-
|
|
173
|
+
expect(linksA.length, "A should have 1 federation link").toBe(1);
|
|
172
174
|
console.log(` A links: ${linksA.map((l) => l.remoteName).join(", ")}`);
|
|
173
175
|
// --- Test 6: Disconnect federation link ---
|
|
174
176
|
console.log("Test 6: Disconnect federation link...");
|
|
175
177
|
await b.store.fedDisconnect(linkId);
|
|
176
178
|
await sleep(200);
|
|
177
179
|
const linksAfter = b.store.fedLinks();
|
|
178
|
-
|
|
180
|
+
expect(linksAfter.length, "B should have 0 federation links after disconnect").toBe(0);
|
|
179
181
|
// --- Cleanup ---
|
|
180
182
|
console.log("\nCleaning up...");
|
|
181
183
|
await a.store.fedStopListening();
|
|
@@ -183,8 +185,7 @@ async function main() {
|
|
|
183
185
|
await b.store.shutdown();
|
|
184
186
|
console.log("\n✓ All federation tests passed!");
|
|
185
187
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
process.exit(1);
|
|
188
|
+
test("federates two meshes over coordinator-to-coordinator TLS links, propagating presence and room messages while rejecting an untrusted inbound link", async () => {
|
|
189
|
+
await main();
|
|
189
190
|
});
|
|
190
191
|
//# sourceMappingURL=federation.integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.integration.test.js","sourceRoot":"","sources":["../../src/test/federation.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"federation.integration.test.js","sourceRoot":"","sources":["../../src/test/federation.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for the FileStore, the filesystem-backed legacy store exported from the public API. Covers the membership operation maps (a pending invite must survive an unrelated join, #35) and record parsing (an unparseable record must surface, not read as an empty mesh, #32).
|
|
3
3
|
*/
|
|
4
|
-
import * as assert from "node:assert/strict";
|
|
5
4
|
import * as fs from "node:fs";
|
|
6
5
|
import { tmpdir } from "node:os";
|
|
7
6
|
import path from "node:path";
|
|
8
|
-
import { test } from "
|
|
7
|
+
import { test, expect } from "vitest";
|
|
9
8
|
import { FileStore } from "../core/store.js";
|
|
10
9
|
function tempStore() {
|
|
11
10
|
const root = fs.mkdtempSync(path.join(tmpdir(), "agent-comms-filestore-"));
|
|
12
11
|
return new FileStore(root);
|
|
13
12
|
}
|
|
14
|
-
|
|
13
|
+
test("a pending invite survives an unrelated join to the room", async () => {
|
|
15
14
|
const store = tempStore();
|
|
16
15
|
const owner = await store.registerAgent({
|
|
17
16
|
name: "owner",
|
|
@@ -44,12 +43,12 @@ void test("a pending invite survives an unrelated join to the room", async () =>
|
|
|
44
43
|
description: "x",
|
|
45
44
|
});
|
|
46
45
|
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
47
|
-
|
|
46
|
+
expect((await store.getRoom("room"))?.invited).toEqual([invitee.id]);
|
|
48
47
|
// Any later join re-derives the invited view from the operation maps; the pending invite must survive it (#35).
|
|
49
48
|
await store.joinRoom("room", other.id);
|
|
50
|
-
|
|
49
|
+
expect((await store.getRoom("room"))?.invited).toEqual([invitee.id]);
|
|
51
50
|
});
|
|
52
|
-
|
|
51
|
+
test("declining and kicking clear the invited view consistently", async () => {
|
|
53
52
|
const store = tempStore();
|
|
54
53
|
const owner = await store.registerAgent({
|
|
55
54
|
name: "owner",
|
|
@@ -76,15 +75,15 @@ void test("declining and kicking clear the invited view consistently", async ()
|
|
|
76
75
|
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
77
76
|
await store.declineInvite("room", invitee.id, "not now");
|
|
78
77
|
const declined = await store.getRoom("room");
|
|
79
|
-
|
|
78
|
+
expect(declined?.invited).toEqual([]);
|
|
80
79
|
// Re-inviting after a decline works: the new join op outranks the leave.
|
|
81
80
|
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
82
|
-
|
|
81
|
+
expect((await store.getRoom("room"))?.invited).toEqual([invitee.id]);
|
|
83
82
|
await store.kickFromRoom("room", invitee.id, owner.id);
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
expect((await store.getRoom("room"))?.invited).toEqual([]);
|
|
84
|
+
expect((await store.getRoom("room"))?.members.includes(invitee.id)).toBe(false);
|
|
86
85
|
});
|
|
87
|
-
|
|
86
|
+
test("joining through an invitation consumes it", async () => {
|
|
88
87
|
const store = tempStore();
|
|
89
88
|
const owner = await store.registerAgent({
|
|
90
89
|
name: "owner",
|
|
@@ -111,10 +110,10 @@ void test("joining through an invitation consumes it", async () => {
|
|
|
111
110
|
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
112
111
|
await store.joinRoom("room", invitee.id);
|
|
113
112
|
const room = await store.getRoom("room");
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
expect(room?.invited).toEqual([]);
|
|
114
|
+
expect(room?.members.includes(invitee.id)).toBe(true);
|
|
116
115
|
});
|
|
117
|
-
|
|
116
|
+
test("an unparseable stored record surfaces instead of an empty list", async () => {
|
|
118
117
|
const store = tempStore();
|
|
119
118
|
await store.registerAgent({
|
|
120
119
|
name: "good",
|
|
@@ -127,10 +126,10 @@ void test("an unparseable stored record surfaces instead of an empty list", asyn
|
|
|
127
126
|
// A record missing the required fields (written by an older build, say) must raise from listAgents, not read as an empty mesh (#32).
|
|
128
127
|
const agentsDir = path.join(store.root, "registry", "agents");
|
|
129
128
|
fs.writeFileSync(path.join(agentsDir, "stale.json"), '{"id": "stale"}');
|
|
130
|
-
await
|
|
129
|
+
await expect(store.listAgents("whoever")).rejects.toBeInstanceOf(Error);
|
|
131
130
|
});
|
|
132
|
-
|
|
131
|
+
test("a store with no registry yet lists no agents", async () => {
|
|
133
132
|
const store = tempStore();
|
|
134
|
-
|
|
133
|
+
expect(await store.listAgents("whoever")).toEqual([]);
|
|
135
134
|
});
|
|
136
135
|
//# sourceMappingURL=filestore.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filestore.test.js","sourceRoot":"","sources":["../../src/test/filestore.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"filestore.test.js","sourceRoot":"","sources":["../../src/test/filestore.test.ts"],"names":[],"mappings":"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"}
|