agent-comms 3.17.0 → 3.18.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/claude-code/channel.d.ts.map +1 -1
- package/dist/bridges/claude-code/channel.js +4 -3
- package/dist/bridges/claude-code/channel.js.map +1 -1
- package/dist/bridges/codex/tool.d.ts.map +1 -1
- package/dist/bridges/codex/tool.js +4 -3
- package/dist/bridges/codex/tool.js.map +1 -1
- package/dist/bridges/mcp/server.d.ts.map +1 -1
- package/dist/bridges/mcp/server.js +4 -3
- package/dist/bridges/mcp/server.js.map +1 -1
- package/dist/bridges/pi/extension.d.ts.map +1 -1
- package/dist/bridges/pi/extension.js +2 -28
- package/dist/bridges/pi/extension.js.map +1 -1
- package/dist/bridges/user/web/server.d.ts +5 -0
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +14 -0
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.js +55 -13
- 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 +19 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/bridge.d.ts +1 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +3 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/hub-session.d.ts +18 -2
- package/dist/core/hub-session.d.ts.map +1 -1
- package/dist/core/hub-session.js +67 -47
- package/dist/core/hub-session.js.map +1 -1
- package/dist/core/tool.d.ts +12 -0
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +17 -0
- package/dist/core/tool.js.map +1 -1
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/wire-mesh-transport.d.ts +1 -1
- package/dist/core/wire-mesh-transport.d.ts.map +1 -1
- package/dist/core/wire-mesh-transport.js +3 -1
- package/dist/core/wire-mesh-transport.js.map +1 -1
- package/dist/test/hub-mode-session.integration.test.js +23 -0
- package/dist/test/hub-mode-session.integration.test.js.map +1 -1
- package/dist/test/hub-room-domain-verb-trust-bypass.integration.test.d.ts +7 -0
- package/dist/test/hub-room-domain-verb-trust-bypass.integration.test.d.ts.map +1 -0
- package/dist/test/hub-room-domain-verb-trust-bypass.integration.test.js +93 -0
- package/dist/test/hub-room-domain-verb-trust-bypass.integration.test.js.map +1 -0
- package/dist/test/hub-session-dispatch.test.d.ts +5 -0
- package/dist/test/hub-session-dispatch.test.d.ts.map +1 -0
- package/dist/test/hub-session-dispatch.test.js +223 -0
- package/dist/test/hub-session-dispatch.test.js.map +1 -0
- package/dist/test/test-transport.d.ts +6 -0
- package/dist/test/test-transport.d.ts.map +1 -1
- package/dist/test/test-transport.js +12 -2
- package/dist/test/test-transport.js.map +1 -1
- package/dist/test/web-url-tool-action.test.d.ts +2 -0
- package/dist/test/web-url-tool-action.test.d.ts.map +1 -0
- package/dist/test/web-url-tool-action.test.js +69 -0
- package/dist/test/web-url-tool-action.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for dispatchHubRequest (agent-comms#192): the per-request trust decision hub-session.ts's own consume() loop delegates to, exercised directly against fake requests and fake deps rather than a real hub connection, mirroring hub-forwarding.test.ts's own fake-object approach for the sibling gateway-trust gates. hub-mode-session.integration.test.ts already proves the legacy FRAME_VERB gate end to end over a real hub; this file is what actually exercises the fix itself, that a real room-domain verb (room.send, room.join, room.notify, ...) is no longer rejected by the coarse per-device isTrusted allowlist at all, and the edge case that gate's removal would otherwise expose: a request with no fromDevice at all still has to be refused before ever reaching a room-verb handler, since resolveHandle/verifyRoomToken would call deviceIdFromHex on a non-hex placeholder and throw synchronously rather than answering with an ordinary unauthorized outcome.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
|
|
6
|
+
import { dispatchHubRequest } from "../core/hub-session.js";
|
|
7
|
+
import { FRAME_VERB } from "../core/wire-mesh-transport.js";
|
|
8
|
+
const DEVICE_ID_HEX_LENGTH = 64;
|
|
9
|
+
const SENDER_HEX = "a".repeat(DEVICE_ID_HEX_LENGTH);
|
|
10
|
+
const OWN_HEX = "b".repeat(DEVICE_ID_HEX_LENGTH);
|
|
11
|
+
const OTHER_LOCAL_PEER_HEX = "c".repeat(DEVICE_ID_HEX_LENGTH);
|
|
12
|
+
function deviceIdBytes(hex) {
|
|
13
|
+
const bytes = new Uint8Array(new ArrayBuffer(hex.length / 2));
|
|
14
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
15
|
+
bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
16
|
+
}
|
|
17
|
+
// A fixture device-id: the real DeviceId type wire-mesh-core mints only through its own deviceIdFromHex/generateIdentity is structurally just a Uint8Array of the right length, and every dispatchHubRequest call site only ever round-trips this value back through deviceIdToHex, so a plain byte array is a faithful stand-in for a test fixture with no cast needed.
|
|
18
|
+
return bytes;
|
|
19
|
+
}
|
|
20
|
+
function fakeOnKnownPeer() {
|
|
21
|
+
return vi.fn();
|
|
22
|
+
}
|
|
23
|
+
function noopEvents() {
|
|
24
|
+
return {
|
|
25
|
+
onMessage: () => undefined,
|
|
26
|
+
onPeerConnected: () => undefined,
|
|
27
|
+
onPeerDisconnected: () => undefined,
|
|
28
|
+
onIntroduction: () => undefined,
|
|
29
|
+
onConnectionRequest: () => undefined,
|
|
30
|
+
onPeerList: () => undefined,
|
|
31
|
+
onPeerJoined: () => undefined,
|
|
32
|
+
onBecomeCoordinator: () => undefined,
|
|
33
|
+
onRevocationAnnounce: () => undefined,
|
|
34
|
+
onPresenceAdvert: () => undefined,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function fakeRequest(options) {
|
|
38
|
+
const responses = [];
|
|
39
|
+
const scope = { kind: "room", path: "owner/room" };
|
|
40
|
+
const request = {
|
|
41
|
+
requestId: 1,
|
|
42
|
+
command: { verb: options.verb ?? "room:member", params: {} },
|
|
43
|
+
scope,
|
|
44
|
+
...(options.fromDevice !== undefined
|
|
45
|
+
? { fromDevice: deviceIdBytes(options.fromDevice) }
|
|
46
|
+
: {}),
|
|
47
|
+
...(options.toDevice !== undefined
|
|
48
|
+
? { toDevice: deviceIdBytes(options.toDevice) }
|
|
49
|
+
: {}),
|
|
50
|
+
respond: async (outcome) => {
|
|
51
|
+
responses.push(outcome);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
return { request, responses };
|
|
55
|
+
}
|
|
56
|
+
function fakeDeps(overrides = {}) {
|
|
57
|
+
const messages = [];
|
|
58
|
+
const events = {
|
|
59
|
+
...noopEvents(),
|
|
60
|
+
messages,
|
|
61
|
+
onMessage: (_handle, message) => {
|
|
62
|
+
messages.push(message);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
isTrusted: () => false,
|
|
67
|
+
events,
|
|
68
|
+
handleRoomRequest: vi.fn().mockResolvedValue(undefined),
|
|
69
|
+
forwardToLocalPeer: () => undefined,
|
|
70
|
+
...overrides,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
describe("dispatchHubRequest", () => {
|
|
74
|
+
it("drops a FRAME_VERB request with no fromDevice, responding ok, without ever calling onMessage", async () => {
|
|
75
|
+
const { request, responses } = fakeRequest({ verb: FRAME_VERB });
|
|
76
|
+
const deps = fakeDeps();
|
|
77
|
+
const onKnownPeer = fakeOnKnownPeer();
|
|
78
|
+
await dispatchHubRequest(request, OWN_HEX, deps, onKnownPeer);
|
|
79
|
+
expect(responses).toEqual([{ result: "ok" }]);
|
|
80
|
+
expect(deps.events.messages).toEqual([]);
|
|
81
|
+
expect(onKnownPeer).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
it("refuses a room-domain verb with no fromDevice with an ordinary unauthorized outcome, never dispatching to handleRoomRequest", async () => {
|
|
84
|
+
const { request, responses } = fakeRequest({ verb: "room:member" });
|
|
85
|
+
const deps = fakeDeps();
|
|
86
|
+
const onKnownPeer = fakeOnKnownPeer();
|
|
87
|
+
await dispatchHubRequest(request, OWN_HEX, deps, onKnownPeer);
|
|
88
|
+
expect(responses).toEqual([{ result: "error", code: "unauthorized" }]);
|
|
89
|
+
expect(deps.handleRoomRequest).not.toHaveBeenCalled();
|
|
90
|
+
expect(onKnownPeer).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
it("drops a FRAME_VERB request from an untrusted device, responding ok, without calling onMessage", async () => {
|
|
93
|
+
const { request, responses } = fakeRequest({
|
|
94
|
+
verb: FRAME_VERB,
|
|
95
|
+
fromDevice: SENDER_HEX,
|
|
96
|
+
});
|
|
97
|
+
const deps = fakeDeps({ isTrusted: () => false });
|
|
98
|
+
const onKnownPeer = fakeOnKnownPeer();
|
|
99
|
+
await dispatchHubRequest(request, OWN_HEX, deps, onKnownPeer);
|
|
100
|
+
expect(responses).toEqual([{ result: "ok" }]);
|
|
101
|
+
expect(deps.events.messages).toEqual([]);
|
|
102
|
+
expect(onKnownPeer).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
it("delivers a FRAME_VERB request from a trusted device to onMessage and records it as a known hub peer", async () => {
|
|
105
|
+
const message = {
|
|
106
|
+
method: "peer_joined",
|
|
107
|
+
peer: { id: "hi", port: 0, startedAt: "2026-01-01T00:00:00.000Z" },
|
|
108
|
+
};
|
|
109
|
+
const { request, responses } = fakeRequest({
|
|
110
|
+
verb: FRAME_VERB,
|
|
111
|
+
fromDevice: SENDER_HEX,
|
|
112
|
+
});
|
|
113
|
+
request.command.params = { message };
|
|
114
|
+
const deps = fakeDeps({ isTrusted: (hex) => hex === SENDER_HEX });
|
|
115
|
+
const onKnownPeer = fakeOnKnownPeer();
|
|
116
|
+
await dispatchHubRequest(request, OWN_HEX, deps, onKnownPeer);
|
|
117
|
+
expect(responses).toEqual([{ result: "ok" }]);
|
|
118
|
+
expect(deps.events.messages).toEqual([message]);
|
|
119
|
+
expect(onKnownPeer).toHaveBeenCalledWith(SENDER_HEX);
|
|
120
|
+
});
|
|
121
|
+
it("never delivers a state_sync or state_update from a trusted device to onMessage (agent-comms#169)", async () => {
|
|
122
|
+
const { request, responses } = fakeRequest({
|
|
123
|
+
verb: FRAME_VERB,
|
|
124
|
+
fromDevice: SENDER_HEX,
|
|
125
|
+
});
|
|
126
|
+
request.command.params = {
|
|
127
|
+
message: {
|
|
128
|
+
method: "state_update",
|
|
129
|
+
patch: { type: "agent_offline", agentId: "spoofed" },
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
const deps = fakeDeps({ isTrusted: () => true });
|
|
133
|
+
await dispatchHubRequest(request, OWN_HEX, deps, fakeOnKnownPeer());
|
|
134
|
+
expect(responses).toEqual([{ result: "ok" }]);
|
|
135
|
+
expect(deps.events.messages).toEqual([]);
|
|
136
|
+
});
|
|
137
|
+
it("dispatches a room-domain verb from an UNTRUSTED but identified device straight to handleRoomRequest, never rejecting it as unauthorized (the actual agent-comms#192 fix)", async () => {
|
|
138
|
+
const { request, responses } = fakeRequest({
|
|
139
|
+
verb: "room:member",
|
|
140
|
+
fromDevice: SENDER_HEX,
|
|
141
|
+
});
|
|
142
|
+
const handleRoomRequest = vi
|
|
143
|
+
.fn()
|
|
144
|
+
.mockImplementation(async (req) => {
|
|
145
|
+
await req.respond({ result: "ok" });
|
|
146
|
+
});
|
|
147
|
+
const deps = fakeDeps({ isTrusted: () => false, handleRoomRequest });
|
|
148
|
+
const onKnownPeer = fakeOnKnownPeer();
|
|
149
|
+
await dispatchHubRequest(request, OWN_HEX, deps, onKnownPeer);
|
|
150
|
+
expect(handleRoomRequest).toHaveBeenCalledTimes(1);
|
|
151
|
+
const [dispatchedRequest, dispatchedHandle] = handleRoomRequest.mock.calls[0] ?? [];
|
|
152
|
+
expect(dispatchedRequest).toBe(request);
|
|
153
|
+
expect(dispatchedHandle).toEqual({ id: SENDER_HEX });
|
|
154
|
+
expect(responses).toEqual([{ result: "ok" }]);
|
|
155
|
+
// hubPeersKnown stays "gateway-trusted hub peers": a room-domain sender's own capability token hasn't been verified yet at this point (that happens inside handleRoomRequest), so an untrusted sender reaching this branch must not be recorded as known just because it presented a syntactically valid device-id.
|
|
156
|
+
expect(onKnownPeer).not.toHaveBeenCalled();
|
|
157
|
+
});
|
|
158
|
+
it("still records a TRUSTED room-domain sender as a known hub peer", async () => {
|
|
159
|
+
const { request } = fakeRequest({
|
|
160
|
+
verb: "room:member",
|
|
161
|
+
fromDevice: SENDER_HEX,
|
|
162
|
+
});
|
|
163
|
+
const deps = fakeDeps({ isTrusted: () => true });
|
|
164
|
+
const onKnownPeer = fakeOnKnownPeer();
|
|
165
|
+
await dispatchHubRequest(request, OWN_HEX, deps, onKnownPeer);
|
|
166
|
+
expect(onKnownPeer).toHaveBeenCalledWith(SENDER_HEX);
|
|
167
|
+
});
|
|
168
|
+
it("forwards a room-domain verb addressed to a different local device via forwardToLocalPeer, stamping on-behalf-of with the true sender", async () => {
|
|
169
|
+
const { request } = fakeRequest({
|
|
170
|
+
verb: "room:member",
|
|
171
|
+
fromDevice: SENDER_HEX,
|
|
172
|
+
toDevice: OTHER_LOCAL_PEER_HEX,
|
|
173
|
+
});
|
|
174
|
+
request.command.params = { verb: "room.send", text: "hi" };
|
|
175
|
+
const outcome = { result: "ok" };
|
|
176
|
+
const forwardToLocalPeer = vi
|
|
177
|
+
.fn()
|
|
178
|
+
.mockReturnValue(Promise.resolve(outcome));
|
|
179
|
+
const handleRoomRequest = vi.fn().mockResolvedValue(undefined);
|
|
180
|
+
const deps = fakeDeps({
|
|
181
|
+
isTrusted: () => false,
|
|
182
|
+
forwardToLocalPeer,
|
|
183
|
+
handleRoomRequest,
|
|
184
|
+
});
|
|
185
|
+
await dispatchHubRequest(request, OWN_HEX, deps, fakeOnKnownPeer());
|
|
186
|
+
expect(forwardToLocalPeer).toHaveBeenCalledTimes(1);
|
|
187
|
+
const [toDeviceArg, commandArg] = forwardToLocalPeer.mock.calls[0] ?? [];
|
|
188
|
+
expect(toDeviceArg).toBe(OTHER_LOCAL_PEER_HEX);
|
|
189
|
+
expect(commandArg).toMatchObject({
|
|
190
|
+
params: { verb: "room.send", text: "hi", "on-behalf-of": SENDER_HEX },
|
|
191
|
+
});
|
|
192
|
+
expect(handleRoomRequest).not.toHaveBeenCalled();
|
|
193
|
+
});
|
|
194
|
+
it("falls back to handleRoomRequest when forwardToLocalPeer finds no local session for the addressed device", async () => {
|
|
195
|
+
const { request } = fakeRequest({
|
|
196
|
+
verb: "room:member",
|
|
197
|
+
fromDevice: SENDER_HEX,
|
|
198
|
+
toDevice: OTHER_LOCAL_PEER_HEX,
|
|
199
|
+
});
|
|
200
|
+
const handleRoomRequest = vi.fn().mockResolvedValue(undefined);
|
|
201
|
+
const deps = fakeDeps({
|
|
202
|
+
isTrusted: () => false,
|
|
203
|
+
forwardToLocalPeer: () => undefined,
|
|
204
|
+
handleRoomRequest,
|
|
205
|
+
});
|
|
206
|
+
await dispatchHubRequest(request, OWN_HEX, deps, fakeOnKnownPeer());
|
|
207
|
+
expect(handleRoomRequest).toHaveBeenCalledTimes(1);
|
|
208
|
+
});
|
|
209
|
+
it("uses deviceIdToHex(request.fromDevice) as the resolved handle id for a room-domain verb addressed to this side's own device", async () => {
|
|
210
|
+
const { request } = fakeRequest({
|
|
211
|
+
verb: "room:member",
|
|
212
|
+
fromDevice: SENDER_HEX,
|
|
213
|
+
toDevice: OWN_HEX,
|
|
214
|
+
});
|
|
215
|
+
const handleRoomRequest = vi.fn().mockResolvedValue(undefined);
|
|
216
|
+
const deps = fakeDeps({ isTrusted: () => true, handleRoomRequest });
|
|
217
|
+
await dispatchHubRequest(request, OWN_HEX, deps, fakeOnKnownPeer());
|
|
218
|
+
expect(handleRoomRequest).toHaveBeenCalledTimes(1);
|
|
219
|
+
const [, handleArg] = handleRoomRequest.mock.calls[0] ?? [];
|
|
220
|
+
expect(handleArg).toEqual({ id: deviceIdToHex(deviceIdBytes(SENDER_HEX)) });
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=hub-session-dispatch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-session-dispatch.test.js","sourceRoot":"","sources":["../../src/test/hub-session-dispatch.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AASlD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAI5D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACpD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACjD,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE9D,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,yWAAyW;IACzW,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe;IAGtB,OAAO,EAAE,CAAC,EAAE,EAA+B,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;QAC1B,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS;QAChC,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;QACnC,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;QAC/B,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS;QACpC,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;QAC3B,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;QAC7B,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS;QACpC,oBAAoB,EAAE,GAAG,EAAE,CAAC,SAAS;QACrC,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,OAIE;IAKF,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,MAAM,KAAK,GAA8B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9E,MAAM,OAAO,GAA0B;QACrC,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5D,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACnD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;YAChC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC/C,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,OAAsB,EAAiB,EAAE;YACvD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CACf,YAAuE,EAAE;IAIzE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG;QACb,GAAG,UAAU,EAAE;QACf,QAAQ;QACR,SAAS,EAAE,CAAC,OAAmC,EAAE,OAAoB,EAAE,EAAE;YACvE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;IACF,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK;QACtB,MAAM;QACN,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACvD,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;QACnC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6HAA6H,EAAE,KAAK,IAAI,EAAE;QAC3I,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC7G,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;YACzC,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACnH,MAAM,OAAO,GAAgB;YAC3B,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE;SACnE,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;YACzC,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;YACzC,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG;YACvB,OAAO,EAAE;gBACP,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE;aACrD;SACF,CAAC;QACF,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0KAA0K,EAAE,KAAK,IAAI,EAAE;QACxL,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;YACzC,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,EAAE;aACzB,EAAE,EAA+C;aACjD,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAChC,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACL,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GACzC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,oTAAoT;QACpT,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAC9B,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sIAAsI,EAAE,KAAK,IAAI,EAAE;QACpJ,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAC9B,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,oBAAoB;SAC/B,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAChD,MAAM,kBAAkB,GAAG,EAAE;aAC1B,EAAE,EAAgD;aAClD,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK;YACtB,kBAAkB;YAClB,iBAAiB;SAClB,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC;YAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE;SACtE,CAAC,CAAC;QACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yGAAyG,EAAE,KAAK,IAAI,EAAE;QACvH,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAC9B,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,oBAAoB;SAC/B,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK;YACtB,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;YACnC,iBAAiB;SAClB,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6HAA6H,EAAE,KAAK,IAAI,EAAE;QAC3I,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAC9B,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEpE,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
/** Wires a real WireMeshTransport plus a persisted identity slot onto a freshly constructed MeshStore -- the same setTransport()/setIdentity() calls every production bridge makes immediately after construction (via createBridgeMesh). MeshStore has no default transport or identity, so every test that constructs one needs this (or an equivalent explicit wiring) before init(), createRoom(), or any other transport- or identity-using method runs. */
|
|
2
|
+
import { WireMeshTransport } from "../core/wire-mesh-transport.js";
|
|
2
3
|
import type { IdentitySlot } from "../core/identity-store.js";
|
|
3
4
|
import type { UserIdentityOptions } from "../core/user-identity.js";
|
|
4
5
|
import type { MeshStore } from "../core/mesh-store.js";
|
|
5
6
|
/** Wires store onto a fresh WireMeshTransport and a persisted identity slot, returning the slot so a test can inspect (or reuse) the persisted room tokens directly via loadRoomTokens(). Defaults to a throwaway temp-dir slot per call -- pass an explicit slot when a test needs the same identity to survive across more than one wireTestTransport call (e.g. simulating a restart). pendingConnectionTimeoutMs overrides WireMeshTransport's own default 5-minute connect_request expiry -- a test proving that expiry behaviour needs it far shorter than any real approval window. presenceReadvertiseIntervalMs likewise overrides the default 20s presence re-advertisement cadence -- a test proving that behaviour needs it far shorter too, or a test that doesn't care about presence at all wants it long enough to never fire spuriously mid-test. Wires getSelfAgentAdvert (`() => store.selfAgentAdvert`) the same way createBridgeMesh does -- a test relying on gossip carrying the registered agent/self extension (e.g. remote-directory-merge coverage, agent-comms#155) needs this wired exactly like production does. */
|
|
6
7
|
export declare function wireTestTransport(store: MeshStore, slot?: Readonly<IdentitySlot>, pendingConnectionTimeoutMs?: number, presenceReadvertiseIntervalMs?: number, userIdentityOptions?: Readonly<UserIdentityOptions>): Promise<IdentitySlot>;
|
|
8
|
+
/** Same wiring as wireTestTransport, but also returns the constructed WireMeshTransport instance itself -- needed by any test that has to reach transport.hub directly (connectHub, hub.peers(), hub.isConnected), since MeshStore exposes no public hub-connect wrapper outside CoordinatorGateway's own becomeCoordinator flow (agent-comms#192's own hub-mode room-verb-gating tests are the first to need this, alongside the real room verb handlers store.roomVerbHandlers already wires in). */
|
|
9
|
+
export declare function wireTestTransportWithHub(store: MeshStore, slot?: Readonly<IdentitySlot>, pendingConnectionTimeoutMs?: number, presenceReadvertiseIntervalMs?: number, userIdentityOptions?: Readonly<UserIdentityOptions>): Promise<{
|
|
10
|
+
slot: IdentitySlot;
|
|
11
|
+
transport: WireMeshTransport;
|
|
12
|
+
}>;
|
|
7
13
|
/**
|
|
8
14
|
* Polls condition() until it returns true or timeoutMs elapses, rather than a fixed sleep() before a single check. A real TLS handshake plus the peer_list -\> connectToPeer -\> state_sync -\> handlePeerConnected round trip genuinely takes variable, load-dependent wall-clock time -- comfortably inside a fixed sleep on a fast local machine, not reliably so under a throttled CI runner. Throws with a descriptive message on timeout rather than letting the caller's own assertion fail with a less specific one.
|
|
9
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-transport.d.ts","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;
|
|
1
|
+
{"version":3,"file":"test-transport.d.ts","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;AAKjc,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAMnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA4DvD,klCAAklC;AACllC,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC7B,0BAA0B,CAAC,EAAE,MAAM,EACnC,6BAA6B,CAAC,EAAE,MAAM,EACtC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAClD,OAAO,CAAC,YAAY,CAAC,CASvB;AAED,ueAAue;AACve,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC7B,0BAA0B,CAAC,EAAE,MAAM,EACnC,6BAA6B,CAAC,EAAE,MAAM,EACtC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAClD,OAAO,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAQ/D;AAMD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,OAAO,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,SAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -14,7 +14,7 @@ import { nanoid } from "../core/nanoid.js";
|
|
|
14
14
|
/** Short enough to keep generated test identity slots readable, long enough that two concurrent test runs won't collide on the same throwaway cwd. */
|
|
15
15
|
const TEST_IDENTITY_CWD_ID_LENGTH = 8;
|
|
16
16
|
/** Wires store onto a fresh WireMeshTransport and a persisted identity slot, returning the slot so a test can inspect (or reuse) the persisted room tokens directly via loadRoomTokens(). Defaults to a throwaway temp-dir slot per call -- pass an explicit slot when a test needs the same identity to survive across more than one wireTestTransport call (e.g. simulating a restart). pendingConnectionTimeoutMs overrides WireMeshTransport's own default 5-minute connect_request expiry -- a test proving that expiry behaviour needs it far shorter than any real approval window. presenceReadvertiseIntervalMs likewise overrides the default 20s presence re-advertisement cadence -- a test proving that behaviour needs it far shorter too, or a test that doesn't care about presence at all wants it long enough to never fire spuriously mid-test. Wires getSelfAgentAdvert (`() => store.selfAgentAdvert`) the same way createBridgeMesh does -- a test relying on gossip carrying the registered agent/self extension (e.g. remote-directory-merge coverage, agent-comms#155) needs this wired exactly like production does. */
|
|
17
|
-
|
|
17
|
+
async function wireTransportInternal(store, slot, pendingConnectionTimeoutMs, presenceReadvertiseIntervalMs, userIdentityOptions) {
|
|
18
18
|
const resolvedSlot = slot ?? {
|
|
19
19
|
harness: "test",
|
|
20
20
|
cwd: nanoid(TEST_IDENTITY_CWD_ID_LENGTH),
|
|
@@ -30,7 +30,8 @@ export async function wireTestTransport(store, slot, pendingConnectionTimeoutMs,
|
|
|
30
30
|
store.peerId = deviceIdToHex(Uint8Array.from(identity.deviceId));
|
|
31
31
|
// One shared dataStorage instance for both the transport's own data-domain frame responder and the store's own durable-send mint path (P5, agent-comms#50) -- memory-backed, matching every other throwaway test identity here, rather than a real createNodeFsStorage a test would need to clean up afterwards.
|
|
32
32
|
const dataStorage = createMemoryStorage();
|
|
33
|
-
|
|
33
|
+
const transport = new WireMeshTransport(store.events, identity, store.roomVerbHandlers, pendingConnectionTimeoutMs, () => store.selfStatus, presenceReadvertiseIntervalMs, undefined, dataStorage, () => store.selfAgentAdvert, store.gatewayTrust);
|
|
34
|
+
store.setTransport(transport);
|
|
34
35
|
store.setIdentity({
|
|
35
36
|
identity: await toIdentityPort(identity),
|
|
36
37
|
clock: createSystemClock(),
|
|
@@ -44,8 +45,17 @@ export async function wireTestTransport(store, slot, pendingConnectionTimeoutMs,
|
|
|
44
45
|
store.onError = (e) => {
|
|
45
46
|
console.error(`[transport error, peerId=${store.peerId}]`, e.message);
|
|
46
47
|
};
|
|
48
|
+
return { slot: resolvedSlot, transport };
|
|
49
|
+
}
|
|
50
|
+
/** Wires store onto a fresh WireMeshTransport and a persisted identity slot, returning the slot so a test can inspect (or reuse) the persisted room tokens directly via loadRoomTokens(). Defaults to a throwaway temp-dir slot per call -- pass an explicit slot when a test needs the same identity to survive across more than one wireTestTransport call (e.g. simulating a restart). pendingConnectionTimeoutMs overrides WireMeshTransport's own default 5-minute connect_request expiry -- a test proving that expiry behaviour needs it far shorter than any real approval window. presenceReadvertiseIntervalMs likewise overrides the default 20s presence re-advertisement cadence -- a test proving that behaviour needs it far shorter too, or a test that doesn't care about presence at all wants it long enough to never fire spuriously mid-test. Wires getSelfAgentAdvert (`() => store.selfAgentAdvert`) the same way createBridgeMesh does -- a test relying on gossip carrying the registered agent/self extension (e.g. remote-directory-merge coverage, agent-comms#155) needs this wired exactly like production does. */
|
|
51
|
+
export async function wireTestTransport(store, slot, pendingConnectionTimeoutMs, presenceReadvertiseIntervalMs, userIdentityOptions) {
|
|
52
|
+
const { slot: resolvedSlot } = await wireTransportInternal(store, slot, pendingConnectionTimeoutMs, presenceReadvertiseIntervalMs, userIdentityOptions);
|
|
47
53
|
return resolvedSlot;
|
|
48
54
|
}
|
|
55
|
+
/** Same wiring as wireTestTransport, but also returns the constructed WireMeshTransport instance itself -- needed by any test that has to reach transport.hub directly (connectHub, hub.peers(), hub.isConnected), since MeshStore exposes no public hub-connect wrapper outside CoordinatorGateway's own becomeCoordinator flow (agent-comms#192's own hub-mode room-verb-gating tests are the first to need this, alongside the real room verb handlers store.roomVerbHandlers already wires in). */
|
|
56
|
+
export async function wireTestTransportWithHub(store, slot, pendingConnectionTimeoutMs, presenceReadvertiseIntervalMs, userIdentityOptions) {
|
|
57
|
+
return wireTransportInternal(store, slot, pendingConnectionTimeoutMs, presenceReadvertiseIntervalMs, userIdentityOptions);
|
|
58
|
+
}
|
|
49
59
|
// Generous on purpose: waitFor returns the instant its condition holds, so a long ceiling costs nothing on the happy path (a local run settles in well under a second) and only matters for the worst case -- a loaded CI runner working through a real, sequential chain of TLS handshakes (each one genuine X.509 certificate work, not instant) for the accept-flow's second connection direction, confirmed to need meaningfully more than 5s on at least one real CI run.
|
|
50
60
|
const DEFAULT_WAIT_FOR_TIMEOUT_MS = 20_000;
|
|
51
61
|
const WAIT_FOR_POLL_INTERVAL_MS = 20;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-transport.js","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"AAAA,icAAic;AAEjc,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,sJAAsJ;AACtJ,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,klCAAklC;AACllC,
|
|
1
|
+
{"version":3,"file":"test-transport.js","sourceRoot":"","sources":["../../src/test/test-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-url-tool-action.test.d.ts","sourceRoot":"","sources":["../../src/test/web-url-tool-action.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommsTool's web_url action (agent-comms#200) -- reports the calling bridge's own web UI address, or the same "not running"/"port not yet assigned" distinction pi's own comms-url command already made, so any MCP client (Claude Code, Codex, OpenCode, the generic MCP bridge) can find and open its own dashboard rather than only pi.
|
|
3
|
+
*/
|
|
4
|
+
import { test, describe, expect } from "vitest";
|
|
5
|
+
import { MeshStore } from "../core/mesh-store.js";
|
|
6
|
+
import { CommsTool } from "../core/tool.js";
|
|
7
|
+
import { buildAction } from "../core/bridge.js";
|
|
8
|
+
import { wireTestTransport } from "./test-transport.js";
|
|
9
|
+
async function registeredContext(store) {
|
|
10
|
+
const agent = await store.registerAgent({
|
|
11
|
+
name: "web-url-test",
|
|
12
|
+
harness: "test",
|
|
13
|
+
cwd: "/test",
|
|
14
|
+
pid: process.pid,
|
|
15
|
+
visibility: "visible",
|
|
16
|
+
tags: [],
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
agentId: agent.id,
|
|
20
|
+
harness: "test",
|
|
21
|
+
cwd: "/test",
|
|
22
|
+
pid: process.pid,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
describe("CommsTool web_url action", () => {
|
|
26
|
+
test("reports the web UI is not running when no getter is wired", async () => {
|
|
27
|
+
const store = new MeshStore();
|
|
28
|
+
await wireTestTransport(store);
|
|
29
|
+
const ctx = await registeredContext(store);
|
|
30
|
+
const tool = new CommsTool(store);
|
|
31
|
+
const result = await tool.handle(ctx, buildAction({ action: "web_url" }));
|
|
32
|
+
expect(result.isError).toBe(true);
|
|
33
|
+
expect(result.content).toBe("Web UI is not running.");
|
|
34
|
+
});
|
|
35
|
+
test("reports the web UI is not running when the getter reports not_running", async () => {
|
|
36
|
+
const store = new MeshStore();
|
|
37
|
+
await wireTestTransport(store);
|
|
38
|
+
const ctx = await registeredContext(store);
|
|
39
|
+
const tool = new CommsTool(store);
|
|
40
|
+
tool.getWebUrlStatus = () => ({ kind: "not_running" });
|
|
41
|
+
const result = await tool.handle(ctx, buildAction({ action: "web_url" }));
|
|
42
|
+
expect(result.isError).toBe(true);
|
|
43
|
+
expect(result.content).toBe("Web UI is not running.");
|
|
44
|
+
});
|
|
45
|
+
test("reports the port as not yet assigned when the getter reports pending", async () => {
|
|
46
|
+
const store = new MeshStore();
|
|
47
|
+
await wireTestTransport(store);
|
|
48
|
+
const ctx = await registeredContext(store);
|
|
49
|
+
const tool = new CommsTool(store);
|
|
50
|
+
tool.getWebUrlStatus = () => ({ kind: "pending" });
|
|
51
|
+
const result = await tool.handle(ctx, buildAction({ action: "web_url" }));
|
|
52
|
+
expect(result.isError).toBe(true);
|
|
53
|
+
expect(result.content).toBe("Web UI port not yet assigned.");
|
|
54
|
+
});
|
|
55
|
+
test("reports the web UI's own URL when the getter reports ready", async () => {
|
|
56
|
+
const store = new MeshStore();
|
|
57
|
+
await wireTestTransport(store);
|
|
58
|
+
const ctx = await registeredContext(store);
|
|
59
|
+
const tool = new CommsTool(store);
|
|
60
|
+
tool.getWebUrlStatus = () => ({
|
|
61
|
+
kind: "ready",
|
|
62
|
+
url: "http://127.0.0.1:54321",
|
|
63
|
+
});
|
|
64
|
+
const result = await tool.handle(ctx, buildAction({ action: "web_url" }));
|
|
65
|
+
expect(result.isError).toBe(false);
|
|
66
|
+
expect(result.content).toBe("http://127.0.0.1:54321");
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=web-url-tool-action.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-url-tool-action.test.js","sourceRoot":"","sources":["../../src/test/web-url-tool-action.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": "3.
|
|
3
|
+
"version": "3.18.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@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c",
|