agent-comms 1.28.0 → 1.28.1

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 (67) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/core/comms-store.d.ts +4 -37
  5. package/dist/core/comms-store.d.ts.map +1 -1
  6. package/dist/core/comms-store.js +3 -3
  7. package/dist/core/mesh-store.d.ts +12 -3
  8. package/dist/core/mesh-store.d.ts.map +1 -1
  9. package/dist/core/mesh-store.js +52 -33
  10. package/dist/core/mesh-store.js.map +1 -1
  11. package/dist/core/store.d.ts +1 -27
  12. package/dist/core/store.d.ts.map +1 -1
  13. package/dist/core/store.js +0 -62
  14. package/dist/core/store.js.map +1 -1
  15. package/dist/core/tls-transport.d.ts +12 -9
  16. package/dist/core/tls-transport.d.ts.map +1 -1
  17. package/dist/core/tls-transport.js +62 -25
  18. package/dist/core/tls-transport.js.map +1 -1
  19. package/dist/core/tool.d.ts +34 -5
  20. package/dist/core/tool.d.ts.map +1 -1
  21. package/dist/core/tool.js +41 -0
  22. package/dist/core/tool.js.map +1 -1
  23. package/dist/core/wire-protocol.d.ts +3 -2
  24. package/dist/core/wire-protocol.d.ts.map +1 -1
  25. package/dist/core/wire-protocol.js +3 -2
  26. package/dist/core/wire-protocol.js.map +1 -1
  27. package/dist/test/approval.integration.test.js +320 -285
  28. package/dist/test/approval.integration.test.js.map +1 -1
  29. package/dist/test/become-coordinator-actual-port.integration.test.js +0 -19
  30. package/dist/test/become-coordinator-actual-port.integration.test.js.map +1 -1
  31. package/dist/test/coordinator-socket-error.integration.test.js +2 -0
  32. package/dist/test/coordinator-socket-error.integration.test.js.map +1 -1
  33. package/dist/test/delivery-receipt.helper.js +15 -0
  34. package/dist/test/delivery-receipt.helper.js.map +1 -1
  35. package/dist/test/downtime-replay.test.js +5 -2
  36. package/dist/test/downtime-replay.test.js.map +1 -1
  37. package/dist/test/federation.integration.test.js +2 -0
  38. package/dist/test/federation.integration.test.js.map +1 -1
  39. package/dist/test/listener-policy.integration.test.js +214 -158
  40. package/dist/test/listener-policy.integration.test.js.map +1 -1
  41. package/dist/test/mesh-e2e.integration.test.js +2 -0
  42. package/dist/test/mesh-e2e.integration.test.js.map +1 -1
  43. package/dist/test/mesh-smoke.integration.test.d.ts +2 -4
  44. package/dist/test/mesh-smoke.integration.test.d.ts.map +1 -1
  45. package/dist/test/mesh-smoke.integration.test.js +28 -5
  46. package/dist/test/mesh-smoke.integration.test.js.map +1 -1
  47. package/dist/test/state-sync-convergence.test.js +5 -2
  48. package/dist/test/state-sync-convergence.test.js.map +1 -1
  49. package/dist/test/test-transport.d.ts +8 -0
  50. package/dist/test/test-transport.d.ts.map +1 -0
  51. package/dist/test/test-transport.js +29 -0
  52. package/dist/test/test-transport.js.map +1 -0
  53. package/dist/test/visibility.integration.test.js +6 -0
  54. package/dist/test/visibility.integration.test.js.map +1 -1
  55. package/package.json +2 -2
  56. package/dist/core/tcp-transport.d.ts +0 -85
  57. package/dist/core/tcp-transport.d.ts.map +0 -1
  58. package/dist/core/tcp-transport.js +0 -659
  59. package/dist/core/tcp-transport.js.map +0 -1
  60. package/dist/core/ws-transport.d.ts +0 -79
  61. package/dist/core/ws-transport.d.ts.map +0 -1
  62. package/dist/core/ws-transport.js +0 -622
  63. package/dist/core/ws-transport.js.map +0 -1
  64. package/dist/test/ws-broadcast-window.integration.test.d.ts +0 -7
  65. package/dist/test/ws-broadcast-window.integration.test.d.ts.map +0 -1
  66. package/dist/test/ws-broadcast-window.integration.test.js +0 -94
  67. package/dist/test/ws-broadcast-window.integration.test.js.map +0 -1
@@ -15,7 +15,7 @@
15
15
  "url": "https://github.com/ExaDev/agent-comms.git"
16
16
  },
17
17
  "description": "Cross-harness LLM agent communication mesh — rooms, DMs, and presence",
18
- "version": "1.28.0"
18
+ "version": "1.28.1"
19
19
  }
20
20
  ]
21
21
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-comms",
3
3
  "description": "Cross-harness LLM agent communication mesh — rooms, DMs, and presence",
4
- "version": "1.28.0",
4
+ "version": "1.28.1",
5
5
  "author": {
6
6
  "name": "ExaDev"
7
7
  },
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![GitHub](https://img.shields.io/badge/GitHub-181717?logo=github&logoColor=white)](https://github.com/ExaDev/agent-comms)
4
4
  [![npm](https://img.shields.io/badge/npm-CB3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/agent-comms)
5
- [![version](https://img.shields.io/badge/version-1.28.0-blue)](https://github.com/ExaDev/agent-comms/releases/tag/v1.28.0)
5
+ [![version](https://img.shields.io/badge/version-1.28.1-blue)](https://github.com/ExaDev/agent-comms/releases/tag/v1.28.1)
6
6
  [![CI](https://img.shields.io/github/actions/workflow/status/ExaDev/agent-comms/ci.yml?branch=main)](https://github.com/ExaDev/agent-comms/actions)
7
7
 
8
8
  Cross-harness communication mesh for LLM agents: rooms, DMs, presence, and visibility over TCP with zero filesystem dependencies.
@@ -1,15 +1,13 @@
1
1
  /**
2
2
  * CommsStore — abstract interface for the agent communication store.
3
3
  *
4
- * Two implementations:
5
- * FileStore — filesystem-backed, no server process (fallback)
6
- * MeshStore — TCP peer mesh, in-memory, real-time push (preferred)
4
+ * Two implementations: FileStore — filesystem-backed, no server process (fallback) MeshStore — TCP peer mesh, in-memory, real-time push (preferred)
7
5
  *
8
6
  * Bridges depend on this interface, not on a specific implementation.
7
+ *
8
+ * Deliberately excludes listener management, federation, and connection approval: those are transport concerns MeshStore alone can support -- FileStore has no network transport to manage listeners on, federate through, or approve inbound connections for. Widening this interface to cover them (as it once did, via always-throwing FileStore stubs) is what forced server.ts and the bridge controller to reach past CommsStore into the concrete MeshStore anyway; CommsTool, the one consumer that genuinely needs to expose these when a MeshStore backs it, takes them as an optional extension (see MeshOnlyFeatures in tool.ts) rather than the shared interface pretending every implementation supports them.
9
9
  */
10
- import type { AgentIdentity, DeliveryEvent, DmMessage, NetworkInterface, Room, RoomMessage, RoomType, StreamingBehavior, Visibility } from "./types.js";
11
- import type { ListenerInfo } from "./transport.js";
12
- import type { FedLink } from "./federation.js";
10
+ import type { AgentIdentity, DeliveryEvent, DmMessage, Room, RoomMessage, RoomType, StreamingBehavior, Visibility } from "./types.js";
13
11
  export interface CommsStore {
14
12
  readIdentity(harness: string, cwd: string): Promise<{
15
13
  id: string;
@@ -46,37 +44,6 @@ export interface CommsStore {
46
44
  sendDm(from: string, to: string, content: string, streamingBehavior?: StreamingBehavior): Promise<DmMessage>;
47
45
  deliver(agentId: string, event: DeliveryEvent): Promise<void>;
48
46
  drainDelivery(agentId: string): Promise<DeliveryEvent[]>;
49
- addListener(host: string, port: number, policy: string): Promise<string>;
50
- removeListener(id: string): Promise<void>;
51
- listListeners(): ListenerInfo[];
52
- getNetworkInterfaces(): NetworkInterface[];
53
- fedConnect(host: string, port: number, name?: string): Promise<string>;
54
- fedDisconnect(linkId: string): Promise<void>;
55
- fedLinks(): FedLink[];
56
- /** This instance's own federation TLS fingerprint, to hand to an operator on the other side to pin. */
57
- getFederationFingerprint(): string;
58
- /** Pin a remote mesh's certificate fingerprint as trusted for federation, inbound or outbound. */
59
- fedTrust(fingerprint: string): Promise<void>;
60
- /** Remove a previously pinned federation fingerprint. */
61
- fedUntrust(fingerprint: string): Promise<void>;
62
- /** List currently trusted federation fingerprints. */
63
- fedTrustedFingerprints(): string[];
64
- /** Start accepting inbound federation links on host:port. Rejects any connection whose certificate isn't pinned via fedTrust(). */
65
- fedListen(host: string, port: number): Promise<void>;
66
- /** Stop accepting new inbound federation connections. Existing links are unaffected. */
67
- fedStopListening(): Promise<void>;
68
- acceptConnection(connectionId: string): Promise<void>;
69
- rejectConnection(connectionId: string, reason: string): Promise<void>;
70
- listPendingConnections(): {
71
- connectionId: string;
72
- peerId: string;
73
- dataPort: number;
74
- name: string;
75
- fingerprint: string;
76
- }[];
77
- connectToRemote(host: string, port: number): Promise<void>;
78
- /** Start only the data server without connecting to a coordinator. */
79
- startDataServerOnly(): Promise<void>;
80
47
  init(): Promise<void>;
81
48
  }
82
49
  //# sourceMappingURL=comms-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"comms-store.d.ts","sourceRoot":"","sources":["../../src/core/comms-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comms-store.d.ts","sourceRoot":"","sources":["../../src/core/comms-store.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * CommsStore — abstract interface for the agent communication store.
3
3
  *
4
- * Two implementations:
5
- * FileStore — filesystem-backed, no server process (fallback)
6
- * MeshStore — TCP peer mesh, in-memory, real-time push (preferred)
4
+ * Two implementations: FileStore — filesystem-backed, no server process (fallback) MeshStore — TCP peer mesh, in-memory, real-time push (preferred)
7
5
  *
8
6
  * Bridges depend on this interface, not on a specific implementation.
7
+ *
8
+ * Deliberately excludes listener management, federation, and connection approval: those are transport concerns MeshStore alone can support -- FileStore has no network transport to manage listeners on, federate through, or approve inbound connections for. Widening this interface to cover them (as it once did, via always-throwing FileStore stubs) is what forced server.ts and the bridge controller to reach past CommsStore into the concrete MeshStore anyway; CommsTool, the one consumer that genuinely needs to expose these when a MeshStore backs it, takes them as an optional extension (see MeshOnlyFeatures in tool.ts) rather than the shared interface pretending every implementation supports them.
9
9
  */
10
10
  export {};
11
11
  //# sourceMappingURL=comms-store.js.map
@@ -7,8 +7,11 @@
7
7
  * Delivery events are pushed directly over the transport — no polling,
8
8
  * no filesystem.
9
9
  *
10
- * Transport is injected via the constructor. TcpTransport for localhost
11
- * TCP, TlsTransport for encrypted connections, etc.
10
+ * Transport is set via setTransport() (e.g. TlsTransport for encrypted
11
+ * connections) before init() or any other transport-using method is called
12
+ * -- there is no default, since every real bridge builds its own transport
13
+ * from this store's own events getter, which needs the store to already
14
+ * exist.
12
15
  */
13
16
  import type { SerialisedState } from "./wire-protocol.js";
14
17
  import { DiscoveryManager } from "./discovery.js";
@@ -41,6 +44,10 @@ export declare class MeshStore implements CommsStore {
41
44
  onDelivery: ((agentId: string, event: DeliveryEvent) => void | Promise<void>) | undefined;
42
45
  /** Fires for every state patch — both locally generated and remote. */
43
46
  onPatch: ((patch: MeshStatePatch) => void | Promise<void>) | undefined;
47
+ /**
48
+ * Fires for a transport-level error a caller may want to observe (a connection rejected for presenting a certificate that doesn't match its claimed peer ID, this store's own inability to join or create a mesh, etc). Previously wired to `this.events.onError` inside this class's own methods, but the `events` getter never actually implemented `onError` on the object it returns, so every one of those calls was silently a no-op -- this store had no way to observe its own transport failures at all. Left undefined by default (matching onDelivery/onPatch): a caller that wants visibility sets it, exactly like those two.
49
+ */
50
+ onError: ((error: Error) => void) | undefined;
44
51
  /** Serialise the full mesh state for state_sync messages. */
45
52
  serialise(): SerialisedState;
46
53
  private lastLocalDeliveryKey;
@@ -48,8 +55,10 @@ export declare class MeshStore implements CommsStore {
48
55
  discovery: DiscoveryManager;
49
56
  federation: FederationManager;
50
57
  constructor(coordinatorPort?: number);
51
- /** Replace the transport (e.g. with TlsTransport for encrypted connections). */
58
+ /** Sets the transport (e.g. TlsTransport for encrypted connections). Must be called before init() or any other transport-using method. */
52
59
  setTransport(transport: MeshTransport): void;
60
+ /** The set transport, or throws if setTransport() hasn't been called yet -- the single place every transport-using method reads through, so the "must call setTransport() first" contract is enforced at one boundary rather than checked ad hoc at each call site. */
61
+ private requireTransport;
53
62
  init(): Promise<void>;
54
63
  private handlePeerList;
55
64
  private handlePeerJoined;
@@ -1 +1 @@
1
- {"version":3,"file":"mesh-store.d.ts","sourceRoot":"","sources":["../../src/core/mesh-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mesh-store.d.ts","sourceRoot":"","sources":["../../src/core/mesh-store.ts"],"names":[],"mappings":"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"}
@@ -7,13 +7,15 @@
7
7
  * Delivery events are pushed directly over the transport — no polling,
8
8
  * no filesystem.
9
9
  *
10
- * Transport is injected via the constructor. TcpTransport for localhost
11
- * TCP, TlsTransport for encrypted connections, etc.
10
+ * Transport is set via setTransport() (e.g. TlsTransport for encrypted
11
+ * connections) before init() or any other transport-using method is called
12
+ * -- there is no default, since every real bridge builds its own transport
13
+ * from this store's own events getter, which needs the store to already
14
+ * exist.
12
15
  */
13
16
  import * as os from "node:os";
14
17
  import { nanoid } from "./nanoid.js";
15
18
  import { CommsError } from "./store.js";
16
- import { TcpTransport } from "./tcp-transport.js";
17
19
  import { dmKey, normaliseWireState } from "./wire-protocol.js";
18
20
  import { DiscoveryManager } from "./discovery.js";
19
21
  import { MdnsDiscoveryBackend } from "./discovery-mdns.js";
@@ -72,13 +74,18 @@ export class MeshStore {
72
74
  pendingMarkReadTimers = [];
73
75
  /** Whether the mesh has a live coordinator connection. */
74
76
  get connected() {
75
- return (this.transport.isCoordinator || this.transport.hasCoordinatorConnection);
77
+ return (this.requireTransport().isCoordinator ||
78
+ this.requireTransport().hasCoordinatorConnection);
76
79
  }
77
80
  // -- Pending inbound connections awaiting approval --
78
81
  pendingInboundConnections = new Map();
79
82
  onDelivery;
80
83
  /** Fires for every state patch — both locally generated and remote. */
81
84
  onPatch;
85
+ /**
86
+ * Fires for a transport-level error a caller may want to observe (a connection rejected for presenting a certificate that doesn't match its claimed peer ID, this store's own inability to join or create a mesh, etc). Previously wired to `this.events.onError` inside this class's own methods, but the `events` getter never actually implemented `onError` on the object it returns, so every one of those calls was silently a no-op -- this store had no way to observe its own transport failures at all. Left undefined by default (matching onDelivery/onPatch): a caller that wants visibility sets it, exactly like those two.
87
+ */
88
+ onError;
82
89
  /** Serialise the full mesh state for state_sync messages. */
83
90
  serialise() {
84
91
  return {
@@ -97,9 +104,6 @@ export class MeshStore {
97
104
  this.peerId = nanoid(8);
98
105
  this.startedAt = new Date().toISOString();
99
106
  this.coordinatorPort = coordinatorPort;
100
- // Wire up transport with this store's event handlers.
101
- // TcpTransport is the default; callers can replace via setTransport().
102
- this.transport = new TcpTransport(this.events);
103
107
  // Discovery manager — registers available backends
104
108
  this.discovery = new DiscoveryManager();
105
109
  this.discovery.registerBackend(new MdnsDiscoveryBackend());
@@ -116,10 +120,17 @@ export class MeshStore {
116
120
  getFederatedRoomMemberships: () => this.getFederatedRoomMembershipsForFed(),
117
121
  });
118
122
  }
119
- /** Replace the transport (e.g. with TlsTransport for encrypted connections). */
123
+ /** Sets the transport (e.g. TlsTransport for encrypted connections). Must be called before init() or any other transport-using method. */
120
124
  setTransport(transport) {
121
125
  this.transport = transport;
122
126
  }
127
+ /** The set transport, or throws if setTransport() hasn't been called yet -- the single place every transport-using method reads through, so the "must call setTransport() first" contract is enforced at one boundary rather than checked ad hoc at each call site. */
128
+ requireTransport() {
129
+ if (this.transport === undefined) {
130
+ throw new Error("MeshStore: no transport set; call setTransport() before using the store");
131
+ }
132
+ return this.transport;
133
+ }
123
134
  // -----------------------------------------------------------------------
124
135
  // Mesh lifecycle
125
136
  // -----------------------------------------------------------------------
@@ -127,11 +138,11 @@ export class MeshStore {
127
138
  if (this.initialised)
128
139
  return;
129
140
  this.initialised = true;
130
- await this.transport.startDataServer();
141
+ await this.requireTransport().startDataServer();
131
142
  // Register our own peer info
132
143
  this.peerInfo.set(this.peerId, {
133
144
  id: this.peerId,
134
- port: this.transport.dataPort,
145
+ port: this.requireTransport().dataPort,
135
146
  startedAt: this.startedAt,
136
147
  });
137
148
  // Try joining an existing mesh; fall back to becoming coordinator.
@@ -144,12 +155,12 @@ export class MeshStore {
144
155
  // cache bug), so we only try once.
145
156
  let connected = false;
146
157
  try {
147
- await this.transport.connectToCoordinator(COORDINATOR_HOST, this.coordinatorPort, this.peerId, this.transport.dataPort);
158
+ await this.requireTransport().connectToCoordinator(COORDINATOR_HOST, this.coordinatorPort, this.peerId, this.requireTransport().dataPort);
148
159
  connected = true;
149
160
  }
150
161
  catch {
151
162
  try {
152
- await this.transport.becomeCoordinator(COORDINATOR_HOST, this.coordinatorPort);
163
+ await this.requireTransport().becomeCoordinator(COORDINATOR_HOST, this.coordinatorPort);
153
164
  this.startStaleCheck();
154
165
  connected = true;
155
166
  }
@@ -166,7 +177,7 @@ export class MeshStore {
166
177
  "Running without mesh — agent-comms will be unavailable."));
167
178
  return;
168
179
  }
169
- this.transport.unref();
180
+ this.requireTransport().unref();
170
181
  }
171
182
  // -----------------------------------------------------------------------
172
183
  // TransportEvents — callbacks from the transport layer
@@ -174,12 +185,17 @@ export class MeshStore {
174
185
  handlePeerList(peers) {
175
186
  for (const peer of peers) {
176
187
  this.peerInfo.set(peer.id, peer);
177
- void this.transport.connectToPeer(peer, this.peerId);
188
+ // The list always includes this store's own entry — dialling yourself is a wasted connection attempt (and, on some platforms, an immediate self-inflicted ECONNRESET) that never needs to happen.
189
+ if (peer.id === this.peerId)
190
+ continue;
191
+ void this.requireTransport().connectToPeer(peer, this.peerId);
178
192
  }
179
193
  }
180
194
  handlePeerJoined(peer) {
181
195
  this.peerInfo.set(peer.id, peer);
182
- void this.transport.connectToPeer(peer, this.peerId);
196
+ if (peer.id === this.peerId)
197
+ return;
198
+ void this.requireTransport().connectToPeer(peer, this.peerId);
183
199
  }
184
200
  async handleIntroduction(handle, msg) {
185
201
  const newPeer = {
@@ -193,18 +209,18 @@ export class MeshStore {
193
209
  method: "peer_list",
194
210
  peers: [...this.peerInfo.values()],
195
211
  };
196
- await this.transport.send(handle, peerList);
212
+ await this.requireTransport().send(handle, peerList);
197
213
  // Broadcast arrival to all existing peers
198
214
  const joined = { method: "peer_joined", peer: newPeer };
199
- await this.transport.broadcast(joined);
215
+ await this.requireTransport().broadcast(joined);
200
216
  // Connect to the new peer's data server
201
- void this.transport.connectToPeer(newPeer, this.peerId);
217
+ void this.requireTransport().connectToPeer(newPeer, this.peerId);
202
218
  }
203
219
  async handlePeerConnected(handle, _info) {
204
220
  // If we have state and the peer doesn't, send state sync
205
221
  if (this.agents.size > 0) {
206
222
  const state = this.serialise();
207
- await this.transport.send(handle, {
223
+ await this.requireTransport().send(handle, {
208
224
  method: "state_sync",
209
225
  state,
210
226
  });
@@ -304,11 +320,11 @@ export class MeshStore {
304
320
  }
305
321
  async handleBecomeCoordinator(peerList) {
306
322
  // Take over as coordinator using the data server we already have
307
- await this.transport.becomeCoordinator(COORDINATOR_HOST, this.coordinatorPort);
323
+ await this.requireTransport().becomeCoordinator(COORDINATOR_HOST, this.coordinatorPort);
308
324
  this.peerInfo.clear();
309
325
  for (const peer of peerList) {
310
326
  this.peerInfo.set(peer.id, peer);
311
- void this.transport.connectToPeer(peer, this.peerId);
327
+ void this.requireTransport().connectToPeer(peer, this.peerId);
312
328
  }
313
329
  this.startStaleCheck();
314
330
  }
@@ -348,7 +364,7 @@ export class MeshStore {
348
364
  }
349
365
  this.pendingInboundConnections.delete(connectionId);
350
366
  const handle = { id: connectionId };
351
- await this.transport.acceptConnection(handle);
367
+ await this.requireTransport().acceptConnection(handle);
352
368
  }
353
369
  /** Reject a pending inbound connection. */
354
370
  async rejectConnection(connectionId, reason) {
@@ -358,7 +374,7 @@ export class MeshStore {
358
374
  }
359
375
  this.pendingInboundConnections.delete(connectionId);
360
376
  const handle = { id: connectionId };
361
- await this.transport.rejectConnection(handle, reason);
377
+ await this.requireTransport().rejectConnection(handle, reason);
362
378
  }
363
379
  /** List all pending inbound connections awaiting approval. */
364
380
  listPendingConnections() {
@@ -375,8 +391,8 @@ export class MeshStore {
375
391
  // Fire-and-forget: don't await the full approval handshake.
376
392
  // The coordinator will either accept (triggering normal introduction flow)
377
393
  // or reject (closing the socket). Handle rejection to avoid unhandled rejection.
378
- this.transport
379
- .connectToRemote(host, port, this.peerId, this.transport.dataPort, agent?.name ?? "", "")
394
+ this.requireTransport()
395
+ .connectToRemote(host, port, this.peerId, this.requireTransport().dataPort, agent?.name ?? "", "")
380
396
  .catch(() => {
381
397
  // Rejection is expected when the coordinator denies the connection.
382
398
  // Log silently — the calling tool already returned success.
@@ -386,13 +402,13 @@ export class MeshStore {
386
402
  /** Start only the data server without connecting to a coordinator.
387
403
  * Used for testing scenarios where the peer connects via connectToRemote. */
388
404
  async startDataServerOnly() {
389
- await this.transport.startDataServer();
405
+ await this.requireTransport().startDataServer();
390
406
  this.peerInfo.set(this.peerId, {
391
407
  id: this.peerId,
392
- port: this.transport.dataPort,
408
+ port: this.requireTransport().dataPort,
393
409
  startedAt: this.startedAt,
394
410
  });
395
- this.transport.unref();
411
+ this.requireTransport().unref();
396
412
  }
397
413
  // -----------------------------------------------------------------------
398
414
  // Transport events accessor (for bridges to wire up)
@@ -424,6 +440,9 @@ export class MeshStore {
424
440
  onConnectionRequest: (handle, request) => {
425
441
  this.handleConnectionRequest(handle, request);
426
442
  },
443
+ onError: (error) => {
444
+ this.onError?.(error);
445
+ },
427
446
  };
428
447
  }
429
448
  /** Append to a target agent's delivery queue, bounded oldest-first (#28). */
@@ -603,7 +622,7 @@ export class MeshStore {
603
622
  // Broadcast
604
623
  // -----------------------------------------------------------------------
605
624
  async broadcastPatch(patch) {
606
- await this.transport.broadcast({ method: "state_update", patch });
625
+ await this.requireTransport().broadcast({ method: "state_update", patch });
607
626
  if (this.onPatch) {
608
627
  await this.onPatch(patch);
609
628
  }
@@ -1267,13 +1286,13 @@ export class MeshStore {
1267
1286
  if (!isListenerPolicy(policy)) {
1268
1287
  throw new CommsError(`Invalid policy "${policy}"`, "INVALID_POLICY");
1269
1288
  }
1270
- return this.transport.addListener(host, port, policy);
1289
+ return this.requireTransport().addListener(host, port, policy);
1271
1290
  }
1272
1291
  async removeListener(id) {
1273
- return this.transport.removeListener(id);
1292
+ return this.requireTransport().removeListener(id);
1274
1293
  }
1275
1294
  listListeners() {
1276
- return this.transport.listListeners();
1295
+ return this.requireTransport().listListeners();
1277
1296
  }
1278
1297
  getNetworkInterfaces() {
1279
1298
  const interfaces = os.networkInterfaces();
@@ -1446,7 +1465,7 @@ export class MeshStore {
1446
1465
  }
1447
1466
  this.stopStaleCheck();
1448
1467
  await this.federation.shutdown();
1449
- await this.transport.shutdown();
1468
+ await this.requireTransport().shutdown();
1450
1469
  }
1451
1470
  }
1452
1471
  //# sourceMappingURL=mesh-store.js.map