agent-comms 9.0.3 → 9.0.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 +4 -0
- package/dist/bridges/user/web/test/web-access.unit.test.d.ts +1 -1
- package/dist/bridges/user/web/test/web-access.unit.test.js +19 -375
- package/dist/bridges/user/web/test/web-access.unit.test.js.map +1 -1
- package/dist/core/bridge.d.ts +11 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +17 -2
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/test/build-action.unit.test.d.ts +2 -0
- package/dist/core/test/build-action.unit.test.d.ts.map +1 -0
- package/dist/core/test/build-action.unit.test.js +28 -0
- package/dist/core/test/build-action.unit.test.js.map +1 -0
- package/dist/test/ci-required-checks.unit.test.d.ts +2 -0
- package/dist/test/ci-required-checks.unit.test.d.ts.map +1 -0
- package/dist/test/ci-required-checks.unit.test.js +137 -0
- package/dist/test/ci-required-checks.unit.test.js.map +1 -0
- package/dist/test/claude-command.unit.test.js +2 -21
- package/dist/test/claude-command.unit.test.js.map +1 -1
- package/dist/test/conformance/corpus-files.d.ts +11 -0
- package/dist/test/conformance/corpus-files.d.ts.map +1 -0
- package/dist/test/conformance/corpus-files.js +71 -0
- package/dist/test/conformance/corpus-files.js.map +1 -0
- package/dist/test/conformance/corpus-types.d.ts +62 -0
- package/dist/test/conformance/corpus-types.d.ts.map +1 -0
- package/dist/test/conformance/corpus-types.js +8 -0
- package/dist/test/conformance/corpus-types.js.map +1 -0
- package/dist/test/conformance/corpus.d.ts +34 -0
- package/dist/test/conformance/corpus.d.ts.map +1 -0
- package/dist/test/conformance/corpus.js +134 -0
- package/dist/test/conformance/corpus.js.map +1 -0
- package/dist/test/conformance/read-json.d.ts +2 -0
- package/dist/test/conformance/read-json.d.ts.map +1 -0
- package/dist/test/conformance/read-json.js +7 -0
- package/dist/test/conformance/read-json.js.map +1 -0
- package/dist/test/conformance/text.d.ts +10 -0
- package/dist/test/conformance/text.d.ts.map +1 -0
- package/dist/test/conformance/text.js +64 -0
- package/dist/test/conformance/text.js.map +1 -0
- package/dist/test/conformance/validate.d.ts +14 -0
- package/dist/test/conformance/validate.d.ts.map +1 -0
- package/dist/test/conformance/validate.js +85 -0
- package/dist/test/conformance/validate.js.map +1 -0
- package/dist/test/conformance-functions.helper.d.ts +19 -0
- package/dist/test/conformance-functions.helper.d.ts.map +1 -0
- package/dist/test/conformance-functions.helper.js +583 -0
- package/dist/test/conformance-functions.helper.js.map +1 -0
- package/dist/test/conformance.unit.test.d.ts +2 -0
- package/dist/test/conformance.unit.test.d.ts.map +1 -0
- package/dist/test/conformance.unit.test.js +358 -0
- package/dist/test/conformance.unit.test.js.map +1 -0
- package/dist/test/error-reporting.unit.test.js +2 -90
- package/dist/test/error-reporting.unit.test.js.map +1 -1
- package/dist/test/version-report-actions.unit.test.d.ts +1 -1
- package/dist/test/version-report-actions.unit.test.js +2 -55
- package/dist/test/version-report-actions.unit.test.js.map +1 -1
- package/package.json +4 -2
- package/src/core/bridge.ts +30 -1
- package/src/core/index.ts +1 -0
- package/dist/core/test/bridge.unit.test.d.ts +0 -5
- package/dist/core/test/bridge.unit.test.d.ts.map +0 -1
- package/dist/core/test/bridge.unit.test.js +0 -119
- package/dist/core/test/bridge.unit.test.js.map +0 -1
- package/dist/test/agent-table.unit.test.d.ts +0 -5
- package/dist/test/agent-table.unit.test.d.ts.map +0 -1
- package/dist/test/agent-table.unit.test.js +0 -53
- package/dist/test/agent-table.unit.test.js.map +0 -1
- package/dist/test/bind-retry.unit.test.d.ts +0 -2
- package/dist/test/bind-retry.unit.test.d.ts.map +0 -1
- package/dist/test/bind-retry.unit.test.js +0 -42
- package/dist/test/bind-retry.unit.test.js.map +0 -1
- package/dist/test/default-command.unit.test.d.ts +0 -2
- package/dist/test/default-command.unit.test.d.ts.map +0 -1
- package/dist/test/default-command.unit.test.js +0 -26
- package/dist/test/default-command.unit.test.js.map +0 -1
- package/dist/test/delegation-policy.unit.test.d.ts +0 -5
- package/dist/test/delegation-policy.unit.test.d.ts.map +0 -1
- package/dist/test/delegation-policy.unit.test.js +0 -52
- package/dist/test/delegation-policy.unit.test.js.map +0 -1
- package/dist/test/display-name.unit.test.d.ts +0 -5
- package/dist/test/display-name.unit.test.d.ts.map +0 -1
- package/dist/test/display-name.unit.test.js +0 -65
- package/dist/test/display-name.unit.test.js.map +0 -1
- package/dist/test/machine-list-groups.unit.test.d.ts +0 -5
- package/dist/test/machine-list-groups.unit.test.d.ts.map +0 -1
- package/dist/test/machine-list-groups.unit.test.js +0 -61
- package/dist/test/machine-list-groups.unit.test.js.map +0 -1
- package/dist/test/relay-selection.unit.test.d.ts +0 -5
- package/dist/test/relay-selection.unit.test.d.ts.map +0 -1
- package/dist/test/relay-selection.unit.test.js +0 -103
- package/dist/test/relay-selection.unit.test.js.map +0 -1
- package/dist/test/request-timeouts.unit.test.d.ts +0 -2
- package/dist/test/request-timeouts.unit.test.d.ts.map +0 -1
- package/dist/test/request-timeouts.unit.test.js +0 -28
- package/dist/test/request-timeouts.unit.test.js.map +0 -1
- package/dist/test/room-discovery.unit.test.d.ts +0 -2
- package/dist/test/room-discovery.unit.test.d.ts.map +0 -1
- package/dist/test/room-discovery.unit.test.js +0 -29
- package/dist/test/room-discovery.unit.test.js.map +0 -1
- package/dist/test/room-lookup.unit.test.d.ts +0 -2
- package/dist/test/room-lookup.unit.test.d.ts.map +0 -1
- package/dist/test/room-lookup.unit.test.js +0 -59
- package/dist/test/room-lookup.unit.test.js.map +0 -1
- package/dist/test/room-path.unit.test.d.ts +0 -2
- package/dist/test/room-path.unit.test.d.ts.map +0 -1
- package/dist/test/room-path.unit.test.js +0 -54
- package/dist/test/room-path.unit.test.js.map +0 -1
- package/dist/test/send-outcome.unit.test.d.ts +0 -2
- package/dist/test/send-outcome.unit.test.d.ts.map +0 -1
- package/dist/test/send-outcome.unit.test.js +0 -52
- package/dist/test/send-outcome.unit.test.js.map +0 -1
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The relay selection policy (agent-comms#342): a relay on this machine, then one on the local network, then any trusted relay-offering device, then the configured public hub, with deny-by-default trust for every offer not from a machine-local peer.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { selectRelay } from "../core/relay-selection.js";
|
|
6
|
-
const DEVICE_ID_HEX_LENGTH = 64;
|
|
7
|
-
const PUBLIC_HUB = "wss://mesh.example.com/";
|
|
8
|
-
const OWN = "0".repeat(DEVICE_ID_HEX_LENGTH);
|
|
9
|
-
const MACHINE_PEER = "1".repeat(DEVICE_ID_HEX_LENGTH);
|
|
10
|
-
const LAN_PEER = "2".repeat(DEVICE_ID_HEX_LENGTH);
|
|
11
|
-
const REMOTE_PEER = "3".repeat(DEVICE_ID_HEX_LENGTH);
|
|
12
|
-
const STRANGER = "4".repeat(DEVICE_ID_HEX_LENGTH);
|
|
13
|
-
const machineOffer = {
|
|
14
|
-
deviceHex: MACHINE_PEER,
|
|
15
|
-
addresses: ["ws://127.0.0.1:4100/", "ws://192.168.1.10:4100/"],
|
|
16
|
-
machineLocal: true,
|
|
17
|
-
};
|
|
18
|
-
const lanOffer = {
|
|
19
|
-
deviceHex: LAN_PEER,
|
|
20
|
-
addresses: ["ws://127.0.0.1:4200/", "ws://10.0.0.7:4200/"],
|
|
21
|
-
machineLocal: false,
|
|
22
|
-
};
|
|
23
|
-
const remoteOffer = {
|
|
24
|
-
deviceHex: REMOTE_PEER,
|
|
25
|
-
addresses: ["wss://relay.example.net/"],
|
|
26
|
-
machineLocal: false,
|
|
27
|
-
};
|
|
28
|
-
function select(offers, trusted = [LAN_PEER, REMOTE_PEER]) {
|
|
29
|
-
return selectRelay({
|
|
30
|
-
offers,
|
|
31
|
-
isTrusted: (hex) => trusted.includes(hex),
|
|
32
|
-
ownDeviceHex: OWN,
|
|
33
|
-
publicHubUrl: PUBLIC_HUB,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
describe("selectRelay", () => {
|
|
37
|
-
it("prefers a relay on this machine, over its loopback address", () => {
|
|
38
|
-
expect(select([remoteOffer, lanOffer, machineOffer])).toEqual({
|
|
39
|
-
url: "ws://127.0.0.1:4100/",
|
|
40
|
-
tier: "machine",
|
|
41
|
-
deviceHex: MACHINE_PEER,
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
it("falls to a trusted relay on the local network next, over its private address", () => {
|
|
45
|
-
expect(select([remoteOffer, lanOffer])).toEqual({
|
|
46
|
-
url: "ws://10.0.0.7:4200/",
|
|
47
|
-
tier: "lan",
|
|
48
|
-
deviceHex: LAN_PEER,
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
it("falls to any trusted relay-offering device next", () => {
|
|
52
|
-
expect(select([remoteOffer])).toEqual({
|
|
53
|
-
url: "wss://relay.example.net/",
|
|
54
|
-
tier: "trusted",
|
|
55
|
-
deviceHex: REMOTE_PEER,
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
it("falls back to the configured public hub when no offer qualifies", () => {
|
|
59
|
-
expect(select([])).toEqual({ url: PUBLIC_HUB, tier: "public" });
|
|
60
|
-
});
|
|
61
|
-
it("never uses an offer from an untrusted device, however well placed", () => {
|
|
62
|
-
const strangerOffer = {
|
|
63
|
-
deviceHex: STRANGER,
|
|
64
|
-
addresses: ["ws://192.168.1.99:4300/", "wss://stranger.example.org/"],
|
|
65
|
-
machineLocal: false,
|
|
66
|
-
};
|
|
67
|
-
expect(select([strangerOffer, remoteOffer])).toEqual({
|
|
68
|
-
url: "wss://relay.example.net/",
|
|
69
|
-
tier: "trusted",
|
|
70
|
-
deviceHex: REMOTE_PEER,
|
|
71
|
-
});
|
|
72
|
-
expect(select([strangerOffer])).toEqual({
|
|
73
|
-
url: PUBLIC_HUB,
|
|
74
|
-
tier: "public",
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
it("never reaches a device learned through a hub over a loopback address, which would only reach this machine", () => {
|
|
78
|
-
const loopbackOnly = {
|
|
79
|
-
deviceHex: REMOTE_PEER,
|
|
80
|
-
addresses: ["ws://127.0.0.1:4400/"],
|
|
81
|
-
machineLocal: false,
|
|
82
|
-
};
|
|
83
|
-
expect(select([loopbackOnly])).toEqual({ url: PUBLIC_HUB, tier: "public" });
|
|
84
|
-
});
|
|
85
|
-
it("never relays through this store's own offer", () => {
|
|
86
|
-
expect(select([{ ...machineOffer, deviceHex: OWN }])).toEqual({
|
|
87
|
-
url: PUBLIC_HUB,
|
|
88
|
-
tier: "public",
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
it("ignores an address that is not a ws:// or wss:// URL", () => {
|
|
92
|
-
expect(select([{ ...remoteOffer, addresses: ["tcp://relay.example.net:9"] }])).toEqual({ url: PUBLIC_HUB, tier: "public" });
|
|
93
|
-
});
|
|
94
|
-
it("breaks a tie within a tier by lowest device-id, so every store hearing the same offers chooses alike", () => {
|
|
95
|
-
const otherLan = {
|
|
96
|
-
deviceHex: "1".repeat(DEVICE_ID_HEX_LENGTH),
|
|
97
|
-
addresses: ["ws://192.168.5.5:4500/"],
|
|
98
|
-
machineLocal: false,
|
|
99
|
-
};
|
|
100
|
-
expect(select([lanOffer, otherLan], [LAN_PEER, otherLan.deviceHex]).deviceHex).toBe(otherLan.deviceHex);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
//# sourceMappingURL=relay-selection.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-selection.unit.test.js","sourceRoot":"","sources":["../../src/test/relay-selection.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-timeouts.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/request-timeouts.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the manage-request deadline policy: requests that wait on a human get the approval window (plus a grace so the receiver's own answer wins), everything else gets the short network deadline.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { APPROVAL_RESPONSE_GRACE_MS, ROOM_JOIN_APPROVAL_TIMEOUT_MS, ROOM_REQUEST_TIMEOUT_MS, manageRequestTimeoutMs, } from "../core/request-timeouts.js";
|
|
6
|
-
const APPROVAL_WINDOW_MS = 4000;
|
|
7
|
-
describe("manageRequestTimeoutMs", () => {
|
|
8
|
-
it("gives a room.join the approval window plus the response grace, since a human decides it", () => {
|
|
9
|
-
expect(manageRequestTimeoutMs({ verb: "room:member", params: { verb: "room.join" } }, APPROVAL_WINDOW_MS)).toBe(APPROVAL_WINDOW_MS + APPROVAL_RESPONSE_GRACE_MS);
|
|
10
|
-
});
|
|
11
|
-
it("gives every other room request the short network deadline", () => {
|
|
12
|
-
for (const verb of [
|
|
13
|
-
"room.send",
|
|
14
|
-
"room.read",
|
|
15
|
-
"room.members",
|
|
16
|
-
"room.leave",
|
|
17
|
-
]) {
|
|
18
|
-
expect(manageRequestTimeoutMs({ verb: "room:member", params: { verb } }, APPROVAL_WINDOW_MS)).toBe(ROOM_REQUEST_TIMEOUT_MS);
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
it("gives a command with no params the short network deadline", () => {
|
|
22
|
-
expect(manageRequestTimeoutMs({ verb: "version:get", params: {} }, APPROVAL_WINDOW_MS)).toBe(ROOM_REQUEST_TIMEOUT_MS);
|
|
23
|
-
});
|
|
24
|
-
it("keeps the approval window well above the network deadline at its default, so a human has real time to answer", () => {
|
|
25
|
-
expect(ROOM_JOIN_APPROVAL_TIMEOUT_MS).toBeGreaterThan(ROOM_REQUEST_TIMEOUT_MS);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=request-timeouts.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-timeouts.unit.test.js","sourceRoot":"","sources":["../../src/test/request-timeouts.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,MAAM,CACJ,sBAAsB,CACpB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EACtD,kBAAkB,CACnB,CACF,CAAC,IAAI,CAAC,kBAAkB,GAAG,0BAA0B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,KAAK,MAAM,IAAI,IAAI;YACjB,WAAW;YACX,WAAW;YACX,cAAc;YACd,YAAY;SACb,EAAE,CAAC;YACF,MAAM,CACJ,sBAAsB,CACpB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EACzC,kBAAkB,CACnB,CACF,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CACJ,sBAAsB,CACpB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,EACnC,kBAAkB,CACnB,CACF,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8GAA8G,EAAE,GAAG,EAAE;QACtH,MAAM,CAAC,6BAA6B,CAAC,CAAC,eAAe,CACnD,uBAAuB,CACxB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"room-discovery.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/room-discovery.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { isHostedRoomAdvert } from "../core/room-discovery.js";
|
|
3
|
-
describe("isHostedRoomAdvert", () => {
|
|
4
|
-
it("accepts a room advertised with its description", () => {
|
|
5
|
-
expect(isHostedRoomAdvert({
|
|
6
|
-
path: "owner/room",
|
|
7
|
-
name: "room",
|
|
8
|
-
type: "public",
|
|
9
|
-
description: "d",
|
|
10
|
-
})).toBe(true);
|
|
11
|
-
});
|
|
12
|
-
it("accepts a room advertised without one, as a hub receives it", () => {
|
|
13
|
-
expect(isHostedRoomAdvert({ path: "owner/room", name: "room", type: "public" })).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
it("refuses a description that is not a string", () => {
|
|
16
|
-
expect(isHostedRoomAdvert({
|
|
17
|
-
path: "owner/room",
|
|
18
|
-
name: "room",
|
|
19
|
-
type: "public",
|
|
20
|
-
description: 1,
|
|
21
|
-
})).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
it("refuses an advert missing its path, name or a known type", () => {
|
|
24
|
-
expect(isHostedRoomAdvert({ name: "room", type: "public" })).toBe(false);
|
|
25
|
-
expect(isHostedRoomAdvert({ path: "p", type: "public" })).toBe(false);
|
|
26
|
-
expect(isHostedRoomAdvert({ path: "p", name: "n", type: "secret" })).toBe(false);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
//# sourceMappingURL=room-discovery.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"room-discovery.unit.test.js","sourceRoot":"","sources":["../../src/test/room-discovery.unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CACJ,kBAAkB,CAAC;YACjB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,GAAG;SACjB,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CACJ,kBAAkB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,kBAAkB,CAAC;YACjB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,CAAC;SACf,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CACvE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"room-lookup.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/room-lookup.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for resolveRoomId, the one place a caller-supplied room id or plain room name is turned into a real room id. The candidates it resolves against are whatever the caller knows of, replicated or merely discovered through gossip (agent-comms#246), so these tests drive it with bare `{ id, name }` refs.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { resolveRoomId } from "../core/room-lookup.js";
|
|
6
|
-
import { CommsError } from "../core/store.js";
|
|
7
|
-
/** A device-id is a 64-character lowercase hex SHA-256 digest. */
|
|
8
|
-
const DEVICE_ID_HEX_LENGTH = 64;
|
|
9
|
-
const HOST_A = "a".repeat(DEVICE_ID_HEX_LENGTH);
|
|
10
|
-
const HOST_B = "b".repeat(DEVICE_ID_HEX_LENGTH);
|
|
11
|
-
describe("resolveRoomId", () => {
|
|
12
|
-
it("returns an id that already names a known room unchanged", () => {
|
|
13
|
-
const id = `${HOST_A}/general`;
|
|
14
|
-
expect(resolveRoomId([{ id, name: "general" }], id)).toBe(id);
|
|
15
|
-
});
|
|
16
|
-
it("resolves a bare name to the id of the single room carrying it", () => {
|
|
17
|
-
const id = `${HOST_A}/e2e-test`;
|
|
18
|
-
expect(resolveRoomId([
|
|
19
|
-
{ id, name: "e2e-test" },
|
|
20
|
-
{ id: `${HOST_A}/other`, name: "other" },
|
|
21
|
-
], "e2e-test")).toBe(id);
|
|
22
|
-
});
|
|
23
|
-
it("returns a string matching no known room unchanged, leaving not-found handling to the caller", () => {
|
|
24
|
-
expect(resolveRoomId([{ id: `${HOST_A}/general`, name: "general" }], "unknown")).toBe("unknown");
|
|
25
|
-
expect(resolveRoomId([], "unknown")).toBe("unknown");
|
|
26
|
-
});
|
|
27
|
-
it("counts the same room supplied twice as one candidate", () => {
|
|
28
|
-
const id = `${HOST_A}/general`;
|
|
29
|
-
expect(resolveRoomId([
|
|
30
|
-
{ id, name: "general" },
|
|
31
|
-
{ id, name: "general" },
|
|
32
|
-
], "general")).toBe(id);
|
|
33
|
-
});
|
|
34
|
-
it("throws AMBIGUOUS_ROOM_NAME listing every candidate id when distinct rooms share the name", () => {
|
|
35
|
-
const first = `${HOST_A}/general`;
|
|
36
|
-
const second = `${HOST_B}/general`;
|
|
37
|
-
let thrown;
|
|
38
|
-
try {
|
|
39
|
-
resolveRoomId([
|
|
40
|
-
{ id: first, name: "general" },
|
|
41
|
-
{ id: second, name: "general" },
|
|
42
|
-
], "general");
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
thrown = error;
|
|
46
|
-
}
|
|
47
|
-
expect(thrown).toBeInstanceOf(CommsError);
|
|
48
|
-
expect(thrown).toMatchObject({ code: "AMBIGUOUS_ROOM_NAME" });
|
|
49
|
-
expect(thrown).toHaveProperty("message", expect.stringContaining(`${first}, ${second}`));
|
|
50
|
-
});
|
|
51
|
-
it("prefers an exact id match over a name match on another room", () => {
|
|
52
|
-
const id = `${HOST_A}/general`;
|
|
53
|
-
expect(resolveRoomId([
|
|
54
|
-
{ id, name: "general" },
|
|
55
|
-
{ id: `${HOST_B}/x`, name: id },
|
|
56
|
-
], id)).toBe(id);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=room-lookup.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"room-lookup.unit.test.js","sourceRoot":"","sources":["../../src/test/room-lookup.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,kEAAkE;AAClE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAChD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAEhD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,GAAG,GAAG,MAAM,UAAU,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,GAAG,GAAG,MAAM,WAAW,CAAC;QAChC,MAAM,CACJ,aAAa,CACX;YACE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YACxB,EAAE,EAAE,EAAE,GAAG,MAAM,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;SACzC,EACD,UAAU,CACX,CACF,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACrG,MAAM,CACJ,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CACzE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClB,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,GAAG,GAAG,MAAM,UAAU,CAAC;QAC/B,MAAM,CACJ,aAAa,CACX;YACE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACvB,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SACxB,EACD,SAAS,CACV,CACF,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,KAAK,GAAG,GAAG,MAAM,UAAU,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;QACnC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,aAAa,CACX;gBACE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC9B,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;aAChC,EACD,SAAS,CACV,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAC3B,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC,CAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,GAAG,GAAG,MAAM,UAAU,CAAC;QAC/B,MAAM,CACJ,aAAa,CACX;YACE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACvB,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;SAChC,EACD,EAAE,CACH,CACF,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"room-path.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/room-path.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "vitest";
|
|
2
|
-
import { dmRoomPath, ownerNamedRoomPath, parseRoomPath, slugRoomName, } from "../core/room-path.js";
|
|
3
|
-
const DEVICE_ID_HEX_LENGTH = 64;
|
|
4
|
-
const OWNER = "1".repeat(DEVICE_ID_HEX_LENGTH);
|
|
5
|
-
const OTHER = "2".repeat(DEVICE_ID_HEX_LENGTH);
|
|
6
|
-
test("ownerNamedRoomPath joins the owner and local name with a slash", () => {
|
|
7
|
-
expect(ownerNamedRoomPath(OWNER, "general")).toBe(`${OWNER}/general`);
|
|
8
|
-
});
|
|
9
|
-
test("ownerNamedRoomPath rejects an owner that isn't 64-character lowercase hex", () => {
|
|
10
|
-
expect(() => ownerNamedRoomPath("not-hex", "general")).toThrow();
|
|
11
|
-
});
|
|
12
|
-
test("ownerNamedRoomPath rejects a local name outside [A-Za-z0-9_-]+", () => {
|
|
13
|
-
expect(() => ownerNamedRoomPath(OWNER, "has spaces")).toThrow();
|
|
14
|
-
expect(() => ownerNamedRoomPath(OWNER, "has.dots")).toThrow();
|
|
15
|
-
});
|
|
16
|
-
test("dmRoomPath joins the bytewise-ascending sorted pair with a plus", () => {
|
|
17
|
-
expect(dmRoomPath(OWNER, OTHER)).toBe(`${OWNER}+${OTHER}`);
|
|
18
|
-
expect(dmRoomPath(OTHER, OWNER)).toBe(`${OWNER}+${OTHER}`);
|
|
19
|
-
});
|
|
20
|
-
test("dmRoomPath refuses to name the same device twice", () => {
|
|
21
|
-
expect(() => dmRoomPath(OWNER, OWNER)).toThrow();
|
|
22
|
-
});
|
|
23
|
-
test("dmRoomPath rejects a participant that isn't 64-character lowercase hex", () => {
|
|
24
|
-
expect(() => dmRoomPath("not-hex", OTHER)).toThrow();
|
|
25
|
-
});
|
|
26
|
-
test("parseRoomPath recognises an owner-named path", () => {
|
|
27
|
-
const parsed = parseRoomPath(`${OWNER}/general`);
|
|
28
|
-
expect(parsed).toEqual({
|
|
29
|
-
kind: "owner-named",
|
|
30
|
-
owner: OWNER,
|
|
31
|
-
localName: "general",
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
test("parseRoomPath recognises a DM path", () => {
|
|
35
|
-
const parsed = parseRoomPath(`${OWNER}+${OTHER}`);
|
|
36
|
-
expect(parsed).toEqual({
|
|
37
|
-
kind: "dm",
|
|
38
|
-
participants: [OWNER, OTHER],
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
test("parseRoomPath rejects a path shaped like neither", () => {
|
|
42
|
-
expect(() => parseRoomPath("just-a-name")).toThrow();
|
|
43
|
-
});
|
|
44
|
-
test("slugRoomName replaces every character outside [A-Za-z0-9_-] with a hyphen", () => {
|
|
45
|
-
expect(slugRoomName("documents.js")).toBe("documents-js");
|
|
46
|
-
expect(slugRoomName("my project")).toBe("my-project");
|
|
47
|
-
});
|
|
48
|
-
test("slugRoomName leaves an already-valid name unchanged", () => {
|
|
49
|
-
expect(slugRoomName("agent-comms_2")).toBe("agent-comms_2");
|
|
50
|
-
});
|
|
51
|
-
test("slugRoomName rejects a name with nothing left to slug", () => {
|
|
52
|
-
expect(() => slugRoomName("...")).toThrow();
|
|
53
|
-
});
|
|
54
|
-
//# sourceMappingURL=room-path.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"room-path.unit.test.js","sourceRoot":"","sources":["../../src/test/room-path.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send-outcome.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/send-outcome.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for send-outcome's classification of a wire manage-outcome. The distinction under test is the one the whole honest-delivery-reporting change rests on: a failure a retry could fix versus one it never will, with an unrecognised code deliberately falling on the refusal side so it reaches its sender rather than being queued to fail again unseen.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { classifyManageOutcome, describeRefusal, } from "../core/send-outcome.js";
|
|
6
|
-
describe("classifyManageOutcome", () => {
|
|
7
|
-
it("classifies an ok outcome as delivered", () => {
|
|
8
|
-
expect(classifyManageOutcome({ result: "ok" })).toEqual({
|
|
9
|
-
kind: "delivered",
|
|
10
|
-
});
|
|
11
|
-
});
|
|
12
|
-
it("classifies a timeout as undelivered, the state a retry can still fix", () => {
|
|
13
|
-
expect(classifyManageOutcome({ result: "error", code: "timeout" })).toEqual({ kind: "undelivered", reason: "timeout" });
|
|
14
|
-
});
|
|
15
|
-
it("classifies not_connected as undelivered", () => {
|
|
16
|
-
expect(classifyManageOutcome({ result: "error", code: "not_connected" })).toEqual({ kind: "undelivered", reason: "not_connected" });
|
|
17
|
-
});
|
|
18
|
-
it.each(["unauthorized", "denied", "malformed_params", "not_participant"])("classifies %s as a refusal a retry cannot fix", (code) => {
|
|
19
|
-
expect(classifyManageOutcome({ result: "error", code })).toEqual({
|
|
20
|
-
kind: "refused",
|
|
21
|
-
code,
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
it("carries the refuser's own message when it sent one", () => {
|
|
25
|
-
const outcome = {
|
|
26
|
-
result: "error",
|
|
27
|
-
code: "denied",
|
|
28
|
-
message: "not right now",
|
|
29
|
-
};
|
|
30
|
-
expect(classifyManageOutcome(outcome)).toEqual({
|
|
31
|
-
kind: "refused",
|
|
32
|
-
code: "denied",
|
|
33
|
-
message: "not right now",
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
it("classifies this side's own no_route as undelivered, not as a refusal", () => {
|
|
37
|
-
// no_route is the local transport saying it had nowhere to send the request, so nobody refused anything and a route appearing later genuinely fixes it. Spelling it the same as a recipient's own unauthorized would bury a message in the retry queue, or fail a send nobody ever refused.
|
|
38
|
-
expect(classifyManageOutcome({ result: "error", code: "no_route" })).toEqual({ kind: "undelivered", reason: "not_connected" });
|
|
39
|
-
});
|
|
40
|
-
it("treats a code it does not recognise as a refusal rather than queueing it", () => {
|
|
41
|
-
expect(classifyManageOutcome({ result: "error", code: "some_future_code" })).toEqual({ kind: "refused", code: "some_future_code" });
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe("describeRefusal", () => {
|
|
45
|
-
it("renders a bare code on its own", () => {
|
|
46
|
-
expect(describeRefusal({ code: "unauthorized" })).toBe("unauthorized");
|
|
47
|
-
});
|
|
48
|
-
it("appends the refuser's message when there is one", () => {
|
|
49
|
-
expect(describeRefusal({ code: "denied", message: "busy" })).toBe("denied: busy");
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=send-outcome.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send-outcome.unit.test.js","sourceRoot":"","sources":["../../src/test/send-outcome.unit.test.ts"],"names":[],"mappings":"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"}
|