agent-comms 8.11.0 → 8.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/LICENSE +21 -0
  4. package/README.md +3 -3
  5. package/dist/bridges/user/web/dist/bundle.js +1 -1
  6. package/dist/bridges/user/web/dist/sw.js +1 -1
  7. package/dist/core/account-join.d.ts +5 -0
  8. package/dist/core/account-join.d.ts.map +1 -1
  9. package/dist/core/account-join.js +3 -3
  10. package/dist/core/account-join.js.map +1 -1
  11. package/dist/core/agent-details.d.ts +67 -0
  12. package/dist/core/agent-details.d.ts.map +1 -0
  13. package/dist/core/agent-details.js +163 -0
  14. package/dist/core/agent-details.js.map +1 -0
  15. package/dist/core/agent-list-format.d.ts +22 -0
  16. package/dist/core/agent-list-format.d.ts.map +1 -0
  17. package/dist/core/agent-list-format.js +54 -0
  18. package/dist/core/agent-list-format.js.map +1 -0
  19. package/dist/core/bridge-mesh.d.ts +1 -1
  20. package/dist/core/bridge-mesh.d.ts.map +1 -1
  21. package/dist/core/bridge-mesh.js +2 -2
  22. package/dist/core/bridge-mesh.js.map +1 -1
  23. package/dist/core/mesh-store-shared.d.ts +9 -1
  24. package/dist/core/mesh-store-shared.d.ts.map +1 -1
  25. package/dist/core/mesh-store-shared.js +24 -1
  26. package/dist/core/mesh-store-shared.js.map +1 -1
  27. package/dist/core/mesh-store.d.ts +11 -10
  28. package/dist/core/mesh-store.d.ts.map +1 -1
  29. package/dist/core/mesh-store.js +18 -25
  30. package/dist/core/mesh-store.js.map +1 -1
  31. package/dist/core/tool.d.ts +3 -0
  32. package/dist/core/tool.d.ts.map +1 -1
  33. package/dist/core/tool.js +7 -42
  34. package/dist/core/tool.js.map +1 -1
  35. package/dist/test/agent-details-refresh.unit.test.d.ts +5 -0
  36. package/dist/test/agent-details-refresh.unit.test.d.ts.map +1 -0
  37. package/dist/test/agent-details-refresh.unit.test.js +108 -0
  38. package/dist/test/agent-details-refresh.unit.test.js.map +1 -0
  39. package/dist/test/agent-details.unit.test.d.ts +5 -0
  40. package/dist/test/agent-details.unit.test.d.ts.map +1 -0
  41. package/dist/test/agent-details.unit.test.js +86 -0
  42. package/dist/test/agent-details.unit.test.js.map +1 -0
  43. package/dist/test/mesh-store-shared.unit.test.js +19 -1
  44. package/dist/test/mesh-store-shared.unit.test.js.map +1 -1
  45. package/package.json +4 -4
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The exchange's refresh loop (agent-comms#323): which listed agents it asks, what it caches, and what it leaves alone, against a fake transport standing in for the send.
3
+ */
4
+ import { describe, expect, it } from "vitest";
5
+ import { AgentDetailsExchange } from "../core/agent-details.js";
6
+ const SELF = "self";
7
+ const TRUSTED_REMOTE = "trusted-remote";
8
+ const UNTRUSTED_REMOTE = "untrusted-remote";
9
+ /** Long enough for the fake transport's promise chain to settle between the check points. */
10
+ const SETTLE_MS = 20;
11
+ /** Long enough for one 250ms retry to have happened. */
12
+ const RETRY_SETTLE_MS = 400;
13
+ async function settle(ms) {
14
+ await new Promise((resolve) => {
15
+ setTimeout(resolve, ms);
16
+ });
17
+ }
18
+ function agentOf(id, cwd) {
19
+ return {
20
+ id,
21
+ version: 1,
22
+ name: id,
23
+ harness: "test",
24
+ cwd,
25
+ pid: process.pid,
26
+ startedAt: new Date().toISOString(),
27
+ visibility: "visible",
28
+ status: "active",
29
+ tags: [],
30
+ subscribedRooms: [],
31
+ };
32
+ }
33
+ /** Records every send and answers each with a canned outcome, defaulting to a plain ok carrying the target's own details. */
34
+ function fakeTransport(outcomes = {}) {
35
+ const sentTo = [];
36
+ return {
37
+ sentTo,
38
+ transport: {
39
+ sendRoomRequest: async (peerId) => {
40
+ sentTo.push(peerId);
41
+ return (outcomes[peerId] ?? {
42
+ result: "ok",
43
+ cwd: `/fetched/${peerId}`,
44
+ tags: [],
45
+ rooms: [],
46
+ });
47
+ },
48
+ },
49
+ };
50
+ }
51
+ function exchangeOf(transport, trusted = [TRUSTED_REMOTE]) {
52
+ return new AgentDetailsExchange({
53
+ selfAgent: () => agentOf(SELF, "/test/self"),
54
+ hostedRooms: () => [],
55
+ isTrusted: (deviceHex) => trusted.includes(deviceHex),
56
+ requireTransport: () => transport,
57
+ });
58
+ }
59
+ describe("AgentDetailsExchange.refresh", () => {
60
+ it("asks a trusted remote agent whose details a hub session withholds, and caches the answer", async () => {
61
+ const { sentTo, transport } = fakeTransport();
62
+ const exchange = exchangeOf(transport);
63
+ exchange.refresh([agentOf(TRUSTED_REMOTE, "")], SELF);
64
+ await settle(SETTLE_MS);
65
+ expect(sentTo).toEqual([TRUSTED_REMOTE]);
66
+ expect(exchange.cached(TRUSTED_REMOTE)?.cwd).toBe(`/fetched/${TRUSTED_REMOTE}`);
67
+ });
68
+ it("never asks for itself, for an untrusted remote, or for an agent whose details are already shared", async () => {
69
+ const { sentTo, transport } = fakeTransport();
70
+ const exchange = exchangeOf(transport);
71
+ exchange.refresh([
72
+ agentOf(SELF, ""),
73
+ agentOf(UNTRUSTED_REMOTE, ""),
74
+ agentOf(TRUSTED_REMOTE, "/already/shared"),
75
+ ], SELF);
76
+ await settle(SETTLE_MS);
77
+ expect(sentTo).toEqual([]);
78
+ expect(exchange.cached(SELF)).toBeUndefined();
79
+ expect(exchange.cached(UNTRUSTED_REMOTE)).toBeUndefined();
80
+ expect(exchange.cached(TRUSTED_REMOTE)).toBeUndefined();
81
+ });
82
+ it("caches nothing for a refusal and retries a transient no-route within the window", async () => {
83
+ let attempts = 0;
84
+ const transport = {
85
+ sendRoomRequest: async () => {
86
+ attempts += 1;
87
+ return attempts === 1
88
+ ? { result: "error", code: "no_route" }
89
+ : { result: "error", code: "untrusted_requester" };
90
+ },
91
+ };
92
+ const exchange = exchangeOf(transport);
93
+ exchange.refresh([agentOf(TRUSTED_REMOTE, "")], SELF);
94
+ await settle(RETRY_SETTLE_MS);
95
+ expect(attempts).toBe(2);
96
+ expect(exchange.cached(TRUSTED_REMOTE)).toBeUndefined();
97
+ });
98
+ it("drops a cached entry once its agent leaves the listing", async () => {
99
+ const { transport } = fakeTransport();
100
+ const exchange = exchangeOf(transport);
101
+ exchange.refresh([agentOf(TRUSTED_REMOTE, "")], SELF);
102
+ await settle(SETTLE_MS);
103
+ expect(exchange.cached(TRUSTED_REMOTE)).toBeDefined();
104
+ exchange.refresh([], SELF);
105
+ expect(exchange.cached(TRUSTED_REMOTE)).toBeUndefined();
106
+ });
107
+ });
108
+ //# sourceMappingURL=agent-details-refresh.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-details-refresh.unit.test.js","sourceRoot":"","sources":["../../src/test/agent-details-refresh.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * The agent-comms/agent-details verb and its cache (agent-comms#323): a trusted peer asking over a relay pairing gets the details a hub session withholds, and anyone else is refused.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=agent-details.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-details.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/agent-details.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * The agent-comms/agent-details verb and its cache (agent-comms#323): a trusted peer asking over a relay pairing gets the details a hub session withholds, and anyone else is refused.
3
+ */
4
+ import { describe, expect, it } from "vitest";
5
+ import { AGENT_DETAILS_VERB, AgentDetailsCache, agentDetailsVerbHandler, parseAgentDetails, } from "../core/agent-details.js";
6
+ const TRUSTED_PEER = "aa"; // deviceIdToHex of a one-byte DeviceId, for fromDevice
7
+ const UNTRUSTED_PEER = "bb";
8
+ function deviceOf(hex) {
9
+ return new Uint8Array(hex.match(/../g)?.map((b) => Number.parseInt(b, 16)) ?? []);
10
+ }
11
+ const DETAILS = {
12
+ cwd: "/test/machine-b",
13
+ tags: ["nightly"],
14
+ rooms: [{ path: "b-room", name: "B Room", description: "where B works" }],
15
+ };
16
+ function handlerDeps(overrides = {}) {
17
+ return {
18
+ details: () => DETAILS,
19
+ isTrusted: (deviceHex) => deviceHex === TRUSTED_PEER,
20
+ ...overrides,
21
+ };
22
+ }
23
+ function requestFrom(peerHex) {
24
+ const scope = { kind: "node" };
25
+ return {
26
+ requestId: 1,
27
+ command: { verb: "agent:details", params: { verb: AGENT_DETAILS_VERB } },
28
+ scope,
29
+ ...(peerHex === undefined ? {} : { fromDevice: deviceOf(peerHex) }),
30
+ respond: async () => undefined,
31
+ };
32
+ }
33
+ /** The handle a direct session's dispatch carries: the connection's own authenticated peer. */
34
+ const TRUSTED_HANDLE = { id: TRUSTED_PEER };
35
+ const UNTRUSTED_HANDLE = { id: UNTRUSTED_PEER };
36
+ describe("agentDetailsVerbHandler", () => {
37
+ it("answers a trusted requester with the cwd, tags and hosted rooms", async () => {
38
+ const handler = agentDetailsVerbHandler(handlerDeps());
39
+ const outcome = await handler(requestFrom(TRUSTED_PEER), TRUSTED_HANDLE);
40
+ expect(outcome).toEqual({ result: "ok", ...DETAILS });
41
+ });
42
+ it("refuses a requester this machine does not trust", async () => {
43
+ const handler = agentDetailsVerbHandler(handlerDeps());
44
+ const outcome = await handler(requestFrom(UNTRUSTED_PEER), UNTRUSTED_HANDLE);
45
+ expect(outcome).toEqual({ result: "error", code: "untrusted_requester" });
46
+ });
47
+ it("answers a direct session whose authenticated peer this machine trusts", async () => {
48
+ const handler = agentDetailsVerbHandler(handlerDeps());
49
+ const outcome = await handler(requestFrom(undefined), TRUSTED_HANDLE);
50
+ expect(outcome).toEqual({ result: "ok", ...DETAILS });
51
+ });
52
+ it("refuses a direct session whose peer this machine does not trust", async () => {
53
+ const handler = agentDetailsVerbHandler(handlerDeps());
54
+ const outcome = await handler(requestFrom(undefined), UNTRUSTED_HANDLE);
55
+ expect(outcome).toEqual({ result: "error", code: "untrusted_requester" });
56
+ });
57
+ it("answers no_agent while this bridge has no registered agent", async () => {
58
+ const handler = agentDetailsVerbHandler(handlerDeps({ details: () => undefined }));
59
+ const outcome = await handler(requestFrom(TRUSTED_PEER), TRUSTED_HANDLE);
60
+ expect(outcome).toEqual({ result: "error", code: "no_agent" });
61
+ });
62
+ });
63
+ describe("parseAgentDetails", () => {
64
+ it("parses an ok outcome with every field present", () => {
65
+ expect(parseAgentDetails({
66
+ result: "ok",
67
+ ...DETAILS,
68
+ rooms: [...DETAILS.rooms],
69
+ })).toEqual(DETAILS);
70
+ });
71
+ it("refuses an error outcome and a malformed ok", () => {
72
+ expect(parseAgentDetails({ result: "error", code: "x" })).toBeUndefined();
73
+ expect(parseAgentDetails({ result: "ok", cwd: "/x", tags: "nope", rooms: [] })).toBeUndefined();
74
+ });
75
+ });
76
+ describe("AgentDetailsCache", () => {
77
+ it("drops entries whose agent the last listing did not include", () => {
78
+ const cache = new AgentDetailsCache();
79
+ cache.set("gone", DETAILS);
80
+ cache.set("kept", DETAILS);
81
+ cache.retain(new Set(["kept"]));
82
+ expect(cache.get("gone")).toBeUndefined();
83
+ expect(cache.get("kept")).toBeDefined();
84
+ });
85
+ });
86
+ //# sourceMappingURL=agent-details.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-details.unit.test.js","sourceRoot":"","sources":["../../src/test/agent-details.unit.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { mergeMessageHistories, ROOM_TOKEN_LIFETIME_MS, } from "../core/mesh-store-shared.js";
2
+ import { DEFAULT_HUB_URL, HUB_URL_ENV_VAR, mergeMessageHistories, resolveHubUrl, ROOM_TOKEN_LIFETIME_MS, } from "../core/mesh-store-shared.js";
3
3
  const DAYS = 30;
