agent-comms 8.0.6 → 8.0.8
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/cc-peer/front-controller.d.ts +6 -3
- package/dist/bridges/cc-peer/front-controller.d.ts.map +1 -1
- package/dist/bridges/cc-peer/front-controller.js +4 -3
- package/dist/bridges/cc-peer/front-controller.js.map +1 -1
- package/dist/bridges/cc-peer/front-relay.d.ts +4 -3
- package/dist/bridges/cc-peer/front-relay.d.ts.map +1 -1
- package/dist/bridges/cc-peer/front-relay.js +17 -8
- package/dist/bridges/cc-peer/front-relay.js.map +1 -1
- package/dist/bridges/cc-peer/reply-aliases.d.ts +24 -7
- package/dist/bridges/cc-peer/reply-aliases.d.ts.map +1 -1
- package/dist/bridges/cc-peer/reply-aliases.js +25 -13
- package/dist/bridges/cc-peer/reply-aliases.js.map +1 -1
- package/dist/core/ws-dial.js +23 -4
- package/dist/core/ws-dial.js.map +1 -1
- package/dist/test/cc-peer-alias-reply-routing.integration.test.d.ts +5 -0
- package/dist/test/cc-peer-alias-reply-routing.integration.test.d.ts.map +1 -0
- package/dist/test/cc-peer-alias-reply-routing.integration.test.js +153 -0
- package/dist/test/cc-peer-alias-reply-routing.integration.test.js.map +1 -0
- package/dist/test/cc-peer-front-controller.unit.test.js +40 -4
- package/dist/test/cc-peer-front-controller.unit.test.js.map +1 -1
- package/dist/test/cc-peer-front-relay.unit.test.js +136 -8
- package/dist/test/cc-peer-front-relay.unit.test.js.map +1 -1
- package/dist/test/cc-peer-reply-aliases.unit.test.js +65 -16
- package/dist/test/cc-peer-reply-aliases.unit.test.js.map +1 -1
- package/dist/test/ws-dial.integration.test.js +30 -2
- package/dist/test/ws-dial.integration.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unit tests for the cc-peer front's reply-alias bookkeeping (bridges/cc-peer/reply-aliases.ts)
|
|
2
|
+
* Unit tests for the cc-peer front's reply-alias bookkeeping (bridges/cc-peer/reply-aliases.ts) — alias-name derivation, the correspondent↔alias↔context directory, and which DeliveryEvent types carry a repliable target worth aliasing, all tested purely over data with no real cc-peer/AliasPool involved.
|
|
3
3
|
*/
|
|
4
4
|
import { describe, expect, it } from "vitest";
|
|
5
|
-
import {
|
|
5
|
+
import { deriveAliasName, replyTargetForEvent, ReplyAliasDirectory, } from "../bridges/cc-peer/reply-aliases.js";
|
|
6
6
|
function dmMessage(overrides = {}) {
|
|
7
7
|
return {
|
|
8
8
|
id: "msg-1",
|
|
@@ -38,20 +38,36 @@ describe("deriveAliasName", () => {
|
|
|
38
38
|
expect(deriveAliasName("ab").length).toBeGreaterThan(0);
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
|
-
describe("
|
|
42
|
-
it("returns the sender's agent id for a dm event", () => {
|
|
41
|
+
describe("replyTargetForEvent", () => {
|
|
42
|
+
it("returns the sender's agent id with a dm context for a dm event", () => {
|
|
43
43
|
const event = {
|
|
44
44
|
type: "dm",
|
|
45
45
|
message: dmMessage({ from: "sender-id" }),
|
|
46
46
|
};
|
|
47
|
-
expect(
|
|
47
|
+
expect(replyTargetForEvent(event)).toEqual({
|
|
48
|
+
correspondentId: "sender-id",
|
|
49
|
+
context: { kind: "dm" },
|
|
50
|
+
});
|
|
48
51
|
});
|
|
49
|
-
it("returns the sender's agent id for a room_message event", () => {
|
|
52
|
+
it("returns the sender's agent id with a room context naming the room for a room_message event", () => {
|
|
50
53
|
const event = {
|
|
51
54
|
type: "room_message",
|
|
52
|
-
message: roomMessage({ from: "sender-id" }),
|
|
55
|
+
message: roomMessage({ from: "sender-id", room: "owner/project" }),
|
|
53
56
|
};
|
|
54
|
-
expect(
|
|
57
|
+
expect(replyTargetForEvent(event)).toEqual({
|
|
58
|
+
correspondentId: "sender-id",
|
|
59
|
+
context: { kind: "room", room: "owner/project" },
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
it("names whichever room the room_message actually came from, not a fixed default", () => {
|
|
63
|
+
const event = {
|
|
64
|
+
type: "room_message",
|
|
65
|
+
message: roomMessage({ from: "sender-id", room: "owner/other-room" }),
|
|
66
|
+
};
|
|
67
|
+
expect(replyTargetForEvent(event)).toEqual({
|
|
68
|
+
correspondentId: "sender-id",
|
|
69
|
+
context: { kind: "room", room: "owner/other-room" },
|
|
70
|
+
});
|
|
55
71
|
});
|
|
56
72
|
it("returns undefined for an event with no single originating correspondent", () => {
|
|
57
73
|
const event = {
|
|
@@ -59,35 +75,68 @@ describe("correspondentForEvent", () => {
|
|
|
59
75
|
room: "owner/project",
|
|
60
76
|
agent: "agent-1",
|
|
61
77
|
};
|
|
62
|
-
expect(
|
|
78
|
+
expect(replyTargetForEvent(event)).toBeUndefined();
|
|
63
79
|
});
|
|
64
80
|
});
|
|
65
81
|
describe("ReplyAliasDirectory", () => {
|
|
66
82
|
it("mints a fresh alias name the first time a correspondent is seen", () => {
|
|
67
83
|
const directory = new ReplyAliasDirectory();
|
|
68
|
-
const name = directory.ensure("correspondent-1");
|
|
84
|
+
const name = directory.ensure("correspondent-1", { kind: "dm" });
|
|
69
85
|
expect(name.length).toBeGreaterThan(0);
|
|
70
86
|
});
|
|
71
|
-
it("is idempotent: the same correspondent always maps to the same alias", () => {
|
|
87
|
+
it("is idempotent: the same correspondent always maps to the same alias name", () => {
|
|
72
88
|
const directory = new ReplyAliasDirectory();
|
|
73
|
-
const first = directory.ensure("correspondent-1");
|
|
74
|
-
const second = directory.ensure("correspondent-1"
|
|
89
|
+
const first = directory.ensure("correspondent-1", { kind: "dm" });
|
|
90
|
+
const second = directory.ensure("correspondent-1", {
|
|
91
|
+
kind: "room",
|
|
92
|
+
room: "owner/project",
|
|
93
|
+
});
|
|
75
94
|
expect(second).toBe(first);
|
|
76
95
|
});
|
|
77
96
|
it("gives distinct correspondents distinct alias names", () => {
|
|
78
97
|
const directory = new ReplyAliasDirectory();
|
|
79
|
-
const a = directory.ensure("aaaaaaaaaaaaaaaaaaaaaaaa");
|
|
80
|
-
const b = directory.ensure("bbbbbbbbbbbbbbbbbbbbbbbb");
|
|
98
|
+
const a = directory.ensure("aaaaaaaaaaaaaaaaaaaaaaaa", { kind: "dm" });
|
|
99
|
+
const b = directory.ensure("bbbbbbbbbbbbbbbbbbbbbbbb", { kind: "dm" });
|
|
81
100
|
expect(a).not.toBe(b);
|
|
82
101
|
});
|
|
83
102
|
it("resolves a minted alias name back to its correspondent id", () => {
|
|
84
103
|
const directory = new ReplyAliasDirectory();
|
|
85
|
-
const name = directory.ensure("correspondent-1");
|
|
104
|
+
const name = directory.ensure("correspondent-1", { kind: "dm" });
|
|
86
105
|
expect(directory.correspondentFor(name)).toBe("correspondent-1");
|
|
87
106
|
});
|
|
88
107
|
it("returns undefined for an alias name it never minted", () => {
|
|
89
108
|
const directory = new ReplyAliasDirectory();
|
|
90
109
|
expect(directory.correspondentFor("never-seen")).toBeUndefined();
|
|
91
110
|
});
|
|
111
|
+
it("resolves a minted alias name back to the context it was minted with", () => {
|
|
112
|
+
const directory = new ReplyAliasDirectory();
|
|
113
|
+
const name = directory.ensure("correspondent-1", {
|
|
114
|
+
kind: "room",
|
|
115
|
+
room: "owner/project",
|
|
116
|
+
});
|
|
117
|
+
expect(directory.contextFor(name)).toEqual({
|
|
118
|
+
kind: "room",
|
|
119
|
+
room: "owner/project",
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
it("returns undefined context for an alias name it never minted", () => {
|
|
123
|
+
const directory = new ReplyAliasDirectory();
|
|
124
|
+
expect(directory.contextFor("never-seen")).toBeUndefined();
|
|
125
|
+
});
|
|
126
|
+
it("updates the alias's own context on every call, reflecting the most recently sent event rather than the one that first minted it", () => {
|
|
127
|
+
const directory = new ReplyAliasDirectory();
|
|
128
|
+
const name = directory.ensure("correspondent-1", { kind: "dm" });
|
|
129
|
+
expect(directory.contextFor(name)).toEqual({ kind: "dm" });
|
|
130
|
+
directory.ensure("correspondent-1", {
|
|
131
|
+
kind: "room",
|
|
132
|
+
room: "owner/project",
|
|
133
|
+
});
|
|
134
|
+
expect(directory.contextFor(name)).toEqual({
|
|
135
|
+
kind: "room",
|
|
136
|
+
room: "owner/project",
|
|
137
|
+
});
|
|
138
|
+
directory.ensure("correspondent-1", { kind: "dm" });
|
|
139
|
+
expect(directory.contextFor(name)).toEqual({ kind: "dm" });
|
|
140
|
+
});
|
|
92
141
|
});
|
|
93
142
|
//# sourceMappingURL=cc-peer-reply-aliases.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cc-peer-reply-aliases.unit.test.js","sourceRoot":"","sources":["../../src/test/cc-peer-reply-aliases.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"cc-peer-reply-aliases.unit.test.js","sourceRoot":"","sources":["../../src/test/cc-peer-reply-aliases.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,11 +74,39 @@ describe("connectWsUrl", () => {
|
|
|
74
74
|
await connection.send({ type: "ping" });
|
|
75
75
|
const iterator = connection.receive()[Symbol.asyncIterator]();
|
|
76
76
|
await iterator.next(); // the echo
|
|
77
|
-
// Close the server first: wss.close() itself waits for client sockets,
|
|
78
|
-
// so closing the connection first would deadlock the shutdown.
|
|
77
|
+
// Close the server first: wss.close() itself waits for client sockets, so closing the connection first would deadlock the shutdown.
|
|
79
78
|
await server.close();
|
|
80
79
|
const afterClose = await iterator.next();
|
|
81
80
|
expect(afterClose.done).toBe(true);
|
|
82
81
|
});
|
|
82
|
+
// agent-comms#304: a teardown that called socket.close() and considered the connection closed at once, without waiting for the underlying WebSocket to actually leave the OPEN state, let a send() call already under way (or issued a moment later) reach the raw socket while it sat in CLOSING, surfacing as "WebSocket is not open: readyState 2 (CLOSING)" rather than a clean, expected rejection.
|
|
83
|
+
it("rejects a send issued after close() has started with a clean error, never the underlying socket's own readyState message", async () => {
|
|
84
|
+
const server = await echoServer();
|
|
85
|
+
servers.push(server);
|
|
86
|
+
const connection = await connectWsUrl(server.url);
|
|
87
|
+
const closing = connection.close();
|
|
88
|
+
await expect(connection.send({ type: "ping" })).rejects.toThrow("connection is closed");
|
|
89
|
+
await closing;
|
|
90
|
+
});
|
|
91
|
+
it("lets a send already under way when close() is called settle on its own terms instead of racing the socket's teardown", async () => {
|
|
92
|
+
const server = await echoServer();
|
|
93
|
+
servers.push(server);
|
|
94
|
+
const connection = await connectWsUrl(server.url);
|
|
95
|
+
// No await between send() and close(): send() has already reached socket.send() by the time close() runs, in the same synchronous tick, so this deterministically exercises the "already in flight" case rather than relying on timing.
|
|
96
|
+
const inFlight = connection.send({ type: "ping" });
|
|
97
|
+
await connection.close();
|
|
98
|
+
await expect(inFlight).resolves.toBeUndefined();
|
|
99
|
+
expect(server.received).toEqual([{ type: "ping" }]);
|
|
100
|
+
});
|
|
101
|
+
it("resolves close() only once the underlying socket has actually closed", async () => {
|
|
102
|
+
const server = await echoServer();
|
|
103
|
+
servers.push(server);
|
|
104
|
+
const connection = await connectWsUrl(server.url);
|
|
105
|
+
await connection.close();
|
|
106
|
+
// A connection that considers itself closed before the real close handshake finishes is exactly the gap #304 exploited: assert the receive stream (which only ends on the real "close" event) has already ended by the time close() resolves.
|
|
107
|
+
const iterator = connection.receive()[Symbol.asyncIterator]();
|
|
108
|
+
const next = await iterator.next();
|
|
109
|
+
expect(next.done).toBe(true);
|
|
110
|
+
});
|
|
83
111
|
});
|
|
84
112
|
//# sourceMappingURL=ws-dial.integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-dial.integration.test.js","sourceRoot":"","sources":["../../src/test/ws-dial.integration.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ws-dial.integration.test.js","sourceRoot":"","sources":["../../src/test/ws-dial.integration.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED