agent-comms 5.2.5 → 7.0.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 (138) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +6 -2
  4. package/dist/bridges/user/controller.d.ts +1 -1
  5. package/dist/bridges/user/controller.d.ts.map +1 -1
  6. package/dist/bridges/user/controller.js +1 -1
  7. package/dist/bridges/user/controller.js.map +1 -1
  8. package/dist/core/bridge-mesh.d.ts +2 -2
  9. package/dist/core/bridge-mesh.d.ts.map +1 -1
  10. package/dist/core/bridge-mesh.js +3 -2
  11. package/dist/core/bridge-mesh.js.map +1 -1
  12. package/dist/core/gateway-trust.d.ts +15 -9
  13. package/dist/core/gateway-trust.d.ts.map +1 -1
  14. package/dist/core/gateway-trust.js +49 -21
  15. package/dist/core/gateway-trust.js.map +1 -1
  16. package/dist/core/gossip-directory.d.ts +1 -1
  17. package/dist/core/gossip-directory.d.ts.map +1 -1
  18. package/dist/core/gossip-directory.js +4 -2
  19. package/dist/core/gossip-directory.js.map +1 -1
  20. package/dist/core/hub-forwarding.d.ts +4 -18
  21. package/dist/core/hub-forwarding.d.ts.map +1 -1
  22. package/dist/core/hub-forwarding.js +2 -41
  23. package/dist/core/hub-forwarding.js.map +1 -1
  24. package/dist/core/hub-link.d.ts +58 -0
  25. package/dist/core/hub-link.d.ts.map +1 -0
  26. package/dist/core/hub-link.js +118 -0
  27. package/dist/core/hub-link.js.map +1 -0
  28. package/dist/core/hub-session.d.ts +14 -15
  29. package/dist/core/hub-session.d.ts.map +1 -1
  30. package/dist/core/hub-session.js +30 -51
  31. package/dist/core/hub-session.js.map +1 -1
  32. package/dist/core/identity-store.d.ts +8 -4
  33. package/dist/core/identity-store.d.ts.map +1 -1
  34. package/dist/core/identity-store.js +29 -15
  35. package/dist/core/identity-store.js.map +1 -1
  36. package/dist/core/mesh-graph.d.ts +1 -1
  37. package/dist/core/mesh-graph.js +1 -1
  38. package/dist/core/mesh-store.d.ts +11 -6
  39. package/dist/core/mesh-store.d.ts.map +1 -1
  40. package/dist/core/mesh-store.js +33 -22
  41. package/dist/core/mesh-store.js.map +1 -1
  42. package/dist/core/peer-lifecycle.d.ts +2 -5
  43. package/dist/core/peer-lifecycle.d.ts.map +1 -1
  44. package/dist/core/peer-lifecycle.js +0 -1
  45. package/dist/core/peer-lifecycle.js.map +1 -1
  46. package/dist/core/room-router.d.ts +2 -2
  47. package/dist/core/room-router.d.ts.map +1 -1
  48. package/dist/core/room-router.js +2 -32
  49. package/dist/core/room-router.js.map +1 -1
  50. package/dist/core/shutdown-signals.d.ts +1 -1
  51. package/dist/core/shutdown-signals.js +1 -1
  52. package/dist/core/transport.d.ts +7 -7
  53. package/dist/core/transport.d.ts.map +1 -1
  54. package/dist/core/wire-mesh-transport.d.ts +7 -3
  55. package/dist/core/wire-mesh-transport.d.ts.map +1 -1
  56. package/dist/core/wire-mesh-transport.js +39 -22
  57. package/dist/core/wire-mesh-transport.js.map +1 -1
  58. package/dist/test/bridge-mesh.integration.test.js +15 -1
  59. package/dist/test/bridge-mesh.integration.test.js.map +1 -1
  60. package/dist/test/chat-controller-mesh-errors.integration.test.js +7 -1
  61. package/dist/test/chat-controller-mesh-errors.integration.test.js.map +1 -1
  62. package/dist/test/coordinator-failover-hub.integration.test.d.ts +5 -0
  63. package/dist/test/coordinator-failover-hub.integration.test.d.ts.map +1 -0
  64. package/dist/test/coordinator-failover-hub.integration.test.js +78 -0
  65. package/dist/test/coordinator-failover-hub.integration.test.js.map +1 -0
  66. package/dist/test/coordinator-failover.integration.test.js +3 -6
  67. package/dist/test/coordinator-failover.integration.test.js.map +1 -1
  68. package/dist/test/coordinator-failover.unit.test.js +0 -7
  69. package/dist/test/coordinator-failover.unit.test.js.map +1 -1
  70. package/dist/test/gateway-trust.integration.test.d.ts +1 -1
  71. package/dist/test/gateway-trust.integration.test.js +26 -2
  72. package/dist/test/gateway-trust.integration.test.js.map +1 -1
  73. package/dist/test/gateway-trust.unit.test.js +43 -5
  74. package/dist/test/gateway-trust.unit.test.js.map +1 -1
  75. package/dist/test/hub-exposure.integration.test.d.ts +5 -0
  76. package/dist/test/hub-exposure.integration.test.d.ts.map +1 -0
  77. package/dist/test/hub-exposure.integration.test.js +121 -0
  78. package/dist/test/hub-exposure.integration.test.js.map +1 -0
  79. package/dist/test/hub-helpers.d.ts +18 -3
  80. package/dist/test/hub-helpers.d.ts.map +1 -1
  81. package/dist/test/hub-helpers.js +24 -3
  82. package/dist/test/hub-helpers.js.map +1 -1
  83. package/dist/test/hub-link.unit.test.d.ts +2 -0
  84. package/dist/test/hub-link.unit.test.d.ts.map +1 -0
  85. package/dist/test/hub-link.unit.test.js +210 -0
  86. package/dist/test/hub-link.unit.test.js.map +1 -0
  87. package/dist/test/hub-peer-per-store.integration.test.d.ts +9 -0
  88. package/dist/test/hub-peer-per-store.integration.test.d.ts.map +1 -0
  89. package/dist/test/hub-peer-per-store.integration.test.js +211 -0
  90. package/dist/test/hub-peer-per-store.integration.test.js.map +1 -0
  91. package/dist/test/hub-room-domain-verb-trust-bypass.integration.test.js +2 -2
  92. package/dist/test/hub-room-domain-verb-trust-bypass.integration.test.js.map +1 -1
  93. package/dist/test/hub-session-close.integration.test.js +1 -1
  94. package/dist/test/hub-session-close.integration.test.js.map +1 -1
  95. package/dist/test/hub-session-dispatch.unit.test.js +1 -66
  96. package/dist/test/hub-session-dispatch.unit.test.js.map +1 -1
  97. package/dist/test/identity-store.integration.test.js +24 -32
  98. package/dist/test/identity-store.integration.test.js.map +1 -1
  99. package/dist/test/mesh-graph-trace.integration.test.js +2 -2
  100. package/dist/test/mesh-graph-trace.integration.test.js.map +1 -1
  101. package/dist/test/mesh-smoke.runner.js +1 -3
  102. package/dist/test/mesh-smoke.runner.js.map +1 -1
  103. package/dist/test/mesh-store-orchestration.unit.test.js +11 -41
  104. package/dist/test/mesh-store-orchestration.unit.test.js.map +1 -1
  105. package/dist/test/peer-lifecycle.unit.test.js +0 -8
  106. package/dist/test/peer-lifecycle.unit.test.js.map +1 -1
  107. package/dist/test/principal-membership-trust.integration.test.js +8 -1
  108. package/dist/test/principal-membership-trust.integration.test.js.map +1 -1
  109. package/dist/test/room-join-by-bare-name.integration.test.js +1 -1
  110. package/dist/test/room-join-by-bare-name.integration.test.js.map +1 -1
  111. package/dist/test/test-transport.d.ts +1 -1
  112. package/dist/test/test-transport.d.ts.map +1 -1
  113. package/dist/test/test-transport.js +1 -1
  114. package/dist/test/test-transport.js.map +1 -1
  115. package/dist/test/wire-mesh-transport-hub.integration.test.d.ts +1 -1
  116. package/dist/test/wire-mesh-transport-hub.integration.test.js +96 -9
  117. package/dist/test/wire-mesh-transport-hub.integration.test.js.map +1 -1
  118. package/package.json +1 -1
  119. package/dist/core/coordinator-gateway.d.ts +0 -25
  120. package/dist/core/coordinator-gateway.d.ts.map +0 -1
  121. package/dist/core/coordinator-gateway.js +0 -34
  122. package/dist/core/coordinator-gateway.js.map +0 -1
  123. package/dist/test/coordinator-gateway.unit.test.d.ts +0 -2
  124. package/dist/test/coordinator-gateway.unit.test.d.ts.map +0 -1
  125. package/dist/test/coordinator-gateway.unit.test.js +0 -88
  126. package/dist/test/coordinator-gateway.unit.test.js.map +0 -1
  127. package/dist/test/gateway-forwarding.integration.test.d.ts +0 -9
  128. package/dist/test/gateway-forwarding.integration.test.d.ts.map +0 -1
  129. package/dist/test/gateway-forwarding.integration.test.js +0 -226
  130. package/dist/test/gateway-forwarding.integration.test.js.map +0 -1
  131. package/dist/test/hub-forwarding.unit.test.d.ts +0 -2
  132. package/dist/test/hub-forwarding.unit.test.d.ts.map +0 -1
  133. package/dist/test/hub-forwarding.unit.test.js +0 -102
  134. package/dist/test/hub-forwarding.unit.test.js.map +0 -1
  135. package/dist/test/hub-todevice-routing.integration.test.d.ts +0 -7
  136. package/dist/test/hub-todevice-routing.integration.test.d.ts.map +0 -1
  137. package/dist/test/hub-todevice-routing.integration.test.js +0 -121
  138. package/dist/test/hub-todevice-routing.integration.test.js.map +0 -1
@@ -1,121 +0,0 @@
1
- /**
2
- * Integration test for agent-comms#184: a hub-relayed manage-request explicitly addressed (relay-data's own `to-device` field, surfaced as `IncomingManageRequest.toDevice` since wire-mesh#170, wire-mesh-core 1.48.1) to a NON-gateway local peer must be routed on to that peer's own local mesh session, not dispatched against the gateway's own local state the way gateway-forwarding.integration.test.ts's "routes a DM to a remote gateway's own agent" case already covers for the gateway itself. Also proves the request's true remote origin (b1) survives the forwarding hop intact -- room-router.ts's own "on-behalf-of" mechanism, not just delivery reaching the right recipient.
3
- *
4
- * Same three-party shape as gateway-forwarding.integration.test.ts: machine A has a coordinator (a1, the gateway, dialled to the hub) and a second, ordinary local peer (a2) that is never itself connected to the hub. Machine B (b1) reaches a2 purely through the hub's relay pairing with a1 -- if toDevice routing didn't exist, b1's request would land at a1's own DM state instead of a2's, since a1's hub session has no way to tell the two apart.
5
- */
6
- import { afterEach, describe, expect, it } from "vitest";
7
- import { MeshStore } from "../core/mesh-store.js";
8
- import { dmRoomPath } from "../core/room-path.js";
9
- import { realHubOverWs, TeardownStack } from "./hub-helpers.js";
10
- import { wireTestTransport } from "./test-transport.js";
11
- let nextPort = 22_500;
12
- function freshPort() {
13
- nextPort += 1;
14
- return nextPort;
15
- }
16
- /** Short enough that a gossip re-advertisement (which carries a1's forwarded advert of a2) fires within a test's own poll budget, matching gateway-forwarding.integration.test.ts's own choice. */
17
- const FAST_GOSSIP_INTERVAL_MS = 50;
18
- const POLL_ATTEMPTS = 100;
19
- const POLL_INTERVAL_MS = 50;
20
- const sleep = async (ms) => new Promise((resolve) => {
21
- setTimeout(resolve, ms);
22
- });
23
- /** Polls an async predicate until it holds -- gateway-forwarding.integration.test.ts's own established pattern for this, duplicated here rather than shared, since neither file exports it. */
24
- async function waitFor(what, check) {
25
- for (let i = 0; i < POLL_ATTEMPTS; i++) {
26
- if (await check())
27
- return;
28
- await sleep(POLL_INTERVAL_MS);
29
- }
30
- expect(false, `timed out waiting for ${what}`).toBeTruthy();
31
- }
32
- const cleanups = new TeardownStack();
33
- afterEach(async () => {
34
- await cleanups.run();
35
- });
36
- describe("hub toDevice routing", () => {
37
- it("routes a DM addressed to a non-gateway local peer to that peer's own state, not the gateway's", async () => {
38
- const hub = await realHubOverWs();
39
- cleanups.push(hub.close);
40
- const a1 = new MeshStore({ coordinatorPort: freshPort(), hubUrl: hub.url });
41
- await wireTestTransport(a1, {
42
- presenceReadvertiseIntervalMs: FAST_GOSSIP_INTERVAL_MS,
43
- });
44
- await a1.init();
45
- cleanups.push(async () => a1.shutdown());
46
- await a1.registerAgent({
47
- name: "a1-gateway",
48
- harness: "test",
49
- cwd: "/test/a1",
50
- pid: process.pid,
51
- visibility: "visible",
52
- tags: [],
53
- });
54
- const a2 = new MeshStore({
55
- coordinatorPort: a1.coordinatorPort,
56
- hubUrl: hub.url,
57
- });
58
- await wireTestTransport(a2, {
59
- presenceReadvertiseIntervalMs: FAST_GOSSIP_INTERVAL_MS,
60
- });
61
- await a2.init();
62
- cleanups.push(async () => a2.shutdown());
63
- await a2.registerAgent({
64
- name: "a2-local-peer",
65
- harness: "test",
66
- cwd: "/test/a2",
67
- pid: process.pid,
68
- visibility: "visible",
69
- tags: [],
70
- });
71
- const b1 = new MeshStore({ coordinatorPort: freshPort(), hubUrl: hub.url });
72
- await wireTestTransport(b1, {
73
- presenceReadvertiseIntervalMs: FAST_GOSSIP_INTERVAL_MS,
74
- });
75
- await b1.init();
76
- cleanups.push(async () => b1.shutdown());
77
- await b1.registerAgent({
78
- name: "b1-remote",
79
- harness: "test",
80
- cwd: "/test/b1",
81
- pid: process.pid,
82
- visibility: "visible",
83
- tags: [],
84
- });
85
- // Deny-all by default (agent-comms#156): a1 needs a trusted remote gateway to forward a2's advert onto the hub at all (forwardAdvertsToHub's own hasAny gate), b1 needs a2's own device-id specifically trusted for sendRoomRequest's own outbound isTrusted gate to route to it via the hub, and a1 needs b1 trusted for consume()'s own inbound gate on the relayed request's fromDevice.
86
- a1.addTrustedGateway(b1.peerId);
87
- b1.addTrustedGateway(a2.peerId);
88
- // Waits for b1 to actually learn of a2 via the hub's own gossip/catch-up (mirroring gateway-forwarding.integration.test.ts's own first test) before addressing a request to it -- otherwise the relay hub has no adjacency entry for a2's device yet and silently drops the relay-connect (spec/relay-hub's own documented behaviour for an unknown target-device), which would time out for a reason unrelated to toDevice routing itself.
89
- await waitFor("b1 to learn of a2 via the hub", async () => {
90
- const agents = await b1.listAgents(b1.peerId);
91
- return agents.some((agent) => agent.id === a2.peerId);
92
- });
93
- const dmPath = dmRoomPath(b1.peerId, a2.peerId);
94
- const requestPromise = b1.requestDmAccess(a2.peerId);
95
- await waitFor("a2 (not a1) to see b1's pending DM request, routed through a1's hub session via toDevice", async () => {
96
- await Promise.resolve();
97
- return a2.listPendingRoomJoins().length === 1;
98
- });
99
- const [pending] = a2.listPendingRoomJoins();
100
- expect(pending?.roomPath).toBe(dmPath);
101
- expect(pending?.requesterId).toBe(b1.peerId);
102
- // The gateway's own DM state must never have seen this request: proves toDevice routing actually redirected it to a2 rather than a1 additionally absorbing a copy.
103
- expect(a1.listPendingRoomJoins()).toHaveLength(0);
104
- a2.acceptRoomJoin(dmPath, b1.peerId);
105
- await requestPromise;
106
- const message = await b1.sendDm(b1.peerId, a2.peerId, "hello from b1");
107
- await waitFor("a2 to receive the DM via the hub, routed through a1", async () => {
108
- const a2Dms = a2.serialise().dms[dmPath] ?? [];
109
- return a2Dms.some((m) => m.id === message.message.id);
110
- });
111
- const delivered = (a2.serialise().dms[dmPath] ?? []).find((m) => m.id === message.message.id);
112
- expect(delivered).toMatchObject({
113
- from: b1.peerId,
114
- to: a2.peerId,
115
- content: "hello from b1",
116
- });
117
- // Again: the gateway's own DM state must stay empty throughout -- the message belongs to a2, never a1.
118
- expect(a1.serialise().dms[dmPath] ?? []).toHaveLength(0);
119
- });
120
- });
121
- //# sourceMappingURL=hub-todevice-routing.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hub-todevice-routing.integration.test.js","sourceRoot":"","sources":["../../src/test/hub-todevice-routing.integration.test.ts"],"names":[],"mappings":"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"}