@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.
- package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
- package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
- package/dist/__tests__/auto-mode-handler.test.js +362 -0
- package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
- package/dist/__tests__/discord-connector.test.d.ts +2 -0
- package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
- package/dist/__tests__/discord-connector.test.js +958 -0
- package/dist/__tests__/discord-connector.test.js.map +1 -0
- package/dist/__tests__/error-handler.test.d.ts +2 -0
- package/dist/__tests__/error-handler.test.d.ts.map +1 -0
- package/dist/__tests__/error-handler.test.js +509 -0
- package/dist/__tests__/error-handler.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +152 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +282 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/mention-handler.test.d.ts +2 -0
- package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
- package/dist/__tests__/mention-handler.test.js +547 -0
- package/dist/__tests__/mention-handler.test.js.map +1 -0
- package/dist/auto-mode-handler.d.ts +145 -0
- package/dist/auto-mode-handler.d.ts.map +1 -0
- package/dist/auto-mode-handler.js +211 -0
- package/dist/auto-mode-handler.js.map +1 -0
- package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
- package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
- package/dist/commands/__tests__/command-manager.test.js +307 -0
- package/dist/commands/__tests__/command-manager.test.js.map +1 -0
- package/dist/commands/__tests__/help.test.d.ts +2 -0
- package/dist/commands/__tests__/help.test.d.ts.map +1 -0
- package/dist/commands/__tests__/help.test.js +105 -0
- package/dist/commands/__tests__/help.test.js.map +1 -0
- package/dist/commands/__tests__/reset.test.d.ts +2 -0
- package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
- package/dist/commands/__tests__/reset.test.js +140 -0
- package/dist/commands/__tests__/reset.test.js.map +1 -0
- package/dist/commands/__tests__/status.test.d.ts +2 -0
- package/dist/commands/__tests__/status.test.d.ts.map +1 -0
- package/dist/commands/__tests__/status.test.js +205 -0
- package/dist/commands/__tests__/status.test.js.map +1 -0
- package/dist/commands/command-manager.d.ts +66 -0
- package/dist/commands/command-manager.d.ts.map +1 -0
- package/dist/commands/command-manager.js +191 -0
- package/dist/commands/command-manager.js.map +1 -0
- package/dist/commands/help.d.ts +8 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +27 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/reset.d.ts +9 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +28 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/types.d.ts +87 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +8 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/discord-connector.d.ts +154 -0
- package/dist/discord-connector.d.ts.map +1 -0
- package/dist/discord-connector.js +638 -0
- package/dist/discord-connector.js.map +1 -0
- package/dist/error-handler.d.ts +237 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +433 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/errors.d.ts +61 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +77 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +119 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +198 -0
- package/dist/logger.js.map +1 -0
- package/dist/mention-handler.d.ts +176 -0
- package/dist/mention-handler.d.ts.map +1 -0
- package/dist/mention-handler.js +236 -0
- package/dist/mention-handler.js.map +1 -0
- package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
- package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/errors.test.js +124 -0
- package/dist/session-manager/__tests__/errors.test.js.map +1 -0
- package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
- package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/session-manager.test.js +517 -0
- package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
- package/dist/session-manager/__tests__/types.test.d.ts +2 -0
- package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/types.test.js +169 -0
- package/dist/session-manager/__tests__/types.test.js.map +1 -0
- package/dist/session-manager/errors.d.ts +58 -0
- package/dist/session-manager/errors.d.ts.map +1 -0
- package/dist/session-manager/errors.js +70 -0
- package/dist/session-manager/errors.js.map +1 -0
- package/dist/session-manager/index.d.ts +11 -0
- package/dist/session-manager/index.d.ts.map +1 -0
- package/dist/session-manager/index.js +12 -0
- package/dist/session-manager/index.js.map +1 -0
- package/dist/session-manager/session-manager.d.ts +107 -0
- package/dist/session-manager/session-manager.d.ts.map +1 -0
- package/dist/session-manager/session-manager.js +347 -0
- package/dist/session-manager/session-manager.js.map +1 -0
- package/dist/session-manager/types.d.ts +167 -0
- package/dist/session-manager/types.d.ts.map +1 -0
- package/dist/session-manager/types.js +57 -0
- package/dist/session-manager/types.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/formatting.test.d.ts +2 -0
- package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
- package/dist/utils/__tests__/formatting.test.js +571 -0
- package/dist/utils/__tests__/formatting.test.js.map +1 -0
- package/dist/utils/formatting.d.ts +211 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +305 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { ChannelSessionSchema, DiscordSessionStateSchema, createInitialSessionState, createChannelSession, } from "../types.js";
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// ChannelSessionSchema Tests
|
|
5
|
+
// =============================================================================
|
|
6
|
+
describe("ChannelSessionSchema", () => {
|
|
7
|
+
it("validates valid channel session", () => {
|
|
8
|
+
const session = {
|
|
9
|
+
sessionId: "discord-test-123",
|
|
10
|
+
lastMessageAt: "2024-01-15T10:30:00.000Z",
|
|
11
|
+
};
|
|
12
|
+
const result = ChannelSessionSchema.safeParse(session);
|
|
13
|
+
expect(result.success).toBe(true);
|
|
14
|
+
if (result.success) {
|
|
15
|
+
expect(result.data.sessionId).toBe("discord-test-123");
|
|
16
|
+
expect(result.data.lastMessageAt).toBe("2024-01-15T10:30:00.000Z");
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
it("rejects empty sessionId", () => {
|
|
20
|
+
const session = {
|
|
21
|
+
sessionId: "",
|
|
22
|
+
lastMessageAt: "2024-01-15T10:30:00.000Z",
|
|
23
|
+
};
|
|
24
|
+
const result = ChannelSessionSchema.safeParse(session);
|
|
25
|
+
expect(result.success).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it("rejects invalid lastMessageAt", () => {
|
|
28
|
+
const session = {
|
|
29
|
+
sessionId: "discord-test-123",
|
|
30
|
+
lastMessageAt: "not-a-date",
|
|
31
|
+
};
|
|
32
|
+
const result = ChannelSessionSchema.safeParse(session);
|
|
33
|
+
expect(result.success).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
it("rejects missing fields", () => {
|
|
36
|
+
const sessions = [
|
|
37
|
+
{ sessionId: "test" },
|
|
38
|
+
{ lastMessageAt: "2024-01-15T10:30:00.000Z" },
|
|
39
|
+
{},
|
|
40
|
+
];
|
|
41
|
+
for (const session of sessions) {
|
|
42
|
+
const result = ChannelSessionSchema.safeParse(session);
|
|
43
|
+
expect(result.success).toBe(false);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// DiscordSessionStateSchema Tests
|
|
49
|
+
// =============================================================================
|
|
50
|
+
describe("DiscordSessionStateSchema", () => {
|
|
51
|
+
it("validates valid session state", () => {
|
|
52
|
+
const state = {
|
|
53
|
+
version: 1,
|
|
54
|
+
agentName: "test-agent",
|
|
55
|
+
channels: {
|
|
56
|
+
"channel-123": {
|
|
57
|
+
sessionId: "discord-test-123",
|
|
58
|
+
lastMessageAt: "2024-01-15T10:30:00.000Z",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
63
|
+
expect(result.success).toBe(true);
|
|
64
|
+
if (result.success) {
|
|
65
|
+
expect(result.data.version).toBe(1);
|
|
66
|
+
expect(result.data.agentName).toBe("test-agent");
|
|
67
|
+
expect(result.data.channels["channel-123"].sessionId).toBe("discord-test-123");
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
it("validates empty channels", () => {
|
|
71
|
+
const state = {
|
|
72
|
+
version: 1,
|
|
73
|
+
agentName: "test-agent",
|
|
74
|
+
channels: {},
|
|
75
|
+
};
|
|
76
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
77
|
+
expect(result.success).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it("rejects wrong version", () => {
|
|
80
|
+
const state = {
|
|
81
|
+
version: 2,
|
|
82
|
+
agentName: "test-agent",
|
|
83
|
+
channels: {},
|
|
84
|
+
};
|
|
85
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
86
|
+
expect(result.success).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
it("rejects empty agentName", () => {
|
|
89
|
+
const state = {
|
|
90
|
+
version: 1,
|
|
91
|
+
agentName: "",
|
|
92
|
+
channels: {},
|
|
93
|
+
};
|
|
94
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
95
|
+
expect(result.success).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it("rejects invalid channel session", () => {
|
|
98
|
+
const state = {
|
|
99
|
+
version: 1,
|
|
100
|
+
agentName: "test-agent",
|
|
101
|
+
channels: {
|
|
102
|
+
"channel-123": {
|
|
103
|
+
sessionId: "",
|
|
104
|
+
lastMessageAt: "2024-01-15T10:30:00.000Z",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
109
|
+
expect(result.success).toBe(false);
|
|
110
|
+
});
|
|
111
|
+
it("validates multiple channels", () => {
|
|
112
|
+
const state = {
|
|
113
|
+
version: 1,
|
|
114
|
+
agentName: "test-agent",
|
|
115
|
+
channels: {
|
|
116
|
+
"channel-1": {
|
|
117
|
+
sessionId: "session-1",
|
|
118
|
+
lastMessageAt: "2024-01-15T10:30:00.000Z",
|
|
119
|
+
},
|
|
120
|
+
"channel-2": {
|
|
121
|
+
sessionId: "session-2",
|
|
122
|
+
lastMessageAt: "2024-01-15T11:30:00.000Z",
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
127
|
+
expect(result.success).toBe(true);
|
|
128
|
+
if (result.success) {
|
|
129
|
+
expect(Object.keys(result.data.channels)).toHaveLength(2);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// =============================================================================
|
|
134
|
+
// Factory Function Tests
|
|
135
|
+
// =============================================================================
|
|
136
|
+
describe("createInitialSessionState", () => {
|
|
137
|
+
it("creates initial state with correct values", () => {
|
|
138
|
+
const state = createInitialSessionState("my-agent");
|
|
139
|
+
expect(state.version).toBe(1);
|
|
140
|
+
expect(state.agentName).toBe("my-agent");
|
|
141
|
+
expect(state.channels).toEqual({});
|
|
142
|
+
});
|
|
143
|
+
it("creates valid schema-compliant state", () => {
|
|
144
|
+
const state = createInitialSessionState("test-agent");
|
|
145
|
+
const result = DiscordSessionStateSchema.safeParse(state);
|
|
146
|
+
expect(result.success).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe("createChannelSession", () => {
|
|
150
|
+
it("creates session with provided sessionId", () => {
|
|
151
|
+
const session = createChannelSession("my-session-id");
|
|
152
|
+
expect(session.sessionId).toBe("my-session-id");
|
|
153
|
+
expect(session.lastMessageAt).toBeTruthy();
|
|
154
|
+
});
|
|
155
|
+
it("sets lastMessageAt to current time", () => {
|
|
156
|
+
const before = new Date();
|
|
157
|
+
const session = createChannelSession("test-session");
|
|
158
|
+
const after = new Date();
|
|
159
|
+
const timestamp = new Date(session.lastMessageAt);
|
|
160
|
+
expect(timestamp.getTime()).toBeGreaterThanOrEqual(before.getTime());
|
|
161
|
+
expect(timestamp.getTime()).toBeLessThanOrEqual(after.getTime());
|
|
162
|
+
});
|
|
163
|
+
it("creates valid schema-compliant session", () => {
|
|
164
|
+
const session = createChannelSession("test-session");
|
|
165
|
+
const result = ChannelSessionSchema.safeParse(session);
|
|
166
|
+
expect(result.success).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../src/session-manager/__tests__/types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for Discord session management
|
|
3
|
+
*
|
|
4
|
+
* Provides typed errors for session persistence and retrieval failures.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Error codes for session manager operations
|
|
8
|
+
*/
|
|
9
|
+
export declare enum SessionErrorCode {
|
|
10
|
+
STATE_READ_FAILED = "SESSION_STATE_READ_FAILED",
|
|
11
|
+
STATE_WRITE_FAILED = "SESSION_STATE_WRITE_FAILED",
|
|
12
|
+
DIRECTORY_CREATE_FAILED = "SESSION_DIRECTORY_CREATE_FAILED",
|
|
13
|
+
SESSION_NOT_FOUND = "SESSION_NOT_FOUND",
|
|
14
|
+
SESSION_EXPIRED = "SESSION_EXPIRED",
|
|
15
|
+
INVALID_STATE = "SESSION_INVALID_STATE"
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Base error class for session manager operations
|
|
19
|
+
*/
|
|
20
|
+
export declare class SessionManagerError extends Error {
|
|
21
|
+
readonly code: SessionErrorCode;
|
|
22
|
+
readonly agentName: string;
|
|
23
|
+
constructor(message: string, code: SessionErrorCode, agentName: string, options?: {
|
|
24
|
+
cause?: Error;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Error thrown when session state file cannot be read
|
|
29
|
+
*/
|
|
30
|
+
export declare class SessionStateReadError extends SessionManagerError {
|
|
31
|
+
readonly path: string;
|
|
32
|
+
constructor(agentName: string, path: string, options?: {
|
|
33
|
+
cause?: Error;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Error thrown when session state file cannot be written
|
|
38
|
+
*/
|
|
39
|
+
export declare class SessionStateWriteError extends SessionManagerError {
|
|
40
|
+
readonly path: string;
|
|
41
|
+
constructor(agentName: string, path: string, options?: {
|
|
42
|
+
cause?: Error;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Error thrown when session directory cannot be created
|
|
47
|
+
*/
|
|
48
|
+
export declare class SessionDirectoryCreateError extends SessionManagerError {
|
|
49
|
+
readonly path: string;
|
|
50
|
+
constructor(agentName: string, path: string, options?: {
|
|
51
|
+
cause?: Error;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Type guard to check if an error is a SessionManagerError
|
|
56
|
+
*/
|
|
57
|
+
export declare function isSessionManagerError(error: unknown): error is SessionManagerError;
|
|
58
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session-manager/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,oBAAY,gBAAgB;IAC1B,iBAAiB,8BAA8B;IAC/C,kBAAkB,+BAA+B;IACjD,uBAAuB,oCAAoC;IAC3D,iBAAiB,sBAAsB;IACvC,eAAe,oBAAoB;IACnC,aAAa,0BAA0B;CACxC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAgB,IAAI,EAAE,gBAAgB,CAAC;IACvC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAGhC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAO9B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAW9B;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAW9B;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,mBAAmB;IAClE,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAW9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAE9B"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for Discord session management
|
|
3
|
+
*
|
|
4
|
+
* Provides typed errors for session persistence and retrieval failures.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Error codes for session manager operations
|
|
8
|
+
*/
|
|
9
|
+
export var SessionErrorCode;
|
|
10
|
+
(function (SessionErrorCode) {
|
|
11
|
+
SessionErrorCode["STATE_READ_FAILED"] = "SESSION_STATE_READ_FAILED";
|
|
12
|
+
SessionErrorCode["STATE_WRITE_FAILED"] = "SESSION_STATE_WRITE_FAILED";
|
|
13
|
+
SessionErrorCode["DIRECTORY_CREATE_FAILED"] = "SESSION_DIRECTORY_CREATE_FAILED";
|
|
14
|
+
SessionErrorCode["SESSION_NOT_FOUND"] = "SESSION_NOT_FOUND";
|
|
15
|
+
SessionErrorCode["SESSION_EXPIRED"] = "SESSION_EXPIRED";
|
|
16
|
+
SessionErrorCode["INVALID_STATE"] = "SESSION_INVALID_STATE";
|
|
17
|
+
})(SessionErrorCode || (SessionErrorCode = {}));
|
|
18
|
+
/**
|
|
19
|
+
* Base error class for session manager operations
|
|
20
|
+
*/
|
|
21
|
+
export class SessionManagerError extends Error {
|
|
22
|
+
code;
|
|
23
|
+
agentName;
|
|
24
|
+
constructor(message, code, agentName, options) {
|
|
25
|
+
super(message, options);
|
|
26
|
+
this.name = "SessionManagerError";
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.agentName = agentName;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Error thrown when session state file cannot be read
|
|
33
|
+
*/
|
|
34
|
+
export class SessionStateReadError extends SessionManagerError {
|
|
35
|
+
path;
|
|
36
|
+
constructor(agentName, path, options) {
|
|
37
|
+
super(`Failed to read session state for agent '${agentName}' from '${path}'`, SessionErrorCode.STATE_READ_FAILED, agentName, options);
|
|
38
|
+
this.name = "SessionStateReadError";
|
|
39
|
+
this.path = path;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Error thrown when session state file cannot be written
|
|
44
|
+
*/
|
|
45
|
+
export class SessionStateWriteError extends SessionManagerError {
|
|
46
|
+
path;
|
|
47
|
+
constructor(agentName, path, options) {
|
|
48
|
+
super(`Failed to write session state for agent '${agentName}' to '${path}'`, SessionErrorCode.STATE_WRITE_FAILED, agentName, options);
|
|
49
|
+
this.name = "SessionStateWriteError";
|
|
50
|
+
this.path = path;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Error thrown when session directory cannot be created
|
|
55
|
+
*/
|
|
56
|
+
export class SessionDirectoryCreateError extends SessionManagerError {
|
|
57
|
+
path;
|
|
58
|
+
constructor(agentName, path, options) {
|
|
59
|
+
super(`Failed to create session directory for agent '${agentName}' at '${path}'`, SessionErrorCode.DIRECTORY_CREATE_FAILED, agentName, options);
|
|
60
|
+
this.name = "SessionDirectoryCreateError";
|
|
61
|
+
this.path = path;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Type guard to check if an error is a SessionManagerError
|
|
66
|
+
*/
|
|
67
|
+
export function isSessionManagerError(error) {
|
|
68
|
+
return error instanceof SessionManagerError;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session-manager/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IAC1B,mEAA+C,CAAA;IAC/C,qEAAiD,CAAA;IACjD,+EAA2D,CAAA;IAC3D,2DAAuC,CAAA;IACvC,uDAAmC,CAAA;IACnC,2DAAuC,CAAA;AACzC,CAAC,EAPW,gBAAgB,KAAhB,gBAAgB,QAO3B;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,SAAS,CAAS;IAElC,YACE,OAAe,EACf,IAAsB,EACtB,SAAiB,EACjB,OAA2B;QAE3B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IAC5C,IAAI,CAAS;IAE7B,YACE,SAAiB,EACjB,IAAY,EACZ,OAA2B;QAE3B,KAAK,CACH,2CAA2C,SAAS,WAAW,IAAI,GAAG,EACtE,gBAAgB,CAAC,iBAAiB,EAClC,SAAS,EACT,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,mBAAmB;IAC7C,IAAI,CAAS;IAE7B,YACE,SAAiB,EACjB,IAAY,EACZ,OAA2B;QAE3B,KAAK,CACH,4CAA4C,SAAS,SAAS,IAAI,GAAG,EACrE,gBAAgB,CAAC,kBAAkB,EACnC,SAAS,EACT,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,mBAAmB;IAClD,IAAI,CAAS;IAE7B,YACE,SAAiB,EACjB,IAAY,EACZ,OAA2B;QAE3B,KAAK,CACH,iDAAiD,SAAS,SAAS,IAAI,GAAG,EAC1E,gBAAgB,CAAC,uBAAuB,EACxC,SAAS,EACT,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc;IAEd,OAAO,KAAK,YAAY,mBAAmB,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session manager module for Discord channel conversations
|
|
3
|
+
*
|
|
4
|
+
* Provides per-channel session management for Claude conversations,
|
|
5
|
+
* enabling conversation context preservation across Discord channels.
|
|
6
|
+
*/
|
|
7
|
+
export { SessionManager } from "./session-manager.js";
|
|
8
|
+
export type { SessionManagerOptions, SessionManagerLogger, ISessionManager, SessionResult, ChannelSession, DiscordSessionState, } from "./types.js";
|
|
9
|
+
export { DiscordSessionStateSchema, ChannelSessionSchema, createInitialSessionState, createChannelSession, } from "./types.js";
|
|
10
|
+
export { SessionErrorCode, SessionManagerError, SessionStateReadError, SessionStateWriteError, SessionDirectoryCreateError, isSessionManagerError, } from "./errors.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-manager/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session manager module for Discord channel conversations
|
|
3
|
+
*
|
|
4
|
+
* Provides per-channel session management for Claude conversations,
|
|
5
|
+
* enabling conversation context preservation across Discord channels.
|
|
6
|
+
*/
|
|
7
|
+
// Main class
|
|
8
|
+
export { SessionManager } from "./session-manager.js";
|
|
9
|
+
export { DiscordSessionStateSchema, ChannelSessionSchema, createInitialSessionState, createChannelSession, } from "./types.js";
|
|
10
|
+
// Errors
|
|
11
|
+
export { SessionErrorCode, SessionManagerError, SessionStateReadError, SessionStateWriteError, SessionDirectoryCreateError, isSessionManagerError, } from "./errors.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session-manager/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYtD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session manager for Discord channel conversations
|
|
3
|
+
*
|
|
4
|
+
* Provides per-channel session management for Claude conversations,
|
|
5
|
+
* enabling conversation context preservation across Discord channels.
|
|
6
|
+
*
|
|
7
|
+
* Sessions are stored at .herdctl/discord-sessions/<agent-name>.yaml
|
|
8
|
+
*/
|
|
9
|
+
import { type SessionManagerOptions, type ISessionManager, type SessionResult, type ChannelSession } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* SessionManager manages per-channel Claude sessions for a Discord agent.
|
|
12
|
+
*
|
|
13
|
+
* Each agent has its own SessionManager instance, storing session mappings
|
|
14
|
+
* in a YAML file at .herdctl/discord-sessions/<agent-name>.yaml
|
|
15
|
+
*
|
|
16
|
+
* Features:
|
|
17
|
+
* - Create new sessions for channels/DMs
|
|
18
|
+
* - Resume existing sessions when user sends messages
|
|
19
|
+
* - Automatic session expiry based on configurable timeout
|
|
20
|
+
* - Cleanup expired sessions on startup
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const sessionManager = new SessionManager({
|
|
25
|
+
* agentName: 'my-agent',
|
|
26
|
+
* stateDir: '.herdctl',
|
|
27
|
+
* sessionExpiryHours: 24,
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Get or create a session for a channel
|
|
31
|
+
* const { sessionId, isNew } = await sessionManager.getOrCreateSession('channel-123');
|
|
32
|
+
*
|
|
33
|
+
* // After sending/receiving a message
|
|
34
|
+
* await sessionManager.touchSession('channel-123');
|
|
35
|
+
*
|
|
36
|
+
* // Cleanup expired sessions on startup
|
|
37
|
+
* const cleanedUp = await sessionManager.cleanupExpiredSessions();
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class SessionManager implements ISessionManager {
|
|
41
|
+
readonly agentName: string;
|
|
42
|
+
private readonly stateDir;
|
|
43
|
+
private readonly sessionExpiryHours;
|
|
44
|
+
private readonly logger;
|
|
45
|
+
private readonly stateFilePath;
|
|
46
|
+
private state;
|
|
47
|
+
constructor(options: SessionManagerOptions);
|
|
48
|
+
/**
|
|
49
|
+
* Get or create a session for a channel/DM
|
|
50
|
+
*
|
|
51
|
+
* If an active (non-expired) session exists, returns it.
|
|
52
|
+
* Otherwise, creates a new session with a generated session ID.
|
|
53
|
+
*/
|
|
54
|
+
getOrCreateSession(channelId: string): Promise<SessionResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Update the last message timestamp for a session
|
|
57
|
+
*/
|
|
58
|
+
touchSession(channelId: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get an existing session without creating one
|
|
61
|
+
*
|
|
62
|
+
* Returns null if no session exists or if the session is expired.
|
|
63
|
+
*/
|
|
64
|
+
getSession(channelId: string): Promise<ChannelSession | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Clear a specific session
|
|
67
|
+
*/
|
|
68
|
+
clearSession(channelId: string): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Clean up all expired sessions
|
|
71
|
+
*
|
|
72
|
+
* Should be called on connector startup and periodically.
|
|
73
|
+
*/
|
|
74
|
+
cleanupExpiredSessions(): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Generate a unique session ID
|
|
77
|
+
*/
|
|
78
|
+
private generateSessionId;
|
|
79
|
+
/**
|
|
80
|
+
* Check if a session is expired
|
|
81
|
+
*/
|
|
82
|
+
private isSessionExpired;
|
|
83
|
+
/**
|
|
84
|
+
* Load session state from disk
|
|
85
|
+
*
|
|
86
|
+
* Returns cached state if available, otherwise loads from file.
|
|
87
|
+
* Creates initial state if file doesn't exist.
|
|
88
|
+
*/
|
|
89
|
+
private loadState;
|
|
90
|
+
/**
|
|
91
|
+
* Save session state to disk atomically
|
|
92
|
+
*/
|
|
93
|
+
private saveState;
|
|
94
|
+
/**
|
|
95
|
+
* Ensure the discord-sessions directory exists
|
|
96
|
+
*/
|
|
97
|
+
private ensureDirectoryExists;
|
|
98
|
+
/**
|
|
99
|
+
* Generate a temp file path for atomic writes
|
|
100
|
+
*/
|
|
101
|
+
private generateTempPath;
|
|
102
|
+
/**
|
|
103
|
+
* Rename with retry logic for Windows compatibility
|
|
104
|
+
*/
|
|
105
|
+
private renameWithRetry;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session-manager/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EAKpB,MAAM,YAAY,CAAC;AA6BpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAGvC,OAAO,CAAC,KAAK,CAAoC;gBAErC,OAAO,EAAE,qBAAqB;IAmB1C;;;;;OAKG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkCnE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpD;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAsBnE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAevD;;;;OAIG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IA8B/C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;YACW,SAAS;IAyDvB;;OAEG;YACW,SAAS;IA8BvB;;OAEG;YACW,qBAAqB;IAiBnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,eAAe;CA+B9B"}
|