agent-comms 2.0.1 → 2.2.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/build.js +0 -11
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/dist/bundle.js +2 -2
- package/dist/bridges/user/web/frontend/components/App.d.ts +0 -4
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +1 -5
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +2 -3
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +2 -16
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/core/bridge.d.ts +3 -3
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +11 -9
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +9 -4
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/room-path.d.ts +20 -0
- package/dist/core/room-path.d.ts.map +1 -0
- package/dist/core/room-path.js +60 -0
- package/dist/core/room-path.js.map +1 -0
- package/dist/core/room-token-verification.d.ts +24 -0
- package/dist/core/room-token-verification.d.ts.map +1 -0
- package/dist/core/room-token-verification.js +35 -0
- package/dist/core/room-token-verification.js.map +1 -0
- package/dist/core/wire-protocol.d.ts +2 -10
- package/dist/core/wire-protocol.d.ts.map +1 -1
- package/dist/core/wire-protocol.js +1 -12
- package/dist/core/wire-protocol.js.map +1 -1
- package/dist/test/create-room-name-sanitisation.test.d.ts +5 -0
- package/dist/test/create-room-name-sanitisation.test.d.ts.map +1 -0
- package/dist/test/create-room-name-sanitisation.test.js +52 -0
- package/dist/test/create-room-name-sanitisation.test.js.map +1 -0
- package/dist/test/downtime-replay.integration.test.js +6 -4
- package/dist/test/downtime-replay.integration.test.js.map +1 -1
- package/dist/test/downtime-replay.test.js +10 -6
- package/dist/test/downtime-replay.test.js.map +1 -1
- package/dist/test/federation.integration.test.js +4 -1
- package/dist/test/federation.integration.test.js.map +1 -1
- package/dist/test/identity-restart.integration.test.js +3 -2
- package/dist/test/identity-restart.integration.test.js.map +1 -1
- package/dist/test/room-path.test.d.ts +2 -0
- package/dist/test/room-path.test.d.ts.map +1 -0
- package/dist/test/room-path.test.js +54 -0
- package/dist/test/room-path.test.js.map +1 -0
- package/dist/test/room-token-verification.test.d.ts +2 -0
- package/dist/test/room-token-verification.test.d.ts.map +1 -0
- package/dist/test/room-token-verification.test.js +212 -0
- package/dist/test/room-token-verification.test.js.map +1 -0
- package/dist/test/state-sync-convergence.test.js +30 -29
- package/dist/test/state-sync-convergence.test.js.map +1 -1
- package/package.json +2 -2
- package/dist/bridges/user/web/dist/relay-worker.js +0 -1
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +0 -15
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/components/RelayPanel.js +0 -46
- package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +0 -1
- package/dist/bridges/user/web/frontend/relay-client.d.ts +0 -40
- package/dist/bridges/user/web/frontend/relay-client.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/relay-client.js +0 -97
- package/dist/bridges/user/web/frontend/relay-client.js.map +0 -1
- package/dist/bridges/user/web/frontend/relay-worker.d.ts +0 -15
- package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/relay-worker.js +0 -379
- package/dist/bridges/user/web/frontend/relay-worker.js.map +0 -1
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { webcrypto } from "node:crypto";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { createNodeIdentity } from "wire-mesh-core/adapters/node-identity";
|
|
5
|
+
import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
|
|
6
|
+
import { mintCapabilityToken, mintRevocationEntry, } from "wire-mesh-core/domain/tokens";
|
|
7
|
+
import { createRevocationView } from "wire-mesh-core/domain/revocation-view";
|
|
8
|
+
import { ownerNamedRoomPath, dmRoomPath } from "../core/room-path.js";
|
|
9
|
+
import { verifyRoomToken } from "../core/room-token-verification.js";
|
|
10
|
+
const ES256 = -7;
|
|
11
|
+
const HOUR_MS = 3_600_000;
|
|
12
|
+
function buf(bytes) {
|
|
13
|
+
return Uint8Array.from(bytes);
|
|
14
|
+
}
|
|
15
|
+
async function generateEs256Identity() {
|
|
16
|
+
const keyPair = await webcrypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"]);
|
|
17
|
+
const publicKeyBytes = new Uint8Array(await webcrypto.subtle.exportKey("raw", keyPair.publicKey));
|
|
18
|
+
return createNodeIdentity(keyPair.privateKey, publicKeyBytes, ES256);
|
|
19
|
+
}
|
|
20
|
+
function fixedClock(atMs) {
|
|
21
|
+
return { now: () => atMs };
|
|
22
|
+
}
|
|
23
|
+
let issuedTokenIds = 0;
|
|
24
|
+
function nextTokenId() {
|
|
25
|
+
issuedTokenIds += 1;
|
|
26
|
+
return buf([issuedTokenIds]);
|
|
27
|
+
}
|
|
28
|
+
const NOW_MS = 1_893_456_000_000;
|
|
29
|
+
const EXPIRES_MS = NOW_MS + HOUR_MS;
|
|
30
|
+
async function mintRoomMemberToken(issuer, bearer, roomPath, tokenId = nextTokenId()) {
|
|
31
|
+
const verdict = await mintCapabilityToken({
|
|
32
|
+
identity: issuer,
|
|
33
|
+
clock: fixedClock(NOW_MS),
|
|
34
|
+
tokenId,
|
|
35
|
+
bearer: bearer.deviceId,
|
|
36
|
+
capability: "room:member",
|
|
37
|
+
scope: { kind: "room", path: roomPath },
|
|
38
|
+
expires: EXPIRES_MS,
|
|
39
|
+
delegationsRemaining: 0,
|
|
40
|
+
});
|
|
41
|
+
if (!verdict.ok)
|
|
42
|
+
throw new Error(`mint failed: ${verdict.reason}`);
|
|
43
|
+
return verdict.token;
|
|
44
|
+
}
|
|
45
|
+
describe("verifyRoomToken", () => {
|
|
46
|
+
it("accepts a token rooted at the named room's own owner", async () => {
|
|
47
|
+
const owner = await generateEs256Identity();
|
|
48
|
+
const member = await generateEs256Identity();
|
|
49
|
+
const roomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
50
|
+
const token = await mintRoomMemberToken(owner, member, roomPath);
|
|
51
|
+
const verdict = await verifyRoomToken(token, {
|
|
52
|
+
identity: owner,
|
|
53
|
+
clock: fixedClock(NOW_MS),
|
|
54
|
+
revocation: createRevocationView(),
|
|
55
|
+
expectedBearer: member.deviceId,
|
|
56
|
+
roomPath,
|
|
57
|
+
});
|
|
58
|
+
assert.equal(verdict.ok, true);
|
|
59
|
+
});
|
|
60
|
+
it("refuses a token rooted at the wrong device for a named room", async () => {
|
|
61
|
+
const owner = await generateEs256Identity();
|
|
62
|
+
const impostor = await generateEs256Identity();
|
|
63
|
+
const member = await generateEs256Identity();
|
|
64
|
+
const roomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
65
|
+
// Minted by the impostor, not the room's actual owner -- rootIssuer will be the impostor's own device-id, not the path's owner.
|
|
66
|
+
const token = await mintRoomMemberToken(impostor, member, roomPath);
|
|
67
|
+
const verdict = await verifyRoomToken(token, {
|
|
68
|
+
identity: owner,
|
|
69
|
+
clock: fixedClock(NOW_MS),
|
|
70
|
+
revocation: createRevocationView(),
|
|
71
|
+
expectedBearer: member.deviceId,
|
|
72
|
+
roomPath,
|
|
73
|
+
});
|
|
74
|
+
assert.equal(verdict.ok, false);
|
|
75
|
+
if (!verdict.ok)
|
|
76
|
+
assert.equal(verdict.reason, "wrong_chain_root");
|
|
77
|
+
});
|
|
78
|
+
it("accepts a DM token rooted at the verifying identity itself", async () => {
|
|
79
|
+
const me = await generateEs256Identity();
|
|
80
|
+
const them = await generateEs256Identity();
|
|
81
|
+
const roomPath = dmRoomPath(deviceIdToHex(me.deviceId), deviceIdToHex(them.deviceId));
|
|
82
|
+
// I (the verifier) issue the token that lets `them` send to me.
|
|
83
|
+
const token = await mintRoomMemberToken(me, them, roomPath);
|
|
84
|
+
const verdict = await verifyRoomToken(token, {
|
|
85
|
+
identity: me,
|
|
86
|
+
clock: fixedClock(NOW_MS),
|
|
87
|
+
revocation: createRevocationView(),
|
|
88
|
+
expectedBearer: them.deviceId,
|
|
89
|
+
roomPath,
|
|
90
|
+
});
|
|
91
|
+
assert.equal(verdict.ok, true);
|
|
92
|
+
});
|
|
93
|
+
it("refuses a DM token rooted at neither participant nor the verifier", async () => {
|
|
94
|
+
const me = await generateEs256Identity();
|
|
95
|
+
const them = await generateEs256Identity();
|
|
96
|
+
const stranger = await generateEs256Identity();
|
|
97
|
+
const roomPath = dmRoomPath(deviceIdToHex(me.deviceId), deviceIdToHex(them.deviceId));
|
|
98
|
+
// A stranger self-issues a token for this DM path -- must never verify, since the DM path's only acceptable root is the verifier itself.
|
|
99
|
+
const token = await mintRoomMemberToken(stranger, them, roomPath);
|
|
100
|
+
const verdict = await verifyRoomToken(token, {
|
|
101
|
+
identity: me,
|
|
102
|
+
clock: fixedClock(NOW_MS),
|
|
103
|
+
revocation: createRevocationView(),
|
|
104
|
+
expectedBearer: them.deviceId,
|
|
105
|
+
roomPath,
|
|
106
|
+
});
|
|
107
|
+
assert.equal(verdict.ok, false);
|
|
108
|
+
if (!verdict.ok)
|
|
109
|
+
assert.equal(verdict.reason, "wrong_chain_root");
|
|
110
|
+
});
|
|
111
|
+
it("refuses a token scoped to a different room path", async () => {
|
|
112
|
+
const owner = await generateEs256Identity();
|
|
113
|
+
const member = await generateEs256Identity();
|
|
114
|
+
const actualRoomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
115
|
+
const otherRoomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "other-room");
|
|
116
|
+
const token = await mintRoomMemberToken(owner, member, actualRoomPath);
|
|
117
|
+
const verdict = await verifyRoomToken(token, {
|
|
118
|
+
identity: owner,
|
|
119
|
+
clock: fixedClock(NOW_MS),
|
|
120
|
+
revocation: createRevocationView(),
|
|
121
|
+
expectedBearer: member.deviceId,
|
|
122
|
+
roomPath: otherRoomPath,
|
|
123
|
+
});
|
|
124
|
+
assert.equal(verdict.ok, false);
|
|
125
|
+
if (!verdict.ok)
|
|
126
|
+
assert.equal(verdict.reason, "wrong_scope_path");
|
|
127
|
+
});
|
|
128
|
+
it("refuses a token scoped to a non-room capability", async () => {
|
|
129
|
+
const owner = await generateEs256Identity();
|
|
130
|
+
const member = await generateEs256Identity();
|
|
131
|
+
const roomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
132
|
+
const verdict1 = await mintCapabilityToken({
|
|
133
|
+
identity: owner,
|
|
134
|
+
clock: fixedClock(NOW_MS),
|
|
135
|
+
tokenId: nextTokenId(),
|
|
136
|
+
bearer: member.deviceId,
|
|
137
|
+
capability: "exec:pty",
|
|
138
|
+
scope: { kind: "folder" },
|
|
139
|
+
expires: EXPIRES_MS,
|
|
140
|
+
});
|
|
141
|
+
if (!verdict1.ok)
|
|
142
|
+
throw new Error(`mint failed: ${verdict1.reason}`);
|
|
143
|
+
const verdict = await verifyRoomToken(verdict1.token, {
|
|
144
|
+
identity: owner,
|
|
145
|
+
clock: fixedClock(NOW_MS),
|
|
146
|
+
revocation: createRevocationView(),
|
|
147
|
+
expectedBearer: member.deviceId,
|
|
148
|
+
roomPath,
|
|
149
|
+
});
|
|
150
|
+
assert.equal(verdict.ok, false);
|
|
151
|
+
if (!verdict.ok)
|
|
152
|
+
assert.equal(verdict.reason, "wrong_scope_kind");
|
|
153
|
+
});
|
|
154
|
+
it("refuses a token bearing a different device than the authenticated connection", async () => {
|
|
155
|
+
const owner = await generateEs256Identity();
|
|
156
|
+
const member = await generateEs256Identity();
|
|
157
|
+
const impostor = await generateEs256Identity();
|
|
158
|
+
const roomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
159
|
+
const token = await mintRoomMemberToken(owner, member, roomPath);
|
|
160
|
+
const verdict = await verifyRoomToken(token, {
|
|
161
|
+
identity: owner,
|
|
162
|
+
clock: fixedClock(NOW_MS),
|
|
163
|
+
revocation: createRevocationView(),
|
|
164
|
+
expectedBearer: impostor.deviceId,
|
|
165
|
+
roomPath,
|
|
166
|
+
});
|
|
167
|
+
assert.equal(verdict.ok, false);
|
|
168
|
+
if (!verdict.ok)
|
|
169
|
+
assert.equal(verdict.reason, "bearer_mismatch");
|
|
170
|
+
});
|
|
171
|
+
it("refuses an expired token", async () => {
|
|
172
|
+
const owner = await generateEs256Identity();
|
|
173
|
+
const member = await generateEs256Identity();
|
|
174
|
+
const roomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
175
|
+
const token = await mintRoomMemberToken(owner, member, roomPath);
|
|
176
|
+
const verdict = await verifyRoomToken(token, {
|
|
177
|
+
identity: owner,
|
|
178
|
+
clock: fixedClock(EXPIRES_MS + HOUR_MS),
|
|
179
|
+
revocation: createRevocationView(),
|
|
180
|
+
expectedBearer: member.deviceId,
|
|
181
|
+
roomPath,
|
|
182
|
+
});
|
|
183
|
+
assert.equal(verdict.ok, false);
|
|
184
|
+
if (!verdict.ok)
|
|
185
|
+
assert.equal(verdict.reason, "expired");
|
|
186
|
+
});
|
|
187
|
+
it("refuses a revoked token", async () => {
|
|
188
|
+
const owner = await generateEs256Identity();
|
|
189
|
+
const member = await generateEs256Identity();
|
|
190
|
+
const roomPath = ownerNamedRoomPath(deviceIdToHex(owner.deviceId), "general");
|
|
191
|
+
const tokenId = nextTokenId();
|
|
192
|
+
const token = await mintRoomMemberToken(owner, member, roomPath, tokenId);
|
|
193
|
+
const revocation = createRevocationView();
|
|
194
|
+
const entry = await mintRevocationEntry({
|
|
195
|
+
identity: owner,
|
|
196
|
+
tokenId,
|
|
197
|
+
revokedAt: NOW_MS,
|
|
198
|
+
});
|
|
199
|
+
await revocation.record(entry, { identity: owner });
|
|
200
|
+
const verdict = await verifyRoomToken(token, {
|
|
201
|
+
identity: owner,
|
|
202
|
+
clock: fixedClock(NOW_MS),
|
|
203
|
+
revocation,
|
|
204
|
+
expectedBearer: member.deviceId,
|
|
205
|
+
roomPath,
|
|
206
|
+
});
|
|
207
|
+
assert.equal(verdict.ok, false);
|
|
208
|
+
if (!verdict.ok)
|
|
209
|
+
assert.equal(verdict.reason, "revoked");
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=room-token-verification.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-token-verification.test.js","sourceRoot":"","sources":["../../src/test/room-token-verification.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import * as assert from "node:assert/strict";
|
|
7
7
|
import { test } from "node:test";
|
|
8
8
|
import { MeshStore } from "../core/mesh-store.js";
|
|
9
|
+
import { ownerNamedRoomPath } from "../core/room-path.js";
|
|
9
10
|
import { wireTestTransport } from "./test-transport.js";
|
|
10
11
|
/** A local-only store: transport is set (registerAgent's own broadcastPatch needs one) but never started, so no ports and no flake -- the stores in these tests never actually connect. */
|
|
11
12
|
function makeStore() {
|
|
@@ -79,35 +80,33 @@ void test("room membership changes converge and stale member lists are rejected"
|
|
|
79
80
|
visibility: "visible",
|
|
80
81
|
tags: [],
|
|
81
82
|
});
|
|
83
|
+
const roomId = ownerNamedRoomPath(owner.id, "room");
|
|
82
84
|
await a.createRoom({
|
|
83
85
|
name: "room",
|
|
84
86
|
type: "public",
|
|
85
87
|
owner: owner.id,
|
|
86
88
|
description: "x",
|
|
87
89
|
});
|
|
88
|
-
// A holds the room before the join; the joiner lives on B, so the join
|
|
89
|
-
// mutates B's copy and syncs back (one MeshStore is one peer identity, so
|
|
90
|
-
// a second agent cannot be registered on A).
|
|
90
|
+
// A holds the room before the join; the joiner lives on B, so the join mutates B's copy and syncs back (one MeshStore is one peer identity, so a second agent cannot be registered on A).
|
|
91
91
|
a.applyStateSync(snapshotOf(b));
|
|
92
92
|
b.applyStateSync(snapshotOf(a));
|
|
93
|
-
assert.equal((await a.getRoom(
|
|
94
|
-
await b.joinRoom(
|
|
93
|
+
assert.equal((await a.getRoom(roomId))?.members.includes(joiner.id), false);
|
|
94
|
+
await b.joinRoom(roomId, joiner.id);
|
|
95
95
|
a.applyStateSync(snapshotOf(b));
|
|
96
|
-
assert.equal((await a.getRoom(
|
|
97
|
-
// The joiner leaves; A (now current) must drop them — the union-only merge
|
|
98
|
-
|
|
99
|
-
await b.leaveRoom("room", joiner.id);
|
|
96
|
+
assert.equal((await a.getRoom(roomId))?.members.includes(joiner.id), true);
|
|
97
|
+
// The joiner leaves; A (now current) must drop them — the union-only merge could never remove a leaver.
|
|
98
|
+
await b.leaveRoom(roomId, joiner.id);
|
|
100
99
|
a.applyStateSync(snapshotOf(b));
|
|
101
|
-
assert.equal((await a.getRoom(
|
|
100
|
+
assert.equal((await a.getRoom(roomId))?.members.includes(joiner.id), false);
|
|
102
101
|
// A stale member list that still contains them is rejected.
|
|
103
102
|
const stale = snapshotOf(b);
|
|
104
|
-
const staleRoom = stale.rooms
|
|
103
|
+
const staleRoom = stale.rooms[roomId];
|
|
105
104
|
if (staleRoom === undefined)
|
|
106
105
|
throw new Error("room missing from snapshot");
|
|
107
106
|
staleRoom.members.push(joiner.id);
|
|
108
107
|
staleRoom.version -= 1;
|
|
109
108
|
a.applyStateSync(stale);
|
|
110
|
-
assert.equal((await a.getRoom(
|
|
109
|
+
assert.equal((await a.getRoom(roomId))?.members.includes(joiner.id), false);
|
|
111
110
|
});
|
|
112
111
|
void test("history sync adds unseen messages and unions read receipts", async () => {
|
|
113
112
|
const a = makeStore();
|
|
@@ -120,23 +119,24 @@ void test("history sync adds unseen messages and unions read receipts", async ()
|
|
|
120
119
|
visibility: "visible",
|
|
121
120
|
tags: [],
|
|
122
121
|
});
|
|
122
|
+
const roomId = ownerNamedRoomPath(agent.id, "room");
|
|
123
123
|
await a.createRoom({
|
|
124
124
|
name: "room",
|
|
125
125
|
type: "public",
|
|
126
126
|
owner: agent.id,
|
|
127
127
|
description: "x",
|
|
128
128
|
});
|
|
129
|
-
await a.sendRoomMessage(
|
|
129
|
+
await a.sendRoomMessage(roomId, agent.id, "one");
|
|
130
130
|
b.applyStateSync(snapshotOf(a));
|
|
131
131
|
// While B is away, a second message arrives and the first gains a reader elsewhere on the mesh; B's next sync takes both.
|
|
132
|
-
await a.sendRoomMessage(
|
|
132
|
+
await a.sendRoomMessage(roomId, agent.id, "two");
|
|
133
133
|
const fresh = snapshotOf(a);
|
|
134
|
-
const history = fresh.messages
|
|
134
|
+
const history = fresh.messages[roomId];
|
|
135
135
|
if (history?.[0] === undefined)
|
|
136
136
|
throw new Error("messages missing from snapshot");
|
|
137
137
|
history[0].readBy.push("reader-elsewhere");
|
|
138
138
|
b.applyStateSync(fresh);
|
|
139
|
-
const merged = await b.readRoomMessages(
|
|
139
|
+
const merged = await b.readRoomMessages(roomId);
|
|
140
140
|
assert.deepEqual(merged.map((m) => m.content), ["one", "two"]);
|
|
141
141
|
assert.equal(merged[0]?.readBy.includes("reader-elsewhere"), true);
|
|
142
142
|
});
|
|
@@ -163,28 +163,28 @@ void test("a kick racing a concurrent join converges with the kick honoured", as
|
|
|
163
163
|
visibility: "visible",
|
|
164
164
|
tags: [],
|
|
165
165
|
});
|
|
166
|
+
const roomId = ownerNamedRoomPath(owner.id, "room");
|
|
166
167
|
await base.createRoom({
|
|
167
168
|
name: "room",
|
|
168
169
|
type: "public",
|
|
169
170
|
owner: owner.id,
|
|
170
171
|
description: "x",
|
|
171
172
|
});
|
|
172
|
-
await base.joinRoom(
|
|
173
|
+
await base.joinRoom(roomId, x.id);
|
|
173
174
|
const kicker = makeStore();
|
|
174
175
|
const joiner = makeStore();
|
|
175
176
|
kicker.applyStateSync(snapshotOf(base));
|
|
176
177
|
joiner.applyStateSync(snapshotOf(base));
|
|
177
|
-
// Concurrent mutations from the same base: a kick on one holder, a
|
|
178
|
-
|
|
179
|
-
await
|
|
180
|
-
await
|
|
181
|
-
assert.equal((await
|
|
182
|
-
assert.equal((await joiner.getRoom("room"))?.members.includes(x.id), true);
|
|
178
|
+
// Concurrent mutations from the same base: a kick on one holder, a re-join of X recorded on the other.
|
|
179
|
+
await kicker.leaveRoom(roomId, x.id);
|
|
180
|
+
await joiner.joinRoom(roomId, x.id);
|
|
181
|
+
assert.equal((await kicker.getRoom(roomId))?.members.includes(x.id), false);
|
|
182
|
+
assert.equal((await joiner.getRoom(roomId))?.members.includes(x.id), true);
|
|
183
183
|
// Exchange both ways: both converge on the kick.
|
|
184
184
|
kicker.applyStateSync(snapshotOf(joiner));
|
|
185
185
|
joiner.applyStateSync(snapshotOf(kicker));
|
|
186
|
-
assert.equal((await kicker.getRoom(
|
|
187
|
-
assert.equal((await joiner.getRoom(
|
|
186
|
+
assert.equal((await kicker.getRoom(roomId))?.members.includes(x.id), false);
|
|
187
|
+
assert.equal((await joiner.getRoom(roomId))?.members.includes(x.id), false);
|
|
188
188
|
});
|
|
189
189
|
void test("concurrent joins of different agents both survive the merge", async () => {
|
|
190
190
|
// The property the old version-tie union existed to protect: two peers
|
|
@@ -216,6 +216,7 @@ void test("concurrent joins of different agents both survive the merge", async (
|
|
|
216
216
|
visibility: "visible",
|
|
217
217
|
tags: [],
|
|
218
218
|
});
|
|
219
|
+
const roomId = ownerNamedRoomPath(owner.id, "room");
|
|
219
220
|
await base.createRoom({
|
|
220
221
|
name: "room",
|
|
221
222
|
type: "public",
|
|
@@ -227,12 +228,12 @@ void test("concurrent joins of different agents both survive the merge", async (
|
|
|
227
228
|
const holderB = makeStore();
|
|
228
229
|
holderA.applyStateSync(snapshotOf(base));
|
|
229
230
|
holderB.applyStateSync(snapshotOf(base));
|
|
230
|
-
await holderA.joinRoom(
|
|
231
|
-
await holderB.joinRoom(
|
|
231
|
+
await holderA.joinRoom(roomId, p.id);
|
|
232
|
+
await holderB.joinRoom(roomId, q.id);
|
|
232
233
|
holderA.applyStateSync(snapshotOf(holderB));
|
|
233
234
|
holderB.applyStateSync(snapshotOf(holderA));
|
|
234
|
-
const mergedA = await holderA.getRoom(
|
|
235
|
-
const mergedB = await holderB.getRoom(
|
|
235
|
+
const mergedA = await holderA.getRoom(roomId);
|
|
236
|
+
const mergedB = await holderB.getRoom(roomId);
|
|
236
237
|
assert.equal(mergedA?.members.includes(p.id), true);
|
|
237
238
|
assert.equal(mergedA?.members.includes(q.id), true);
|
|
238
239
|
assert.deepEqual(mergedB?.members, mergedA?.members);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-sync-convergence.test.js","sourceRoot":"","sources":["../../src/test/state-sync-convergence.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state-sync-convergence.test.js","sourceRoot":"","sources":["../../src/test/state-sync-convergence.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.33.0",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"cbor2": "2.3.0",
|
|
98
98
|
"preact": "10.29.7",
|
|
99
99
|
"typebox": "1.3.6",
|
|
100
|
-
"wire-mesh-core": "1.0.
|
|
100
|
+
"wire-mesh-core": "1.0.2",
|
|
101
101
|
"ws": "8.21.1",
|
|
102
102
|
"zod": "4.4.3"
|
|
103
103
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(()=>{var l=new Set(["agent_upsert","agent_offline","room_upsert","room_delete","message_add","dm_add","delivery","message_read"]);function _(t){return typeof t!="object"||t===null||!("type"in t)||typeof t.type!="string"?!1:l.has(t.type)}var M=new Set(["state_update","peer_joined","peer_left"]),h=new Set(["state_sync","introduce","connect_request","connect_accepted","connect_rejected","peer_list","become_coordinator","pong","fed_handshake","fed_ack","fed_agent_visible","fed_agent_gone","fed_room_message","fed_room_join","fed_room_leave","fed_ping","fed_pong"]),o={label:"a",url:"",ws:void 0,connected:!1,reconnectTimer:void 0},i={label:"b",url:"",ws:void 0,connected:!1,reconnectTimer:void 0},g=0,a=[],b=50,y=new Set;function r(t,e){return`${t}:${e}`}function S(t,e){return{...e,id:r(t,e.id),name:`${e.name} (via ${t.toUpperCase()})`,subscribedRooms:e.subscribedRooms.map(n=>r(t,n))}}function v(t,e){return{...e,id:r(t,e.id),owner:r(t,e.owner),members:e.members.map(n=>r(t,n)),invited:e.invited.map(n=>r(t,n))}}function R(t,e){let n={...e,from:r(t,e.from),room:r(t,e.room),readBy:e.readBy.map(s=>r(t,s))};return e.replyTo!==void 0&&(n.replyTo=r(t,e.replyTo)),n}function w(t,e){return{...e,from:r(t,e.from),to:r(t,e.to),readBy:e.readBy.map(n=>r(t,n))}}function k(t,e){return e.split("--").map(s=>r(t,s)).join("--")}function I(t,e){switch(e.type){case"agent_upsert":return{...e,agent:S(t,e.agent)};case"agent_offline":return{...e,agentId:r(t,e.agentId)};case"room_upsert":return{...e,room:v(t,e.room)};case"room_delete":return{...e,roomId:r(t,e.roomId)};case"message_add":return{...e,roomId:r(t,e.roomId),message:R(t,e.message)};case"dm_add":return{...e,key:k(t,e.key),message:w(t,e.message)};case"delivery":return{...e,agentId:r(t,e.agentId)};case"message_read":return{...e,readBy:r(t,e.readBy),...e.room?{room:r(t,e.room)}:{}}}}function T(t){return typeof t!="object"||t===null||!("method"in t)||typeof t.method!="string"?void 0:{...t,method:t.method}}function A(t){return h.has(t.method)?!1:!!M.has(t.method)}function B(t,e){return e.method==="state_update"&&"patch"in e&&_(e.patch)?{...e,patch:I(t,e.patch)}:e.method==="peer_joined"&&"peer"in e&&typeof e.peer=="object"&&e.peer!==null&&"id"in e.peer&&typeof e.peer.id=="string"&&"port"in e.peer&&typeof e.peer.port=="number"&&"startedAt"in e.peer&&typeof e.peer.startedAt=="string"?{...e,peer:{...e.peer,id:r(t,e.peer.id)}}:e.method==="peer_left"&&"peerId"in e&&typeof e.peerId=="string"?{...e,peerId:r(t,e.peerId)}:e}function E(t,e,n){let s=T(n);if(s===void 0||!A(s))return;let u=B(t.label,s),p=e.ws;p?.readyState===WebSocket.OPEN&&(p.send(JSON.stringify(u)),g++,d())}function f(t,e){t.reconnectTimer!==void 0&&(clearTimeout(t.reconnectTimer),t.reconnectTimer=void 0);let n=new WebSocket(t.url);t.ws=n,n.onopen=()=>{t.connected=!0,d()},n.onclose=()=>{t.ws=void 0,t.connected=!1,d(),C(t,e)},n.onerror=()=>{},n.onmessage=s=>{let u=JSON.parse(typeof s.data=="string"?s.data:String(s.data));E(t,e,u)}}function C(t,e){t.url&&(t.reconnectTimer=setTimeout(()=>{t.url&&f(t,e)},3e3))}function c(t){t.reconnectTimer!==void 0&&(clearTimeout(t.reconnectTimer),t.reconnectTimer=void 0),t.ws?.close(),t.ws=void 0,t.connected=!1,t.url=""}function W(t){let e=JSON.stringify(t);for(let n of y)try{n.postMessage(e)}catch{}}function d(){W({type:"status",status:m()})}function m(){return{connectedA:o.connected,connectedB:i.connected,urlA:o.url||void 0,urlB:i.url||void 0,forwardedCount:g,errors:[...a]}}function O(t){a.push(t),a.length>b&&a.shift()}function P(t){switch(t.type){case"connect":{c(o),c(i),g=0,a.length=0,o.url=t.urlA,i.url=t.urlB;try{f(o,i),f(i,o)}catch(e){O(e instanceof Error?e.message:String(e))}d();break}case"disconnect":{c(o),c(i),d();break}case"status":d();break}}function D(t){if(typeof t!="object"||t===null||!("type"in t))return!1;let e=t.type;return typeof e=="string"&&(e==="connect"||e==="disconnect"||e==="status")}self.addEventListener("connect",t=>{let e=t.ports[0];if(e!==void 0){y.add(e);try{e.postMessage(JSON.stringify({type:"status",status:m()}))}catch{}e.onmessage=n=>{let s=JSON.parse(typeof n.data=="string"?n.data:String(n.data));D(s)&&P(s)}}});})();
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RelayPanel — UI for configuring the PWA mesh relay.
|
|
3
|
-
*
|
|
4
|
-
* Provides input fields for two mesh WebSocket URLs, connect/disconnect
|
|
5
|
-
* controls, and a live status display showing connection state and
|
|
6
|
-
* forwarding statistics.
|
|
7
|
-
*/
|
|
8
|
-
import type { RelayStatus } from "../relay-client.js";
|
|
9
|
-
export interface RelayPanelProps {
|
|
10
|
-
status: RelayStatus;
|
|
11
|
-
onConnect: (urlA: string, urlB: string) => void;
|
|
12
|
-
onDisconnect: () => void;
|
|
13
|
-
}
|
|
14
|
-
export declare function RelayPanel({ status, onConnect, onDisconnect, }: RelayPanelProps): import("preact").JSX.Element;
|
|
15
|
-
//# sourceMappingURL=RelayPanel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RelayPanel.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/RelayPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,eAAe,gCAiJjB"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* RelayPanel — UI for configuring the PWA mesh relay.
|
|
4
|
-
*
|
|
5
|
-
* Provides input fields for two mesh WebSocket URLs, connect/disconnect
|
|
6
|
-
* controls, and a live status display showing connection state and
|
|
7
|
-
* forwarding statistics.
|
|
8
|
-
*/
|
|
9
|
-
import { useState, useEffect } from "preact/hooks";
|
|
10
|
-
export function RelayPanel({ status, onConnect, onDisconnect, }) {
|
|
11
|
-
const [urlA, setUrlA] = useState(status.urlA ?? "ws://localhost:8080/ws/mesh");
|
|
12
|
-
const [urlB, setUrlB] = useState(status.urlB ?? "ws://localhost:8081/ws/mesh");
|
|
13
|
-
const [expanded, setExpanded] = useState(false);
|
|
14
|
-
const bothConnected = status.connectedA && status.connectedB;
|
|
15
|
-
const eitherConnected = status.connectedA || status.connectedB;
|
|
16
|
-
// Sync URL fields when the relay reports new URLs (e.g. after reconnect)
|
|
17
|
-
useEffect(() => {
|
|
18
|
-
if (status.urlA)
|
|
19
|
-
setUrlA(status.urlA);
|
|
20
|
-
if (status.urlB)
|
|
21
|
-
setUrlB(status.urlB);
|
|
22
|
-
}, [status.urlA, status.urlB]);
|
|
23
|
-
if (!expanded) {
|
|
24
|
-
return (_jsx("div", { class: "relay-panel relay-collapsed", children: _jsxs("button", { class: "relay-toggle-btn", onClick: () => {
|
|
25
|
-
setExpanded(true);
|
|
26
|
-
}, children: ["\u293A Relay", bothConnected && (_jsx("span", { class: "relay-badge relay-badge-green", children: "\u25CF" })), eitherConnected && !bothConnected && (_jsx("span", { class: "relay-badge relay-badge-yellow", children: "\u25CF" })), status.forwardedCount > 0 && (_jsx("span", { class: "relay-count", children: status.forwardedCount }))] }) }));
|
|
27
|
-
}
|
|
28
|
-
const handleConnect = (e) => {
|
|
29
|
-
e.preventDefault();
|
|
30
|
-
if (urlA.trim() && urlB.trim()) {
|
|
31
|
-
onConnect(urlA.trim(), urlB.trim());
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
return (_jsxs("div", { class: "relay-panel", children: [_jsxs("div", { class: "relay-header", children: [_jsx("span", { class: "relay-title", children: "Mesh Relay" }), _jsx("button", { class: "relay-collapse-btn", onClick: () => {
|
|
35
|
-
setExpanded(false);
|
|
36
|
-
}, title: "Collapse relay panel", children: "\u2715" })] }), _jsxs("form", { class: "relay-form", onSubmit: handleConnect, children: [_jsxs("label", { class: "relay-label", children: ["Mesh A", _jsx("input", { type: "url", class: "relay-input", placeholder: "ws://machine-a:8080/ws/mesh", value: urlA, onInput: (e) => {
|
|
37
|
-
const target = e.target;
|
|
38
|
-
if (target instanceof HTMLInputElement)
|
|
39
|
-
setUrlA(target.value);
|
|
40
|
-
}, disabled: eitherConnected }), _jsx("span", { class: `relay-status-dot ${status.connectedA ? "active" : ""}` })] }), _jsxs("label", { class: "relay-label", children: ["Mesh B", _jsx("input", { type: "url", class: "relay-input", placeholder: "ws://machine-b:8080/ws/mesh", value: urlB, onInput: (e) => {
|
|
41
|
-
const target = e.target;
|
|
42
|
-
if (target instanceof HTMLInputElement)
|
|
43
|
-
setUrlB(target.value);
|
|
44
|
-
}, disabled: eitherConnected }), _jsx("span", { class: `relay-status-dot ${status.connectedB ? "active" : ""}` })] }), _jsx("div", { class: "relay-actions", children: !eitherConnected ? (_jsx("button", { type: "submit", class: "relay-connect-btn", disabled: !urlA.trim() || !urlB.trim(), children: "Connect" })) : (_jsx("button", { type: "button", class: "relay-disconnect-btn", onClick: onDisconnect, children: "Disconnect" })) })] }), eitherConnected && (_jsxs("div", { class: "relay-stats", children: [_jsxs("span", { class: "relay-stat", children: ["Forwarded: ", status.forwardedCount] }), _jsxs("span", { class: "relay-stat", children: ["A: ", status.connectedA ? "connected" : "disconnected"] }), _jsxs("span", { class: "relay-stat", children: ["B: ", status.connectedB ? "connected" : "disconnected"] })] })), status.errors.length > 0 && (_jsx("div", { class: "relay-errors", children: status.errors.slice(-3).map((err, i) => (_jsx("div", { class: "relay-error", children: err }, i))) }))] }));
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=RelayPanel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RelayPanel.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/RelayPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RelayClient — main-thread API for the relay SharedWorker.
|
|
3
|
-
*
|
|
4
|
-
* Creates a SharedWorker from the built relay-worker.js bundle and
|
|
5
|
-
* provides a typed interface for the React frontend to:
|
|
6
|
-
*
|
|
7
|
-
* - Connect to two mesh endpoints simultaneously
|
|
8
|
-
* - Disconnect from both
|
|
9
|
-
* - Query relay status (connection state, forwarding stats)
|
|
10
|
-
* - Subscribe to real-time status updates
|
|
11
|
-
*/
|
|
12
|
-
export interface RelayStatus {
|
|
13
|
-
connectedA: boolean;
|
|
14
|
-
connectedB: boolean;
|
|
15
|
-
urlA: string | undefined;
|
|
16
|
-
urlB: string | undefined;
|
|
17
|
-
forwardedCount: number;
|
|
18
|
-
errors: string[];
|
|
19
|
-
}
|
|
20
|
-
export type RelayStatusListener = (status: RelayStatus) => void;
|
|
21
|
-
export declare class RelayClient {
|
|
22
|
-
private worker;
|
|
23
|
-
private status;
|
|
24
|
-
private readonly listeners;
|
|
25
|
-
/** Connect to the relay SharedWorker. Idempotent. */
|
|
26
|
-
connect(): void;
|
|
27
|
-
/** Connect the relay to two mesh WebSocket endpoints. */
|
|
28
|
-
connectRelay(urlA: string, urlB: string): void;
|
|
29
|
-
/** Disconnect the relay from both mesh endpoints. */
|
|
30
|
-
disconnect(): void;
|
|
31
|
-
/** Get the current relay status (snapshot). */
|
|
32
|
-
get(): Readonly<RelayStatus>;
|
|
33
|
-
/** Subscribe to status changes. Returns an unsubscribe function. */
|
|
34
|
-
subscribe(listener: RelayStatusListener): () => void;
|
|
35
|
-
/** Destroy the client and release the SharedWorker port. */
|
|
36
|
-
destroy(): void;
|
|
37
|
-
private postToWorker;
|
|
38
|
-
private notify;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=relay-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;AAMhE,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAOZ;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,qDAAqD;IACrD,OAAO,IAAI,IAAI;IAqBf,yDAAyD;IACzD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9C,qDAAqD;IACrD,UAAU,IAAI,IAAI;IAIlB,+CAA+C;IAC/C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAI5B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,4DAA4D;IAC5D,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,MAAM;CAMf"}
|