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
package/src/core/bridge.ts
CHANGED
|
@@ -162,9 +162,38 @@ class BuildActionError extends Error {
|
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
/** Thrown by buildAction for parameters MCP_TOOL_PARAMS rejects, so a malformed tool call reaches its caller as an error naming what is wrong and is never run as some other action. `issues` is every problem found, each with the path of the parameter at fault. */
|
|
166
|
+
export class InvalidToolParamsError extends Error {
|
|
167
|
+
constructor(
|
|
168
|
+
readonly issues: readonly {
|
|
169
|
+
readonly path: readonly (string | number)[];
|
|
170
|
+
readonly message: string;
|
|
171
|
+
}[],
|
|
172
|
+
) {
|
|
173
|
+
super(
|
|
174
|
+
`Invalid parameters: ${issues
|
|
175
|
+
.map(
|
|
176
|
+
(issue) =>
|
|
177
|
+
`${issue.path.length === 0 ? "(root)" : issue.path.join(".")}: ${issue.message}`,
|
|
178
|
+
)
|
|
179
|
+
.join("; ")}`,
|
|
180
|
+
);
|
|
181
|
+
this.name = "InvalidToolParamsError";
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
165
185
|
export function buildAction(params: Record<string, unknown>): CommsAction {
|
|
166
186
|
const parsed = MCP_TOOL_PARAMS.safeParse(params);
|
|
167
|
-
if (!parsed.success)
|
|
187
|
+
if (!parsed.success) {
|
|
188
|
+
throw new InvalidToolParamsError(
|
|
189
|
+
parsed.error.issues.map((issue) => ({
|
|
190
|
+
path: issue.path.map((step) =>
|
|
191
|
+
typeof step === "number" ? step : String(step),
|
|
192
|
+
),
|
|
193
|
+
message: issue.message,
|
|
194
|
+
})),
|
|
195
|
+
);
|
|
196
|
+
}
|
|
168
197
|
const p = parsed.data;
|
|
169
198
|
|
|
170
199
|
switch (p.action) {
|
package/src/core/index.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.unit.test.d.ts","sourceRoot":"","sources":["../../../src/core/test/bridge.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for bridge.ts — formatDeliveryEvent.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from "vitest";
|
|
5
|
-
import { formatDeliveryEvent, isActionableEvent } from "../bridge.js";
|
|
6
|
-
describe("formatDeliveryEvent", () => {
|
|
7
|
-
it("formats name_changed event", () => {
|
|
8
|
-
const event = {
|
|
9
|
-
type: "name_changed",
|
|
10
|
-
agent: "abc123",
|
|
11
|
-
oldName: "Alice",
|
|
12
|
-
newName: "Bob",
|
|
13
|
-
};
|
|
14
|
-
const result = formatDeliveryEvent(event);
|
|
15
|
-
expect(result).toBe("Alice is now known as Bob");
|
|
16
|
-
});
|
|
17
|
-
it("formats room_message", () => {
|
|
18
|
-
const event = {
|
|
19
|
-
type: "room_message",
|
|
20
|
-
message: {
|
|
21
|
-
id: "m1",
|
|
22
|
-
from: "a1",
|
|
23
|
-
room: "r1",
|
|
24
|
-
content: "hello",
|
|
25
|
-
timestamp: "2025-01-01T00:00:00Z",
|
|
26
|
-
readBy: [],
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
const result = formatDeliveryEvent(event);
|
|
30
|
-
expect(result).toBe("[r1] a1: hello");
|
|
31
|
-
});
|
|
32
|
-
it("formats member_status", () => {
|
|
33
|
-
const event = {
|
|
34
|
-
type: "member_status",
|
|
35
|
-
room: "r1",
|
|
36
|
-
agent: "a1",
|
|
37
|
-
status: "busy",
|
|
38
|
-
};
|
|
39
|
-
const result = formatDeliveryEvent(event);
|
|
40
|
-
expect(result).toBe("a1 is now busy in r1");
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe("isActionableEvent", () => {
|
|
44
|
-
it("classifies room_message as actionable", () => {
|
|
45
|
-
const event = {
|
|
46
|
-
type: "room_message",
|
|
47
|
-
message: {
|
|
48
|
-
id: "m1",
|
|
49
|
-
from: "a1",
|
|
50
|
-
room: "r1",
|
|
51
|
-
content: "hello",
|
|
52
|
-
timestamp: "2025-01-01T00:00:00Z",
|
|
53
|
-
readBy: [],
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
expect(isActionableEvent(event)).toBe(true);
|
|
57
|
-
});
|
|
58
|
-
it("classifies dm as actionable", () => {
|
|
59
|
-
const event = {
|
|
60
|
-
type: "dm",
|
|
61
|
-
message: {
|
|
62
|
-
id: "dm1",
|
|
63
|
-
from: "a1",
|
|
64
|
-
to: "a2",
|
|
65
|
-
content: "hey",
|
|
66
|
-
timestamp: "2025-01-01T00:00:00Z",
|
|
67
|
-
readBy: [],
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
expect(isActionableEvent(event)).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
it("classifies room_invite as actionable", () => {
|
|
73
|
-
const event = {
|
|
74
|
-
type: "room_invite",
|
|
75
|
-
room: "r1",
|
|
76
|
-
roomDescription: "",
|
|
77
|
-
from: "a1",
|
|
78
|
-
fromName: "Alice",
|
|
79
|
-
fromCwd: "/home",
|
|
80
|
-
};
|
|
81
|
-
expect(isActionableEvent(event)).toBe(true);
|
|
82
|
-
});
|
|
83
|
-
it("classifies member_joined as informational", () => {
|
|
84
|
-
const event = {
|
|
85
|
-
type: "member_joined",
|
|
86
|
-
room: "r1",
|
|
87
|
-
agent: "a1",
|
|
88
|
-
};
|
|
89
|
-
expect(isActionableEvent(event)).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
it("classifies member_status as informational", () => {
|
|
92
|
-
const event = {
|
|
93
|
-
type: "member_status",
|
|
94
|
-
room: "r1",
|
|
95
|
-
agent: "a1",
|
|
96
|
-
status: "offline",
|
|
97
|
-
};
|
|
98
|
-
expect(isActionableEvent(event)).toBe(false);
|
|
99
|
-
});
|
|
100
|
-
it("classifies name_changed as informational", () => {
|
|
101
|
-
const event = {
|
|
102
|
-
type: "name_changed",
|
|
103
|
-
agent: "a1",
|
|
104
|
-
oldName: "Alice",
|
|
105
|
-
newName: "Bob",
|
|
106
|
-
};
|
|
107
|
-
expect(isActionableEvent(event)).toBe(false);
|
|
108
|
-
});
|
|
109
|
-
it("classifies delivery_status as informational", () => {
|
|
110
|
-
const event = {
|
|
111
|
-
type: "delivery_status",
|
|
112
|
-
messageId: "m1",
|
|
113
|
-
agent: "a1",
|
|
114
|
-
delivery: { status: "delivered" },
|
|
115
|
-
};
|
|
116
|
-
expect(isActionableEvent(event)).toBe(false);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
//# sourceMappingURL=bridge.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.unit.test.js","sourceRoot":"","sources":["../../../src/core/test/bridge.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-table.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/agent-table.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for list_agents' aligned table (core/agent-table, agent-comms#345): every column starts at the same offset in every line, header included, however long a name is.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { agentTable } from "../core/agent-table.js";
|
|
6
|
-
const DEVICE_ID_HEX_LENGTH = 64;
|
|
7
|
-
function row(id, name) {
|
|
8
|
-
return {
|
|
9
|
-
id: id.repeat(DEVICE_ID_HEX_LENGTH),
|
|
10
|
-
name,
|
|
11
|
-
harness: "claude-code",
|
|
12
|
-
status: "active",
|
|
13
|
-
visibility: "visible",
|
|
14
|
-
cwd: "~/project",
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
/** Where each of values starts in line, searching from left to right. */
|
|
18
|
-
function offsets(line, values) {
|
|
19
|
-
let from = 0;
|
|
20
|
-
return values.map((value) => {
|
|
21
|
-
const at = line.indexOf(value, from);
|
|
22
|
-
from = at + value.length;
|
|
23
|
-
return at;
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
describe("agentTable", () => {
|
|
27
|
-
it("lines every column up under its header, even when one name is far longer than the rest", () => {
|
|
28
|
-
const rows = [
|
|
29
|
-
row("a", "short"),
|
|
30
|
-
row("b", `my work laptop ${JSON.stringify("a much longer self-asserted name")}`),
|
|
31
|
-
];
|
|
32
|
-
const table = agentTable(rows);
|
|
33
|
-
const header = offsets(table.header, [
|
|
34
|
-
"ID",
|
|
35
|
-
"Name",
|
|
36
|
-
"Harness",
|
|
37
|
-
"Status",
|
|
38
|
-
"Visibility",
|
|
39
|
-
"CWD",
|
|
40
|
-
]);
|
|
41
|
-
for (const r of rows) {
|
|
42
|
-
expect(offsets(table.line(r), [
|
|
43
|
-
r.id,
|
|
44
|
-
r.name,
|
|
45
|
-
r.harness,
|
|
46
|
-
r.status,
|
|
47
|
-
r.visibility,
|
|
48
|
-
r.cwd,
|
|
49
|
-
])).toEqual(header);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
//# sourceMappingURL=agent-table.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-table.unit.test.js","sourceRoot":"","sources":["../../src/test/agent-table.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAsB,MAAM,wBAAwB,CAAC;AAExE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,SAAS,GAAG,CAAC,EAAU,EAAE,IAAY;IACnC,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC;QACnC,IAAI;QACJ,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,SAAS;QACrB,GAAG,EAAE,WAAW;KACjB,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,OAAO,CAAC,IAAY,EAAE,MAAyB;IACtD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,MAAM,IAAI,GAAG;YACX,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;YACjB,GAAG,CACD,GAAG,EACH,kBAAkB,IAAI,CAAC,SAAS,CAAC,kCAAkC,CAAC,EAAE,CACvE;SACF,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;YACnC,IAAI;YACJ,MAAM;YACN,SAAS;YACT,QAAQ;YACR,YAAY;YACZ,KAAK;SACN,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CACJ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACrB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,GAAG;aACN,CAAC,CACH,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind-retry.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/bind-retry.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Direct unit tests for bind-retry.ts's retryOnAddrInUse helper (agent-comms#170): WireMeshTransport.becomeCoordinator's own bind-retry safety net for the graceful coordinator handover race. When the outgoing coordinator sends become_coordinator and the successor's own handleBecomeCoordinator tries to rebind the coordinator port moments later, the outgoing side's listening socket may not have finished releasing that port yet -- an ordinary EADDRINUSE, not a design flaw, but one that would otherwise surface as an unhandled rejection crashing the process (onBecomeCoordinator's own dispatch in mesh-store.ts is fire-and-forget). retryOnAddrInUse is deliberately a pure, transport-agnostic helper (no real sockets) so this race's retry/backoff logic is fast and deterministic to test directly, independent of wire-mesh-transport's own real-TLS-socket test suite.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it, vi } from "vitest";
|
|
5
|
-
import { retryOnAddrInUse } from "../core/bind-retry.js";
|
|
6
|
-
const RETRIES = 3;
|
|
7
|
-
const DELAY_MS = 10;
|
|
8
|
-
function addrInUseError() {
|
|
9
|
-
return new Error("listen EADDRINUSE: address already in use 127.0.0.1:1");
|
|
10
|
-
}
|
|
11
|
-
describe("retryOnAddrInUse", () => {
|
|
12
|
-
it("returns the result immediately when the first attempt succeeds", async () => {
|
|
13
|
-
const attempt = vi.fn().mockResolvedValue("bound");
|
|
14
|
-
const result = await retryOnAddrInUse(attempt, RETRIES, DELAY_MS);
|
|
15
|
-
expect(result).toBe("bound");
|
|
16
|
-
expect(attempt).toHaveBeenCalledTimes(1);
|
|
17
|
-
});
|
|
18
|
-
it("retries on an EADDRINUSE-shaped rejection and returns once a later attempt succeeds", async () => {
|
|
19
|
-
const failuresBeforeSuccess = 2;
|
|
20
|
-
const attempt = vi
|
|
21
|
-
.fn()
|
|
22
|
-
.mockRejectedValueOnce(addrInUseError())
|
|
23
|
-
.mockRejectedValueOnce(addrInUseError())
|
|
24
|
-
.mockResolvedValue("bound");
|
|
25
|
-
const result = await retryOnAddrInUse(attempt, RETRIES, DELAY_MS);
|
|
26
|
-
expect(result).toBe("bound");
|
|
27
|
-
expect(attempt).toHaveBeenCalledTimes(failuresBeforeSuccess + 1);
|
|
28
|
-
});
|
|
29
|
-
it("rethrows immediately for a rejection that isn't EADDRINUSE, without retrying", async () => {
|
|
30
|
-
const otherError = new Error("listen EACCES: permission denied");
|
|
31
|
-
const attempt = vi.fn().mockRejectedValue(otherError);
|
|
32
|
-
await expect(retryOnAddrInUse(attempt, RETRIES, DELAY_MS)).rejects.toBe(otherError);
|
|
33
|
-
expect(attempt).toHaveBeenCalledTimes(1);
|
|
34
|
-
});
|
|
35
|
-
it("rethrows the last EADDRINUSE error once the retry budget is exhausted", async () => {
|
|
36
|
-
const attempt = vi.fn().mockRejectedValue(addrInUseError());
|
|
37
|
-
await expect(retryOnAddrInUse(attempt, RETRIES, DELAY_MS)).rejects.toThrow("EADDRINUSE");
|
|
38
|
-
// The initial attempt plus exactly `retries` further attempts, never one more.
|
|
39
|
-
expect(attempt).toHaveBeenCalledTimes(RETRIES + 1);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
//# sourceMappingURL=bind-retry.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind-retry.unit.test.js","sourceRoot":"","sources":["../../src/test/bind-retry.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,SAAS,cAAc;IACrB,OAAO,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;AAC5E,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,qBAAqB,GAAG,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,EAAE;aACf,EAAE,EAAE;aACJ,qBAAqB,CAAC,cAAc,EAAE,CAAC;aACvC,qBAAqB,CAAC,cAAc,EAAE,CAAC;aACvC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CACrE,UAAU,CACX,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC;QAE5D,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACxE,YAAY,CACb,CAAC;QACF,+EAA+E;QAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-command.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/default-command.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for resolveDefaultCommand (agent-comms#339): a bare `agent-comms` picks setup or the MCP server from whether stdin is a terminal, and never reinterprets an explicit subcommand.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { resolveDefaultCommand } from "../core/default-command.js";
|
|
6
|
-
describe("resolveDefaultCommand", () => {
|
|
7
|
-
it("serves the generic MCP bridge for a bare command whose stdin is not a terminal", () => {
|
|
8
|
-
expect(resolveDefaultCommand([], false)).toEqual(["bridge", "mcp"]);
|
|
9
|
-
});
|
|
10
|
-
it("leaves a bare command on a terminal to the setup default", () => {
|
|
11
|
-
expect(resolveDefaultCommand([], true)).toEqual([]);
|
|
12
|
-
});
|
|
13
|
-
it.each([
|
|
14
|
-
[["setup"], false],
|
|
15
|
-
[["status"], false],
|
|
16
|
-
[["remove"], false],
|
|
17
|
-
[["bridge", "claude-code"], false],
|
|
18
|
-
[["bridge", "mcp"], false],
|
|
19
|
-
[["send", "room", "hello"], false],
|
|
20
|
-
[["setup"], true],
|
|
21
|
-
[["bridge", "codex"], true],
|
|
22
|
-
])("returns the explicit subcommand %j untouched when stdin is a terminal: %s", (args, stdinIsTerminal) => {
|
|
23
|
-
expect(resolveDefaultCommand(args, stdinIsTerminal)).toEqual(args);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
//# sourceMappingURL=default-command.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-command.unit.test.js","sourceRoot":"","sources":["../../src/test/default-command.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;QAClB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QACnB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QACnB,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC;QAClC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAC1B,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;QACjB,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC;KACnB,CAAC,CACT,2EAA2E,EAC3E,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE;QACxB,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the issuer-side delegation policy (core/delegation-policy, agent-comms#163): deciding which capability verbs an issuer never lets a bearer redelegate, and how a caller narrows that decision per bearer.
|
|
3
|
-
*/
|
|
4
|
-
export {};
|
|
5
|
-
//# sourceMappingURL=delegation-policy.unit.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delegation-policy.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/delegation-policy.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the issuer-side delegation policy (core/delegation-policy, agent-comms#163): deciding which capability verbs an issuer never lets a bearer redelegate, and how a caller narrows that decision per bearer.
|
|
3
|
-
*/
|
|
4
|
-
import { test, expect } from "vitest";
|
|
5
|
-
import { resolveDelegationsRemaining } from "../core/delegation-policy.js";
|
|
6
|
-
const ALICE = "alice-device-id";
|
|
7
|
-
const BOB = "bob-device-id";
|
|
8
|
-
const REQUESTED_DELEGATIONS_REMAINING = 5;
|
|
9
|
-
const NO_DELEGATIONS_REMAINING = 0;
|
|
10
|
-
test("a capability on the policy's default nonDelegable set is always minted with delegationsRemaining 0", () => {
|
|
11
|
-
const policy = {
|
|
12
|
-
nonDelegable: new Set(["room:member"]),
|
|
13
|
-
};
|
|
14
|
-
expect(resolveDelegationsRemaining(policy, "room:member", ALICE, REQUESTED_DELEGATIONS_REMAINING)).toBe(NO_DELEGATIONS_REMAINING);
|
|
15
|
-
});
|
|
16
|
-
test("a capability absent from the default nonDelegable set passes the requested value through unchanged", () => {
|
|
17
|
-
const policy = {
|
|
18
|
-
nonDelegable: new Set(["room:member"]),
|
|
19
|
-
};
|
|
20
|
-
expect(resolveDelegationsRemaining(policy, "dm:send", ALICE, REQUESTED_DELEGATIONS_REMAINING)).toBe(REQUESTED_DELEGATIONS_REMAINING);
|
|
21
|
-
});
|
|
22
|
-
test("an undefined requested value passes through unchanged for a delegable capability", () => {
|
|
23
|
-
const policy = {
|
|
24
|
-
nonDelegable: new Set(["room:member"]),
|
|
25
|
-
};
|
|
26
|
-
expect(resolveDelegationsRemaining(policy, "dm:send", ALICE, undefined)).toBeUndefined();
|
|
27
|
-
});
|
|
28
|
-
test("a per-agent override entirely replaces the default nonDelegable set for that bearer, never merges with it", () => {
|
|
29
|
-
const policy = {
|
|
30
|
-
nonDelegable: new Set(["room:member"]),
|
|
31
|
-
perAgentOverrides: new Map([[ALICE, new Set(["dm:send"])]]),
|
|
32
|
-
};
|
|
33
|
-
// Alice's own override names dm:send, not room:member -- so room:member, present only in the policy's default set, no longer applies to her once her own override is in effect.
|
|
34
|
-
expect(resolveDelegationsRemaining(policy, "room:member", ALICE, REQUESTED_DELEGATIONS_REMAINING)).toBe(REQUESTED_DELEGATIONS_REMAINING);
|
|
35
|
-
expect(resolveDelegationsRemaining(policy, "dm:send", ALICE, REQUESTED_DELEGATIONS_REMAINING)).toBe(NO_DELEGATIONS_REMAINING);
|
|
36
|
-
});
|
|
37
|
-
test("a per-agent override for one bearer never affects a different bearer's own resolution", () => {
|
|
38
|
-
const policy = {
|
|
39
|
-
nonDelegable: new Set(["room:member"]),
|
|
40
|
-
perAgentOverrides: new Map([[ALICE, new Set(["dm:send"])]]),
|
|
41
|
-
};
|
|
42
|
-
expect(resolveDelegationsRemaining(policy, "room:member", BOB, REQUESTED_DELEGATIONS_REMAINING)).toBe(NO_DELEGATIONS_REMAINING);
|
|
43
|
-
expect(resolveDelegationsRemaining(policy, "dm:send", BOB, REQUESTED_DELEGATIONS_REMAINING)).toBe(REQUESTED_DELEGATIONS_REMAINING);
|
|
44
|
-
});
|
|
45
|
-
test("an empty per-agent override set makes every capability delegable for that bearer", () => {
|
|
46
|
-
const policy = {
|
|
47
|
-
nonDelegable: new Set(["room:member"]),
|
|
48
|
-
perAgentOverrides: new Map([[ALICE, new Set()]]),
|
|
49
|
-
};
|
|
50
|
-
expect(resolveDelegationsRemaining(policy, "room:member", ALICE, REQUESTED_DELEGATIONS_REMAINING)).toBe(REQUESTED_DELEGATIONS_REMAINING);
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=delegation-policy.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delegation-policy.unit.test.js","sourceRoot":"","sources":["../../src/test/delegation-policy.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"display-name.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/display-name.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the one display convention (core/display-name, agent-comms#345): petname, then the self-asserted name, then the short id, and what a display name may contain.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { MAX_DISPLAY_NAME_LENGTH, SHORT_ID_LENGTH, formatDisplayName, formatNames, parseDisplayName, shortId, } from "../core/display-name.js";
|
|
6
|
-
/** A device-id is a 64-character lowercase hex SHA-256 digest. */
|
|
7
|
-
const DEVICE_ID_HEX_LENGTH = 64;
|
|
8
|
-
const HEX_DIGITS = "0123456789abcdef";
|
|
9
|
-
/** An id whose every prefix differs from every other's, so a wrong prefix length shows. */
|
|
10
|
-
const ID = HEX_DIGITS.repeat(DEVICE_ID_HEX_LENGTH / HEX_DIGITS.length);
|
|
11
|
-
describe("formatDisplayName", () => {
|
|
12
|
-
it("puts the petname first, then the self-asserted name quoted, then the short id", () => {
|
|
13
|
-
expect(formatDisplayName({
|
|
14
|
-
id: ID,
|
|
15
|
-
petname: "work laptop",
|
|
16
|
-
selfName: "joe-mbp",
|
|
17
|
-
})).toBe(`work laptop "joe-mbp" ${shortId(ID)}`);
|
|
18
|
-
});
|
|
19
|
-
it("shows the self-asserted name and short id when the viewer has no petname", () => {
|
|
20
|
-
expect(formatDisplayName({ id: ID, selfName: "joe-mbp" })).toBe(`"joe-mbp" ${shortId(ID)}`);
|
|
21
|
-
});
|
|
22
|
-
it("falls back to the short id alone when nothing is named", () => {
|
|
23
|
-
expect(formatDisplayName({ id: ID })).toBe(shortId(ID));
|
|
24
|
-
});
|
|
25
|
-
it("does not repeat a self-asserted name that only echoes the petname", () => {
|
|
26
|
-
expect(formatDisplayName({ id: ID, petname: "joe-mbp", selfName: "joe-mbp" })).toBe(`joe-mbp ${shortId(ID)}`);
|
|
27
|
-
});
|
|
28
|
-
it("escapes a quote in a self-asserted name, so it cannot close the quotes and pass the rest off as an unquoted label", () => {
|
|
29
|
-
expect(formatDisplayName({ id: ID, selfName: 'x" boss-laptop "y' })).toBe(`"x\\" boss-laptop \\"y" ${shortId(ID)}`);
|
|
30
|
-
});
|
|
31
|
-
it("leaves out a name parseDisplayName refuses, whichever tier it is in, so a control sequence never reaches the output", () => {
|
|
32
|
-
expect(formatDisplayName({
|
|
33
|
-
id: ID,
|
|
34
|
-
petname: "evil\u001b[2J",
|
|
35
|
-
selfName: "also\u0007evil",
|
|
36
|
-
})).toBe(shortId(ID));
|
|
37
|
-
expect(formatDisplayName({ id: ID, selfName: "evil\u001b[2Jname" })).not.toContain("\u001b");
|
|
38
|
-
});
|
|
39
|
-
it("shortens an id to a prefix of it", () => {
|
|
40
|
-
expect(shortId(ID)).toHaveLength(SHORT_ID_LENGTH);
|
|
41
|
-
expect(ID.startsWith(shortId(ID))).toBe(true);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe("formatNames", () => {
|
|
45
|
-
it("gives the names alone, for a surface that prints the full id beside them", () => {
|
|
46
|
-
expect(formatNames({ id: ID, petname: "work laptop", selfName: "joe-mbp" })).toBe(`work laptop "joe-mbp"`);
|
|
47
|
-
});
|
|
48
|
-
it("is empty when nothing is named", () => {
|
|
49
|
-
expect(formatNames({ id: ID })).toBe("");
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe("parseDisplayName", () => {
|
|
53
|
-
it("accepts a name and trims the space around it", () => {
|
|
54
|
-
expect(parseDisplayName(" Joe's laptop ")).toBe("Joe's laptop");
|
|
55
|
-
});
|
|
56
|
-
it("refuses an empty name, one over the length limit, and one carrying a control sequence", () => {
|
|
57
|
-
expect(parseDisplayName(" ")).toBeUndefined();
|
|
58
|
-
expect(parseDisplayName("x".repeat(MAX_DISPLAY_NAME_LENGTH + 1))).toBeUndefined();
|
|
59
|
-
expect(parseDisplayName("x".repeat(MAX_DISPLAY_NAME_LENGTH))).toBe("x".repeat(MAX_DISPLAY_NAME_LENGTH));
|
|
60
|
-
expect(parseDisplayName("evil\u001b[2Jname")).toBeUndefined();
|
|
61
|
-
expect(parseDisplayName("tab\tname")).toBeUndefined();
|
|
62
|
-
expect(parseDisplayName("c1\u009bname")).toBeUndefined();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=display-name.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"display-name.unit.test.js","sourceRoot":"","sources":["../../src/test/display-name.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"machine-list-groups.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/machine-list-groups.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for list_agents' machine grouping (agent-comms#343): this host first, other machines by id, unplaced agents last, and no grouping at all when nothing is placed.
|
|
3
|
-
*/
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { groupAgentsByMachine } from "../core/machine-list-groups.js";
|
|
6
|
-
/** Names every id as itself, so a heading shows exactly the machine id. */
|
|
7
|
-
const idNamer = (id) => id;
|
|
8
|
-
function agent(id) {
|
|
9
|
-
return {
|
|
10
|
-
id,
|
|
11
|
-
version: 0,
|
|
12
|
-
name: id,
|
|
13
|
-
harness: "test",
|
|
14
|
-
cwd: "/test",
|
|
15
|
-
pid: 1,
|
|
16
|
-
startedAt: "",
|
|
17
|
-
visibility: "visible",
|
|
18
|
-
status: "active",
|
|
19
|
-
tags: [],
|
|
20
|
-
subscribedRooms: [],
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
describe("groupAgentsByMachine", () => {
|
|
24
|
-
it("puts this machine first, then other machines by id, then agents no proof places", () => {
|
|
25
|
-
const agents = ["remote-b", "local", "unplaced", "remote-a"].map(agent);
|
|
26
|
-
const machines = new Map([
|
|
27
|
-
["remote-b", "bbbb"],
|
|
28
|
-
["local", "mine"],
|
|
29
|
-
["remote-a", "aaaa"],
|
|
30
|
-
]);
|
|
31
|
-
const groups = groupAgentsByMachine(agents, machines, "mine", idNamer);
|
|
32
|
-
expect(groups.map((group) => [group.heading, group.agents.map((a) => a.id)])).toEqual([
|
|
33
|
-
["Machine mine (this machine):", ["local"]],
|
|
34
|
-
["Machine aaaa:", ["remote-a"]],
|
|
35
|
-
["Machine bbbb:", ["remote-b"]],
|
|
36
|
-
["Machine not proven:", ["unplaced"]],
|
|
37
|
-
]);
|
|
38
|
-
});
|
|
39
|
-
it("keeps several agents of one machine together in their listed order", () => {
|
|
40
|
-
const agents = ["one", "other", "two"].map(agent);
|
|
41
|
-
const machines = new Map([
|
|
42
|
-
["one", "mine"],
|
|
43
|
-
["other", "theirs"],
|
|
44
|
-
["two", "mine"],
|
|
45
|
-
]);
|
|
46
|
-
const groups = groupAgentsByMachine(agents, machines, "mine", idNamer);
|
|
47
|
-
expect(groups[0]?.agents.map((a) => a.id)).toEqual(["one", "two"]);
|
|
48
|
-
});
|
|
49
|
-
it("lists everything as one ungrouped run when no agent is placed on a machine, or the store has no machine identity", () => {
|
|
50
|
-
const agents = ["a", "b"].map(agent);
|
|
51
|
-
expect(groupAgentsByMachine(agents, new Map(), "mine", idNamer)).toEqual([
|
|
52
|
-
{ heading: undefined, agents },
|
|
53
|
-
]);
|
|
54
|
-
expect(groupAgentsByMachine(agents, undefined, undefined, idNamer)).toEqual([{ heading: undefined, agents }]);
|
|
55
|
-
});
|
|
56
|
-
it("names each machine heading through the namer it is given", () => {
|
|
57
|
-
const groups = groupAgentsByMachine([agent("local")], new Map([["local", "mine"]]), "mine", (id) => `laptop "${id}"`);
|
|
58
|
-
expect(groups[0]?.heading).toBe('Machine laptop "mine" (this machine):');
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
//# sourceMappingURL=machine-list-groups.unit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"machine-list-groups.unit.test.js","sourceRoot":"","sources":["../../src/test/machine-list-groups.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +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
|
-
export {};
|
|
5
|
-
//# sourceMappingURL=relay-selection.unit.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-selection.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/relay-selection.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|