@moltzap/client 2026.411.0 → 2026.414.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/dist/__tests__/service.integration.test.js +94 -6
- package/dist/__tests__/service.integration.test.js.map +1 -1
- package/dist/channel-core.d.ts +103 -0
- package/dist/channel-core.d.ts.map +1 -0
- package/dist/channel-core.js +141 -0
- package/dist/channel-core.js.map +1 -0
- package/dist/channel-core.test.d.ts +2 -0
- package/dist/channel-core.test.d.ts.map +1 -0
- package/dist/channel-core.test.js +475 -0
- package/dist/channel-core.test.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/service.d.ts +57 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +131 -19
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +345 -1
- package/dist/service.test.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +44 -0
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -0
- package/dist/test-utils/channel-service-fixture.js +117 -0
- package/dist/test-utils/channel-service-fixture.js.map +1 -0
- package/dist/test-utils/index.d.ts +5 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +18 -0
- package/dist/test-utils/index.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { MoltZapChannelCore, } from "./index.js";
|
|
3
|
+
import { createFakeChannelService, buildMessage, flushDispatchChain, } from "./test-utils/index.js";
|
|
4
|
+
function customSetup() {
|
|
5
|
+
const fake = createFakeChannelService({ ownAgentId: "agent-self" });
|
|
6
|
+
const received = [];
|
|
7
|
+
const errorSpy = vi.fn();
|
|
8
|
+
const core = new MoltZapChannelCore({
|
|
9
|
+
service: fake.service,
|
|
10
|
+
logger: { info: () => { }, warn: () => { }, error: errorSpy },
|
|
11
|
+
});
|
|
12
|
+
core.onInbound((m) => {
|
|
13
|
+
received.push(m);
|
|
14
|
+
});
|
|
15
|
+
return { fake, core, received, errorSpy };
|
|
16
|
+
}
|
|
17
|
+
/** Stub out getAgentName on the fixture's service so resolveAgentName is the only path. */
|
|
18
|
+
function forceResolveAgentNamePath(fake) {
|
|
19
|
+
fake.service.getAgentName = () => undefined;
|
|
20
|
+
}
|
|
21
|
+
describe("MoltZapChannelCore", () => {
|
|
22
|
+
let fake;
|
|
23
|
+
let service;
|
|
24
|
+
let core;
|
|
25
|
+
let inbound;
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
fake = createFakeChannelService({ ownAgentId: "agent-self" });
|
|
28
|
+
service = fake.service;
|
|
29
|
+
core = new MoltZapChannelCore({ service });
|
|
30
|
+
inbound = [];
|
|
31
|
+
core.onInbound((msg) => {
|
|
32
|
+
inbound.push(msg);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("lifecycle", () => {
|
|
36
|
+
it("connect() delegates to service and sets connected", async () => {
|
|
37
|
+
expect(core.isConnected()).toBe(false);
|
|
38
|
+
await core.connect();
|
|
39
|
+
expect(fake.state.connectCalls.count).toBe(1);
|
|
40
|
+
expect(core.isConnected()).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it("disconnect() closes the service and clears the connected flag", async () => {
|
|
43
|
+
await core.connect();
|
|
44
|
+
await core.disconnect();
|
|
45
|
+
expect(fake.state.closeCalls.count).toBe(1);
|
|
46
|
+
expect(core.isConnected()).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
it("disconnect event from the service clears the connected flag", async () => {
|
|
49
|
+
await core.connect();
|
|
50
|
+
fake.emit.disconnect();
|
|
51
|
+
expect(core.isConnected()).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
it("reconnect event from the service sets the connected flag", () => {
|
|
54
|
+
fake.emit.reconnect();
|
|
55
|
+
expect(core.isConnected()).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it("onDisconnect handlers fire on disconnect event", async () => {
|
|
58
|
+
const spy = vi.fn();
|
|
59
|
+
core.onDisconnect(spy);
|
|
60
|
+
await core.connect();
|
|
61
|
+
fake.emit.disconnect();
|
|
62
|
+
expect(spy).toHaveBeenCalledOnce();
|
|
63
|
+
});
|
|
64
|
+
it("onReconnect handlers fire on reconnect event", () => {
|
|
65
|
+
const spy = vi.fn();
|
|
66
|
+
core.onReconnect(spy);
|
|
67
|
+
fake.emit.reconnect();
|
|
68
|
+
expect(spy).toHaveBeenCalledOnce();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe("inbound message enrichment", () => {
|
|
72
|
+
it("maps a MoltZap Message to EnrichedInboundMessage", async () => {
|
|
73
|
+
fake.state.setConversation("conv-1", {
|
|
74
|
+
type: "dm",
|
|
75
|
+
name: "alice-dm",
|
|
76
|
+
participants: ["agent:agent-alice", "agent:agent-self"],
|
|
77
|
+
});
|
|
78
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
79
|
+
fake.emit.message(buildMessage({
|
|
80
|
+
id: "msg-abc",
|
|
81
|
+
conversationId: "conv-1",
|
|
82
|
+
sender: { type: "agent", id: "agent-alice" },
|
|
83
|
+
parts: [{ type: "text", text: "hi there" }],
|
|
84
|
+
createdAt: "2026-04-10T13:00:00.000Z",
|
|
85
|
+
}));
|
|
86
|
+
await flushDispatchChain();
|
|
87
|
+
expect(inbound).toHaveLength(1);
|
|
88
|
+
const enriched = inbound[0];
|
|
89
|
+
expect(enriched).toMatchObject({
|
|
90
|
+
id: "msg-abc",
|
|
91
|
+
conversationId: "conv-1",
|
|
92
|
+
sender: { type: "agent", id: "agent-alice", name: "Alice" },
|
|
93
|
+
text: "hi there",
|
|
94
|
+
isFromMe: false,
|
|
95
|
+
createdAt: "2026-04-10T13:00:00.000Z",
|
|
96
|
+
});
|
|
97
|
+
expect(enriched.conversationMeta).toMatchObject({
|
|
98
|
+
type: "dm",
|
|
99
|
+
name: "alice-dm",
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
it("resolves sender name from getAgentName cache when present", async () => {
|
|
103
|
+
fake.state.setAgentName("agent-alice", "Alice (cached)");
|
|
104
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
105
|
+
fake.emit.message(buildMessage());
|
|
106
|
+
await flushDispatchChain();
|
|
107
|
+
expect(inbound[0].sender.name).toBe("Alice (cached)");
|
|
108
|
+
expect(fake.state.resolveAgentNameCallCount("agent-alice")).toBe(0);
|
|
109
|
+
});
|
|
110
|
+
it("falls back to resolveAgentName when getAgentName returns undefined", async () => {
|
|
111
|
+
const { fake, received } = customSetup();
|
|
112
|
+
forceResolveAgentNamePath(fake);
|
|
113
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
114
|
+
fake.state.setAgentName("agent-alice", "Alice (via resolve)");
|
|
115
|
+
fake.emit.message(buildMessage());
|
|
116
|
+
await flushDispatchChain();
|
|
117
|
+
expect(received[0].sender.name).toBe("Alice (via resolve)");
|
|
118
|
+
expect(fake.state.resolveAgentNameCallCount("agent-alice")).toBe(1);
|
|
119
|
+
});
|
|
120
|
+
it("falls back to sender.id when both name lookups fail", async () => {
|
|
121
|
+
const { fake, received } = customSetup();
|
|
122
|
+
forceResolveAgentNamePath(fake);
|
|
123
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
124
|
+
fake.emit.message(buildMessage({ sender: { type: "agent", id: "agent-unknown" } }));
|
|
125
|
+
await flushDispatchChain();
|
|
126
|
+
expect(received[0].sender.name).toBe("agent-unknown");
|
|
127
|
+
});
|
|
128
|
+
it("swallows resolveAgentName errors and falls back to sender.id", async () => {
|
|
129
|
+
const { fake, received } = customSetup();
|
|
130
|
+
forceResolveAgentNamePath(fake);
|
|
131
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
132
|
+
fake.state.setResolveAgentNameFailure("agent-broken", new Error("network down"));
|
|
133
|
+
fake.emit.message(buildMessage({ sender: { type: "agent", id: "agent-broken" } }));
|
|
134
|
+
await flushDispatchChain();
|
|
135
|
+
expect(received[0].sender.name).toBe("agent-broken");
|
|
136
|
+
});
|
|
137
|
+
it("concatenates multi-text-part messages with newlines", async () => {
|
|
138
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
139
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
140
|
+
fake.emit.message(buildMessage({
|
|
141
|
+
parts: [
|
|
142
|
+
{ type: "text", text: "line one" },
|
|
143
|
+
{ type: "text", text: "line two" },
|
|
144
|
+
],
|
|
145
|
+
}));
|
|
146
|
+
await flushDispatchChain();
|
|
147
|
+
expect(inbound[0].text).toBe("line one\nline two");
|
|
148
|
+
});
|
|
149
|
+
it("ignores non-text parts when building text", async () => {
|
|
150
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
151
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
152
|
+
fake.emit.message(buildMessage({
|
|
153
|
+
parts: [
|
|
154
|
+
{ type: "text", text: "caption" },
|
|
155
|
+
{ type: "image", url: "https://example.com/pic.png" },
|
|
156
|
+
],
|
|
157
|
+
}));
|
|
158
|
+
await flushDispatchChain();
|
|
159
|
+
expect(inbound[0].text).toBe("caption");
|
|
160
|
+
});
|
|
161
|
+
it("sets isFromMe=true when sender matches ownAgentId", async () => {
|
|
162
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
163
|
+
fake.emit.message(buildMessage({ sender: { type: "agent", id: "agent-self" } }));
|
|
164
|
+
await flushDispatchChain();
|
|
165
|
+
expect(inbound[0].isFromMe).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
it("forwards replyToId from the message frame", async () => {
|
|
168
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
169
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
170
|
+
fake.emit.message(buildMessage({ replyToId: "msg-parent-123" }));
|
|
171
|
+
await flushDispatchChain();
|
|
172
|
+
expect(inbound[0].replyToId).toBe("msg-parent-123");
|
|
173
|
+
});
|
|
174
|
+
it("logs and swallows errors from the inbound handler", async () => {
|
|
175
|
+
const { fake, errorSpy, core } = customSetup();
|
|
176
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
177
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
178
|
+
let handlerShouldThrow = true;
|
|
179
|
+
const received = [];
|
|
180
|
+
// Replace the setup's default capture handler with one that can throw.
|
|
181
|
+
core.onInbound((m) => {
|
|
182
|
+
if (handlerShouldThrow) {
|
|
183
|
+
throw new Error("handler boom");
|
|
184
|
+
}
|
|
185
|
+
received.push(m);
|
|
186
|
+
});
|
|
187
|
+
fake.emit.message(buildMessage({ id: "msg-1" }));
|
|
188
|
+
await flushDispatchChain();
|
|
189
|
+
expect(received).toHaveLength(0);
|
|
190
|
+
expect(errorSpy).toHaveBeenCalledOnce();
|
|
191
|
+
// Recovery: subsequent message lands cleanly.
|
|
192
|
+
handlerShouldThrow = false;
|
|
193
|
+
fake.emit.message(buildMessage({ id: "msg-2" }));
|
|
194
|
+
await flushDispatchChain();
|
|
195
|
+
expect(received).toHaveLength(1);
|
|
196
|
+
expect(received[0].id).toBe("msg-2");
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe("dispatch chain ordering", () => {
|
|
200
|
+
it("serializes handlers so message order is preserved across async resolution", async () => {
|
|
201
|
+
const { fake, received } = customSetup();
|
|
202
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
203
|
+
forceResolveAgentNamePath(fake);
|
|
204
|
+
// Hold the resolveAgentName promises so we can control timing.
|
|
205
|
+
const resolvers = [];
|
|
206
|
+
fake.service.resolveAgentName = (id) => new Promise((resolve) => {
|
|
207
|
+
resolvers.push(() => resolve(id));
|
|
208
|
+
});
|
|
209
|
+
fake.emit.message(buildMessage({ id: "msg-1" }));
|
|
210
|
+
fake.emit.message(buildMessage({ id: "msg-2" }));
|
|
211
|
+
// Neither has been delivered to the handler yet — first message is
|
|
212
|
+
// still awaiting resolveAgentName; second is queued behind it.
|
|
213
|
+
await flushDispatchChain();
|
|
214
|
+
expect(received).toHaveLength(0);
|
|
215
|
+
expect(resolvers).toHaveLength(1);
|
|
216
|
+
// Resolve the first, chain advances.
|
|
217
|
+
resolvers[0]("agent-alice");
|
|
218
|
+
await flushDispatchChain();
|
|
219
|
+
expect(received.map((r) => r.id)).toEqual(["msg-1"]);
|
|
220
|
+
expect(resolvers).toHaveLength(2);
|
|
221
|
+
// Resolve the second.
|
|
222
|
+
resolvers[1]("agent-bob");
|
|
223
|
+
await flushDispatchChain();
|
|
224
|
+
expect(received.map((r) => r.id)).toEqual(["msg-1", "msg-2"]);
|
|
225
|
+
});
|
|
226
|
+
it("awaits async handler fully before processing the next message", async () => {
|
|
227
|
+
const { fake, core } = customSetup();
|
|
228
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
229
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
230
|
+
const handlerBarriers = [];
|
|
231
|
+
const order = [];
|
|
232
|
+
core.onInbound(async (m) => {
|
|
233
|
+
order.push(`enter:${m.id}`);
|
|
234
|
+
await new Promise((resolve) => handlerBarriers.push(resolve));
|
|
235
|
+
order.push(`exit:${m.id}`);
|
|
236
|
+
});
|
|
237
|
+
fake.emit.message(buildMessage({ id: "msg-1" }));
|
|
238
|
+
fake.emit.message(buildMessage({ id: "msg-2" }));
|
|
239
|
+
await flushDispatchChain();
|
|
240
|
+
// Handler started for msg-1, hasn't returned yet. msg-2 has NOT entered.
|
|
241
|
+
expect(order).toEqual(["enter:msg-1"]);
|
|
242
|
+
handlerBarriers[0]();
|
|
243
|
+
await flushDispatchChain();
|
|
244
|
+
// msg-1 fully processed; msg-2 has entered.
|
|
245
|
+
expect(order).toEqual(["enter:msg-1", "exit:msg-1", "enter:msg-2"]);
|
|
246
|
+
handlerBarriers[1]();
|
|
247
|
+
await flushDispatchChain();
|
|
248
|
+
expect(order).toEqual([
|
|
249
|
+
"enter:msg-1",
|
|
250
|
+
"exit:msg-1",
|
|
251
|
+
"enter:msg-2",
|
|
252
|
+
"exit:msg-2",
|
|
253
|
+
]);
|
|
254
|
+
});
|
|
255
|
+
it("onInbound replaces the previous handler instead of adding", async () => {
|
|
256
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
257
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
258
|
+
const firstHandler = vi.fn();
|
|
259
|
+
const secondHandler = vi.fn();
|
|
260
|
+
core.onInbound(firstHandler);
|
|
261
|
+
core.onInbound(secondHandler);
|
|
262
|
+
fake.emit.message(buildMessage());
|
|
263
|
+
await flushDispatchChain();
|
|
264
|
+
expect(firstHandler).not.toHaveBeenCalled();
|
|
265
|
+
expect(secondHandler).toHaveBeenCalledOnce();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe("context blocks enrichment", () => {
|
|
269
|
+
it("attaches groupMetadata when conversation is a group", async () => {
|
|
270
|
+
fake.state.setConversation("conv-1", {
|
|
271
|
+
type: "group",
|
|
272
|
+
name: "devs",
|
|
273
|
+
participants: [
|
|
274
|
+
"agent:agent-alice",
|
|
275
|
+
"agent:agent-bob",
|
|
276
|
+
"agent:agent-self",
|
|
277
|
+
],
|
|
278
|
+
});
|
|
279
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
280
|
+
fake.emit.message(buildMessage());
|
|
281
|
+
await flushDispatchChain();
|
|
282
|
+
const msg = inbound[0];
|
|
283
|
+
expect(msg.contextBlocks.groupMetadata).toEqual({
|
|
284
|
+
type: "group",
|
|
285
|
+
name: "devs",
|
|
286
|
+
participants: [
|
|
287
|
+
"agent:agent-alice",
|
|
288
|
+
"agent:agent-bob",
|
|
289
|
+
"agent:agent-self",
|
|
290
|
+
],
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
it("does NOT attach groupMetadata for DM conversations", async () => {
|
|
294
|
+
fake.state.setConversation("conv-1", {
|
|
295
|
+
type: "dm",
|
|
296
|
+
name: "alice-dm",
|
|
297
|
+
participants: ["agent:agent-alice", "agent:agent-self"],
|
|
298
|
+
});
|
|
299
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
300
|
+
fake.emit.message(buildMessage());
|
|
301
|
+
await flushDispatchChain();
|
|
302
|
+
expect(inbound[0].contextBlocks.groupMetadata).toBeUndefined();
|
|
303
|
+
});
|
|
304
|
+
it("attaches crossConversation entries when getContextEntries returns non-empty", async () => {
|
|
305
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
306
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
307
|
+
const entries = [
|
|
308
|
+
{
|
|
309
|
+
conversationId: "conv-other",
|
|
310
|
+
conversationName: "other-dm",
|
|
311
|
+
senderName: "Bob",
|
|
312
|
+
text: "hello from the other side",
|
|
313
|
+
minutesAgo: 3,
|
|
314
|
+
count: 1,
|
|
315
|
+
},
|
|
316
|
+
];
|
|
317
|
+
fake.state.setContextEntries("conv-1", entries);
|
|
318
|
+
fake.emit.message(buildMessage());
|
|
319
|
+
await flushDispatchChain();
|
|
320
|
+
expect(inbound[0].contextBlocks.crossConversation).toEqual(entries);
|
|
321
|
+
});
|
|
322
|
+
it("does NOT attach crossConversation when getContextEntries returns empty", async () => {
|
|
323
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
324
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
325
|
+
// Fixture default: returns [] for unknown convs
|
|
326
|
+
fake.emit.message(buildMessage());
|
|
327
|
+
await flushDispatchChain();
|
|
328
|
+
expect(inbound[0].contextBlocks.crossConversation).toBeUndefined();
|
|
329
|
+
});
|
|
330
|
+
it("handles groups with zero participants gracefully", async () => {
|
|
331
|
+
fake.state.setConversation("conv-1", {
|
|
332
|
+
type: "group",
|
|
333
|
+
name: "empty-group",
|
|
334
|
+
participants: [],
|
|
335
|
+
});
|
|
336
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
337
|
+
fake.emit.message(buildMessage());
|
|
338
|
+
await flushDispatchChain();
|
|
339
|
+
const meta = inbound[0].contextBlocks.groupMetadata;
|
|
340
|
+
expect(meta).toBeDefined();
|
|
341
|
+
expect(meta.participants).toEqual([]);
|
|
342
|
+
});
|
|
343
|
+
it("commits context markers after enrichment so a second inbound message does not re-see the same entries", async () => {
|
|
344
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
345
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
346
|
+
fake.state.setContextEntries("conv-1", [
|
|
347
|
+
{
|
|
348
|
+
conversationId: "conv-other",
|
|
349
|
+
senderName: "Bob",
|
|
350
|
+
text: "first visit",
|
|
351
|
+
minutesAgo: 1,
|
|
352
|
+
count: 1,
|
|
353
|
+
},
|
|
354
|
+
]);
|
|
355
|
+
fake.emit.message(buildMessage({ id: "msg-1" }));
|
|
356
|
+
await flushDispatchChain();
|
|
357
|
+
expect(inbound[0].contextBlocks.crossConversation).toHaveLength(1);
|
|
358
|
+
fake.emit.message(buildMessage({ id: "msg-2" }));
|
|
359
|
+
await flushDispatchChain();
|
|
360
|
+
expect(inbound[1].contextBlocks.crossConversation).toBeUndefined();
|
|
361
|
+
});
|
|
362
|
+
it("does not commit when there are no context entries", async () => {
|
|
363
|
+
const commitSpy = vi.fn();
|
|
364
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
365
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
366
|
+
// Install a peekContextEntries that records commit calls.
|
|
367
|
+
fake.service.peekContextEntries = () => ({ entries: [], commit: commitSpy });
|
|
368
|
+
fake.emit.message(buildMessage());
|
|
369
|
+
await flushDispatchChain();
|
|
370
|
+
expect(commitSpy).not.toHaveBeenCalled();
|
|
371
|
+
});
|
|
372
|
+
it("attaches crossConversationMessages when peekFullMessages returns non-empty", async () => {
|
|
373
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
374
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
375
|
+
fake.state.setFullMessages("conv-1", [
|
|
376
|
+
{
|
|
377
|
+
conversationId: "conv-other",
|
|
378
|
+
conversationName: "other-dm",
|
|
379
|
+
senderName: "Bob",
|
|
380
|
+
senderId: "agent-bob",
|
|
381
|
+
text: "full message text here",
|
|
382
|
+
timestamp: "2026-04-13T22:00:00Z",
|
|
383
|
+
},
|
|
384
|
+
]);
|
|
385
|
+
fake.emit.message(buildMessage());
|
|
386
|
+
await flushDispatchChain();
|
|
387
|
+
const msgs = inbound[0].contextBlocks.crossConversationMessages;
|
|
388
|
+
expect(msgs).toHaveLength(1);
|
|
389
|
+
expect(msgs[0]).toMatchObject({
|
|
390
|
+
conversationId: "conv-other",
|
|
391
|
+
senderName: "Bob",
|
|
392
|
+
text: "full message text here",
|
|
393
|
+
timestamp: "2026-04-13T22:00:00Z",
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
it("does NOT attach crossConversationMessages when peekFullMessages returns empty", async () => {
|
|
397
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
398
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
399
|
+
fake.emit.message(buildMessage());
|
|
400
|
+
await flushDispatchChain();
|
|
401
|
+
expect(inbound[0].contextBlocks.crossConversationMessages).toBeUndefined();
|
|
402
|
+
});
|
|
403
|
+
it("commits full message markers after inbound handler succeeds", async () => {
|
|
404
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
405
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
406
|
+
fake.state.setFullMessages("conv-1", [
|
|
407
|
+
{
|
|
408
|
+
conversationId: "conv-other",
|
|
409
|
+
senderName: "Bob",
|
|
410
|
+
senderId: "agent-bob",
|
|
411
|
+
text: "first",
|
|
412
|
+
timestamp: "2026-04-13T22:00:00Z",
|
|
413
|
+
},
|
|
414
|
+
]);
|
|
415
|
+
fake.emit.message(buildMessage({ id: "msg-1" }));
|
|
416
|
+
await flushDispatchChain();
|
|
417
|
+
expect(inbound[0].contextBlocks.crossConversationMessages).toHaveLength(1);
|
|
418
|
+
fake.emit.message(buildMessage({ id: "msg-2" }));
|
|
419
|
+
await flushDispatchChain();
|
|
420
|
+
expect(inbound[1].contextBlocks.crossConversationMessages).toBeUndefined();
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
describe("sendReply", () => {
|
|
424
|
+
it("delegates to service.send with conversationId and text", async () => {
|
|
425
|
+
await core.sendReply("conv-42", "hello there");
|
|
426
|
+
expect(fake.state.sent).toEqual([
|
|
427
|
+
{ convId: "conv-42", text: "hello there" },
|
|
428
|
+
]);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
describe("static enrichMessage", () => {
|
|
432
|
+
it("returns the same shape as the instance handler path", async () => {
|
|
433
|
+
fake.state.setConversation("conv-1", {
|
|
434
|
+
type: "group",
|
|
435
|
+
name: "devs",
|
|
436
|
+
participants: ["agent:agent-alice", "agent:agent-self"],
|
|
437
|
+
});
|
|
438
|
+
fake.state.setAgentName("agent-alice", "Alice");
|
|
439
|
+
fake.state.setContextEntries("conv-1", [
|
|
440
|
+
{
|
|
441
|
+
conversationId: "conv-other",
|
|
442
|
+
senderName: "Bob",
|
|
443
|
+
text: "bonjour",
|
|
444
|
+
minutesAgo: 1,
|
|
445
|
+
count: 1,
|
|
446
|
+
},
|
|
447
|
+
]);
|
|
448
|
+
const msg = buildMessage({
|
|
449
|
+
id: "msg-static",
|
|
450
|
+
conversationId: "conv-1",
|
|
451
|
+
parts: [{ type: "text", text: "static enrichment" }],
|
|
452
|
+
});
|
|
453
|
+
const { enriched: staticResult, commitContext } = await MoltZapChannelCore.enrichMessage(service, msg);
|
|
454
|
+
expect(staticResult).toMatchObject({
|
|
455
|
+
id: "msg-static",
|
|
456
|
+
conversationId: "conv-1",
|
|
457
|
+
sender: { type: "agent", id: "agent-alice", name: "Alice" },
|
|
458
|
+
text: "static enrichment",
|
|
459
|
+
isFromMe: false,
|
|
460
|
+
});
|
|
461
|
+
expect(staticResult.contextBlocks.groupMetadata?.name).toBe("devs");
|
|
462
|
+
expect(staticResult.contextBlocks.crossConversation).toHaveLength(1);
|
|
463
|
+
expect(commitContext).toBeTypeOf("function");
|
|
464
|
+
});
|
|
465
|
+
it("static helper tolerates resolveAgentName throwing (disconnected service)", async () => {
|
|
466
|
+
const { fake } = customSetup();
|
|
467
|
+
fake.state.setConversation("conv-1", { type: "dm", participants: [] });
|
|
468
|
+
forceResolveAgentNamePath(fake);
|
|
469
|
+
fake.state.setResolveAgentNameFailure("agent-unknown", new Error("Not connected"));
|
|
470
|
+
const { enriched: result } = await MoltZapChannelCore.enrichMessage(fake.service, buildMessage({ sender: { type: "agent", id: "agent-unknown" } }));
|
|
471
|
+
expect(result.sender.name).toBe("agent-unknown");
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
});
|
|
475
|
+
//# sourceMappingURL=channel-core.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-core.test.js","sourceRoot":"","sources":["../src/channel-core.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { MoltZapService, type ConversationMeta, type ContextOptions, type ServiceOptions, } from "./service.js";
|
|
1
|
+
export { MoltZapService, formatCrossConversationBlock, sanitizeForSystemReminder, type ConversationMeta, type ContextOptions, type CrossConvMessage, type CrossConversationEntry, type ServiceOptions, } from "./service.js";
|
|
2
|
+
export { MoltZapChannelCore, type ChannelCoreOptions, type ChannelService, type ContextBlocks, type EnrichedConversationMeta, type EnrichedInboundMessage, type EnrichedSender, type InboundHandler, } from "./channel-core.js";
|
|
2
3
|
export { MoltZapWsClient, type WsClientLogger, type MoltZapWsClientOptions, } from "./ws-client.js";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { MoltZapService, } from "./service.js";
|
|
1
|
+
export { MoltZapService, formatCrossConversationBlock, sanitizeForSystemReminder, } from "./service.js";
|
|
2
|
+
export { MoltZapChannelCore, } from "./channel-core.js";
|
|
2
3
|
export { MoltZapWsClient, } from "./ws-client.js";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAM1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,GAQnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,GAGhB,MAAM,gBAAgB,CAAC"}
|
package/dist/service.d.ts
CHANGED
|
@@ -11,6 +11,26 @@ export interface ContextOptions {
|
|
|
11
11
|
maxConversations?: number;
|
|
12
12
|
maxMessagesPerConv?: number;
|
|
13
13
|
}
|
|
14
|
+
/** Structured summary of recent activity in one other conversation. */
|
|
15
|
+
export interface CrossConversationEntry {
|
|
16
|
+
conversationId: string;
|
|
17
|
+
conversationName?: string;
|
|
18
|
+
senderName: string;
|
|
19
|
+
text: string;
|
|
20
|
+
minutesAgo: number;
|
|
21
|
+
/** Messages in this summary (capped by maxMessagesPerConv). */
|
|
22
|
+
count: number;
|
|
23
|
+
}
|
|
24
|
+
/** Escape `<`, `>`, `&` so sender content can't escape a `<system-reminder>` block. */
|
|
25
|
+
export declare function sanitizeForSystemReminder(s: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Format CrossConversationEntry[] as a `<system-reminder>` block. Adapters
|
|
28
|
+
* that inline context into prompt text (nanoclaw) and `MoltZapService.getContext`
|
|
29
|
+
* share this formatter so sanitization and line shape stay in one place.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatCrossConversationBlock(entries: CrossConversationEntry[], opts: {
|
|
32
|
+
header: string;
|
|
33
|
+
}): string | null;
|
|
14
34
|
export interface ServiceOptions {
|
|
15
35
|
serverUrl: string;
|
|
16
36
|
agentKey: string;
|
|
@@ -30,6 +50,15 @@ interface HelloOk {
|
|
|
30
50
|
}>;
|
|
31
51
|
unreadCounts?: Record<string, number>;
|
|
32
52
|
}
|
|
53
|
+
/** Full message from another conversation, used by peekFullMessages(). */
|
|
54
|
+
export interface CrossConvMessage {
|
|
55
|
+
conversationId: string;
|
|
56
|
+
conversationName?: string;
|
|
57
|
+
senderName: string;
|
|
58
|
+
senderId: string;
|
|
59
|
+
text: string;
|
|
60
|
+
timestamp: string;
|
|
61
|
+
}
|
|
33
62
|
/**
|
|
34
63
|
* Stateful MoltZap client that manages connection, conversation tracking,
|
|
35
64
|
* agent name resolution, and cross-conversation context generation.
|
|
@@ -81,11 +110,39 @@ export declare class MoltZapService {
|
|
|
81
110
|
* per viewing conversation and advanced after notification.
|
|
82
111
|
*/
|
|
83
112
|
getContext(currentConvId: string, opts?: ContextOptions): string | null;
|
|
113
|
+
/**
|
|
114
|
+
* Return recent activity in other conversations without advancing any state.
|
|
115
|
+
* Call `commit()` on the result to mark the returned messages as seen so
|
|
116
|
+
* subsequent peeks return only what's new. A caller that reads without
|
|
117
|
+
* committing can re-peek idempotently.
|
|
118
|
+
*/
|
|
119
|
+
peekContextEntries(currentConvId: string, opts?: {
|
|
120
|
+
maxConversations?: number;
|
|
121
|
+
maxMessagesPerConv?: number;
|
|
122
|
+
}): {
|
|
123
|
+
entries: CrossConversationEntry[];
|
|
124
|
+
commit: () => void;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Return all new messages from all other conversations as full transcripts,
|
|
128
|
+
* sorted chronologically. Uses the same lastNotified markers as
|
|
129
|
+
* peekContextEntries. Call commit() to advance markers.
|
|
130
|
+
*/
|
|
131
|
+
peekFullMessages(currentConvId: string): {
|
|
132
|
+
messages: CrossConvMessage[];
|
|
133
|
+
commit: () => void;
|
|
134
|
+
};
|
|
84
135
|
on(event: "message", handler: EventHandler<Message>): void;
|
|
85
136
|
on(event: "rawEvent", handler: EventHandler<EventFrame>): void;
|
|
86
137
|
on(event: "disconnect", handler: EventHandler<void>): void;
|
|
87
138
|
on(event: "reconnect", handler: EventHandler<HelloOk>): void;
|
|
88
139
|
sendRpc(method: string, params?: unknown): Promise<unknown>;
|
|
140
|
+
/**
|
|
141
|
+
* Fetch full conversation details (including participants) via RPC and merge
|
|
142
|
+
* into the local cache. Called on ConversationCreated events because the
|
|
143
|
+
* event schema omits the participants list — see protocol/events.ts.
|
|
144
|
+
*/
|
|
145
|
+
private refreshConversationParticipants;
|
|
89
146
|
private populateFromHello;
|
|
90
147
|
private handleEvent;
|
|
91
148
|
private storeMessage;
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,OAAO,EAGb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEzC,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|