4
4
  const HOURS_PER_DAY = 24;
5
5
  const MINUTES_PER_HOUR = 60;
@@ -86,4 +86,22 @@ describe("mergeMessageHistories", () => {
86
86
  expect(merged[0]?.readBy.sort()).toEqual(["u1", "u2"]);
87
87
  });
88
88
  });
89
+ describe("resolveHubUrl", () => {
90
+ it("returns the production hub when the variable is unset", () => {
91
+ expect(resolveHubUrl({})).toBe(DEFAULT_HUB_URL);
92
+ });
93
+ it("returns the production hub when the variable is blank", () => {
94
+ expect(resolveHubUrl({ [HUB_URL_ENV_VAR]: " " })).toBe(DEFAULT_HUB_URL);
95
+ });
96
+ it("returns a configured wss:// hub", () => {
97
+ expect(resolveHubUrl({ [HUB_URL_ENV_VAR]: "wss://relay.example.com/" })).toBe("wss://relay.example.com/");
98
+ });
99
+ it("returns a configured ws:// hub, trimmed", () => {
100
+ expect(resolveHubUrl({ [HUB_URL_ENV_VAR]: " ws://10.0.0.5:8787/ " })).toBe("ws://10.0.0.5:8787/");
101
+ });
102
+ it("throws on a value that is not a WebSocket URL instead of falling back to the public hub", () => {
103
+ expect(() => resolveHubUrl({ [HUB_URL_ENV_VAR]: "https://relay.example.com/" })).toThrow(HUB_URL_ENV_VAR);
104
+ expect(() => resolveHubUrl({ [HUB_URL_ENV_VAR]: "not a url" })).toThrow(HUB_URL_ENV_VAR);
105
+ });
106
+ });
89
107
  //# sourceMappingURL=mesh-store-shared.unit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mesh-store-shared.unit.test.js","sourceRoot":"","sources":["../../src/test/mesh-store-shared.unit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mesh-store-shared.unit.test.js","sourceRoot":"","sources":["../../src/test/mesh-store-shared.unit.test.ts"],"names":[],"mappings":"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"}
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": "8.11.0",
4
+ "version": "8.13.0",
5
5
  "bin": {
6
6
  "agent-comms": "dist/cli.js"
7
7
  },
@@ -14,11 +14,11 @@
14
14
  "@orpc/contract": "2.0.0-beta.35",
15
15
  "@orpc/server": "2.0.0-beta.35",
16
16
  "@orpc/tanstack-query": "2.0.0-beta.36",
17
- "@tanstack/react-query": "5.102.8",
17
+ "@tanstack/react-query": "5.103.2",
18
18
  "cbor2": "2.3.0",
19
19
  "cc-peer": "1.6.1",
20
20
  "d3-force": "3.0.0",
21
- "openpgp": "6.3.1",
21
+ "openpgp": "6.3.2",
22
22
  "react": "19.3.0",
23
23
  "react-dom": "19.3.0",
24
24
  "typebox": "1.3.6",
@@ -31,7 +31,7 @@
31
31
  "@commitlint/cli": "21.2.1",
32
32
  "@commitlint/config-conventional": "21.2.2",
33
33
  "@commitlint/types": "21.2.0",
34
- "@earendil-works/pi-ai": "0.85.1",
34
+ "@earendil-works/pi-ai": "0.87.1",
35
35
  "@earendil-works/pi-coding-agent": "0.85.1",
36
36
  "@eslint/json": "2.1.0",
37
37
  "@eslint/markdown": "8.0.3",