agent-comms 3.10.0 → 3.12.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 (63) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +3 -1
  4. package/dist/bridges/cc-peer/front-controller.d.ts +20 -0
  5. package/dist/bridges/cc-peer/front-controller.d.ts.map +1 -1
  6. package/dist/bridges/cc-peer/front-controller.js +12 -0
  7. package/dist/bridges/cc-peer/front-controller.js.map +1 -1
  8. package/dist/bridges/cc-peer/front-relay.d.ts +11 -1
  9. package/dist/bridges/cc-peer/front-relay.d.ts.map +1 -1
  10. package/dist/bridges/cc-peer/front-relay.js +35 -4
  11. package/dist/bridges/cc-peer/front-relay.js.map +1 -1
  12. package/dist/bridges/cc-peer/front-runtime.d.ts.map +1 -1
  13. package/dist/bridges/cc-peer/front-runtime.js +20 -0
  14. package/dist/bridges/cc-peer/front-runtime.js.map +1 -1
  15. package/dist/bridges/cc-peer/reply-aliases.d.ts +22 -0
  16. package/dist/bridges/cc-peer/reply-aliases.d.ts.map +1 -0
  17. package/dist/bridges/cc-peer/reply-aliases.js +56 -0
  18. package/dist/bridges/cc-peer/reply-aliases.js.map +1 -0
  19. package/dist/bridges/user/tui.js +2 -0
  20. package/dist/bridges/user/tui.js.map +1 -1
  21. package/dist/core/bridge.d.ts +7 -0
  22. package/dist/core/bridge.d.ts.map +1 -1
  23. package/dist/core/bridge.js +36 -0
  24. package/dist/core/bridge.js.map +1 -1
  25. package/dist/core/capability-ask.d.ts +51 -0
  26. package/dist/core/capability-ask.d.ts.map +1 -0
  27. package/dist/core/capability-ask.js +92 -0
  28. package/dist/core/capability-ask.js.map +1 -0
  29. package/dist/core/mcp-registry-retry.d.ts +1 -1
  30. package/dist/core/mcp-registry-retry.d.ts.map +1 -1
  31. package/dist/core/mcp-registry-retry.js +15 -2
  32. package/dist/core/mcp-registry-retry.js.map +1 -1
  33. package/dist/core/mesh-store.d.ts +25 -0
  34. package/dist/core/mesh-store.d.ts.map +1 -1
  35. package/dist/core/mesh-store.js +35 -0
  36. package/dist/core/mesh-store.js.map +1 -1
  37. package/dist/core/tool.d.ts +16 -0
  38. package/dist/core/tool.d.ts.map +1 -1
  39. package/dist/core/tool.js +44 -0
  40. package/dist/core/tool.js.map +1 -1
  41. package/dist/core/types.d.ts +38 -0
  42. package/dist/core/types.d.ts.map +1 -1
  43. package/dist/core/types.js +21 -0
  44. package/dist/core/types.js.map +1 -1
  45. package/dist/test/capability-admission-tool-actions.test.d.ts +5 -0
  46. package/dist/test/capability-admission-tool-actions.test.d.ts.map +1 -0
  47. package/dist/test/capability-admission-tool-actions.test.js +198 -0
  48. package/dist/test/capability-admission-tool-actions.test.js.map +1 -0
  49. package/dist/test/capability-ask.test.d.ts +2 -0
  50. package/dist/test/capability-ask.test.d.ts.map +1 -0
  51. package/dist/test/capability-ask.test.js +300 -0
  52. package/dist/test/capability-ask.test.js.map +1 -0
  53. package/dist/test/cc-peer-front-controller.test.js +61 -0
  54. package/dist/test/cc-peer-front-controller.test.js.map +1 -1
  55. package/dist/test/cc-peer-front-relay.test.js +161 -2
  56. package/dist/test/cc-peer-front-relay.test.js.map +1 -1
  57. package/dist/test/cc-peer-reply-aliases.test.d.ts +2 -0
  58. package/dist/test/cc-peer-reply-aliases.test.d.ts.map +1 -0
  59. package/dist/test/cc-peer-reply-aliases.test.js +93 -0
  60. package/dist/test/cc-peer-reply-aliases.test.js.map +1 -0
  61. package/dist/test/mcp-registry-retry.test.js +16 -0
  62. package/dist/test/mcp-registry-retry.test.js.map +1 -1
  63. package/package.json +2 -2
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Direct, DI-based unit tests for CapabilityAskAdmission -- mirrors connection-approval.test.ts's own approach (a narrow, injectable deps surface, fake collaborators via vi.fn()) so every branch of the ask tier's tool-layer surfacing (agent-comms#165) is asserted on directly rather than only indirectly through a live transport.
3
+ */
4
+ import { webcrypto } from "node:crypto";
5
+ import { describe, it, expect, vi } from "vitest";
6
+ import { createNodeIdentity } from "wire-mesh-core/adapters/node-identity";
7
+ import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
8
+ import { verifyCapabilityToken } from "wire-mesh-core/domain/tokens";
9
+ import { createRevocationView } from "wire-mesh-core/domain/revocation-view";
10
+ import { CapabilityAskAdmission, } from "../core/capability-ask.js";
11
+ const ES256 = -7;
12
+ const NOW_MS = 1_893_456_000_000;
13
+ const HOUR_MS = 3_600_000;
14
+ const EXPIRES_MS = NOW_MS + HOUR_MS;
15
+ const CAPABILITY = "dm:send";
16
+ const SCOPE = { kind: "user" };
17
+ const OWNER_ID = "owner-peer";
18
+ async function generateEs256Identity() {
19
+ const keyPair = await webcrypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"]);
20
+ const publicKeyBytes = new Uint8Array(await webcrypto.subtle.exportKey("raw", keyPair.publicKey));
21
+ return createNodeIdentity(keyPair.privateKey, publicKeyBytes, ES256);
22
+ }
23
+ function fixedClock(atMs) {
24
+ return { now: () => atMs };
25
+ }
26
+ function makeHarness(options = {}) {
27
+ const queueDelivery = vi.fn();
28
+ const onDelivery = options.withOnDelivery === true ? vi.fn() : undefined;
29
+ const deps = {
30
+ getPeerId: () => OWNER_ID,
31
+ getOnDelivery: () => onDelivery,
32
+ queueDelivery,
33
+ };
34
+ return {
35
+ deps,
36
+ admission: new CapabilityAskAdmission(deps),
37
+ queueDelivery,
38
+ onDelivery,
39
+ };
40
+ }
41
+ let nextRequestId = 0;
42
+ function fakeIncoming(params) {
43
+ nextRequestId += 1;
44
+ return {
45
+ requestId: nextRequestId,
46
+ command: { verb: CAPABILITY, params },
47
+ scope: SCOPE,
48
+ respond: vi.fn(async () => undefined),
49
+ };
50
+ }
51
+ describe("CapabilityAskAdmission — createAskHandler", () => {
52
+ it("holds the request open, queues a capability_request delivery event, and touches neither respond nor onDelivery's own callback synchronously", async () => {
53
+ const h = makeHarness({ withOnDelivery: true });
54
+ const identity = await generateEs256Identity();
55
+ const requester = await generateEs256Identity();
56
+ const handler = h.admission.createAskHandler({
57
+ capability: CAPABILITY,
58
+ identity,
59
+ clock: fixedClock(NOW_MS),
60
+ bearerDevice: requester.deviceId,
61
+ timeoutMs: HOUR_MS,
62
+ });
63
+ const incoming = fakeIncoming({
64
+ verb: "capability.request",
65
+ capability: CAPABILITY,
66
+ });
67
+ // The handler awaits only until onRequest is called, never until decide() settles -- the ask stays held open, so this resolves without ever calling respond().
68
+ await handler(incoming);
69
+ expect(incoming.respond).not.toHaveBeenCalled();
70
+ expect(h.queueDelivery).toHaveBeenCalledTimes(1);
71
+ const [deliveredTo, event] = h.queueDelivery.mock.calls[0];
72
+ expect(deliveredTo).toBe(OWNER_ID);
73
+ expect(event).toEqual({
74
+ type: "capability_request",
75
+ requestId: expect.any(String),
76
+ capability: CAPABILITY,
77
+ scopeKind: "user",
78
+ requesterDevice: deviceIdToHex(requester.deviceId),
79
+ });
80
+ expect(h.onDelivery).toHaveBeenCalledTimes(1);
81
+ });
82
+ it("includes scopePath in the delivery event when the incoming request's own scope carries one", async () => {
83
+ const h = makeHarness();
84
+ const identity = await generateEs256Identity();
85
+ const requester = await generateEs256Identity();
86
+ const handler = h.admission.createAskHandler({
87
+ capability: CAPABILITY,
88
+ identity,
89
+ clock: fixedClock(NOW_MS),
90
+ bearerDevice: requester.deviceId,
91
+ timeoutMs: HOUR_MS,
92
+ });
93
+ nextRequestId += 1;
94
+ const incoming = {
95
+ requestId: nextRequestId,
96
+ command: {
97
+ verb: CAPABILITY,
98
+ params: { verb: "capability.request", capability: CAPABILITY },
99
+ },
100
+ scope: { kind: "room", path: "abc/general" },
101
+ respond: vi.fn(async () => undefined),
102
+ };
103
+ await handler(incoming);
104
+ const [, event] = h.queueDelivery.mock.calls[0];
105
+ expect(event).toMatchObject({
106
+ scopeKind: "room",
107
+ scopePath: "abc/general",
108
+ });
109
+ });
110
+ it("responds malformed for a request naming a different capability, and never surfaces it as a pending ask", async () => {
111
+ const h = makeHarness();
112
+ const identity = await generateEs256Identity();
113
+ const requester = await generateEs256Identity();
114
+ const handler = h.admission.createAskHandler({
115
+ capability: CAPABILITY,
116
+ identity,
117
+ clock: fixedClock(NOW_MS),
118
+ bearerDevice: requester.deviceId,
119
+ timeoutMs: HOUR_MS,
120
+ });
121
+ const incoming = fakeIncoming({
122
+ verb: "capability.request",
123
+ capability: "room:member",
124
+ });
125
+ await handler(incoming);
126
+ expect(incoming.respond).toHaveBeenCalledWith({
127
+ result: "error",
128
+ code: "malformed",
129
+ });
130
+ expect(h.queueDelivery).not.toHaveBeenCalled();
131
+ expect(h.admission.listPendingCapabilityRequests()).toEqual([]);
132
+ });
133
+ });
134
+ describe("CapabilityAskAdmission — listPendingCapabilityRequests / acceptCapabilityRequest / rejectCapabilityRequest", () => {
135
+ it("lists every still-held ask with its capability, scope, and requester", async () => {
136
+ const h = makeHarness();
137
+ const identity = await generateEs256Identity();
138
+ const requester = await generateEs256Identity();
139
+ const handler = h.admission.createAskHandler({
140
+ capability: CAPABILITY,
141
+ identity,
142
+ clock: fixedClock(NOW_MS),
143
+ bearerDevice: requester.deviceId,
144
+ timeoutMs: HOUR_MS,
145
+ });
146
+ await handler(fakeIncoming({ verb: "capability.request", capability: CAPABILITY }));
147
+ expect(h.admission.listPendingCapabilityRequests()).toEqual([
148
+ {
149
+ requestId: expect.any(String),
150
+ capability: CAPABILITY,
151
+ scopeKind: "user",
152
+ requesterDevice: deviceIdToHex(requester.deviceId),
153
+ },
154
+ ]);
155
+ });
156
+ it("accepting a pending ask mints a granted token, responds ok, and removes it from the pending list", async () => {
157
+ const h = makeHarness();
158
+ const identity = await generateEs256Identity();
159
+ const requester = await generateEs256Identity();
160
+ const handler = h.admission.createAskHandler({
161
+ capability: CAPABILITY,
162
+ identity,
163
+ clock: fixedClock(NOW_MS),
164
+ bearerDevice: requester.deviceId,
165
+ timeoutMs: HOUR_MS,
166
+ });
167
+ const incoming = fakeIncoming({
168
+ verb: "capability.request",
169
+ capability: CAPABILITY,
170
+ });
171
+ await handler(incoming);
172
+ const [requestId] = h.admission
173
+ .listPendingCapabilityRequests()
174
+ .map((p) => p.requestId);
175
+ if (requestId === undefined)
176
+ throw new Error("no pending request");
177
+ await h.admission.acceptCapabilityRequest(requestId, {
178
+ expires: EXPIRES_MS,
179
+ delegationsRemaining: 1,
180
+ });
181
+ expect(incoming.respond).toHaveBeenCalledTimes(1);
182
+ const outcome = incoming.respond.mock.calls[0]?.[0];
183
+ expect(outcome.result).toBe("ok");
184
+ const verdict = await verifyCapabilityToken(outcome["granted-token"], {
185
+ identity,
186
+ clock: fixedClock(NOW_MS),
187
+ revocation: createRevocationView(),
188
+ expectedBearer: requester.deviceId,
189
+ });
190
+ expect(verdict.ok).toBe(true);
191
+ if (verdict.ok) {
192
+ expect(verdict.claims.capability).toBe(CAPABILITY);
193
+ }
194
+ expect(h.admission.listPendingCapabilityRequests()).toEqual([]);
195
+ });
196
+ it("rejecting a pending ask responds denied with the given reason and removes it from the pending list", async () => {
197
+ const h = makeHarness();
198
+ const identity = await generateEs256Identity();
199
+ const requester = await generateEs256Identity();
200
+ const handler = h.admission.createAskHandler({
201
+ capability: CAPABILITY,
202
+ identity,
203
+ clock: fixedClock(NOW_MS),
204
+ bearerDevice: requester.deviceId,
205
+ timeoutMs: HOUR_MS,
206
+ });
207
+ const incoming = fakeIncoming({
208
+ verb: "capability.request",
209
+ capability: CAPABILITY,
210
+ });
211
+ await handler(incoming);
212
+ const [requestId] = h.admission
213
+ .listPendingCapabilityRequests()
214
+ .map((p) => p.requestId);
215
+ if (requestId === undefined)
216
+ throw new Error("no pending request");
217
+ await h.admission.rejectCapabilityRequest(requestId, "not right now");
218
+ expect(incoming.respond).toHaveBeenCalledWith({
219
+ result: "error",
220
+ code: "denied",
221
+ message: "not right now",
222
+ });
223
+ expect(h.admission.listPendingCapabilityRequests()).toEqual([]);
224
+ });
225
+ it("rejects with no message field when no reason is given", async () => {
226
+ const h = makeHarness();
227
+ const identity = await generateEs256Identity();
228
+ const requester = await generateEs256Identity();
229
+ const handler = h.admission.createAskHandler({
230
+ capability: CAPABILITY,
231
+ identity,
232
+ clock: fixedClock(NOW_MS),
233
+ bearerDevice: requester.deviceId,
234
+ timeoutMs: HOUR_MS,
235
+ });
236
+ const incoming = fakeIncoming({
237
+ verb: "capability.request",
238
+ capability: CAPABILITY,
239
+ });
240
+ await handler(incoming);
241
+ const [requestId] = h.admission
242
+ .listPendingCapabilityRequests()
243
+ .map((p) => p.requestId);
244
+ if (requestId === undefined)
245
+ throw new Error("no pending request");
246
+ await h.admission.rejectCapabilityRequest(requestId);
247
+ expect(incoming.respond).toHaveBeenCalledWith({
248
+ result: "error",
249
+ code: "denied",
250
+ });
251
+ });
252
+ it("throws naming the exact unknown request id when accepting, and never touches decide", async () => {
253
+ const h = makeHarness();
254
+ await expect(h.admission.acceptCapabilityRequest("no-such-request", {
255
+ expires: EXPIRES_MS,
256
+ })).rejects.toThrow("No pending capability request no-such-request");
257
+ });
258
+ it("throws naming the exact unknown request id when rejecting", async () => {
259
+ const h = makeHarness();
260
+ await expect(h.admission.rejectCapabilityRequest("no-such-request")).rejects.toThrow("No pending capability request no-such-request");
261
+ });
262
+ it("grants a narrower capability than requested when the accept decision names one explicitly", async () => {
263
+ const h = makeHarness();
264
+ const identity = await generateEs256Identity();
265
+ const requester = await generateEs256Identity();
266
+ const handler = h.admission.createAskHandler({
267
+ capability: CAPABILITY,
268
+ identity,
269
+ clock: fixedClock(NOW_MS),
270
+ bearerDevice: requester.deviceId,
271
+ timeoutMs: HOUR_MS,
272
+ });
273
+ const incoming = fakeIncoming({
274
+ verb: "capability.request",
275
+ capability: CAPABILITY,
276
+ });
277
+ await handler(incoming);
278
+ const [requestId] = h.admission
279
+ .listPendingCapabilityRequests()
280
+ .map((p) => p.requestId);
281
+ if (requestId === undefined)
282
+ throw new Error("no pending request");
283
+ await h.admission.acceptCapabilityRequest(requestId, {
284
+ expires: EXPIRES_MS,
285
+ capability: "dm:send-narrow",
286
+ });
287
+ const outcome = incoming.respond.mock.calls[0]?.[0];
288
+ const verdict = await verifyCapabilityToken(outcome["granted-token"], {
289
+ identity,
290
+ clock: fixedClock(NOW_MS),
291
+ revocation: createRevocationView(),
292
+ expectedBearer: requester.deviceId,
293
+ });
294
+ expect(verdict.ok).toBe(true);
295
+ if (verdict.ok) {
296
+ expect(verdict.claims.capability).toBe("dm:send-narrow");
297
+ }
298
+ });
299
+ });
300
+ //# sourceMappingURL=capability-ask.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-ask.test.js","sourceRoot":"","sources":["../../src/test/capability-ask.test.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,8 @@ function stubRecord(entry) {
31
31
  cwd: entry.cwd,
32
32
  messagingSocketPath: entry.messagingSocketPath,
33
33
  handleInbound: vi.fn(),
34
+ handleAliasReply: vi.fn(),
35
+ notifyStaleAlias: vi.fn(),
34
36
  detached: false,
35
37
  };
