agent-comms 2.18.3 → 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/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 +4 -4
|
@@ -14,77 +14,80 @@ import { buildAction } from "../core/bridge.js";
|
|
|
14
14
|
import { generateIdentity } from "../core/identity.js";
|
|
15
15
|
import { toIdentityPort } from "../core/wire-mesh-identity.js";
|
|
16
16
|
import { DOMAIN, FRAME_SCOPE, buildCommand, WireMeshTransport, } from "../core/wire-mesh-transport.js";
|
|
17
|
-
import
|
|
18
|
-
import { test, describe } from "node:test";
|
|
17
|
+
import { test, describe, expect } from "vitest";
|
|
19
18
|
import { wireTestTransport } from "./test-transport.js";
|
|
20
19
|
const TEST_PORT = 19880;
|
|
21
20
|
describe("listener policy", () => {
|
|
22
|
-
|
|
21
|
+
test("coordinator starts with a single default localhost listener", async () => {
|
|
23
22
|
const store = new MeshStore(TEST_PORT);
|
|
24
23
|
await wireTestTransport(store);
|
|
25
24
|
try {
|
|
26
25
|
await store.init();
|
|
27
26
|
const listeners = store.listListeners();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
expect(listeners.length, "Should have exactly one listener").toBe(1);
|
|
28
|
+
expect(listeners[0]?.policy, "Default listener should have full policy").toBe("full");
|
|
29
|
+
expect(listeners[0]?.isDefault, "Default listener should be marked as default").toBe(true);
|
|
30
|
+
expect(listeners[0]?.host, "Default listener should be on localhost").toBe("127.0.0.1");
|
|
31
|
+
expect(listeners[0]?.port, "Default listener should be on the coordinator port").toBe(TEST_PORT);
|
|
33
32
|
}
|
|
34
33
|
finally {
|
|
35
34
|
await store.shutdown();
|
|
36
35
|
}
|
|
37
36
|
});
|
|
38
|
-
|
|
37
|
+
test("addListener creates an additional listener", async () => {
|
|
39
38
|
const store = new MeshStore(TEST_PORT);
|
|
40
39
|
await wireTestTransport(store);
|
|
41
40
|
try {
|
|
42
41
|
await store.init();
|
|
43
42
|
const id = await store.addListener("127.0.0.1", 0, "observe");
|
|
44
|
-
|
|
43
|
+
expect(id, "Should return a listener ID").toBeTruthy();
|
|
45
44
|
const listeners = store.listListeners();
|
|
46
|
-
|
|
45
|
+
expect(listeners.length, "Should have two listeners").toBe(2);
|
|
47
46
|
const newListener = listeners.find((l) => l.id === id);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
expect(newListener, "New listener should be listed").toBeTruthy();
|
|
48
|
+
if (newListener === undefined)
|
|
49
|
+
throw new Error("New listener should be listed");
|
|
50
|
+
expect(newListener.policy, "New listener should have observe policy").toBe("observe");
|
|
51
|
+
expect(newListener.isDefault, "New listener should not be default").toBe(false);
|
|
52
|
+
expect(newListener.port > 0, "Should have an assigned port").toBeTruthy();
|
|
52
53
|
}
|
|
53
54
|
finally {
|
|
54
55
|
await store.shutdown();
|
|
55
56
|
}
|
|
56
57
|
});
|
|
57
|
-
|
|
58
|
+
test("removeListener removes a non-default listener", async () => {
|
|
58
59
|
const store = new MeshStore(TEST_PORT);
|
|
59
60
|
await wireTestTransport(store);
|
|
60
61
|
try {
|
|
61
62
|
await store.init();
|
|
62
63
|
const id = await store.addListener("127.0.0.1", 0, "observe");
|
|
63
|
-
|
|
64
|
+
expect(store.listListeners().length).toBe(2);
|
|
64
65
|
await store.removeListener(id);
|
|
65
66
|
const listeners = store.listListeners();
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
expect(listeners.length, "Should be back to one listener").toBe(1);
|
|
68
|
+
expect(listeners[0]?.isDefault, "Remaining listener should be the default").toBe(true);
|
|
68
69
|
}
|
|
69
70
|
finally {
|
|
70
71
|
await store.shutdown();
|
|
71
72
|
}
|
|
72
73
|
});
|
|
73
|
-
|
|
74
|
+
test("removeListener rejects removing the default listener", async () => {
|
|
74
75
|
const store = new MeshStore(TEST_PORT);
|
|
75
76
|
await wireTestTransport(store);
|
|
76
77
|
try {
|
|
77
78
|
await store.init();
|
|
78
79
|
const listeners = store.listListeners();
|
|
79
80
|
const defaultId = listeners[0]?.id;
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
expect(defaultId, "Should have a default listener").toBeTruthy();
|
|
82
|
+
if (defaultId === undefined)
|
|
83
|
+
throw new Error("Should have a default listener");
|
|
84
|
+
await expect(store.removeListener(defaultId), "Should reject removing default listener").rejects.toThrow(/Cannot remove the default/);
|
|
82
85
|
}
|
|
83
86
|
finally {
|
|
84
87
|
await store.shutdown();
|
|
85
88
|
}
|
|
86
89
|
});
|
|
87
|
-
|
|
90
|
+
test("observe listener accepts connections but enforces policy", async () => {
|
|
88
91
|
const store = new MeshStore(TEST_PORT);
|
|
89
92
|
await wireTestTransport(store);
|
|
90
93
|
try {
|
|
@@ -92,7 +95,9 @@ describe("listener policy", () => {
|
|
|
92
95
|
const id = await store.addListener("127.0.0.1", 0, "observe");
|
|
93
96
|
const listeners = store.listListeners();
|
|
94
97
|
const observeListener = listeners.find((l) => l.id === id);
|
|
95
|
-
|
|
98
|
+
expect(observeListener, "Observe listener should exist").toBeTruthy();
|
|
99
|
+
if (observeListener === undefined)
|
|
100
|
+
throw new Error("Observe listener should exist");
|
|
96
101
|
// Verify a peer can connect to the observe listener's port
|
|
97
102
|
const canConnect = await new Promise((resolve) => {
|
|
98
103
|
const socket = net.createConnection({
|
|
@@ -108,13 +113,13 @@ describe("listener policy", () => {
|
|
|
108
113
|
resolve(false);
|
|
109
114
|
});
|
|
110
115
|
});
|
|
111
|
-
|
|
116
|
+
expect(canConnect, "Should be able to connect to observe listener").toBeTruthy();
|
|
112
117
|
}
|
|
113
118
|
finally {
|
|
114
119
|
await store.shutdown();
|
|
115
120
|
}
|
|
116
121
|
});
|
|
117
|
-
|
|
122
|
+
test("mesh_listeners action returns all listeners via CommsTool", async () => {
|
|
118
123
|
const store = new MeshStore(TEST_PORT);
|
|
119
124
|
await wireTestTransport(store);
|
|
120
125
|
try {
|
|
@@ -130,15 +135,15 @@ describe("listener policy", () => {
|
|
|
130
135
|
await store.addListener("127.0.0.1", 0, "rooms-only");
|
|
131
136
|
const tool = new CommsTool(store);
|
|
132
137
|
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_listeners" });
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
138
|
+
expect(!result.isError, "Should not be an error").toBeTruthy();
|
|
139
|
+
expect(result.content.includes("full"), "Should list the default full listener").toBeTruthy();
|
|
140
|
+
expect(result.content.includes("rooms-only"), "Should list the rooms-only listener").toBeTruthy();
|
|
136
141
|
}
|
|
137
142
|
finally {
|
|
138
143
|
await store.shutdown();
|
|
139
144
|
}
|
|
140
145
|
});
|
|
141
|
-
|
|
146
|
+
test("mesh_interfaces action returns available network adapters", async () => {
|
|
142
147
|
const store = new MeshStore(TEST_PORT);
|
|
143
148
|
await wireTestTransport(store);
|
|
144
149
|
try {
|
|
@@ -153,14 +158,14 @@ describe("listener policy", () => {
|
|
|
153
158
|
});
|
|
154
159
|
const tool = new CommsTool(store);
|
|
155
160
|
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_interfaces" });
|
|
156
|
-
|
|
157
|
-
|
|
161
|
+
expect(!result.isError, "Should not be an error").toBeTruthy();
|
|
162
|
+
expect(result.content.includes("lo") || result.content.includes("IPv4"), "Should list network interfaces").toBeTruthy();
|
|
158
163
|
}
|
|
159
164
|
finally {
|
|
160
165
|
await store.shutdown();
|
|
161
166
|
}
|
|
162
167
|
});
|
|
163
|
-
|
|
168
|
+
test("mesh_unlisten removes listener via CommsTool", async () => {
|
|
164
169
|
const store = new MeshStore(TEST_PORT);
|
|
165
170
|
await wireTestTransport(store);
|
|
166
171
|
try {
|
|
@@ -176,16 +181,16 @@ describe("listener policy", () => {
|
|
|
176
181
|
const listenerId = await store.addListener("127.0.0.1", 0, "observe");
|
|
177
182
|
const tool = new CommsTool(store);
|
|
178
183
|
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_unlisten", id: listenerId });
|
|
179
|
-
|
|
180
|
-
|
|
184
|
+
expect(!result.isError, "Should not be an error").toBeTruthy();
|
|
185
|
+
expect(result.content.includes("removed"), "Should confirm removal").toBeTruthy();
|
|
181
186
|
const listeners = store.listListeners();
|
|
182
|
-
|
|
187
|
+
expect(listeners.length, "Should be back to one listener").toBe(1);
|
|
183
188
|
}
|
|
184
189
|
finally {
|
|
185
190
|
await store.shutdown();
|
|
186
191
|
}
|
|
187
192
|
});
|
|
188
|
-
|
|
193
|
+
test("mesh_listen adds listener via CommsTool", async () => {
|
|
189
194
|
const store = new MeshStore(TEST_PORT);
|
|
190
195
|
await wireTestTransport(store);
|
|
191
196
|
try {
|
|
@@ -200,48 +205,48 @@ describe("listener policy", () => {
|
|
|
200
205
|
});
|
|
201
206
|
const tool = new CommsTool(store);
|
|
202
207
|
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_listen", host: "127.0.0.1", policy: "observe" });
|
|
203
|
-
|
|
204
|
-
|
|
208
|
+
expect(!result.isError, "Should not be an error").toBeTruthy();
|
|
209
|
+
expect(result.content.includes("Listener added"), "Should confirm addition").toBeTruthy();
|
|
205
210
|
const listeners = store.listListeners();
|
|
206
|
-
|
|
211
|
+
expect(listeners.length, "Should have two listeners").toBe(2);
|
|
207
212
|
}
|
|
208
213
|
finally {
|
|
209
214
|
await store.shutdown();
|
|
210
215
|
}
|
|
211
216
|
});
|
|
212
|
-
|
|
217
|
+
test("buildAction parses mesh_listen with host and policy", () => {
|
|
213
218
|
const action = buildAction({
|
|
214
219
|
action: "mesh_listen",
|
|
215
220
|
host: "192.168.1.1",
|
|
216
221
|
port: 9999,
|
|
217
222
|
policy: "observe",
|
|
218
223
|
});
|
|
219
|
-
|
|
224
|
+
expect(action.action).toBe("mesh_listen");
|
|
220
225
|
if (action.action === "mesh_listen") {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
expect(action.host).toBe("192.168.1.1");
|
|
227
|
+
expect(action.port).toBe(9999);
|
|
228
|
+
expect(action.policy).toBe("observe");
|
|
224
229
|
}
|
|
225
230
|
});
|
|
226
|
-
|
|
231
|
+
test("buildAction parses mesh_unlisten", () => {
|
|
227
232
|
const action = buildAction({
|
|
228
233
|
action: "mesh_unlisten",
|
|
229
234
|
id: "abc123",
|
|
230
235
|
});
|
|
231
|
-
|
|
236
|
+
expect(action.action).toBe("mesh_unlisten");
|
|
232
237
|
if (action.action === "mesh_unlisten") {
|
|
233
|
-
|
|
238
|
+
expect(action.id).toBe("abc123");
|
|
234
239
|
}
|
|
235
240
|
});
|
|
236
|
-
|
|
241
|
+
test("buildAction parses mesh_listeners", () => {
|
|
237
242
|
const action = buildAction({ action: "mesh_listeners" });
|
|
238
|
-
|
|
243
|
+
expect(action.action).toBe("mesh_listeners");
|
|
239
244
|
});
|
|
240
|
-
|
|
245
|
+
test("buildAction parses mesh_interfaces", () => {
|
|
241
246
|
const action = buildAction({ action: "mesh_interfaces" });
|
|
242
|
-
|
|
247
|
+
expect(action.action).toBe("mesh_interfaces");
|
|
243
248
|
});
|
|
244
|
-
|
|
249
|
+
test("connections via non-default listener carry policy in handle", async () => {
|
|
245
250
|
// Constructed directly rather than through MeshStore: MeshStore.events is a getter that builds a fresh TransportEvents object on every access, so there's no way to observe what the transport itself passed to onIntroduction without either reaching into the transport by an unsafe cast or, as here, supplying our own TransportEvents object the transport calls directly.
|
|
246
251
|
let receivedPolicy = "not-called";
|
|
247
252
|
const events = {
|
|
@@ -265,7 +270,9 @@ describe("listener policy", () => {
|
|
|
265
270
|
const listenerId = await transport.addListener("127.0.0.1", 0, "observe");
|
|
266
271
|
const listeners = transport.listListeners();
|
|
267
272
|
const observeListener = listeners.find((l) => l.id === listenerId);
|
|
268
|
-
|
|
273
|
+
expect(observeListener, "Should find the observe listener").toBeTruthy();
|
|
274
|
+
if (observeListener === undefined)
|
|
275
|
+
throw new Error("Should find the observe listener");
|
|
269
276
|
// Connect to the observe listener and send an introduce message over a real WireMeshTransport client session -- the transport should tag the resulting connection handle with policy="observe".
|
|
270
277
|
const probeIdentity = generateIdentity();
|
|
271
278
|
const probeTransport = createTlsTransport({
|
|
@@ -283,8 +290,8 @@ describe("listener policy", () => {
|
|
|
283
290
|
peerId: "probe",
|
|
284
291
|
dataPort: 19999,
|
|
285
292
|
}), FRAME_SCOPE);
|
|
286
|
-
|
|
287
|
-
|
|
293
|
+
expect(outcome.result, "introduce should be accepted").toBe("ok");
|
|
294
|
+
expect(receivedPolicy, "Handle should carry observe policy").toBe("observe");
|
|
288
295
|
}
|
|
289
296
|
finally {
|
|
290
297
|
await session.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listener-policy.integration.test.js","sourceRoot":"","sources":["../../src/test/listener-policy.integration.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"listener-policy.integration.test.js","sourceRoot":"","sources":["../../src/test/listener-policy.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { describe, it } from "
|
|
2
|
-
import assert from "node:assert/strict";
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
3
2
|
import { INITIAL_RETRY_DELAY_MS, MAX_RETRY_DELAY_MS, MAX_TOTAL_RETRY_MS, isRetryablePublishFailure, nextRetryDelayMs, } from "../core/mcp-registry-retry.js";
|
|
4
3
|
describe("nextRetryDelayMs", () => {
|
|
5
4
|
it("doubles the previous delay", () => {
|
|
6
|
-
|
|
5
|
+
expect(nextRetryDelayMs(INITIAL_RETRY_DELAY_MS)).toBe(INITIAL_RETRY_DELAY_MS * 2);
|
|
7
6
|
});
|
|
8
7
|
it("caps at MAX_RETRY_DELAY_MS", () => {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
expect(nextRetryDelayMs(MAX_RETRY_DELAY_MS)).toBe(MAX_RETRY_DELAY_MS);
|
|
9
|
+
expect(nextRetryDelayMs(MAX_RETRY_DELAY_MS * 10)).toBe(MAX_RETRY_DELAY_MS);
|
|
11
10
|
});
|
|
12
11
|
it("accumulates to comfortably exceed the previous, confirmed-insufficient 225-second retry budget (agent-comms v2.18.0's release job exhausted a fixed [15, 30, 60, 120] schedule while npm's own CDN still hadn't propagated the just-published version)", () => {
|
|
13
12
|
const previousBudgetMs = (15 + 30 + 60 + 120) * 1000;
|
|
@@ -17,25 +16,25 @@ describe("nextRetryDelayMs", () => {
|
|
|
17
16
|
totalMs += delayMs;
|
|
18
17
|
delayMs = nextRetryDelayMs(delayMs);
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
expect(totalMs > previousBudgetMs).toBeTruthy();
|
|
20
|
+
expect(totalMs >= MAX_TOTAL_RETRY_MS).toBeTruthy();
|
|
22
21
|
});
|
|
23
22
|
});
|
|
24
23
|
describe("isRetryablePublishFailure", () => {
|
|
25
24
|
it("recognises the MCP registry's own npm-propagation-lag error text", () => {
|
|
26
25
|
const output = "registry validation failed for package 0 (agent-comms): NPM package 'agent-comms' exists, but version '2.18.0' was not found (status: 404). A newly published release can take a moment to appear on the registry. Wait and retry, or publish version '2.18.0' before registering it";
|
|
27
|
-
|
|
26
|
+
expect(isRetryablePublishFailure(output)).toBe(true);
|
|
28
27
|
});
|
|
29
28
|
it("recognises a transient 5xx from the registry's own infrastructure -- confirmed as a real, second retryable failure mode (ExaDev/agent-comms, 2026-09-13, v2.18.1): the registry returned a genuine HTTP 504 that resolved itself on a plain re-run seconds later, but the retry logic at the time only recognised the propagation-lag text above and failed the release job immediately instead of retrying it", () => {
|
|
30
29
|
const output = "Error: publish failed: server returned status 504: <html>";
|
|
31
|
-
|
|
30
|
+
expect(isRetryablePublishFailure(output)).toBe(true);
|
|
32
31
|
});
|
|
33
32
|
it("does not retry a 4xx other than the specific propagation-lag 404 -- a genuinely invalid publish request, which retrying can never fix", () => {
|
|
34
33
|
const output = "Error: publish failed: server returned status 400: Bad Request";
|
|
35
|
-
|
|
34
|
+
expect(isRetryablePublishFailure(output)).toBe(false);
|
|
36
35
|
});
|
|
37
36
|
it("does not misclassify an unrelated failure as retryable", () => {
|
|
38
|
-
|
|
37
|
+
expect(isRetryablePublishFailure("permission denied")).toBe(false);
|
|
39
38
|
});
|
|
40
39
|
});
|
|
41
40
|
//# sourceMappingURL=mcp-registry-retry.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-registry-retry.test.js","sourceRoot":"","sources":["../../src/test/mcp-registry-retry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-registry-retry.test.js","sourceRoot":"","sources":["../../src/test/mcp-registry-retry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AAEvC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CACnD,sBAAsB,GAAG,CAAC,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wPAAwP,EAAE,GAAG,EAAE;QAChQ,MAAM,gBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QACrD,IAAI,OAAO,GAAG,sBAAsB,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,GAAG,kBAAkB,EAAE,CAAC;YACpC,OAAO,IAAI,OAAO,CAAC;YACnB,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC,UAAU,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,MAAM,GACV,sRAAsR,CAAC;QACzR,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gZAAgZ,EAAE,GAAG,EAAE;QACxZ,MAAM,MAAM,GAAG,2DAA2D,CAAC;QAC3E,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uIAAuI,EAAE,GAAG,EAAE;QAC/I,MAAM,MAAM,GACV,gEAAgE,CAAC;QACnE,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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();
|