@herdctl/discord 0.2.2 → 1.0.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__/auto-mode-handler.test.js +1 -28
- package/dist/__tests__/auto-mode-handler.test.js.map +1 -1
- package/dist/__tests__/discord-connector.test.js +1 -0
- package/dist/__tests__/discord-connector.test.js.map +1 -1
- package/dist/__tests__/error-handler.test.js +1 -1
- package/dist/__tests__/error-handler.test.js.map +1 -1
- package/dist/__tests__/manager.test.d.ts +8 -0
- package/dist/__tests__/manager.test.d.ts.map +1 -0
- package/dist/__tests__/manager.test.js +3541 -0
- package/dist/__tests__/manager.test.js.map +1 -0
- package/dist/auto-mode-handler.d.ts +8 -39
- package/dist/auto-mode-handler.d.ts.map +1 -1
- package/dist/auto-mode-handler.js +12 -78
- package/dist/auto-mode-handler.js.map +1 -1
- package/dist/commands/__tests__/command-manager.test.js +1 -0
- package/dist/commands/__tests__/command-manager.test.js.map +1 -1
- package/dist/commands/__tests__/help.test.js +1 -0
- package/dist/commands/__tests__/help.test.js.map +1 -1
- package/dist/commands/__tests__/reset.test.js +1 -0
- package/dist/commands/__tests__/reset.test.js.map +1 -1
- package/dist/commands/__tests__/status.test.js +1 -0
- package/dist/commands/__tests__/status.test.js.map +1 -1
- package/dist/commands/command-manager.d.ts.map +1 -1
- package/dist/commands/command-manager.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -54
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/types.d.ts +3 -3
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/discord-connector.d.ts +2 -2
- package/dist/discord-connector.d.ts.map +1 -1
- package/dist/discord-connector.js.map +1 -1
- package/dist/error-handler.js +1 -1
- package/dist/error-handler.js.map +1 -1
- package/dist/index.d.ts +13 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -15
- package/dist/index.js.map +1 -1
- package/dist/manager.d.ts +195 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +851 -0
- package/dist/manager.js.map +1 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/__tests__/formatting.test.js +1 -247
- package/dist/utils/__tests__/formatting.test.js.map +1 -1
- package/dist/utils/formatting.d.ts +11 -99
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +15 -163
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/package.json +3 -4
- package/dist/session-manager/__tests__/errors.test.d.ts +0 -2
- package/dist/session-manager/__tests__/errors.test.d.ts.map +0 -1
- package/dist/session-manager/__tests__/errors.test.js +0 -124
- package/dist/session-manager/__tests__/errors.test.js.map +0 -1
- package/dist/session-manager/__tests__/session-manager.test.d.ts +0 -2
- package/dist/session-manager/__tests__/session-manager.test.d.ts.map +0 -1
- package/dist/session-manager/__tests__/session-manager.test.js +0 -573
- package/dist/session-manager/__tests__/session-manager.test.js.map +0 -1
- package/dist/session-manager/__tests__/types.test.d.ts +0 -2
- package/dist/session-manager/__tests__/types.test.d.ts.map +0 -1
- package/dist/session-manager/__tests__/types.test.js +0 -169
- package/dist/session-manager/__tests__/types.test.js.map +0 -1
- package/dist/session-manager/errors.d.ts +0 -58
- package/dist/session-manager/errors.d.ts.map +0 -1
- package/dist/session-manager/errors.js +0 -70
- package/dist/session-manager/errors.js.map +0 -1
- package/dist/session-manager/index.d.ts +0 -11
- package/dist/session-manager/index.d.ts.map +0 -1
- package/dist/session-manager/index.js +0 -12
- package/dist/session-manager/index.js.map +0 -1
- package/dist/session-manager/session-manager.d.ts +0 -119
- package/dist/session-manager/session-manager.d.ts.map +0 -1
- package/dist/session-manager/session-manager.js +0 -383
- package/dist/session-manager/session-manager.js.map +0 -1
- package/dist/session-manager/types.d.ts +0 -186
- package/dist/session-manager/types.d.ts.map +0 -1
- package/dist/session-manager/types.js +0 -57
- package/dist/session-manager/types.js.map +0 -1
|
@@ -1,573 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
|
-
import { mkdir, writeFile, readFile, rm } from "node:fs/promises";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { randomBytes } from "node:crypto";
|
|
6
|
-
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
7
|
-
import { SessionManager } from "../session-manager.js";
|
|
8
|
-
import { SessionStateReadError, } from "../errors.js";
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// Test Fixtures
|
|
11
|
-
// =============================================================================
|
|
12
|
-
function createTestDir() {
|
|
13
|
-
const random = randomBytes(8).toString("hex");
|
|
14
|
-
return join(tmpdir(), `herdctl-session-test-${random}`);
|
|
15
|
-
}
|
|
16
|
-
function createMockLogger() {
|
|
17
|
-
return {
|
|
18
|
-
debug: vi.fn(),
|
|
19
|
-
info: vi.fn(),
|
|
20
|
-
warn: vi.fn(),
|
|
21
|
-
error: vi.fn(),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// =============================================================================
|
|
25
|
-
// Session Manager Tests
|
|
26
|
-
// =============================================================================
|
|
27
|
-
describe("SessionManager", () => {
|
|
28
|
-
let testDir;
|
|
29
|
-
let mockLogger;
|
|
30
|
-
beforeEach(async () => {
|
|
31
|
-
testDir = createTestDir();
|
|
32
|
-
await mkdir(testDir, { recursive: true });
|
|
33
|
-
mockLogger = createMockLogger();
|
|
34
|
-
vi.clearAllMocks();
|
|
35
|
-
});
|
|
36
|
-
afterEach(async () => {
|
|
37
|
-
try {
|
|
38
|
-
await rm(testDir, { recursive: true, force: true });
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
// Ignore cleanup errors
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
// ===========================================================================
|
|
45
|
-
// Constructor Tests
|
|
46
|
-
// ===========================================================================
|
|
47
|
-
describe("constructor", () => {
|
|
48
|
-
it("creates session manager with valid options", () => {
|
|
49
|
-
const manager = new SessionManager({
|
|
50
|
-
agentName: "test-agent",
|
|
51
|
-
stateDir: testDir,
|
|
52
|
-
logger: mockLogger,
|
|
53
|
-
});
|
|
54
|
-
expect(manager.agentName).toBe("test-agent");
|
|
55
|
-
});
|
|
56
|
-
it("uses default expiry hours when not specified", async () => {
|
|
57
|
-
const manager = new SessionManager({
|
|
58
|
-
agentName: "test-agent",
|
|
59
|
-
stateDir: testDir,
|
|
60
|
-
logger: mockLogger,
|
|
61
|
-
});
|
|
62
|
-
// Create a session
|
|
63
|
-
await manager.getOrCreateSession("channel-1");
|
|
64
|
-
// Read the state file to verify it was created
|
|
65
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
66
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
67
|
-
const state = parseYaml(content);
|
|
68
|
-
expect(state.channels["channel-1"]).toBeDefined();
|
|
69
|
-
});
|
|
70
|
-
it("accepts custom expiry hours", () => {
|
|
71
|
-
const manager = new SessionManager({
|
|
72
|
-
agentName: "test-agent",
|
|
73
|
-
stateDir: testDir,
|
|
74
|
-
sessionExpiryHours: 48,
|
|
75
|
-
logger: mockLogger,
|
|
76
|
-
});
|
|
77
|
-
expect(manager.agentName).toBe("test-agent");
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
// ===========================================================================
|
|
81
|
-
// getOrCreateSession Tests
|
|
82
|
-
// ===========================================================================
|
|
83
|
-
describe("getOrCreateSession", () => {
|
|
84
|
-
it("creates new session when none exists", async () => {
|
|
85
|
-
const manager = new SessionManager({
|
|
86
|
-
agentName: "test-agent",
|
|
87
|
-
stateDir: testDir,
|
|
88
|
-
logger: mockLogger,
|
|
89
|
-
});
|
|
90
|
-
const result = await manager.getOrCreateSession("channel-123");
|
|
91
|
-
expect(result.isNew).toBe(true);
|
|
92
|
-
expect(result.sessionId).toMatch(/^discord-test-agent-/);
|
|
93
|
-
expect(mockLogger.info).toHaveBeenCalledWith("Created new session", expect.objectContaining({ channelId: "channel-123" }));
|
|
94
|
-
});
|
|
95
|
-
it("returns existing session when one exists", async () => {
|
|
96
|
-
const manager = new SessionManager({
|
|
97
|
-
agentName: "test-agent",
|
|
98
|
-
stateDir: testDir,
|
|
99
|
-
logger: mockLogger,
|
|
100
|
-
});
|
|
101
|
-
// Create first session
|
|
102
|
-
const first = await manager.getOrCreateSession("channel-123");
|
|
103
|
-
// Get session again
|
|
104
|
-
const second = await manager.getOrCreateSession("channel-123");
|
|
105
|
-
expect(second.isNew).toBe(false);
|
|
106
|
-
expect(second.sessionId).toBe(first.sessionId);
|
|
107
|
-
expect(mockLogger.info).toHaveBeenCalledWith("Resuming existing session", expect.objectContaining({
|
|
108
|
-
channelId: "channel-123",
|
|
109
|
-
sessionId: first.sessionId,
|
|
110
|
-
}));
|
|
111
|
-
});
|
|
112
|
-
it("creates different sessions for different channels", async () => {
|
|
113
|
-
const manager = new SessionManager({
|
|
114
|
-
agentName: "test-agent",
|
|
115
|
-
stateDir: testDir,
|
|
116
|
-
logger: mockLogger,
|
|
117
|
-
});
|
|
118
|
-
const session1 = await manager.getOrCreateSession("channel-1");
|
|
119
|
-
const session2 = await manager.getOrCreateSession("channel-2");
|
|
120
|
-
expect(session1.sessionId).not.toBe(session2.sessionId);
|
|
121
|
-
expect(session1.isNew).toBe(true);
|
|
122
|
-
expect(session2.isNew).toBe(true);
|
|
123
|
-
});
|
|
124
|
-
it("creates new session when previous is expired", async () => {
|
|
125
|
-
const manager = new SessionManager({
|
|
126
|
-
agentName: "test-agent",
|
|
127
|
-
stateDir: testDir,
|
|
128
|
-
sessionExpiryHours: 1, // 1 hour expiry
|
|
129
|
-
logger: mockLogger,
|
|
130
|
-
});
|
|
131
|
-
// Create initial session
|
|
132
|
-
const first = await manager.getOrCreateSession("channel-123");
|
|
133
|
-
// Manually update state to have old timestamp
|
|
134
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
135
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
136
|
-
const state = parseYaml(content);
|
|
137
|
-
// Set last message to 2 hours ago
|
|
138
|
-
const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000);
|
|
139
|
-
state.channels["channel-123"].lastMessageAt = twoHoursAgo.toISOString();
|
|
140
|
-
await writeFile(stateFilePath, stringifyYaml(state), "utf-8");
|
|
141
|
-
// Clear cache by creating new manager
|
|
142
|
-
const manager2 = new SessionManager({
|
|
143
|
-
agentName: "test-agent",
|
|
144
|
-
stateDir: testDir,
|
|
145
|
-
sessionExpiryHours: 1,
|
|
146
|
-
logger: mockLogger,
|
|
147
|
-
});
|
|
148
|
-
// Get session again - should be new
|
|
149
|
-
const second = await manager2.getOrCreateSession("channel-123");
|
|
150
|
-
expect(second.isNew).toBe(true);
|
|
151
|
-
expect(second.sessionId).not.toBe(first.sessionId);
|
|
152
|
-
});
|
|
153
|
-
it("creates discord-sessions directory if it doesn't exist", async () => {
|
|
154
|
-
const manager = new SessionManager({
|
|
155
|
-
agentName: "test-agent",
|
|
156
|
-
stateDir: testDir,
|
|
157
|
-
logger: mockLogger,
|
|
158
|
-
});
|
|
159
|
-
await manager.getOrCreateSession("channel-123");
|
|
160
|
-
// Verify directory was created
|
|
161
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
162
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
163
|
-
expect(content).toBeTruthy();
|
|
164
|
-
});
|
|
165
|
-
it("persists state to YAML file", async () => {
|
|
166
|
-
const manager = new SessionManager({
|
|
167
|
-
agentName: "test-agent",
|
|
168
|
-
stateDir: testDir,
|
|
169
|
-
logger: mockLogger,
|
|
170
|
-
});
|
|
171
|
-
const result = await manager.getOrCreateSession("channel-123");
|
|
172
|
-
// Read and verify the state file
|
|
173
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
174
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
175
|
-
const state = parseYaml(content);
|
|
176
|
-
expect(state.version).toBe(1);
|
|
177
|
-
expect(state.agentName).toBe("test-agent");
|
|
178
|
-
expect(state.channels["channel-123"].sessionId).toBe(result.sessionId);
|
|
179
|
-
expect(state.channels["channel-123"].lastMessageAt).toBeTruthy();
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
// ===========================================================================
|
|
183
|
-
// touchSession Tests
|
|
184
|
-
// ===========================================================================
|
|
185
|
-
describe("touchSession", () => {
|
|
186
|
-
it("updates lastMessageAt timestamp", async () => {
|
|
187
|
-
const manager = new SessionManager({
|
|
188
|
-
agentName: "test-agent",
|
|
189
|
-
stateDir: testDir,
|
|
190
|
-
logger: mockLogger,
|
|
191
|
-
});
|
|
192
|
-
// Create session
|
|
193
|
-
await manager.getOrCreateSession("channel-123");
|
|
194
|
-
// Wait a bit
|
|
195
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
196
|
-
// Touch the session
|
|
197
|
-
await manager.touchSession("channel-123");
|
|
198
|
-
// Read state and verify timestamp was updated
|
|
199
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
200
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
201
|
-
const state = parseYaml(content);
|
|
202
|
-
const lastMessageAt = new Date(state.channels["channel-123"].lastMessageAt);
|
|
203
|
-
const now = new Date();
|
|
204
|
-
// Should be within last second
|
|
205
|
-
expect(now.getTime() - lastMessageAt.getTime()).toBeLessThan(1000);
|
|
206
|
-
});
|
|
207
|
-
it("warns when touching non-existent session", async () => {
|
|
208
|
-
const manager = new SessionManager({
|
|
209
|
-
agentName: "test-agent",
|
|
210
|
-
stateDir: testDir,
|
|
211
|
-
logger: mockLogger,
|
|
212
|
-
});
|
|
213
|
-
await manager.touchSession("non-existent-channel");
|
|
214
|
-
expect(mockLogger.warn).toHaveBeenCalledWith("Attempted to touch non-existent session", { channelId: "non-existent-channel" });
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
// ===========================================================================
|
|
218
|
-
// getSession Tests
|
|
219
|
-
// ===========================================================================
|
|
220
|
-
describe("getSession", () => {
|
|
221
|
-
it("returns null when no session exists", async () => {
|
|
222
|
-
const manager = new SessionManager({
|
|
223
|
-
agentName: "test-agent",
|
|
224
|
-
stateDir: testDir,
|
|
225
|
-
logger: mockLogger,
|
|
226
|
-
});
|
|
227
|
-
const session = await manager.getSession("channel-123");
|
|
228
|
-
expect(session).toBeNull();
|
|
229
|
-
});
|
|
230
|
-
it("returns session when it exists and is not expired", async () => {
|
|
231
|
-
const manager = new SessionManager({
|
|
232
|
-
agentName: "test-agent",
|
|
233
|
-
stateDir: testDir,
|
|
234
|
-
logger: mockLogger,
|
|
235
|
-
});
|
|
236
|
-
// Create session
|
|
237
|
-
const created = await manager.getOrCreateSession("channel-123");
|
|
238
|
-
// Get session
|
|
239
|
-
const session = await manager.getSession("channel-123");
|
|
240
|
-
expect(session).not.toBeNull();
|
|
241
|
-
expect(session.sessionId).toBe(created.sessionId);
|
|
242
|
-
});
|
|
243
|
-
it("returns null when session is expired", async () => {
|
|
244
|
-
const manager = new SessionManager({
|
|
245
|
-
agentName: "test-agent",
|
|
246
|
-
stateDir: testDir,
|
|
247
|
-
sessionExpiryHours: 1,
|
|
248
|
-
logger: mockLogger,
|
|
249
|
-
});
|
|
250
|
-
// Create session
|
|
251
|
-
await manager.getOrCreateSession("channel-123");
|
|
252
|
-
// Manually update state to have old timestamp
|
|
253
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
254
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
255
|
-
const state = parseYaml(content);
|
|
256
|
-
// Set last message to 2 hours ago
|
|
257
|
-
const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000);
|
|
258
|
-
state.channels["channel-123"].lastMessageAt = twoHoursAgo.toISOString();
|
|
259
|
-
await writeFile(stateFilePath, stringifyYaml(state), "utf-8");
|
|
260
|
-
// Clear cache by creating new manager
|
|
261
|
-
const manager2 = new SessionManager({
|
|
262
|
-
agentName: "test-agent",
|
|
263
|
-
stateDir: testDir,
|
|
264
|
-
sessionExpiryHours: 1,
|
|
265
|
-
logger: mockLogger,
|
|
266
|
-
});
|
|
267
|
-
// Get session - should be null
|
|
268
|
-
const session = await manager2.getSession("channel-123");
|
|
269
|
-
expect(session).toBeNull();
|
|
270
|
-
expect(mockLogger.info).toHaveBeenCalledWith("Session expired", expect.objectContaining({ channelId: "channel-123" }));
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
// ===========================================================================
|
|
274
|
-
// setSession Tests
|
|
275
|
-
// ===========================================================================
|
|
276
|
-
describe("setSession", () => {
|
|
277
|
-
it("stores a new session for a channel", async () => {
|
|
278
|
-
const manager = new SessionManager({
|
|
279
|
-
agentName: "test-agent",
|
|
280
|
-
stateDir: testDir,
|
|
281
|
-
logger: mockLogger,
|
|
282
|
-
});
|
|
283
|
-
await manager.setSession("channel-123", "sdk-session-456");
|
|
284
|
-
// Verify session was stored
|
|
285
|
-
const session = await manager.getSession("channel-123");
|
|
286
|
-
expect(session).toBeDefined();
|
|
287
|
-
expect(session?.sessionId).toBe("sdk-session-456");
|
|
288
|
-
expect(mockLogger.info).toHaveBeenCalledWith("Stored new session", expect.objectContaining({
|
|
289
|
-
channelId: "channel-123",
|
|
290
|
-
sessionId: "sdk-session-456",
|
|
291
|
-
}));
|
|
292
|
-
});
|
|
293
|
-
it("updates an existing session with a new session ID", async () => {
|
|
294
|
-
const manager = new SessionManager({
|
|
295
|
-
agentName: "test-agent",
|
|
296
|
-
stateDir: testDir,
|
|
297
|
-
logger: mockLogger,
|
|
298
|
-
});
|
|
299
|
-
// Store initial session
|
|
300
|
-
await manager.setSession("channel-123", "old-session-id");
|
|
301
|
-
// Update with new session ID
|
|
302
|
-
await manager.setSession("channel-123", "new-session-id");
|
|
303
|
-
// Verify session was updated
|
|
304
|
-
const session = await manager.getSession("channel-123");
|
|
305
|
-
expect(session).toBeDefined();
|
|
306
|
-
expect(session?.sessionId).toBe("new-session-id");
|
|
307
|
-
expect(mockLogger.debug).toHaveBeenCalledWith("Updated session", expect.objectContaining({
|
|
308
|
-
channelId: "channel-123",
|
|
309
|
-
oldSessionId: "old-session-id",
|
|
310
|
-
newSessionId: "new-session-id",
|
|
311
|
-
}));
|
|
312
|
-
});
|
|
313
|
-
it("updates the lastMessageAt timestamp", async () => {
|
|
314
|
-
const manager = new SessionManager({
|
|
315
|
-
agentName: "test-agent",
|
|
316
|
-
stateDir: testDir,
|
|
317
|
-
logger: mockLogger,
|
|
318
|
-
});
|
|
319
|
-
const beforeSet = new Date();
|
|
320
|
-
await manager.setSession("channel-123", "sdk-session-456");
|
|
321
|
-
const afterSet = new Date();
|
|
322
|
-
const session = await manager.getSession("channel-123");
|
|
323
|
-
expect(session).toBeDefined();
|
|
324
|
-
const lastMessageAt = new Date(session.lastMessageAt);
|
|
325
|
-
expect(lastMessageAt.getTime()).toBeGreaterThanOrEqual(beforeSet.getTime());
|
|
326
|
-
expect(lastMessageAt.getTime()).toBeLessThanOrEqual(afterSet.getTime());
|
|
327
|
-
});
|
|
328
|
-
});
|
|
329
|
-
// ===========================================================================
|
|
330
|
-
// clearSession Tests
|
|
331
|
-
// ===========================================================================
|
|
332
|
-
describe("clearSession", () => {
|
|
333
|
-
it("returns false when no session exists", async () => {
|
|
334
|
-
const manager = new SessionManager({
|
|
335
|
-
agentName: "test-agent",
|
|
336
|
-
stateDir: testDir,
|
|
337
|
-
logger: mockLogger,
|
|
338
|
-
});
|
|
339
|
-
const result = await manager.clearSession("channel-123");
|
|
340
|
-
expect(result).toBe(false);
|
|
341
|
-
});
|
|
342
|
-
it("clears existing session and returns true", async () => {
|
|
343
|
-
const manager = new SessionManager({
|
|
344
|
-
agentName: "test-agent",
|
|
345
|
-
stateDir: testDir,
|
|
346
|
-
logger: mockLogger,
|
|
347
|
-
});
|
|
348
|
-
// Create session
|
|
349
|
-
await manager.getOrCreateSession("channel-123");
|
|
350
|
-
// Clear it
|
|
351
|
-
const result = await manager.clearSession("channel-123");
|
|
352
|
-
expect(result).toBe(true);
|
|
353
|
-
expect(mockLogger.info).toHaveBeenCalledWith("Cleared session", expect.objectContaining({ channelId: "channel-123" }));
|
|
354
|
-
// Verify it's gone
|
|
355
|
-
const session = await manager.getSession("channel-123");
|
|
356
|
-
expect(session).toBeNull();
|
|
357
|
-
});
|
|
358
|
-
it("only clears the specified session", async () => {
|
|
359
|
-
const manager = new SessionManager({
|
|
360
|
-
agentName: "test-agent",
|
|
361
|
-
stateDir: testDir,
|
|
362
|
-
logger: mockLogger,
|
|
363
|
-
});
|
|
364
|
-
// Create sessions
|
|
365
|
-
await manager.getOrCreateSession("channel-1");
|
|
366
|
-
const session2 = await manager.getOrCreateSession("channel-2");
|
|
367
|
-
// Clear only channel-1
|
|
368
|
-
await manager.clearSession("channel-1");
|
|
369
|
-
// Verify channel-2 still exists
|
|
370
|
-
const remaining = await manager.getSession("channel-2");
|
|
371
|
-
expect(remaining).not.toBeNull();
|
|
372
|
-
expect(remaining.sessionId).toBe(session2.sessionId);
|
|
373
|
-
});
|
|
374
|
-
});
|
|
375
|
-
// ===========================================================================
|
|
376
|
-
// cleanupExpiredSessions Tests
|
|
377
|
-
// ===========================================================================
|
|
378
|
-
describe("cleanupExpiredSessions", () => {
|
|
379
|
-
it("returns 0 when no sessions exist", async () => {
|
|
380
|
-
const manager = new SessionManager({
|
|
381
|
-
agentName: "test-agent",
|
|
382
|
-
stateDir: testDir,
|
|
383
|
-
logger: mockLogger,
|
|
384
|
-
});
|
|
385
|
-
const count = await manager.cleanupExpiredSessions();
|
|
386
|
-
expect(count).toBe(0);
|
|
387
|
-
});
|
|
388
|
-
it("returns 0 when no sessions are expired", async () => {
|
|
389
|
-
const manager = new SessionManager({
|
|
390
|
-
agentName: "test-agent",
|
|
391
|
-
stateDir: testDir,
|
|
392
|
-
logger: mockLogger,
|
|
393
|
-
});
|
|
394
|
-
// Create sessions
|
|
395
|
-
await manager.getOrCreateSession("channel-1");
|
|
396
|
-
await manager.getOrCreateSession("channel-2");
|
|
397
|
-
const count = await manager.cleanupExpiredSessions();
|
|
398
|
-
expect(count).toBe(0);
|
|
399
|
-
});
|
|
400
|
-
it("cleans up expired sessions", async () => {
|
|
401
|
-
const manager = new SessionManager({
|
|
402
|
-
agentName: "test-agent",
|
|
403
|
-
stateDir: testDir,
|
|
404
|
-
sessionExpiryHours: 1,
|
|
405
|
-
logger: mockLogger,
|
|
406
|
-
});
|
|
407
|
-
// Create sessions
|
|
408
|
-
await manager.getOrCreateSession("channel-1");
|
|
409
|
-
await manager.getOrCreateSession("channel-2");
|
|
410
|
-
await manager.getOrCreateSession("channel-3");
|
|
411
|
-
// Manually expire some sessions
|
|
412
|
-
const stateFilePath = join(testDir, "discord-sessions", "test-agent.yaml");
|
|
413
|
-
const content = await readFile(stateFilePath, "utf-8");
|
|
414
|
-
const state = parseYaml(content);
|
|
415
|
-
// Expire channel-1 and channel-3 (2 hours ago)
|
|
416
|
-
const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000);
|
|
417
|
-
state.channels["channel-1"].lastMessageAt = twoHoursAgo.toISOString();
|
|
418
|
-
state.channels["channel-3"].lastMessageAt = twoHoursAgo.toISOString();
|
|
419
|
-
await writeFile(stateFilePath, stringifyYaml(state), "utf-8");
|
|
420
|
-
// Clear cache by creating new manager
|
|
421
|
-
const manager2 = new SessionManager({
|
|
422
|
-
agentName: "test-agent",
|
|
423
|
-
stateDir: testDir,
|
|
424
|
-
sessionExpiryHours: 1,
|
|
425
|
-
logger: mockLogger,
|
|
426
|
-
});
|
|
427
|
-
// Cleanup
|
|
428
|
-
const count = await manager2.cleanupExpiredSessions();
|
|
429
|
-
expect(count).toBe(2);
|
|
430
|
-
expect(mockLogger.info).toHaveBeenCalledWith("Cleaned up expired sessions", { count: 2 });
|
|
431
|
-
// Verify channel-2 still exists
|
|
432
|
-
const session2 = await manager2.getSession("channel-2");
|
|
433
|
-
expect(session2).not.toBeNull();
|
|
434
|
-
// Verify channel-1 and channel-3 are gone
|
|
435
|
-
const session1 = await manager2.getSession("channel-1");
|
|
436
|
-
const session3 = await manager2.getSession("channel-3");
|
|
437
|
-
expect(session1).toBeNull();
|
|
438
|
-
expect(session3).toBeNull();
|
|
439
|
-
});
|
|
440
|
-
});
|
|
441
|
-
// ===========================================================================
|
|
442
|
-
// State File Recovery Tests
|
|
443
|
-
// ===========================================================================
|
|
444
|
-
describe("state file recovery", () => {
|
|
445
|
-
it("creates fresh state when file is corrupted", async () => {
|
|
446
|
-
// Write corrupted YAML
|
|
447
|
-
const stateDir = join(testDir, "discord-sessions");
|
|
448
|
-
await mkdir(stateDir, { recursive: true });
|
|
449
|
-
await writeFile(join(stateDir, "test-agent.yaml"), "invalid: yaml: content: {{");
|
|
450
|
-
const manager = new SessionManager({
|
|
451
|
-
agentName: "test-agent",
|
|
452
|
-
stateDir: testDir,
|
|
453
|
-
logger: mockLogger,
|
|
454
|
-
});
|
|
455
|
-
// Should still work
|
|
456
|
-
const result = await manager.getOrCreateSession("channel-123");
|
|
457
|
-
expect(result.isNew).toBe(true);
|
|
458
|
-
expect(mockLogger.warn).toHaveBeenCalledWith("Corrupted session state file, creating fresh state", expect.any(Object));
|
|
459
|
-
});
|
|
460
|
-
it("creates fresh state when file has invalid schema", async () => {
|
|
461
|
-
// Write valid YAML but invalid schema
|
|
462
|
-
const stateDir = join(testDir, "discord-sessions");
|
|
463
|
-
await mkdir(stateDir, { recursive: true });
|
|
464
|
-
await writeFile(join(stateDir, "test-agent.yaml"), stringifyYaml({ version: 999, invalid: true }));
|
|
465
|
-
const manager = new SessionManager({
|
|
466
|
-
agentName: "test-agent",
|
|
467
|
-
stateDir: testDir,
|
|
468
|
-
logger: mockLogger,
|
|
469
|
-
});
|
|
470
|
-
// Should still work
|
|
471
|
-
const result = await manager.getOrCreateSession("channel-123");
|
|
472
|
-
expect(result.isNew).toBe(true);
|
|
473
|
-
expect(mockLogger.warn).toHaveBeenCalledWith("Corrupted session state file, creating fresh state", expect.any(Object));
|
|
474
|
-
});
|
|
475
|
-
it("creates fresh state when file is empty", async () => {
|
|
476
|
-
// Write empty file
|
|
477
|
-
const stateDir = join(testDir, "discord-sessions");
|
|
478
|
-
await mkdir(stateDir, { recursive: true });
|
|
479
|
-
await writeFile(join(stateDir, "test-agent.yaml"), "");
|
|
480
|
-
const manager = new SessionManager({
|
|
481
|
-
agentName: "test-agent",
|
|
482
|
-
stateDir: testDir,
|
|
483
|
-
logger: mockLogger,
|
|
484
|
-
});
|
|
485
|
-
// Should still work
|
|
486
|
-
const result = await manager.getOrCreateSession("channel-123");
|
|
487
|
-
expect(result.isNew).toBe(true);
|
|
488
|
-
});
|
|
489
|
-
});
|
|
490
|
-
// ===========================================================================
|
|
491
|
-
// agentName Property Tests
|
|
492
|
-
// ===========================================================================
|
|
493
|
-
describe("agentName", () => {
|
|
494
|
-
it("returns the agent name from options", () => {
|
|
495
|
-
const manager = new SessionManager({
|
|
496
|
-
agentName: "my-test-agent",
|
|
497
|
-
stateDir: testDir,
|
|
498
|
-
logger: mockLogger,
|
|
499
|
-
});
|
|
500
|
-
expect(manager.agentName).toBe("my-test-agent");
|
|
501
|
-
});
|
|
502
|
-
});
|
|
503
|
-
// ===========================================================================
|
|
504
|
-
// Session ID Format Tests
|
|
505
|
-
// ===========================================================================
|
|
506
|
-
describe("session ID format", () => {
|
|
507
|
-
it("generates session IDs with expected format", async () => {
|
|
508
|
-
const manager = new SessionManager({
|
|
509
|
-
agentName: "my-agent",
|
|
510
|
-
stateDir: testDir,
|
|
511
|
-
logger: mockLogger,
|
|
512
|
-
});
|
|
513
|
-
const result = await manager.getOrCreateSession("channel-123");
|
|
514
|
-
// Should match pattern: discord-<agent-name>-<uuid>
|
|
515
|
-
expect(result.sessionId).toMatch(/^discord-my-agent-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
|
516
|
-
});
|
|
517
|
-
});
|
|
518
|
-
// ===========================================================================
|
|
519
|
-
// Concurrent Access Tests
|
|
520
|
-
// ===========================================================================
|
|
521
|
-
describe("concurrent access", () => {
|
|
522
|
-
it("handles concurrent getOrCreateSession calls", async () => {
|
|
523
|
-
const manager = new SessionManager({
|
|
524
|
-
agentName: "test-agent",
|
|
525
|
-
stateDir: testDir,
|
|
526
|
-
logger: mockLogger,
|
|
527
|
-
});
|
|
528
|
-
// Make concurrent calls
|
|
529
|
-
const promises = [
|
|
530
|
-
manager.getOrCreateSession("channel-1"),
|
|
531
|
-
manager.getOrCreateSession("channel-2"),
|
|
532
|
-
manager.getOrCreateSession("channel-3"),
|
|
533
|
-
];
|
|
534
|
-
const results = await Promise.all(promises);
|
|
535
|
-
// All should succeed
|
|
536
|
-
expect(results[0].isNew).toBe(true);
|
|
537
|
-
expect(results[1].isNew).toBe(true);
|
|
538
|
-
expect(results[2].isNew).toBe(true);
|
|
539
|
-
// Each should have unique session ID
|
|
540
|
-
const sessionIds = new Set(results.map((r) => r.sessionId));
|
|
541
|
-
expect(sessionIds.size).toBe(3);
|
|
542
|
-
});
|
|
543
|
-
});
|
|
544
|
-
});
|
|
545
|
-
// =============================================================================
|
|
546
|
-
// Error Tests
|
|
547
|
-
// =============================================================================
|
|
548
|
-
describe("SessionManager errors", () => {
|
|
549
|
-
let mockLogger;
|
|
550
|
-
beforeEach(() => {
|
|
551
|
-
mockLogger = createMockLogger();
|
|
552
|
-
vi.clearAllMocks();
|
|
553
|
-
});
|
|
554
|
-
describe("SessionStateReadError", () => {
|
|
555
|
-
it("is thrown on permission errors", async () => {
|
|
556
|
-
// Create a directory that looks like a file (causes read to fail)
|
|
557
|
-
const testDir = createTestDir();
|
|
558
|
-
const stateDir = join(testDir, "discord-sessions");
|
|
559
|
-
await mkdir(stateDir, { recursive: true });
|
|
560
|
-
// Create the state file as a directory (which will cause read to fail)
|
|
561
|
-
await mkdir(join(stateDir, "test-agent.yaml"));
|
|
562
|
-
const manager = new SessionManager({
|
|
563
|
-
agentName: "test-agent",
|
|
564
|
-
stateDir: testDir,
|
|
565
|
-
logger: mockLogger,
|
|
566
|
-
});
|
|
567
|
-
await expect(manager.getOrCreateSession("channel-123")).rejects.toThrow(SessionStateReadError);
|
|
568
|
-
// Cleanup
|
|
569
|
-
await rm(testDir, { recursive: true, force: true });
|
|
570
|
-
});
|
|
571
|
-
});
|
|
572
|
-
});
|
|
573
|
-
//# sourceMappingURL=session-manager.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.test.js","sourceRoot":"","sources":["../../../src/session-manager/__tests__/session-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../../src/session-manager/__tests__/types.test.ts"],"names":[],"mappings":""}
|