@herdctl/discord 0.0.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.
Files changed (137) hide show
  1. package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
  2. package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/auto-mode-handler.test.js +362 -0
  4. package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
  5. package/dist/__tests__/discord-connector.test.d.ts +2 -0
  6. package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
  7. package/dist/__tests__/discord-connector.test.js +958 -0
  8. package/dist/__tests__/discord-connector.test.js.map +1 -0
  9. package/dist/__tests__/error-handler.test.d.ts +2 -0
  10. package/dist/__tests__/error-handler.test.d.ts.map +1 -0
  11. package/dist/__tests__/error-handler.test.js +509 -0
  12. package/dist/__tests__/error-handler.test.js.map +1 -0
  13. package/dist/__tests__/errors.test.d.ts +2 -0
  14. package/dist/__tests__/errors.test.d.ts.map +1 -0
  15. package/dist/__tests__/errors.test.js +152 -0
  16. package/dist/__tests__/errors.test.js.map +1 -0
  17. package/dist/__tests__/logger.test.d.ts +2 -0
  18. package/dist/__tests__/logger.test.d.ts.map +1 -0
  19. package/dist/__tests__/logger.test.js +282 -0
  20. package/dist/__tests__/logger.test.js.map +1 -0
  21. package/dist/__tests__/mention-handler.test.d.ts +2 -0
  22. package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/mention-handler.test.js +547 -0
  24. package/dist/__tests__/mention-handler.test.js.map +1 -0
  25. package/dist/auto-mode-handler.d.ts +145 -0
  26. package/dist/auto-mode-handler.d.ts.map +1 -0
  27. package/dist/auto-mode-handler.js +211 -0
  28. package/dist/auto-mode-handler.js.map +1 -0
  29. package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
  30. package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/command-manager.test.js +307 -0
  32. package/dist/commands/__tests__/command-manager.test.js.map +1 -0
  33. package/dist/commands/__tests__/help.test.d.ts +2 -0
  34. package/dist/commands/__tests__/help.test.d.ts.map +1 -0
  35. package/dist/commands/__tests__/help.test.js +105 -0
  36. package/dist/commands/__tests__/help.test.js.map +1 -0
  37. package/dist/commands/__tests__/reset.test.d.ts +2 -0
  38. package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
  39. package/dist/commands/__tests__/reset.test.js +140 -0
  40. package/dist/commands/__tests__/reset.test.js.map +1 -0
  41. package/dist/commands/__tests__/status.test.d.ts +2 -0
  42. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  43. package/dist/commands/__tests__/status.test.js +205 -0
  44. package/dist/commands/__tests__/status.test.js.map +1 -0
  45. package/dist/commands/command-manager.d.ts +66 -0
  46. package/dist/commands/command-manager.d.ts.map +1 -0
  47. package/dist/commands/command-manager.js +191 -0
  48. package/dist/commands/command-manager.js.map +1 -0
  49. package/dist/commands/help.d.ts +8 -0
  50. package/dist/commands/help.d.ts.map +1 -0
  51. package/dist/commands/help.js +27 -0
  52. package/dist/commands/help.js.map +1 -0
  53. package/dist/commands/index.d.ts +12 -0
  54. package/dist/commands/index.d.ts.map +1 -0
  55. package/dist/commands/index.js +13 -0
  56. package/dist/commands/index.js.map +1 -0
  57. package/dist/commands/reset.d.ts +9 -0
  58. package/dist/commands/reset.d.ts.map +1 -0
  59. package/dist/commands/reset.js +28 -0
  60. package/dist/commands/reset.js.map +1 -0
  61. package/dist/commands/status.d.ts +9 -0
  62. package/dist/commands/status.d.ts.map +1 -0
  63. package/dist/commands/status.js +102 -0
  64. package/dist/commands/status.js.map +1 -0
  65. package/dist/commands/types.d.ts +87 -0
  66. package/dist/commands/types.d.ts.map +1 -0
  67. package/dist/commands/types.js +8 -0
  68. package/dist/commands/types.js.map +1 -0
  69. package/dist/discord-connector.d.ts +154 -0
  70. package/dist/discord-connector.d.ts.map +1 -0
  71. package/dist/discord-connector.js +638 -0
  72. package/dist/discord-connector.js.map +1 -0
  73. package/dist/error-handler.d.ts +237 -0
  74. package/dist/error-handler.d.ts.map +1 -0
  75. package/dist/error-handler.js +433 -0
  76. package/dist/error-handler.js.map +1 -0
  77. package/dist/errors.d.ts +61 -0
  78. package/dist/errors.d.ts.map +1 -0
  79. package/dist/errors.js +77 -0
  80. package/dist/errors.js.map +1 -0
  81. package/dist/index.d.ts +34 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +36 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/logger.d.ts +119 -0
  86. package/dist/logger.d.ts.map +1 -0
  87. package/dist/logger.js +198 -0
  88. package/dist/logger.js.map +1 -0
  89. package/dist/mention-handler.d.ts +176 -0
  90. package/dist/mention-handler.d.ts.map +1 -0
  91. package/dist/mention-handler.js +236 -0
  92. package/dist/mention-handler.js.map +1 -0
  93. package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
  94. package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
  95. package/dist/session-manager/__tests__/errors.test.js +124 -0
  96. package/dist/session-manager/__tests__/errors.test.js.map +1 -0
  97. package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
  98. package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
  99. package/dist/session-manager/__tests__/session-manager.test.js +517 -0
  100. package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
  101. package/dist/session-manager/__tests__/types.test.d.ts +2 -0
  102. package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
  103. package/dist/session-manager/__tests__/types.test.js +169 -0
  104. package/dist/session-manager/__tests__/types.test.js.map +1 -0
  105. package/dist/session-manager/errors.d.ts +58 -0
  106. package/dist/session-manager/errors.d.ts.map +1 -0
  107. package/dist/session-manager/errors.js +70 -0
  108. package/dist/session-manager/errors.js.map +1 -0
  109. package/dist/session-manager/index.d.ts +11 -0
  110. package/dist/session-manager/index.d.ts.map +1 -0
  111. package/dist/session-manager/index.js +12 -0
  112. package/dist/session-manager/index.js.map +1 -0
  113. package/dist/session-manager/session-manager.d.ts +107 -0
  114. package/dist/session-manager/session-manager.d.ts.map +1 -0
  115. package/dist/session-manager/session-manager.js +347 -0
  116. package/dist/session-manager/session-manager.js.map +1 -0
  117. package/dist/session-manager/types.d.ts +167 -0
  118. package/dist/session-manager/types.d.ts.map +1 -0
  119. package/dist/session-manager/types.js +57 -0
  120. package/dist/session-manager/types.js.map +1 -0
  121. package/dist/types.d.ts +323 -0
  122. package/dist/types.d.ts.map +1 -0
  123. package/dist/types.js +8 -0
  124. package/dist/types.js.map +1 -0
  125. package/dist/utils/__tests__/formatting.test.d.ts +2 -0
  126. package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
  127. package/dist/utils/__tests__/formatting.test.js +571 -0
  128. package/dist/utils/__tests__/formatting.test.js.map +1 -0
  129. package/dist/utils/formatting.d.ts +211 -0
  130. package/dist/utils/formatting.d.ts.map +1 -0
  131. package/dist/utils/formatting.js +305 -0
  132. package/dist/utils/formatting.js.map +1 -0
  133. package/dist/utils/index.d.ts +5 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +9 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/package.json +49 -0
