agent-comms 8.11.0 → 8.12.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 (33) 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 +2 -2
  5. package/dist/core/account-join.d.ts +5 -0
  6. package/dist/core/account-join.d.ts.map +1 -1
  7. package/dist/core/account-join.js +3 -3
  8. package/dist/core/account-join.js.map +1 -1
  9. package/dist/core/agent-details.d.ts +67 -0
  10. package/dist/core/agent-details.d.ts.map +1 -0
  11. package/dist/core/agent-details.js +163 -0
  12. package/dist/core/agent-details.js.map +1 -0
  13. package/dist/core/agent-list-format.d.ts +22 -0
  14. package/dist/core/agent-list-format.d.ts.map +1 -0
  15. package/dist/core/agent-list-format.js +54 -0
  16. package/dist/core/agent-list-format.js.map +1 -0
  17. package/dist/core/mesh-store.d.ts +11 -10
  18. package/dist/core/mesh-store.d.ts.map +1 -1
  19. package/dist/core/mesh-store.js +18 -25
  20. package/dist/core/mesh-store.js.map +1 -1
  21. package/dist/core/tool.d.ts +3 -0
  22. package/dist/core/tool.d.ts.map +1 -1
  23. package/dist/core/tool.js +7 -42
  24. package/dist/core/tool.js.map +1 -1
  25. package/dist/test/agent-details-refresh.unit.test.d.ts +5 -0
  26. package/dist/test/agent-details-refresh.unit.test.d.ts.map +1 -0
  27. package/dist/test/agent-details-refresh.unit.test.js +108 -0
  28. package/dist/test/agent-details-refresh.unit.test.js.map +1 -0
  29. package/dist/test/agent-details.unit.test.d.ts +5 -0
  30. package/dist/test/agent-details.unit.test.d.ts.map +1 -0
  31. package/dist/test/agent-details.unit.test.js +86 -0
  32. package/dist/test/agent-details.unit.test.js.map +1 -0
  33. package/package.json +1 -1
@@ -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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"}
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.12.0",
5
5
  "bin": {
6
6
  "agent-comms": "dist/cli.js"
7
7
  },