agent-comms 9.0.2 → 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 +6 -0
- package/dist/bridges/claude-code/channel.d.ts.map +1 -1
- package/dist/bridges/claude-code/channel.js +3 -1
- package/dist/bridges/claude-code/channel.js.map +1 -1
- package/dist/bridges/codex/tool.d.ts +2 -1
- package/dist/bridges/codex/tool.d.ts.map +1 -1
- package/dist/bridges/codex/tool.js +4 -2
- 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 +3 -1
- package/dist/bridges/mcp/server.js.map +1 -1
- package/dist/bridges/user/web/bridge-port-range.d.ts +52 -0
- package/dist/bridges/user/web/bridge-port-range.d.ts.map +1 -0
- package/dist/bridges/user/web/bridge-port-range.js +90 -0
- package/dist/bridges/user/web/bridge-port-range.js.map +1 -0
- package/dist/bridges/user/web/dist/bundle.js +1 -1
- package/dist/bridges/user/web/dist/sw.js +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.d.ts +6 -2
- package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.js +13 -27
- package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -1
- package/dist/bridges/user/web/server.d.ts +11 -5
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +78 -21
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.d.ts +2 -0
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.d.ts.map +1 -0
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.js +281 -0
- package/dist/bridges/user/web/test/bridge-port-range.integration.test.js.map +1 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.d.ts +13 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.d.ts.map +1 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.js +46 -0
- package/dist/bridges/user/web/test/bridge-web-server.helper.js.map +1 -0
- package/dist/bridges/user/web/test/bridge-web-server.integration.test.js +4 -2
- package/dist/bridges/user/web/test/bridge-web-server.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/lan-web-server.integration.test.js +1 -0
- package/dist/bridges/user/web/test/lan-web-server.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/orpc-router.integration.test.js +1 -0
- package/dist/bridges/user/web/test/orpc-router.integration.test.js.map +1 -1
- 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/bridges/user/web/test/web-console-route.integration.test.js +1 -0
- package/dist/bridges/user/web/test/web-console-route.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server-unbuilt-frontend.integration.test.js +4 -2
- package/dist/bridges/user/web/test/web-server-unbuilt-frontend.integration.test.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js +1 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/bridge-mesh.d.ts +2 -0
- package/dist/core/bridge-mesh.d.ts.map +1 -1
- package/dist/core/bridge-mesh.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/core/tool.d.ts +1 -1
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/test/bridge-stdout.runner.js +5 -0
- package/dist/test/bridge-stdout.runner.js.map +1 -1
- 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/hub-helpers.d.ts +6 -0
- package/dist/test/hub-helpers.d.ts.map +1 -1
- package/dist/test/hub-helpers.js +17 -0
- package/dist/test/hub-helpers.js.map +1 -1
- package/dist/test/mcp-stdout-channel.integration.test.js +2 -1
- package/dist/test/mcp-stdout-channel.integration.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/bridges/claude-code/channel.ts +3 -1
- package/src/bridges/codex/tool.ts +5 -2
- package/src/bridges/mcp/server.ts +3 -1
- package/src/bridges/user/web/bridge-port-range.ts +130 -0
- package/src/bridges/user/web/dist/bundle.js +1 -1
- package/src/bridges/user/web/dist/sw.js +1 -1
- package/src/bridges/user/web/server.ts +104 -29
- package/src/bridges/user/web/test/bridge-web-server.helper.ts +54 -0
- package/src/core/bridge-mesh.ts +2 -0
- package/src/core/bridge.ts +30 -1
- package/src/core/index.ts +1 -0
- package/src/core/tool.ts +1 -1
- package/dist/bridges/user/web/port-discovery.d.ts +0 -14
- package/dist/bridges/user/web/port-discovery.d.ts.map +0 -1
- package/dist/bridges/user/web/port-discovery.js +0 -40
- package/dist/bridges/user/web/port-discovery.js.map +0 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/test/port-discovery.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/test/port-discovery.unit.test.js +0 -180
- package/dist/bridges/user/web/test/port-discovery.unit.test.js.map +0 -1
- 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/bridges/user/web/port-discovery.ts +0 -49
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-stdout-channel.integration.test.js","sourceRoot":"","sources":["../../src/test/mcp-stdout-channel.integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;AAErC,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CACtB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,yBAAyB,CAC1B,CAAC;AAKF,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,mJAAmJ;AACnJ,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,SAAS,WAAW,CAAC,OAAgC;IACnD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,KAAK,CAAC,OAAO,KAAK,KAAK,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CACd,mFAAmF,EACnF,KAAK,EAAE,KAAK,EAAE,EAAE;IACd,MAAM,OAAO,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAC/B,OAAO,CAAC,QAAQ,EAChB;QACE,UAAU;QACV,KAAK;QACL,MAAM;QACN,IAAI,CAAC,SAAS,CAAC;YACb,KAAK;YACL,eAAe,EAAE,MAAM,aAAa,EAAE;YACtC,gBAAgB,EAAE,MAAM,aAAa,EAAE;YACvC,MAAM,EAAE,MAAM,iBAAiB,EAAE;YACjC,OAAO;
|
|
1
|
+
{"version":3,"file":"mcp-stdout-channel.integration.test.js","sourceRoot":"","sources":["../../src/test/mcp-stdout-channel.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unit tests for version-report-actions.ts's
|
|
2
|
+
* Unit tests for version-report-actions.ts's formatting helpers that read this process's own versions (agent-comms#198). The helpers that depend only on what a store answers are in the conformance corpus (conformance/function/version-report-actions.json); these stay because their expected text names the running package's and dependency's own version, which a language-neutral case cannot pin.
|
|
3
3
|
*/
|
|
4
4
|
export {};
|
|
5
5
|
//# sourceMappingURL=version-report-actions.unit.test.d.ts.map
|
|
@@ -1,46 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unit tests for version-report-actions.ts's
|
|
2
|
+
* Unit tests for version-report-actions.ts's formatting helpers that read this process's own versions (agent-comms#198). The helpers that depend only on what a store answers are in the conformance corpus (conformance/function/version-report-actions.json); these stay because their expected text names the running package's and dependency's own version, which a language-neutral case cannot pin.
|
|
3
3
|
*/
|
|
4
4
|
import { describe, it, expect } from "vitest";
|
|
5
|
-
import { formatListedAgentVersions, formatSelfVersionLines, formatSelfVersionSuffix,
|
|
5
|
+
import { formatListedAgentVersions, formatSelfVersionLines, formatSelfVersionSuffix, } from "../core/version-report-actions.js";
|
|
6
6
|
import { getOwnPackageVersion } from "../core/package-version.js";
|
|
7
7
|
import { getWireMeshCoreVersion } from "../core/wire-mesh-core-version.js";
|
|
8
|
-
describe("handleQueryVersion", () => {
|
|
9
|
-
it("reports not-mesh-backed when the store has no queryVersion method", async () => {
|
|
10
|
-
const result = await handleQueryVersion({}, { action: "query_version", device: "abc123" });
|
|
11
|
-
expect(result.isError).toBe(true);
|
|
12
|
-
expect(result.content).toContain("requires a mesh-backed store");
|
|
13
|
-
});
|
|
14
|
-
it("reports the peer's live version on success", async () => {
|
|
15
|
-
const store = {
|
|
16
|
-
queryVersion: async (deviceId) => {
|
|
17
|
-
await Promise.resolve();
|
|
18
|
-
expect(deviceId).toBe("abc123");
|
|
19
|
-
return { version: "1.2.3" };
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
const result = await handleQueryVersion(store, {
|
|
23
|
-
action: "query_version",
|
|
24
|
-
device: "abc123",
|
|
25
|
-
});
|
|
26
|
-
expect(result.isError).toBe(false);
|
|
27
|
-
expect(result.content).toBe("abc123 is running wire-mesh-core 1.2.3.");
|
|
28
|
-
});
|
|
29
|
-
it("reports the store's own error on failure", async () => {
|
|
30
|
-
const store = {
|
|
31
|
-
queryVersion: async () => {
|
|
32
|
-
await Promise.resolve();
|
|
33
|
-
return { error: "unauthorized" };
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
const result = await handleQueryVersion(store, {
|
|
37
|
-
action: "query_version",
|
|
38
|
-
device: "abc123",
|
|
39
|
-
});
|
|
40
|
-
expect(result.isError).toBe(true);
|
|
41
|
-
expect(result.content).toBe("Failed to query abc123's version: unauthorized");
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
8
|
describe("formatSelfVersionLines / formatSelfVersionSuffix", () => {
|
|
45
9
|
it("includes only the wire-mesh-core line when no cc-peer getter is wired", () => {
|
|
46
10
|
expect(formatSelfVersionLines(undefined)).toEqual([
|
|
@@ -67,22 +31,5 @@ describe("formatListedAgentVersions", () => {
|
|
|
67
31
|
const formatted = formatListedAgentVersions(store, "self-device", true, () => "9.9.9");
|
|
68
32
|
expect(formatted).toBe(`agent-comms ${getOwnPackageVersion()}, wire-mesh-core ${getWireMeshCoreVersion()}, cc-peer 9.9.9`);
|
|
69
33
|
});
|
|
70
|
-
it("reads gossiped versions for another peer, defaulting to unknown when never gossiped", () => {
|
|
71
|
-
const knownPeer = formatListedAgentVersions({
|
|
72
|
-
getPeerAgentCommsVersion: () => "3.0.0",
|
|
73
|
-
getPeerWireMeshCoreVersion: () => "1.50.0",
|
|
74
|
-
}, "peer-device", false, undefined);
|
|
75
|
-
expect(knownPeer).toBe("agent-comms 3.0.0, wire-mesh-core 1.50.0");
|
|
76
|
-
const unknownPeer = formatListedAgentVersions({}, "peer-device", false, undefined);
|
|
77
|
-
expect(unknownPeer).toBe("agent-comms unknown, wire-mesh-core unknown");
|
|
78
|
-
});
|
|
79
|
-
it("includes a peer's cc-peer version only when the store actually reports one", () => {
|
|
80
|
-
const formatted = formatListedAgentVersions({
|
|
81
|
-
getPeerAgentCommsVersion: () => "3.0.0",
|
|
82
|
-
getPeerWireMeshCoreVersion: () => "1.50.0",
|
|
83
|
-
getPeerCcPeerVersion: () => "1.5.0",
|
|
84
|
-
}, "peer-device", false, undefined);
|
|
85
|
-
expect(formatted).toBe("agent-comms 3.0.0, wire-mesh-core 1.50.0, cc-peer 1.5.0");
|
|
86
|
-
});
|
|
87
34
|
});
|
|
88
35
|
//# sourceMappingURL=version-report-actions.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-report-actions.unit.test.js","sourceRoot":"","sources":["../../src/test/version-report-actions.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"version-report-actions.unit.test.js","sourceRoot":"","sources":["../../src/test/version-report-actions.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YAChD,mBAAmB,sBAAsB,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAC7C,kBAAkB,sBAAsB,EAAE,EAAE,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;QACvC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,mBAAmB,sBAAsB,EAAE,EAAE;YAC7C,gBAAgB;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CACpD,kBAAkB,sBAAsB,EAAE,gBAAgB,CAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,KAAK,GAAuB;YAChC,wBAAwB,EAAE,GAAG,EAAE,CAAC,oBAAoB;YACpD,0BAA0B,EAAE,GAAG,EAAE,CAAC,oBAAoB;YACtD,oBAAoB,EAAE,GAAG,EAAE,CAAC,oBAAoB;SACjD,CAAC;QACF,MAAM,SAAS,GAAG,yBAAyB,CACzC,KAAK,EACL,aAAa,EACb,IAAI,EACJ,GAAG,EAAE,CAAC,OAAO,CACd,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CACpB,eAAe,oBAAoB,EAAE,oBAAoB,sBAAsB,EAAE,iBAAiB,CACnG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
3
|
"description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
|
|
4
|
-
"version": "9.0.
|
|
4
|
+
"version": "9.0.4",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agent-comms": "dist/cli.js"
|
|
7
7
|
},
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"@types/react-dom": "19.3.0",
|
|
57
57
|
"@types/ws": "8.18.1",
|
|
58
58
|
"@vitejs/plugin-react": "6.1.1",
|
|
59
|
+
"ajv": "8.20.0",
|
|
59
60
|
"conventional-changelog-conventionalcommits": "10.4.0",
|
|
60
61
|
"eslint": "10.11.0",
|
|
61
62
|
"eslint-config-prettier": "10.1.8",
|
|
@@ -74,7 +75,8 @@
|
|
|
74
75
|
"typescript-eslint": "8.70.0",
|
|
75
76
|
"vite": "8.3.2",
|
|
76
77
|
"vite-plugin-pwa": "1.3.0",
|
|
77
|
-
"vitest": "5.0.0"
|
|
78
|
+
"vitest": "5.0.0",
|
|
79
|
+
"yaml": "2.9.1"
|
|
78
80
|
},
|
|
79
81
|
"exports": {
|
|
80
82
|
".": {
|
|
@@ -278,7 +278,9 @@ export async function run(options?: Readonly<BridgeRunOptions>): Promise<void> {
|
|
|
278
278
|
// -----------------------------------------------------------------------
|
|
279
279
|
|
|
280
280
|
await store.init();
|
|
281
|
-
const webHandle = await tryStartBridgeWebServer(store, "claude-code"
|
|
281
|
+
const webHandle = await tryStartBridgeWebServer(store, "claude-code", {
|
|
282
|
+
bridgePortBase: options?.webPortBase,
|
|
283
|
+
});
|
|
282
284
|
tool.getWebUrlStatus = () => getWebUrlStatus(webHandle);
|
|
283
285
|
await mcp.connect(new StdioServerTransport());
|
|
284
286
|
|
|
@@ -13,6 +13,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
13
13
|
|
|
14
14
|
import {
|
|
15
15
|
createBridgeMesh,
|
|
16
|
+
type BridgeRunOptions,
|
|
16
17
|
createMeshErrorReporter,
|
|
17
18
|
buildAction,
|
|
18
19
|
ensureRegistered,
|
|
@@ -36,7 +37,7 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
36
37
|
/** Length of the random suffix appended to an auto-generated `codex-<suffix>` agent name. */
|
|
37
38
|
const CODEX_AGENT_NAME_SUFFIX_LENGTH = 4;
|
|
38
39
|
|
|
39
|
-
export async function run(): Promise<void> {
|
|
40
|
+
export async function run(options?: Readonly<BridgeRunOptions>): Promise<void> {
|
|
40
41
|
// Persistent identity for this slot: a stable device-id means the agent ID survives restarts, so peers can keep targeting us.
|
|
41
42
|
const identitySlot: IdentitySlot = { harness: "codex", cwd: process.cwd() };
|
|
42
43
|
const { store, tool } = await createBridgeMesh(identitySlot);
|
|
@@ -109,7 +110,9 @@ export async function run(): Promise<void> {
|
|
|
109
110
|
// -----------------------------------------------------------------------
|
|
110
111
|
|
|
111
112
|
await store.init();
|
|
112
|
-
const webHandle = await tryStartBridgeWebServer(store, "codex"
|
|
113
|
+
const webHandle = await tryStartBridgeWebServer(store, "codex", {
|
|
114
|
+
bridgePortBase: options?.webPortBase,
|
|
115
|
+
});
|
|
113
116
|
tool.getWebUrlStatus = () => getWebUrlStatus(webHandle);
|
|
114
117
|
await mcp.connect(new StdioServerTransport());
|
|
115
118
|
|
|
@@ -114,7 +114,9 @@ export async function run(options?: Readonly<BridgeRunOptions>): Promise<void> {
|
|
|
114
114
|
// -----------------------------------------------------------------------
|
|
115
115
|
|
|
116
116
|
await store.init();
|
|
117
|
-
const webHandle = await tryStartBridgeWebServer(store, "mcp"
|
|
117
|
+
const webHandle = await tryStartBridgeWebServer(store, "mcp", {
|
|
118
|
+
bridgePortBase: options?.webPortBase,
|
|
119
|
+
});
|
|
118
120
|
tool.getWebUrlStatus = () => getWebUrlStatus(webHandle);
|
|
119
121
|
await mcp.connect(new StdioServerTransport());
|
|
120
122
|
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The loopback TCP ports a bridge's web server looks for, and the dashboard looks in.
|
|
3
|
+
*
|
|
4
|
+
* A bridge binds the first free port of this range, so a hosted dashboard that cannot know a bridge's port finds it by trying each port in order. The range starts at the number the first-contact beacon uses over UDP, which is a separate port space: the two never contend.
|
|
5
|
+
*
|
|
6
|
+
* Shared by the Node server and the browser frontend, so it imports nothing from either.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** First port of the range a bridge's web server binds and the dashboard probes. */
|
|
10
|
+
export const BRIDGE_PORT_BASE = 19877;
|
|
11
|
+
|
|
12
|
+
/** How many consecutive ports, from the base, belong to the range. */
|
|
13
|
+
export const BRIDGE_PORT_COUNT = 10;
|
|
14
|
+
|
|
15
|
+
/** How long the probe waits for one port to accept the mesh socket before it counts as not a bridge: a listener that accepts and never answers must not stall the walk over the rest of the range. A bridge answers on loopback well inside this. */
|
|
16
|
+
export const BRIDGE_PROBE_TIMEOUT_MS = 1000;
|
|
17
|
+
|
|
18
|
+
/** The lowest port of the range an unprivileged process may bind. */
|
|
19
|
+
export const LOWEST_UNPRIVILEGED_PORT = 1024;
|
|
20
|
+
|
|
21
|
+
/** The highest TCP port. */
|
|
22
|
+
export const HIGHEST_PORT = 65_535;
|
|
23
|
+
|
|
24
|
+
/** Thrown for a base that is not a whole number or would put a port of the range outside 1024 to 65535. */
|
|
25
|
+
export class InvalidBridgePortBaseError extends Error {
|
|
26
|
+
readonly base: number;
|
|
27
|
+
|
|
28
|
+
constructor(base: number) {
|
|
29
|
+
super(
|
|
30
|
+
`Bridge port base ${String(base)} is not an integer whose ${String(BRIDGE_PORT_COUNT)} ports all lie in ${String(LOWEST_UNPRIVILEGED_PORT)} to ${String(HIGHEST_PORT)}`,
|
|
31
|
+
);
|
|
32
|
+
this.name = "InvalidBridgePortBaseError";
|
|
33
|
+
this.base = base;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The ports of the range in the order both sides try them.
|
|
39
|
+
* @param base - The first port; defaults to {@link BRIDGE_PORT_BASE}. Tests pass a range of their own.
|
|
40
|
+
* @throws InvalidBridgePortBaseError when `base` is not an integer or a port of the range would fall outside 1024 to 65535.
|
|
41
|
+
*/
|
|
42
|
+
export function bridgePortRange(base: number = BRIDGE_PORT_BASE): number[] {
|
|
43
|
+
if (
|
|
44
|
+
!Number.isInteger(base) ||
|
|
45
|
+
base < LOWEST_UNPRIVILEGED_PORT ||
|
|
46
|
+
base + BRIDGE_PORT_COUNT - 1 > HIGHEST_PORT
|
|
47
|
+
) {
|
|
48
|
+
throw new InvalidBridgePortBaseError(base);
|
|
49
|
+
}
|
|
50
|
+
return Array.from({ length: BRIDGE_PORT_COUNT }, (_, index) => base + index);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The address of a bridge's mesh socket on `port`. */
|
|
54
|
+
export function bridgeMeshUrl(port: number): string {
|
|
55
|
+
return `ws://127.0.0.1:${String(port)}/ws/mesh`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Whether a bridge's mesh socket (the dashboard's own endpoint, `/ws/mesh`) accepts a connection on the port within the timeout. Another kind of server, a refused port and a listener that never answers all give false: a WebSocket handshake needs a bridge to complete, and unlike a plain fetch it is readable from a hosted page without CORS headers.
|
|
60
|
+
* @param port - The loopback port to try.
|
|
61
|
+
* @param timeoutMs - How long to wait for the handshake; defaults to {@link BRIDGE_PROBE_TIMEOUT_MS}.
|
|
62
|
+
*/
|
|
63
|
+
export async function isBridgeAt(
|
|
64
|
+
port: number,
|
|
65
|
+
timeoutMs: number = BRIDGE_PROBE_TIMEOUT_MS,
|
|
66
|
+
): Promise<boolean> {
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
const socket = new WebSocket(bridgeMeshUrl(port));
|
|
69
|
+
const settle = (isBridge: boolean): void => {
|
|
70
|
+
socket.close();
|
|
71
|
+
resolve(isBridge);
|
|
72
|
+
};
|
|
73
|
+
AbortSignal.timeout(timeoutMs).addEventListener(
|
|
74
|
+
"abort",
|
|
75
|
+
() => {
|
|
76
|
+
settle(false);
|
|
77
|
+
},
|
|
78
|
+
{ once: true },
|
|
79
|
+
);
|
|
80
|
+
socket.addEventListener(
|
|
81
|
+
"open",
|
|
82
|
+
() => {
|
|
83
|
+
settle(true);
|
|
84
|
+
},
|
|
85
|
+
{ once: true },
|
|
86
|
+
);
|
|
87
|
+
socket.addEventListener(
|
|
88
|
+
"error",
|
|
89
|
+
() => {
|
|
90
|
+
settle(false);
|
|
91
|
+
},
|
|
92
|
+
{ once: true },
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The first port of the range that `isBridge` accepts, tried in range order, or undefined when none does.
|
|
99
|
+
* @param isBridge - Decides whether a bridge answers on a port.
|
|
100
|
+
* @param base - The first port of the range; defaults to {@link BRIDGE_PORT_BASE}.
|
|
101
|
+
*/
|
|
102
|
+
export async function findBridgePort(
|
|
103
|
+
isBridge: (port: number) => Promise<boolean>,
|
|
104
|
+
base: number = BRIDGE_PORT_BASE,
|
|
105
|
+
): Promise<number | undefined> {
|
|
106
|
+
for (const port of bridgePortRange(base)) {
|
|
107
|
+
if (await isBridge(port)) return port;
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Looks for a bridge in the range and, when one answers, passes its mesh socket address to `onFound`; calls nothing when none does. Resolves once the walk is over.
|
|
114
|
+
* @param onFound - Receives the mesh socket address of the first bridge found.
|
|
115
|
+
* @param options - `base` is the first port of the range (default {@link BRIDGE_PORT_BASE}); `timeoutMs` is the wait for each port (default {@link BRIDGE_PROBE_TIMEOUT_MS}).
|
|
116
|
+
*/
|
|
117
|
+
export async function probeForBridge(
|
|
118
|
+
onFound: (meshUrl: string) => void,
|
|
119
|
+
options?: Readonly<{
|
|
120
|
+
base?: number | undefined;
|
|
121
|
+
timeoutMs?: number | undefined;
|
|
122
|
+
}>,
|
|
123
|
+
): Promise<void> {
|
|
124
|
+
const timeoutMs = options?.timeoutMs ?? BRIDGE_PROBE_TIMEOUT_MS;
|
|
125
|
+
const port = await findBridgePort(
|
|
126
|
+
async (candidate) => isBridgeAt(candidate, timeoutMs),
|
|
127
|
+
options?.base,
|
|
128
|
+
);
|
|
129
|
+
if (port !== undefined) onFound(bridgeMeshUrl(port));
|
|
130
|
+
}
|