@@ -0,0 +1,547 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { isBotMentioned, shouldProcessMessage, stripBotMention, stripMentions, processMessage, buildConversationContext, formatContextForPrompt, } from "../mention-handler.js";
3
+ // =============================================================================
4
+ // Mock Helpers
5
+ // =============================================================================
6
+ function createMockUser(overrides = {}) {
7
+ return {
8
+ id: "user-123",
9
+ username: "testuser",
10
+ displayName: "Test User",
11
+ bot: false,
12
+ ...overrides,
13
+ };
14
+ }
15
+ function createMockMessage(overrides = {}) {
16
+ const mockMentions = {
17
+ users: new Map(),
18
+ ...overrides.mentions,
19
+ };
20
+ const base = {
21
+ id: "message-123",
22
+ content: "Hello world",
23
+ author: createMockUser(),
24
+ createdAt: new Date("2024-01-20T10:00:00Z"),
25
+ mentions: mockMentions,
26
+ channel: {
27
+ id: "channel-123",
28
+ send: vi.fn(),
29
+ messages: {
30
+ fetch: vi.fn(),
31
+ },
32
+ },
33
+ guildId: "guild-123",
34
+ };
35
+ return {
36
+ ...base,
37
+ ...overrides,
38
+ mentions: mockMentions,
39
+ };
40
+ }
41
+ function createMockChannel(messages = []) {
42
+ const mockCollection = new Map();
43
+ messages.forEach((msg) => mockCollection.set(msg.id, msg));
44
+ return {
45
+ id: "channel-123",
46
+ send: vi.fn(),
47
+ messages: {
48
+ fetch: vi.fn().mockResolvedValue(mockCollection),
49
+ },
50
+ };
51
+ }
52
+ // =============================================================================
53
+ // isBotMentioned Tests
54
+ // =============================================================================
55
+ describe("isBotMentioned", () => {
56
+ it("returns true when bot is mentioned", () => {
57
+ const botUser = createMockUser({ id: "bot-123", bot: true });
58
+ const mentionsMap = new Map();
59
+ mentionsMap.set("bot-123", botUser);
60
+ const message = createMockMessage({
61
+ content: "<@bot-123> help me",
62
+ mentions: { users: mentionsMap },
63
+ });
64
+ expect(isBotMentioned(message, "bot-123")).toBe(true);
65
+ });
66
+ it("returns false when bot is not mentioned", () => {
67
+ const message = createMockMessage({
68
+ content: "Hello everyone",
69
+ });
70
+ expect(isBotMentioned(message, "bot-123")).toBe(false);
71
+ });
72
+ it("returns false when different user is mentioned", () => {
73
+ const otherUser = createMockUser({ id: "other-user" });
74
+ const mentionsMap = new Map();
75
+ mentionsMap.set("other-user", otherUser);
76
+ const message = createMockMessage({
77
+ content: "<@other-user> hello",
78
+ mentions: { users: mentionsMap },
79
+ });
80
+ expect(isBotMentioned(message, "bot-123")).toBe(false);
81
+ });
82
+ });
83
+ // =============================================================================
84
+ // shouldProcessMessage Tests
85
+ // =============================================================================
86
+ describe("shouldProcessMessage", () => {
87
+ const botUserId = "bot-123";
88
+ describe("mention mode", () => {
89
+ it("returns true when bot is mentioned", () => {
90
+ const botUser = createMockUser({ id: botUserId, bot: true });
91
+ const mentionsMap = new Map();
92
+ mentionsMap.set(botUserId, botUser);
93
+ const message = createMockMessage({
94
+ content: "<@bot-123> help me",
95
+ mentions: { users: mentionsMap },
96
+ });
97
+ expect(shouldProcessMessage(message, botUserId, "mention")).toBe(true);
98
+ });
99
+ it("returns false when bot is not mentioned", () => {
100
+ const message = createMockMessage({
101
+ content: "Hello everyone",
102
+ });
103
+ expect(shouldProcessMessage(message, botUserId, "mention")).toBe(false);
104
+ });
105
+ it("returns false for bot messages even when mentioned", () => {
106
+ const botUser = createMockUser({ id: botUserId, bot: true });
107
+ const mentionsMap = new Map();
108
+ mentionsMap.set(botUserId, botUser);
109
+ const message = createMockMessage({
110
+ content: "<@bot-123> test",
111
+ author: createMockUser({ bot: true }),
112
+ mentions: { users: mentionsMap },
113
+ });
114
+ expect(shouldProcessMessage(message, botUserId, "mention")).toBe(false);
115
+ });
116
+ });
117
+ describe("auto mode", () => {
118
+ it("returns true for non-bot messages", () => {
119
+ const message = createMockMessage({
120
+ content: "Hello world",
121
+ });
122
+ expect(shouldProcessMessage(message, botUserId, "auto")).toBe(true);
123
+ });
124
+ it("returns false for bot messages", () => {
125
+ const message = createMockMessage({
126
+ content: "Hello world",
127
+ author: createMockUser({ bot: true }),
128
+ });
129
+ expect(shouldProcessMessage(message, botUserId, "auto")).toBe(false);
130
+ });
131
+ it("returns true regardless of mention status", () => {
132
+ const message = createMockMessage({
133
+ content: "No mention here",
134
+ });
135
+ expect(shouldProcessMessage(message, botUserId, "auto")).toBe(true);
136
+ });
137
+ });
138
+ });
139
+ // =============================================================================
140
+ // stripBotMention Tests
141
+ // =============================================================================
142
+ describe("stripBotMention", () => {
143
+ const botUserId = "123456789";
144
+ it("strips regular mention format", () => {
145
+ const content = "<@123456789> help me with this";
146
+ expect(stripBotMention(content, botUserId)).toBe("help me with this");
147
+ });
148
+ it("strips nickname mention format", () => {
149
+ const content = "<@!123456789> help me with this";
150
+ expect(stripBotMention(content, botUserId)).toBe("help me with this");
151
+ });
152
+ it("strips multiple mentions of the same bot", () => {
153
+ const content = "<@123456789> hello <@123456789>";
154
+ expect(stripBotMention(content, botUserId)).toBe("hello");
155
+ });
156
+ it("preserves mentions of other users", () => {
157
+ const content = "<@123456789> <@987654321> hello";
158
+ expect(stripBotMention(content, botUserId)).toBe("<@987654321> hello");
159
+ });
160
+ it("handles content with no mentions", () => {
161
+ const content = "Hello world";
162
+ expect(stripBotMention(content, botUserId)).toBe("Hello world");
163
+ });
164
+ it("handles content that is only the mention", () => {
165
+ const content = "<@123456789>";
166
+ expect(stripBotMention(content, botUserId)).toBe("");
167
+ });
168
+ it("trims whitespace after stripping", () => {
169
+ const content = " <@123456789> help ";
170
+ expect(stripBotMention(content, botUserId)).toBe("help");
171
+ });
172
+ it("handles mention at the end of message", () => {
173
+ const content = "Hello <@123456789>";
174
+ expect(stripBotMention(content, botUserId)).toBe("Hello");
175
+ });
176
+ it("handles mention in the middle of message", () => {
177
+ const content = "Hello <@123456789> world";
178
+ expect(stripBotMention(content, botUserId)).toBe("Hello world");
179
+ });
180
+ });
181
+ // =============================================================================
182
+ // stripMentions Tests
183
+ // =============================================================================
184
+ describe("stripMentions", () => {
185
+ it("strips specific bot mention when botUserId provided", () => {
186
+ const content = "<@123456789> <@987654321> hello";
187
+ expect(stripMentions(content, "123456789")).toBe("<@987654321> hello");
188
+ });
189
+ it("strips all mentions when no botUserId provided", () => {
190
+ const content = "<@123456789> <@987654321> hello";
191
+ expect(stripMentions(content)).toBe("hello");
192
+ });
193
+ it("strips nickname format mentions", () => {
194
+ const content = "<@!123456789> hello";
195
+ expect(stripMentions(content)).toBe("hello");
196
+ });
197
+ it("handles content with no mentions", () => {
198
+ const content = "Hello world";
199
+ expect(stripMentions(content)).toBe("Hello world");
200
+ });
201
+ });
202
+ // =============================================================================
203
+ // processMessage Tests
204
+ // =============================================================================
205
+ describe("processMessage", () => {
206
+ const botUserId = "bot-123";
207
+ it("processes a regular user message", () => {
208
+ const message = createMockMessage({
209
+ id: "msg-123",
210
+ content: "<@bot-123> help me please",
211
+ author: createMockUser({
212
+ id: "user-456",
213
+ username: "testuser",
214
+ displayName: "Test User",
215
+ }),
216
+ createdAt: new Date("2024-01-20T10:00:00Z"),
217
+ });
218
+ const result = processMessage(message, botUserId);
219
+ expect(result).toEqual({
220
+ authorId: "user-456",
221
+ authorName: "Test User",
222
+ isBot: false,
223
+ isSelf: false,
224
+ content: "help me please",
225
+ timestamp: "2024-01-20T10:00:00.000Z",
226
+ messageId: "msg-123",
227
+ });
228
+ });
229
+ it("identifies bot messages correctly", () => {
230
+ const message = createMockMessage({
231
+ author: createMockUser({ id: "some-bot", bot: true }),
232
+ });
233
+ const result = processMessage(message, botUserId);
234
+ expect(result.isBot).toBe(true);
235
+ expect(result.isSelf).toBe(false);
236
+ });
237
+ it("identifies self messages correctly", () => {
238
+ const message = createMockMessage({
239
+ author: createMockUser({ id: botUserId, bot: true }),
240
+ });
241
+ const result = processMessage(message, botUserId);
242
+ expect(result.isBot).toBe(true);
243
+ expect(result.isSelf).toBe(true);
244
+ });
245
+ it("uses username when displayName is not available", () => {
246
+ const message = createMockMessage({
247
+ author: createMockUser({
248
+ id: "user-456",
249
+ username: "testuser",
250
+ displayName: undefined,
251
+ }),
252
+ });
253
+ const result = processMessage(message, botUserId);
254
+ expect(result.authorName).toBe("testuser");
255
+ });
256
+ });
257
+ // =============================================================================
258
+ // buildConversationContext Tests
259
+ // =============================================================================
260
+ describe("buildConversationContext", () => {
261
+ const botUserId = "bot-123";
262
+ it("builds context with message history", async () => {
263
+ // Create history messages (older messages first)
264
+ const historyMessages = [
265
+ createMockMessage({
266
+ id: "msg-1",
267
+ content: "First message",
268
+ createdAt: new Date("2024-01-20T09:58:00Z"),
269
+ author: createMockUser({ id: "user-1", username: "user1" }),
270
+ }),
271
+ createMockMessage({
272
+ id: "msg-2",
273
+ content: "Second message",
274
+ createdAt: new Date("2024-01-20T09:59:00Z"),
275
+ author: createMockUser({ id: "user-2", username: "user2" }),
276
+ }),
277
+ ];
278
+ const channel = createMockChannel(historyMessages);
279
+ // Trigger message with mention
280
+ const botUser = createMockUser({ id: botUserId, bot: true });
281
+ const mentionsMap = new Map();
282
+ mentionsMap.set(botUserId, botUser);
283
+ const triggerMessage = createMockMessage({
284
+ id: "msg-3",
285
+ content: "<@bot-123> help me please",
286
+ createdAt: new Date("2024-01-20T10:00:00Z"),
287
+ mentions: { users: mentionsMap },
288
+ channel: channel,
289
+ });
290
+ const context = await buildConversationContext(triggerMessage, channel, botUserId, { maxMessages: 10 });
291
+ expect(context.prompt).toBe("help me please");
292
+ expect(context.wasMentioned).toBe(true);
293
+ expect(context.messages).toHaveLength(2);
294
+ // Messages should be in chronological order
295
+ expect(context.messages[0].content).toBe("First message");
296
+ expect(context.messages[1].content).toBe("Second message");
297
+ });
298
+ it("respects maxMessages limit", async () => {
299
+ const historyMessages = Array.from({ length: 20 }, (_, i) => createMockMessage({
300
+ id: `msg-${i}`,
301
+ content: `Message ${i}`,
302
+ createdAt: new Date(`2024-01-20T09:${String(i).padStart(2, "0")}:00Z`),
303
+ author: createMockUser({ id: `user-${i}` }),
304
+ }));
305
+ const channel = createMockChannel(historyMessages);
306
+ const triggerMessage = createMockMessage({
307
+ id: "trigger",
308
+ content: "trigger message",
309
+ channel: channel,
310
+ });
311
+ const context = await buildConversationContext(triggerMessage, channel, botUserId, { maxMessages: 5 });
312
+ expect(context.messages).toHaveLength(5);
313
+ });
314
+ it("filters out empty messages", async () => {
315
+ const historyMessages = [
316
+ createMockMessage({
317
+ id: "msg-1",
318
+ content: "Valid message",
319
+ createdAt: new Date("2024-01-20T09:58:00Z"),
320
+ }),
321
+ createMockMessage({
322
+ id: "msg-2",
323
+ content: "", // Empty message
324
+ createdAt: new Date("2024-01-20T09:59:00Z"),
325
+ }),
326
+ createMockMessage({
327
+ id: "msg-3",
328
+ content: " ", // Whitespace only
329
+ createdAt: new Date("2024-01-20T09:59:30Z"),
330
+ }),
331
+ ];
332
+ const channel = createMockChannel(historyMessages);
333
+ const triggerMessage = createMockMessage({
334
+ id: "trigger",
335
+ content: "trigger message",
336
+ channel: channel,
337
+ });
338
+ const context = await buildConversationContext(triggerMessage, channel, botUserId, { maxMessages: 10 });
339
+ expect(context.messages).toHaveLength(1);
340
+ expect(context.messages[0].content).toBe("Valid message");
341
+ });
342
+ it("filters out bot messages when includeBotMessages is false", async () => {
343
+ const historyMessages = [
344
+ createMockMessage({
345
+ id: "msg-1",
346
+ content: "User message",
347
+ author: createMockUser({ id: "user-1", bot: false }),
348
+ createdAt: new Date("2024-01-20T09:58:00Z"),
349
+ }),
350
+ createMockMessage({
351
+ id: "msg-2",
352
+ content: "Bot response",
353
+ author: createMockUser({ id: botUserId, bot: true }),
354
+ createdAt: new Date("2024-01-20T09:59:00Z"),
355
+ }),
356
+ ];
357
+ const channel = createMockChannel(historyMessages);
358
+ const triggerMessage = createMockMessage({
359
+ id: "trigger",
360
+ content: "trigger message",
361
+ channel: channel,
362
+ });
363
+ const context = await buildConversationContext(triggerMessage, channel, botUserId, { maxMessages: 10, includeBotMessages: false });
364
+ expect(context.messages).toHaveLength(1);
365
+ expect(context.messages[0].content).toBe("User message");
366
+ });
367
+ it("prioritizes user messages when enabled", async () => {
368
+ // Create 5 bot messages and 3 user messages
369
+ const historyMessages = [
370
+ createMockMessage({
371
+ id: "user-1",
372
+ content: "User 1",
373
+ author: createMockUser({ id: "user-1", bot: false }),
374
+ createdAt: new Date("2024-01-20T09:50:00Z"),
375
+ }),
376
+ createMockMessage({
377
+ id: "bot-1",
378
+ content: "Bot 1",
379
+ author: createMockUser({ id: "bot-other", bot: true }),
380
+ createdAt: new Date("2024-01-20T09:51:00Z"),
381
+ }),
382
+ createMockMessage({
383
+ id: "bot-2",
384
+ content: "Bot 2",
385
+ author: createMockUser({ id: "bot-other", bot: true }),
386
+ createdAt: new Date("2024-01-20T09:52:00Z"),
387
+ }),
388
+ createMockMessage({
389
+ id: "user-2",
390
+ content: "User 2",
391
+ author: createMockUser({ id: "user-2", bot: false }),
392
+ createdAt: new Date("2024-01-20T09:53:00Z"),
393
+ }),
394
+ createMockMessage({
395
+ id: "bot-3",
396
+ content: "Bot 3",
397
+ author: createMockUser({ id: "bot-other", bot: true }),
398
+ createdAt: new Date("2024-01-20T09:54:00Z"),
399
+ }),
400
+ createMockMessage({
401
+ id: "user-3",
402
+ content: "User 3",
403
+ author: createMockUser({ id: "user-3", bot: false }),
404
+ createdAt: new Date("2024-01-20T09:55:00Z"),
405
+ }),
406
+ createMockMessage({
407
+ id: "bot-4",
408
+ content: "Bot 4",
409
+ author: createMockUser({ id: "bot-other", bot: true }),
410
+ createdAt: new Date("2024-01-20T09:56:00Z"),
411
+ }),
412
+ createMockMessage({
413
+ id: "bot-5",
414
+ content: "Bot 5",
415
+ author: createMockUser({ id: "bot-other", bot: true }),
416
+ createdAt: new Date("2024-01-20T09:57:00Z"),
417
+ }),
418
+ ];
419
+ const channel = createMockChannel(historyMessages);
420
+ const triggerMessage = createMockMessage({
421
+ id: "trigger",
422
+ content: "trigger message",
423
+ channel: channel,
424
+ });
425
+ const context = await buildConversationContext(triggerMessage, channel, botUserId, { maxMessages: 5, prioritizeUserMessages: true });
426
+ // Should include all 3 user messages and 2 bot messages to fill up to 5
427
+ expect(context.messages).toHaveLength(5);
428
+ const userMessages = context.messages.filter((m) => !m.isBot);
429
+ expect(userMessages).toHaveLength(3);
430
+ });
431
+ it("returns correct wasMentioned for mentions", async () => {
432
+ const channel = createMockChannel([]);
433
+ const botUser = createMockUser({ id: botUserId, bot: true });
434
+ const mentionsMap = new Map();
435
+ mentionsMap.set(botUserId, botUser);
436
+ const triggerMessage = createMockMessage({
437
+ id: "trigger",
438
+ content: "<@bot-123> hello",
439
+ mentions: { users: mentionsMap },
440
+ channel: channel,
441
+ });
442
+ const context = await buildConversationContext(triggerMessage, channel, botUserId);
443
+ expect(context.wasMentioned).toBe(true);
444
+ });
445
+ it("returns correct wasMentioned when not mentioned", async () => {
446
+ const channel = createMockChannel([]);
447
+ const triggerMessage = createMockMessage({
448
+ id: "trigger",
449
+ content: "hello",
450
+ channel: channel,
451
+ });
452
+ const context = await buildConversationContext(triggerMessage, channel, botUserId);
453
+ expect(context.wasMentioned).toBe(false);
454
+ });
455
+ });
456
+ // =============================================================================
457
+ // formatContextForPrompt Tests
458
+ // =============================================================================
459
+ describe("formatContextForPrompt", () => {
460
+ it("formats messages correctly", () => {
461
+ const context = {
462
+ messages: [
463
+ {
464
+ authorId: "user-1",
465
+ authorName: "Alice",
466
+ isBot: false,
467
+ isSelf: false,
468
+ content: "How do I use this?",
469
+ timestamp: "2024-01-20T10:00:00.000Z",
470
+ messageId: "msg-1",
471
+ },
472
+ {
473
+ authorId: "bot-1",
474
+ authorName: "HelperBot",
475
+ isBot: true,
476
+ isSelf: true,
477
+ content: "Here is how you can use it...",
478
+ timestamp: "2024-01-20T10:00:30.000Z",
479
+ messageId: "msg-2",
480
+ },
481
+ {
482
+ authorId: "user-1",
483
+ authorName: "Alice",
484
+ isBot: false,
485
+ isSelf: false,
486
+ content: "Thanks, but what about...",
487
+ timestamp: "2024-01-20T10:01:00.000Z",
488
+ messageId: "msg-3",
489
+ },
490
+ ],
491
+ prompt: "Can you explain more?",
492
+ wasMentioned: true,
493
+ };
494
+ const formatted = formatContextForPrompt(context);
495
+ expect(formatted).toContain("[Alice at 2024-01-20T10:00:00.000Z]: How do I use this?");
496
+ expect(formatted).toContain("[HelperBot (bot) at 2024-01-20T10:00:30.000Z]: Here is how you can use it...");
497
+ expect(formatted).toContain("[Alice at 2024-01-20T10:01:00.000Z]: Thanks, but what about...");
498
+ });
499
+ it("returns empty string for empty messages", () => {
500
+ const context = {
501
+ messages: [],
502
+ prompt: "Hello",
503
+ wasMentioned: false,
504
+ };
505
+ expect(formatContextForPrompt(context)).toBe("");
506
+ });
507
+ it("marks bot messages with (bot) label", () => {
508
+ const context = {
509
+ messages: [
510
+ {
511
+ authorId: "bot-1",
512
+ authorName: "BotName",
513
+ isBot: true,
514
+ isSelf: false,
515
+ content: "Bot message",
516
+ timestamp: "2024-01-20T10:00:00.000Z",
517
+ messageId: "msg-1",
518
+ },
519
+ ],
520
+ prompt: "Test",
521
+ wasMentioned: false,
522
+ };
523
+ const formatted = formatContextForPrompt(context);
524
+ expect(formatted).toContain("BotName (bot)");
525
+ });
526
+ it("does not mark user messages with (bot) label", () => {
527
+ const context = {
528
+ messages: [
529
+ {
530
+ authorId: "user-1",
531
+ authorName: "UserName",
532
+ isBot: false,
533
+ isSelf: false,
534
+ content: "User message",
535
+ timestamp: "2024-01-20T10:00:00.000Z",
536
+ messageId: "msg-1",
537
+ },
538
+ ],
539
+ prompt: "Test",
540
+ wasMentioned: false,
541
+ };
542
+ const formatted = formatContextForPrompt(context);
543
+ expect(formatted).not.toContain("(bot)");
544
+ expect(formatted).toContain("[UserName at");
545
+ });
546
+ });
547
+ //# sourceMappingURL=mention-handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-handler.test.js","sourceRoot":"","sources":["../../src/__tests__/mention-handler.test.ts"],"names":[],"mappings":"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"}