agent-comms 1.26.1 → 1.27.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/core/comms-store.d.ts +12 -0
- package/dist/core/comms-store.d.ts.map +1 -1
- package/dist/core/federation.d.ts +25 -0
- package/dist/core/federation.d.ts.map +1 -1
- package/dist/core/federation.js +93 -1
- package/dist/core/federation.js.map +1 -1
- package/dist/core/identity.d.ts +4 -0
- package/dist/core/identity.d.ts.map +1 -1
- package/dist/core/identity.js +6 -0
- package/dist/core/identity.js.map +1 -1
- package/dist/core/mesh-store.d.ts +6 -0
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +21 -0
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/store.d.ts +6 -0
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +42 -14
- package/dist/core/store.js.map +1 -1
- package/dist/core/tool.d.ts +6 -0
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +88 -0
- package/dist/core/tool.js.map +1 -1
- package/dist/core/types.d.ts +32 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +16 -0
- package/dist/core/types.js.map +1 -1
- package/dist/test/federation.integration.test.d.ts +8 -7
- package/dist/test/federation.integration.test.d.ts.map +1 -1
- package/dist/test/federation.integration.test.js +28 -61
- package/dist/test/federation.integration.test.js.map +1 -1
- package/dist/test/filestore.test.d.ts +5 -0
- package/dist/test/filestore.test.d.ts.map +1 -0
- package/dist/test/filestore.test.js +136 -0
- package/dist/test/filestore.test.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the FileStore, the filesystem-backed legacy store exported from the public API. Covers the membership operation maps (a pending invite must survive an unrelated join, #35) and record parsing (an unparseable record must surface, not read as an empty mesh, #32).
|
|
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 { FileStore } from "../core/store.js";
|
|
10
|
+
function tempStore() {
|
|
11
|
+
const root = fs.mkdtempSync(path.join(tmpdir(), "agent-comms-filestore-"));
|
|
12
|
+
return new FileStore(root);
|
|
13
|
+
}
|
|
14
|
+
void test("a pending invite survives an unrelated join to the room", async () => {
|
|
15
|
+
const store = tempStore();
|
|
16
|
+
const owner = await store.registerAgent({
|
|
17
|
+
name: "owner",
|
|
18
|
+
harness: "pi",
|
|
19
|
+
cwd: "/tmp/p",
|
|
20
|
+
pid: process.pid,
|
|
21
|
+
visibility: "visible",
|
|
22
|
+
tags: [],
|
|
23
|
+
});
|
|
24
|
+
const invitee = await store.registerAgent({
|
|
25
|
+
name: "invitee",
|
|
26
|
+
harness: "claude-code",
|
|
27
|
+
cwd: "/tmp/i",
|
|
28
|
+
pid: process.pid,
|
|
29
|
+
visibility: "visible",
|
|
30
|
+
tags: [],
|
|
31
|
+
});
|
|
32
|
+
const other = await store.registerAgent({
|
|
33
|
+
name: "other",
|
|
34
|
+
harness: "codex",
|
|
35
|
+
cwd: "/tmp/o",
|
|
36
|
+
pid: process.pid,
|
|
37
|
+
visibility: "visible",
|
|
38
|
+
tags: [],
|
|
39
|
+
});
|
|
40
|
+
await store.createRoom({
|
|
41
|
+
name: "room",
|
|
42
|
+
type: "public",
|
|
43
|
+
owner: owner.id,
|
|
44
|
+
description: "x",
|
|
45
|
+
});
|
|
46
|
+
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
47
|
+
assert.deepEqual((await store.getRoom("room"))?.invited, [invitee.id]);
|
|
48
|
+
// Any later join re-derives the invited view from the operation maps; the pending invite must survive it (#35).
|
|
49
|
+
await store.joinRoom("room", other.id);
|
|
50
|
+
assert.deepEqual((await store.getRoom("room"))?.invited, [invitee.id]);
|
|
51
|
+
});
|
|
52
|
+
void test("declining and kicking clear the invited view consistently", async () => {
|
|
53
|
+
const store = tempStore();
|
|
54
|
+
const owner = await store.registerAgent({
|
|
55
|
+
name: "owner",
|
|
56
|
+
harness: "pi",
|
|
57
|
+
cwd: "/tmp/p",
|
|
58
|
+
pid: process.pid,
|
|
59
|
+
visibility: "visible",
|
|
60
|
+
tags: [],
|
|
61
|
+
});
|
|
62
|
+
const invitee = await store.registerAgent({
|
|
63
|
+
name: "invitee",
|
|
64
|
+
harness: "claude-code",
|
|
65
|
+
cwd: "/tmp/i",
|
|
66
|
+
pid: process.pid,
|
|
67
|
+
visibility: "visible",
|
|
68
|
+
tags: [],
|
|
69
|
+
});
|
|
70
|
+
await store.createRoom({
|
|
71
|
+
name: "room",
|
|
72
|
+
type: "private",
|
|
73
|
+
owner: owner.id,
|
|
74
|
+
description: "x",
|
|
75
|
+
});
|
|
76
|
+
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
77
|
+
await store.declineInvite("room", invitee.id, "not now");
|
|
78
|
+
const declined = await store.getRoom("room");
|
|
79
|
+
assert.deepEqual(declined?.invited, []);
|
|
80
|
+
// Re-inviting after a decline works: the new join op outranks the leave.
|
|
81
|
+
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
82
|
+
assert.deepEqual((await store.getRoom("room"))?.invited, [invitee.id]);
|
|
83
|
+
await store.kickFromRoom("room", invitee.id, owner.id);
|
|
84
|
+
assert.deepEqual((await store.getRoom("room"))?.invited, []);
|
|
85
|
+
assert.equal((await store.getRoom("room"))?.members.includes(invitee.id), false);
|
|
86
|
+
});
|
|
87
|
+
void test("joining through an invitation consumes it", async () => {
|
|
88
|
+
const store = tempStore();
|
|
89
|
+
const owner = await store.registerAgent({
|
|
90
|
+
name: "owner",
|
|
91
|
+
harness: "pi",
|
|
92
|
+
cwd: "/tmp/p",
|
|
93
|
+
pid: process.pid,
|
|
94
|
+
visibility: "visible",
|
|
95
|
+
tags: [],
|
|
96
|
+
});
|
|
97
|
+
const invitee = await store.registerAgent({
|
|
98
|
+
name: "invitee",
|
|
99
|
+
harness: "claude-code",
|
|
100
|
+
cwd: "/tmp/i",
|
|
101
|
+
pid: process.pid,
|
|
102
|
+
visibility: "visible",
|
|
103
|
+
tags: [],
|
|
104
|
+
});
|
|
105
|
+
await store.createRoom({
|
|
106
|
+
name: "room",
|
|
107
|
+
type: "private",
|
|
108
|
+
owner: owner.id,
|
|
109
|
+
description: "x",
|
|
110
|
+
});
|
|
111
|
+
await store.inviteToRoom("room", invitee.id, owner.id);
|
|
112
|
+
await store.joinRoom("room", invitee.id);
|
|
113
|
+
const room = await store.getRoom("room");
|
|
114
|
+
assert.deepEqual(room?.invited, []);
|
|
115
|
+
assert.equal(room?.members.includes(invitee.id), true);
|
|
116
|
+
});
|
|
117
|
+
void test("an unparseable stored record surfaces instead of an empty list", async () => {
|
|
118
|
+
const store = tempStore();
|
|
119
|
+
await store.registerAgent({
|
|
120
|
+
name: "good",
|
|
121
|
+
harness: "pi",
|
|
122
|
+
cwd: "/tmp/p",
|
|
123
|
+
pid: process.pid,
|
|
124
|
+
visibility: "visible",
|
|
125
|
+
tags: [],
|
|
126
|
+
});
|
|
127
|
+
// A record missing the required fields (written by an older build, say) must raise from listAgents, not read as an empty mesh (#32).
|
|
128
|
+
const agentsDir = path.join(store.root, "registry", "agents");
|
|
129
|
+
fs.writeFileSync(path.join(agentsDir, "stale.json"), '{"id": "stale"}');
|
|
130
|
+
await assert.rejects(store.listAgents("whoever"), (err) => err instanceof Error);
|
|
131
|
+
});
|
|
132
|
+
void test("a store with no registry yet lists no agents", async () => {
|
|
133
|
+
const store = tempStore();
|
|
134
|
+
assert.deepEqual(await store.listAgents("whoever"), []);
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=filestore.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filestore.test.js","sourceRoot":"","sources":["../../src/test/filestore.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.27.1",
|
|
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,10 +52,11 @@
|
|
|
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": "node --test --test-concurrency=1 dist/test/coordinator-socket-error.integration.test.js dist/test/identity-store.test.js dist/test/identity-cert.test.js dist/test/broadcast-window.integration.test.js dist/test/identity-restart.integration.test.js dist/test/mesh-e2e.integration.test.js dist/test/ws-broadcast-window.integration.test.js dist/test/tls-transport.integration.test.js dist/test/state-sync-convergence.test.js dist/test/downtime-replay.test.js dist/test/downtime-replay.integration.test.js",
|
|
55
|
+
"test": "node --test --test-concurrency=1 dist/test/coordinator-socket-error.integration.test.js dist/test/identity-store.test.js dist/test/identity-cert.test.js dist/test/broadcast-window.integration.test.js dist/test/identity-restart.integration.test.js dist/test/mesh-e2e.integration.test.js dist/test/ws-broadcast-window.integration.test.js dist/test/tls-transport.integration.test.js dist/test/state-sync-convergence.test.js dist/test/downtime-replay.test.js dist/test/downtime-replay.integration.test.js dist/test/filestore.test.js",
|
|
56
56
|
"test:visibility": "node --test dist/test/visibility.integration.test.js",
|
|
57
57
|
"test:delivery": "node dist/test/delivery-receipt.runner.js",
|
|
58
|
-
"test:
|
|
58
|
+
"test:federation": "node dist/test/federation.integration.test.js",
|
|
59
|
+
"test:all": "pnpm test && pnpm test:delivery && pnpm test:federation",
|
|
59
60
|
"test:frontend": "tsx --test src/bridges/user/web/frontend/test/**/*.unit.test.ts",
|
|
60
61
|
"test:e2e": "playwright test",
|
|
61
62
|
"typecheck": "tsc --noEmit"
|