36
38
  }
@@ -43,11 +45,13 @@ function harness(initialRoster) {
43
45
  });
44
46
  const probeSlotOwner = vi.fn(() => undefined);
45
47
  const onError = vi.fn();
48
+ const correspondentFor = vi.fn(() => undefined);
46
49
  const deps = {
47
50
  listRoster: async () => Promise.resolve([...roster]),
48
51
  probeSlotOwner,
49
52
  attach,
50
53
  detach,
54
+ aliasDirectory: { correspondentFor },
51
55
  pollIntervalMs: POLL_INTERVAL_MS,
52
56
  onError,
53
57
  };
@@ -59,6 +63,7 @@ function harness(initialRoster) {
59
63
  detach,
60
64
  probeSlotOwner,
61
65
  onError,
66
+ correspondentFor,
62
67
  };
63
68
  }
64
69
  describe("CcPeerFront — start/stop", () => {
@@ -203,4 +208,60 @@ describe("CcPeerFront — attach/detach diffing across ticks", () => {
203
208
  await h.front.stop();
204
209
  });
205
210
  });
211
+ describe("CcPeerFront — handleAliasMessage", () => {
212
+ beforeEach(() => {
213
+ vi.useFakeTimers();
214
+ });
215
+ afterEach(() => {
216
+ vi.useRealTimers();
217
+ });
218
+ it("routes an alias reply to the fronted session it came from, resolving the correspondent via the alias directory", async () => {
219
+ const h = harness([
220
+ rosterEntry({ pid: 1, messagingSocketPath: "/tmp/sock-1" }),
221
+ ]);
222
+ h.correspondentFor.mockReturnValue("correspondent-1");
223
+ h.front.start();
224
+ await vi.advanceTimersByTimeAsync(POLL_INTERVAL_MS);
225
+ const record = await attachResult(h.attach);
226
+ h.front.handleAliasMessage({
227
+ alias: "mesh-correspond",
228
+ from: "uds:/tmp/sock-1",
229
+ body: "reply body",
230
+ });
231
+ expect(h.correspondentFor).toHaveBeenCalledWith("mesh-correspond");
232
+ expect(record.handleAliasReply).toHaveBeenCalledWith("correspondent-1", {
233
+ alias: "mesh-correspond",
234
+ from: "uds:/tmp/sock-1",
235
+ body: "reply body",
236
+ });
237
+ expect(record.notifyStaleAlias).not.toHaveBeenCalled();
238
+ await h.front.stop();
239
+ });
240
+ it("notifies the fronted session of a stale alias when the directory no longer knows the correspondent", async () => {
241
+ const h = harness([
242
+ rosterEntry({ pid: 1, messagingSocketPath: "/tmp/sock-1" }),
243
+ ]);
244
+ h.correspondentFor.mockReturnValue(undefined);
245
+ h.front.start();
246
+ await vi.advanceTimersByTimeAsync(POLL_INTERVAL_MS);
247
+ const record = await attachResult(h.attach);
248
+ h.front.handleAliasMessage({
249
+ alias: "mesh-stale",
250
+ from: "uds:/tmp/sock-1",
251
+ body: "reply body",
252
+ });
253
+ expect(record.notifyStaleAlias).toHaveBeenCalledWith("mesh-stale");
254
+ expect(record.handleAliasReply).not.toHaveBeenCalled();
255
+ await h.front.stop();
256
+ });
257
+ it("silently ignores an alias message matching no fronted session", async () => {
258
+ const h = harness([]);
259
+ expect(() => h.front.handleAliasMessage({
260
+ alias: "mesh-unknown",
261
+ from: "uds:/tmp/unknown",
262
+ body: "hi",
263
+ })).not.toThrow();
264
+ expect(h.correspondentFor).not.toHaveBeenCalled();
265
+ });
266
+ });
206
267
  //# sourceMappingURL=cc-peer-front-controller.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cc-peer-front-controller.test.js","sourceRoot":"","sources":["../../src/test/cc-peer-front-controller.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cc-peer-front-controller.test.js","sourceRoot":"","sources":["../../src/test/cc-peer-front-controller.test.ts"],"names":[],"mappings":"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"}
