agent-comms 1.31.0 → 1.32.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/mcp/index.d.ts.map +1 -1
- package/dist/bridges/mcp/index.js +3 -11
- package/dist/bridges/mcp/index.js.map +1 -1
- package/dist/core/bridge-mesh.d.ts +14 -0
- package/dist/core/bridge-mesh.d.ts.map +1 -0
- package/dist/core/bridge-mesh.js +19 -0
- package/dist/core/bridge-mesh.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/test/bridge-mesh.test.d.ts +5 -0
- package/dist/test/bridge-mesh.test.d.ts.map +1 -0
- package/dist/test/bridge-mesh.test.js +67 -0
- package/dist/test/bridge-mesh.test.js.map +1 -0
- package/dist/test/delivery-receipt.runner.d.ts +2 -7
- package/dist/test/delivery-receipt.runner.d.ts.map +1 -1
- package/dist/test/delivery-receipt.runner.js +4 -9
- package/dist/test/delivery-receipt.runner.js.map +1 -1
- package/package.json +4 -6
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/ExaDev/agent-comms)
|
|
4
4
|
[](https://www.npmjs.com/package/agent-comms)
|
|
5
|
-
[](https://github.com/ExaDev/agent-comms/releases/tag/v1.32.0)
|
|
6
6
|
[](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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bridges/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bridges/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAkFzC"}
|
|
@@ -9,24 +9,16 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
|
-
import {
|
|
13
|
-
import { TlsTransport } from "../../core/tls-transport.js";
|
|
14
|
-
import { loadOrCreateIdentity, } from "../../core/identity-store.js";
|
|
12
|
+
import { createBridgeMesh, buildAction, ensureRegistered, drainAndFormat, MCP_TOOL_PARAMS, } from "../../core/index.js";
|
|
15
13
|
import { tryStartWebServer } from "../user/web/server.js";
|
|
16
14
|
import { nanoid } from "../../core/nanoid.js";
|
|
17
15
|
function isRecord(value) {
|
|
18
16
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
19
17
|
}
|
|
20
18
|
export async function run() {
|
|
21
|
-
// Persistent identity for this slot: a stable
|
|
22
|
-
// ID survives restarts, so peers can keep targeting us. The stdio server
|
|
23
|
-
// has no graceful shutdown hook; a stale lock self-heals via the pid probe.
|
|
19
|
+
// Persistent identity for this slot: a stable device-id means the agent ID survives restarts, so peers can keep targeting us. The stdio server has no graceful shutdown hook; a stale lock self-heals via the pid probe.
|
|
24
20
|
const identitySlot = { harness: "mcp", cwd: process.cwd() };
|
|
25
|
-
const
|
|
26
|
-
const store = new MeshStore();
|
|
27
|
-
store.peerId = identity.fingerprint;
|
|
28
|
-
store.setTransport(new TlsTransport(store.events, identity));
|
|
29
|
-
const tool = new CommsTool(store, store.discovery);
|
|
21
|
+
const { store, tool } = createBridgeMesh(identitySlot);
|
|
30
22
|
let agentId;
|
|
31
23
|
const mcp = new McpServer({ name: "agent-comms", version: "1.1.0" }, { capabilities: {} });
|
|
32
24
|
// -----------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bridges/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bridges/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared bootstrap for a bridge's own mesh participation: load or create this bridge's persisted identity, construct a MeshStore wired to WireMeshTransport, and build the CommsTool that sits on top of it. Every bridge previously repeated this same four-line block against TlsTransport/identity.fingerprint directly; this factory is the single place that wiring lives now, so the substrate a bridge runs on is a one-line change here rather than six repeated ones.
|
|
3
|
+
*
|
|
4
|
+
* peerId is deviceIdToHex(identity.deviceId), not identity.fingerprint -- WireMeshTransport's own session bookkeeping is keyed by device-id, so MeshStore's own notion of "this peer's id" has to be the same value for the two to correlate. Every existing agent id changes the first time a bridge starts through this factory: there is no migration path, since the value is a hash of genuinely different bytes (device-id is SHA-256(raw public key); fingerprint is SHA-256(certificate DER)) -- a hard cutover, already established as correct when identity.ts first grew deviceId, not relitigated here.
|
|
5
|
+
*/
|
|
6
|
+
import { MeshStore } from "./mesh-store.js";
|
|
7
|
+
import { CommsTool } from "./tool.js";
|
|
8
|
+
import type { IdentitySlot } from "./identity-store.js";
|
|
9
|
+
export interface BridgeMesh {
|
|
10
|
+
store: MeshStore;
|
|
11
|
+
tool: CommsTool;
|
|
12
|
+
}
|
|
13
|
+
export declare function createBridgeMesh(slot: Readonly<IdentitySlot>, coordinatorPort?: number): BridgeMesh;
|
|
14
|
+
//# sourceMappingURL=bridge-mesh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-mesh.d.ts","sourceRoot":"","sources":["../../src/core/bridge-mesh.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,eAAe,CAAC,EAAE,MAAM,GACvB,UAAU,CAOZ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared bootstrap for a bridge's own mesh participation: load or create this bridge's persisted identity, construct a MeshStore wired to WireMeshTransport, and build the CommsTool that sits on top of it. Every bridge previously repeated this same four-line block against TlsTransport/identity.fingerprint directly; this factory is the single place that wiring lives now, so the substrate a bridge runs on is a one-line change here rather than six repeated ones.
|
|
3
|
+
*
|
|
4
|
+
* peerId is deviceIdToHex(identity.deviceId), not identity.fingerprint -- WireMeshTransport's own session bookkeeping is keyed by device-id, so MeshStore's own notion of "this peer's id" has to be the same value for the two to correlate. Every existing agent id changes the first time a bridge starts through this factory: there is no migration path, since the value is a hash of genuinely different bytes (device-id is SHA-256(raw public key); fingerprint is SHA-256(certificate DER)) -- a hard cutover, already established as correct when identity.ts first grew deviceId, not relitigated here.
|
|
5
|
+
*/
|
|
6
|
+
import { deviceIdToHex } from "@exadev/wire-mesh-core/domain/device-id";
|
|
7
|
+
import { MeshStore } from "./mesh-store.js";
|
|
8
|
+
import { CommsTool } from "./tool.js";
|
|
9
|
+
import { WireMeshTransport } from "./wire-mesh-transport.js";
|
|
10
|
+
import { loadOrCreateIdentity } from "./identity-store.js";
|
|
11
|
+
export function createBridgeMesh(slot, coordinatorPort) {
|
|
12
|
+
const identity = loadOrCreateIdentity(slot);
|
|
13
|
+
const store = new MeshStore(coordinatorPort);
|
|
14
|
+
store.peerId = deviceIdToHex(Uint8Array.from(identity.deviceId));
|
|
15
|
+
store.setTransport(new WireMeshTransport(store.events, identity));
|
|
16
|
+
const tool = new CommsTool(store, store.discovery);
|
|
17
|
+
return { store, tool };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=bridge-mesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-mesh.js","sourceRoot":"","sources":["../../src/core/bridge-mesh.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAQ3D,MAAM,UAAU,gBAAgB,CAC9B,IAA4B,EAC5B,eAAwB;IAExB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;IAC7C,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,YAAY,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export type { CommsStore } from "./comms-store.js";
|
|
|
8
8
|
export { FileStore, CommsError } from "./store.js";
|
|
9
9
|
export { MeshStore } from "./mesh-store.js";
|
|
10
10
|
export { CommsTool } from "./tool.js";
|
|
11
|
+
export { createBridgeMesh } from "./bridge-mesh.js";
|
|
12
|
+
export type { BridgeMesh } from "./bridge-mesh.js";
|
|
11
13
|
export type { CommsContext, CommsResult } from "./tool.js";
|
|
12
14
|
export { buildAction, formatDeliveryEvent, extractStreamingBehavior, isActionableEvent, ensureRegistered, ensureProjectRoom, drainAndFormat, MCP_TOOL_PARAMS, } from "./bridge.js";
|
|
13
15
|
export type { RegistrationResult } from "./bridge.js";
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,cAAc,YAAY,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,cAAc,YAAY,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
export { FileStore, CommsError } from "./store.js";
|
|
8
8
|
export { MeshStore } from "./mesh-store.js";
|
|
9
9
|
export { CommsTool } from "./tool.js";
|
|
10
|
+
export { createBridgeMesh } from "./bridge-mesh.js";
|
|
10
11
|
export { buildAction, formatDeliveryEvent, extractStreamingBehavior, isActionableEvent, ensureRegistered, ensureProjectRoom, drainAndFormat, MCP_TOOL_PARAMS, } from "./bridge.js";
|
|
11
12
|
export { generateVapidKeys } from "./vapid.js";
|
|
12
13
|
export { PushManager } from "./push-manager.js";
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,cAAc,YAAY,CAAC;AAM3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for createBridgeMesh -- the shared factory every bridge builds its own MeshStore/WireMeshTransport/CommsTool from, replacing the identical four-line block each of the six bridges used to repeat against TlsTransport directly.
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=bridge-mesh.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-mesh.test.d.ts","sourceRoot":"","sources":["../../src/test/bridge-mesh.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for createBridgeMesh -- the shared factory every bridge builds its own MeshStore/WireMeshTransport/CommsTool from, replacing the identical four-line block each of the six bridges used to repeat against TlsTransport directly.
|
|
3
|
+
*/
|
|
4
|
+
import * as assert from "node:assert/strict";
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { test } from "node:test";
|
|
9
|
+
import { deviceIdToHex } from "@exadev/wire-mesh-core/domain/device-id";
|
|
10
|
+
import { createBridgeMesh } from "../core/bridge-mesh.js";
|
|
11
|
+
import { loadOrCreateIdentity, } from "../core/identity-store.js";
|
|
12
|
+
import { waitFor } from "./test-transport.js";
|
|
13
|
+
function tempSlot(harness) {
|
|
14
|
+
const dir = fs.mkdtempSync(path.join(tmpdir(), "agent-comms-bridge-mesh-test-"));
|
|
15
|
+
return { harness, cwd: "/tmp/project", dir };
|
|
16
|
+
}
|
|
17
|
+
void test("createBridgeMesh sets peerId to deviceIdToHex(identity.deviceId), not the certificate fingerprint", async () => {
|
|
18
|
+
const slot = tempSlot("test-harness");
|
|
19
|
+
const identity = loadOrCreateIdentity(slot);
|
|
20
|
+
const { store } = createBridgeMesh(slot);
|
|
21
|
+
try {
|
|
22
|
+
assert.strictEqual(store.peerId, deviceIdToHex(Uint8Array.from(identity.deviceId)));
|
|
23
|
+
assert.notStrictEqual(store.peerId, identity.fingerprint);
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await store.shutdown();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
void test("createBridgeMesh wires a WireMeshTransport, not TlsTransport", async () => {
|
|
30
|
+
const slot = tempSlot("test-harness");
|
|
31
|
+
const { store } = createBridgeMesh(slot);
|
|
32
|
+
try {
|
|
33
|
+
// init() is the only way to prove the transport is actually usable end to end, which also confirms it's a WireMeshTransport by construction (createBridgeMesh only ever builds one).
|
|
34
|
+
await store.init();
|
|
35
|
+
assert.ok(store.connected);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await store.shutdown();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
void test("createBridgeMesh passes an explicit coordinatorPort through to MeshStore, forming one shared mesh", async () => {
|
|
42
|
+
const slotA = tempSlot("test-harness-a");
|
|
43
|
+
const slotB = tempSlot("test-harness-b");
|
|
44
|
+
const port = 20_900 + Math.floor(Math.random() * 100);
|
|
45
|
+
const a = createBridgeMesh(slotA, port);
|
|
46
|
+
const b = createBridgeMesh(slotB, port);
|
|
47
|
+
try {
|
|
48
|
+
await a.store.init();
|
|
49
|
+
await b.store.init();
|
|
50
|
+
assert.ok(a.store.connected);
|
|
51
|
+
assert.ok(b.store.connected);
|
|
52
|
+
await a.store.registerAgent({
|
|
53
|
+
name: "peer-a",
|
|
54
|
+
harness: "test-harness-a",
|
|
55
|
+
cwd: "/tmp/project",
|
|
56
|
+
pid: process.pid,
|
|
57
|
+
visibility: "visible",
|
|
58
|
+
tags: [],
|
|
59
|
+
});
|
|
60
|
+
await waitFor(() => b.store.serialise().agents[a.store.peerId] !== undefined, "b sees a's agent, proving both joined the same mesh on the shared coordinatorPort");
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await b.store.shutdown();
|
|
64
|
+
await a.store.shutdown();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=bridge-mesh.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-mesh.test.js","sourceRoot":"","sources":["../../src/test/bridge-mesh.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Delivery receipt test runner — runs each test case in an isolated child
|
|
4
|
-
* process. Tests MUST NOT be run from within a process that has the
|
|
5
|
-
* agent-comms extension loaded (e.g. pi's agent session), because the
|
|
6
|
-
* parent's active TCP handles interfere with child process forking.
|
|
3
|
+
* Delivery receipt test runner — runs each test case in an isolated child process. Tests MUST NOT be run from within a process that has the agent-comms extension loaded (e.g. pi's agent session), because the parent's active TCP handles interfere with child process forking.
|
|
7
4
|
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* pnpm test:delivery # from a clean shell (recommended)
|
|
10
|
-
* node dist/test/delivery-receipt.runner.js
|
|
5
|
+
* Usage: pnpm test:delivery # from a clean shell (recommended) tsx src/test/delivery-receipt.runner.ts
|
|
11
6
|
*/
|
|
12
7
|
export {};
|
|
13
8
|
//# sourceMappingURL=delivery-receipt.runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-receipt.runner.d.ts","sourceRoot":"","sources":["../../src/test/delivery-receipt.runner.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"delivery-receipt.runner.d.ts","sourceRoot":"","sources":["../../src/test/delivery-receipt.runner.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Delivery receipt test runner — runs each test case in an isolated child
|
|
4
|
-
* process. Tests MUST NOT be run from within a process that has the
|
|
5
|
-
* agent-comms extension loaded (e.g. pi's agent session), because the
|
|
6
|
-
* parent's active TCP handles interfere with child process forking.
|
|
3
|
+
* Delivery receipt test runner — runs each test case in an isolated child process. Tests MUST NOT be run from within a process that has the agent-comms extension loaded (e.g. pi's agent session), because the parent's active TCP handles interfere with child process forking.
|
|
7
4
|
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* pnpm test:delivery # from a clean shell (recommended)
|
|
10
|
-
* node dist/test/delivery-receipt.runner.js
|
|
5
|
+
* Usage: pnpm test:delivery # from a clean shell (recommended) tsx src/test/delivery-receipt.runner.ts
|
|
11
6
|
*/
|
|
12
7
|
import { execFileSync } from "node:child_process";
|
|
13
8
|
import * as path from "node:path";
|
|
14
9
|
import * as url from "node:url";
|
|
15
10
|
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
|
|
16
|
-
const HELPER = path.join(__dirname, "delivery-receipt.helper.
|
|
11
|
+
const HELPER = path.join(__dirname, "delivery-receipt.helper.ts");
|
|
17
12
|
const tests = [
|
|
18
13
|
"push-room",
|
|
19
14
|
"push-dm",
|
|
@@ -26,7 +21,7 @@ const tests = [
|
|
|
26
21
|
let failed = false;
|
|
27
22
|
for (const t of tests) {
|
|
28
23
|
try {
|
|
29
|
-
const stdout = execFileSync(process.execPath, [HELPER, t], {
|
|
24
|
+
const stdout = execFileSync(process.execPath, ["--import", "tsx", HELPER, t], {
|
|
30
25
|
timeout: 15_000,
|
|
31
26
|
stdio: ["pipe", "pipe", "pipe"],
|
|
32
27
|
encoding: "utf-8",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-receipt.runner.js","sourceRoot":"","sources":["../../src/test/delivery-receipt.runner.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"delivery-receipt.runner.js","sourceRoot":"","sources":["../../src/test/delivery-receipt.runner.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;AAElE,MAAM,KAAK,GAAG;IACZ,WAAW;IACX,SAAS;IACT,YAAY;IACZ,UAAU;IACV,mBAAmB;IACnB,oBAAoB;IACpB,cAAc;CACf,CAAC;AAEF,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CACzB,OAAO,CAAC,QAAQ,EAChB,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAC9B;YACE,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,QAAQ,EAAE,OAAO;SAClB,CACF,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GACP,CAAC,YAAY,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YACjE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO;YAC9B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC/B,MAAM,GAAG,IAAI,CAAC;QACd,MAAM;IACR,CAAC;AACH,CAAC;AAED,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.32.0",
|
|
4
4
|
"description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.33.0",
|
|
@@ -52,11 +52,9 @@
|
|
|
52
52
|
"generate:server-json": "tsx scripts/sync-release-metadata.ts",
|
|
53
53
|
"publish:mcp-registry": "tsx scripts/publish-mcp-registry.ts",
|
|
54
54
|
"lint": "eslint .",
|
|
55
|
-
"test": "
|
|
56
|
-
"test:
|
|
57
|
-
"test:
|
|
58
|
-
"test:federation": "node dist/test/federation.integration.test.js",
|
|
59
|
-
"test:all": "pnpm test && pnpm test:delivery && pnpm test:federation",
|
|
55
|
+
"test": "tsx --test --test-concurrency=1 'src/test/**/*.test.ts'",
|
|
56
|
+
"test:delivery": "tsx src/test/delivery-receipt.runner.ts",
|
|
57
|
+
"test:all": "pnpm test && pnpm test:delivery",
|
|
60
58
|
"test:frontend": "tsx --test src/bridges/user/web/frontend/test/**/*.unit.test.ts",
|
|
61
59
|
"test:e2e": "playwright test",
|
|
62
60
|
"typecheck": "tsc --noEmit"
|