@@ -62,8 +62,34 @@ function roomMessage(overrides = {}) {
62
62
  ...overrides,
63
63
  };
64
64
  }
65
+ function dmMessage(overrides = {}) {
66
+ return {
67
+ id: "msg-1",
68
+ from: "peer-a",
69
+ to: "agent-1",
70
+ content: "hi from the mesh",
71
+ timestamp: "2026-01-01T00:00:00.000Z",
72
+ readBy: [],
73
+ ...overrides,
74
+ };
75
+ }
76
+ function fakeAliasPool() {
77
+ const ensureCalls = [];
78
+ return {
79
+ ensureCalls,
80
+ ensure: vi.fn(async (name) => {
81
+ ensureCalls.push(name);
82
+ return Promise.resolve();
83
+ }),
84
+ };
85
+ }
86
+ function fakeAliasDirectory(nameFor = (id) => `mesh-${id}`) {
87
+ return {
88
+ ensure: vi.fn(nameFor),
89
+ };
90
+ }
65
91
  describe("buildFrontedSessionRecord — outbound (mesh -> cc-peer)", () => {
66
- it("wires store.onDelivery to send the formatted event to the session's own pid", () => {
92
+ it("wires store.onDelivery to send the formatted event to the session's own pid", async () => {
67
93
  const store = fakeStore();
68
94
  const peer = fakePeer();
69
95
  const entry = rosterEntry({ pid: 333 });
@@ -74,16 +100,143 @@ describe("buildFrontedSessionRecord — outbound (mesh -> cc-peer)", () => {
74
100
  store,
75
101
  tool: fakeTool(),
76
102
  peer,
103
+ aliasPool: fakeAliasPool(),
104
+ aliasDirectory: fakeAliasDirectory(),
77
105
  });
78
106
  expect(store.onDelivery).toBeDefined();
79
107
  const event = {
80
108
  type: "room_message",
81
109
  message: roomMessage(),
82
110
  };
83
- void store.onDelivery?.("agent-1", event);
111
+ await store.onDelivery?.("agent-1", event);
84
112
  expect(peer.sendCalls).toHaveLength(1);
85
113
  expect(peer.sendCalls[0]?.target).toEqual({ pid: 333 });
86
114
  });
115
+ it("materialises a reply alias for the event's own correspondent and mentions it in the delivered body", async () => {
116
+ const store = fakeStore();
117
+ const peer = fakePeer();
118
+ const aliasPool = fakeAliasPool();
119
+ const aliasDirectory = fakeAliasDirectory((id) => `mesh-${id}`);
120
+ buildFrontedSessionRecord({
121
+ entry: rosterEntry(),
122
+ agentId: "agent-1",
123
+ roomId: "owner/project",
124
+ store,
125
+ tool: fakeTool(),
126
+ peer,
127
+ aliasPool,
128
+ aliasDirectory,
129
+ });
130
+ const event = {
131
+ type: "dm",
132
+ message: dmMessage({ from: "correspondent-1" }),
133
+ };
134
+ await store.onDelivery?.("agent-1", event);
135
+ expect(aliasDirectory.ensure).toHaveBeenCalledWith("correspondent-1");
136
+ expect(aliasPool.ensureCalls).toEqual(["mesh-correspondent-1"]);
137
+ expect(peer.sendCalls[0]?.body).toContain('reply via peer "mesh-correspondent-1"');
138
+ });
139
+ it("delivers an event with no single correspondent (e.g. member_joined) without touching the alias pool", async () => {
140
+ const store = fakeStore();
141
+ const peer = fakePeer();
142
+ const aliasPool = fakeAliasPool();
143
+ buildFrontedSessionRecord({
144
+ entry: rosterEntry(),
145
+ agentId: "agent-1",
146
+ roomId: "owner/project",
147
+ store,
148
+ tool: fakeTool(),
149
+ peer,
150
+ aliasPool,
151
+ aliasDirectory: fakeAliasDirectory(),
152
+ });
153
+ const event = {
154
+ type: "member_joined",
155
+ room: "owner/project",
156
+ agent: "agent-2",
157
+ };
158
+ await store.onDelivery?.("agent-1", event);
159
+ expect(aliasPool.ensureCalls).toEqual([]);
160
+ expect(peer.sendCalls).toHaveLength(1);
161
+ });
162
+ it("still delivers the event, without a reply hint, if materialising the alias fails", async () => {
163
+ const store = fakeStore();
164
+ const peer = fakePeer();
165
+ const failure = new Error("alias worker failed to start");
166
+ const aliasPool = {
167
+ ensure: vi.fn(async () => Promise.reject(failure)),
168
+ };
169
+ buildFrontedSessionRecord({
170
+ entry: rosterEntry(),
171
+ agentId: "agent-1",
172
+ roomId: "owner/project",
173
+ store,
174
+ tool: fakeTool(),
175
+ peer,
176
+ aliasPool,
177
+ aliasDirectory: fakeAliasDirectory(),
178
+ });
179
+ const event = {
180
+ type: "dm",
181
+ message: dmMessage({ from: "correspondent-1" }),
182
+ };
183
+ await store.onDelivery?.("agent-1", event);
184
+ expect(peer.sendCalls).toHaveLength(1);
185
+ expect(peer.sendCalls[0]?.body).not.toContain("reply via peer");
186
+ });
187
+ });
188
+ describe("buildFrontedSessionRecord — alias reply (cc-peer -> mesh DM)", () => {
189
+ it("sends a mesh DM to the correspondent, as this session's own agent id, when a reply arrives on its alias", () => {
190
+ const tool = fakeTool();
191
+ const record = buildFrontedSessionRecord({
192
+ entry: rosterEntry({ cwd: "/tmp/my-project" }),
193
+ agentId: "agent-1",
194
+ roomId: "owner/my-project",
195
+ store: fakeStore(),
196
+ tool,
197
+ peer: fakePeer(),
198
+ aliasPool: fakeAliasPool(),
199
+ aliasDirectory: fakeAliasDirectory(),
200
+ });
201
+ record.handleAliasReply("correspondent-1", {
202
+ from: "local-session",
203
+ fromName: "my-local-session",
204
+ body: "reply body",
205
+ });
206
+ expect(tool.handleCalls).toHaveLength(1);
207
+ expect(tool.handleCalls[0]).toEqual({
208
+ ctx: {
209
+ agentId: "agent-1",
210
+ harness: "claude-code",
211
+ cwd: "/tmp/my-project",
212
+ pid: process.pid,
213
+ },
214
+ action: {
215
+ action: "dm",
216
+ target: "correspondent-1",
217
+ content: "reply body",
218
+ },
219
+ });
220
+ });
221
+ });
222
+ describe("buildFrontedSessionRecord — stale alias notification", () => {
223
+ it("sends a clear error back to the session's own pid rather than silently dropping the reply", () => {
224
+ const peer = fakePeer();
225
+ const record = buildFrontedSessionRecord({
226
+ entry: rosterEntry({ pid: 555 }),
227
+ agentId: "agent-1",
228
+ roomId: "owner/project",
229
+ store: fakeStore(),
230
+ tool: fakeTool(),
231
+ peer,
232
+ aliasPool: fakeAliasPool(),
233
+ aliasDirectory: fakeAliasDirectory(),
234
+ });
235
+ record.notifyStaleAlias("mesh-stale");
236
+ expect(peer.sendCalls).toHaveLength(1);
237
+ expect(peer.sendCalls[0]?.target).toEqual({ pid: 555 });
238
+ expect(peer.sendCalls[0]?.body).toContain("mesh-stale");
239
+ });
87
240
  });
88
241
  describe("buildFrontedSessionRecord — inbound (cc-peer -> mesh)", () => {
89
242
  it("returns a record whose handleInbound posts into the session's own project room", () => {
@@ -96,6 +249,8 @@ describe("buildFrontedSessionRecord — inbound (cc-peer -> mesh)", () => {
96
249
  store: fakeStore(),
97
250
  tool,
98
251
  peer: fakePeer(),
252
+ aliasPool: fakeAliasPool(),
253
+ aliasDirectory: fakeAliasDirectory(),
99
254
  });
100
255
  record.handleInbound({
101
256
  from: "local-session",
@@ -126,6 +281,8 @@ describe("buildFrontedSessionRecord — inbound (cc-peer -> mesh)", () => {
126
281
  store: fakeStore(),
127
282
  tool,
128
283
  peer: fakePeer(),
284
+ aliasPool: fakeAliasPool(),
285
+ aliasDirectory: fakeAliasDirectory(),
129
286
  });
130
287
  record.handleInbound({ from: "local-session", body: "hi" });
131
288
  const call = tool.handleCalls[0];
@@ -146,6 +303,8 @@ describe("buildFrontedSessionRecord — record shape", () => {
146
303
  store: fakeStore(),
147
304
  tool: fakeTool(),
148
305
  peer: fakePeer(),
306
+ aliasPool: fakeAliasPool(),
307
+ aliasDirectory: fakeAliasDirectory(),
149
308
  });
150
309
  expect(record.pid).toBe(entry.pid);
151
310
  expect(record.cwd).toBe(entry.cwd);