@herdctl/slack 0.2.1 → 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__/command-handler.test.js +1 -0
- package/dist/__tests__/command-handler.test.js.map +1 -1
- package/dist/__tests__/error-handler.test.js +25 -25
- package/dist/__tests__/error-handler.test.js.map +1 -1
- package/dist/__tests__/formatting.test.js +9 -9
- package/dist/__tests__/formatting.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 +278 -0
- package/dist/__tests__/manager.test.js.map +1 -0
- package/dist/__tests__/slack-connector.test.js +11 -12
- package/dist/__tests__/slack-connector.test.js.map +1 -1
- package/dist/commands/command-handler.d.ts +3 -3
- package/dist/commands/command-handler.d.ts.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/error-handler.d.ts +12 -33
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +32 -57
- package/dist/error-handler.js.map +1 -1
- package/dist/formatting.d.ts +4 -45
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +10 -96
- package/dist/formatting.js.map +1 -1
- package/dist/index.d.ts +7 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -11
- package/dist/index.js.map +1 -1
- package/dist/manager.d.ts +156 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +531 -0
- package/dist/manager.js.map +1 -0
- package/dist/slack-connector.d.ts +7 -7
- package/dist/slack-connector.d.ts.map +1 -1
- package/dist/slack-connector.js +56 -55
- package/dist/slack-connector.js.map +1 -1
- package/dist/types.d.ts +17 -32
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/__tests__/session-manager.test.d.ts +0 -2
- package/dist/__tests__/session-manager.test.d.ts.map +0 -1
- package/dist/__tests__/session-manager.test.js +0 -214
- package/dist/__tests__/session-manager.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 -9
- package/dist/session-manager/index.d.ts.map +0 -1
- package/dist/session-manager/index.js +0 -13
- package/dist/session-manager/index.js.map +0 -1
- package/dist/session-manager/session-manager.d.ts +0 -62
- package/dist/session-manager/session-manager.d.ts.map +0 -1
- package/dist/session-manager/session-manager.js +0 -320
- package/dist/session-manager/session-manager.js.map +0 -1
- package/dist/session-manager/types.d.ts +0 -154
- 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,320 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session manager for Slack channel conversations
|
|
3
|
-
*
|
|
4
|
-
* Provides per-channel session management for Claude conversations,
|
|
5
|
-
* enabling conversation context preservation across Slack channels.
|
|
6
|
-
*
|
|
7
|
-
* Sessions are stored at .herdctl/slack-sessions/<agent-name>.yaml
|
|
8
|
-
*/
|
|
9
|
-
import { mkdir } from "node:fs/promises";
|
|
10
|
-
import { join, dirname } from "node:path";
|
|
11
|
-
import { randomUUID } from "node:crypto";
|
|
12
|
-
import { stringify as stringifyYaml, parse as parseYaml } from "yaml";
|
|
13
|
-
import { readFile, writeFile, rename, unlink } from "node:fs/promises";
|
|
14
|
-
import { randomBytes } from "node:crypto";
|
|
15
|
-
import { createLogger } from "@herdctl/core";
|
|
16
|
-
import { SlackSessionStateSchema, createInitialSessionState, } from "./types.js";
|
|
17
|
-
import { SessionStateReadError, SessionStateWriteError, SessionDirectoryCreateError, } from "./errors.js";
|
|
18
|
-
// =============================================================================
|
|
19
|
-
// Default Logger
|
|
20
|
-
// =============================================================================
|
|
21
|
-
function createDefaultLogger(agentName) {
|
|
22
|
-
return createLogger(`slack-session:${agentName}`);
|
|
23
|
-
}
|
|
24
|
-
// =============================================================================
|
|
25
|
-
// Session Manager Implementation
|
|
26
|
-
// =============================================================================
|
|
27
|
-
/**
|
|
28
|
-
* SessionManager manages per-channel Claude sessions for a Slack agent.
|
|
29
|
-
*
|
|
30
|
-
* Each agent has its own SessionManager instance, storing session mappings
|
|
31
|
-
* in a YAML file at .herdctl/slack-sessions/<agent-name>.yaml
|
|
32
|
-
*
|
|
33
|
-
* Sessions are keyed by channelId (matching Discord's approach).
|
|
34
|
-
*/
|
|
35
|
-
export class SessionManager {
|
|
36
|
-
agentName;
|
|
37
|
-
stateDir;
|
|
38
|
-
sessionExpiryHours;
|
|
39
|
-
logger;
|
|
40
|
-
stateFilePath;
|
|
41
|
-
// In-memory cache of session state
|
|
42
|
-
state = null;
|
|
43
|
-
constructor(options) {
|
|
44
|
-
this.agentName = options.agentName;
|
|
45
|
-
this.stateDir = options.stateDir;
|
|
46
|
-
this.sessionExpiryHours = options.sessionExpiryHours ?? 24;
|
|
47
|
-
this.logger =
|
|
48
|
-
options.logger ?? createDefaultLogger(options.agentName);
|
|
49
|
-
// Compute state file path
|
|
50
|
-
this.stateFilePath = join(this.stateDir, "slack-sessions", `${this.agentName}.yaml`);
|
|
51
|
-
}
|
|
52
|
-
// ===========================================================================
|
|
53
|
-
// Public API
|
|
54
|
-
// ===========================================================================
|
|
55
|
-
/**
|
|
56
|
-
* Get or create a session for a channel
|
|
57
|
-
*/
|
|
58
|
-
async getOrCreateSession(channelId) {
|
|
59
|
-
const existingSession = await this.getSession(channelId);
|
|
60
|
-
if (existingSession) {
|
|
61
|
-
this.logger.info("Resuming existing session", {
|
|
62
|
-
channelId,
|
|
63
|
-
sessionId: existingSession.sessionId,
|
|
64
|
-
});
|
|
65
|
-
return {
|
|
66
|
-
sessionId: existingSession.sessionId,
|
|
67
|
-
isNew: false,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
// Create new session
|
|
71
|
-
const sessionId = this.generateSessionId();
|
|
72
|
-
const state = await this.loadState();
|
|
73
|
-
const now = new Date().toISOString();
|
|
74
|
-
state.channels[channelId] = {
|
|
75
|
-
sessionId,
|
|
76
|
-
lastMessageAt: now,
|
|
77
|
-
};
|
|
78
|
-
await this.saveState(state);
|
|
79
|
-
this.logger.info("Created new session", { channelId, sessionId });
|
|
80
|
-
return {
|
|
81
|
-
sessionId,
|
|
82
|
-
isNew: true,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Update the last message timestamp for a session
|
|
87
|
-
*/
|
|
88
|
-
async touchSession(channelId) {
|
|
89
|
-
const state = await this.loadState();
|
|
90
|
-
const session = state.channels[channelId];
|
|
91
|
-
if (!session) {
|
|
92
|
-
this.logger.warn("Attempted to touch non-existent session", {
|
|
93
|
-
channelId,
|
|
94
|
-
});
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
session.lastMessageAt = new Date().toISOString();
|
|
98
|
-
await this.saveState(state);
|
|
99
|
-
this.logger.debug("Touched session", {
|
|
100
|
-
channelId,
|
|
101
|
-
sessionId: session.sessionId,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Get an existing session without creating one
|
|
106
|
-
*/
|
|
107
|
-
async getSession(channelId) {
|
|
108
|
-
const state = await this.loadState();
|
|
109
|
-
const session = state.channels[channelId];
|
|
110
|
-
if (!session) {
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
// Check if session is expired
|
|
114
|
-
if (this.isSessionExpired(session)) {
|
|
115
|
-
this.logger.info("Session expired", {
|
|
116
|
-
channelId,
|
|
117
|
-
sessionId: session.sessionId,
|
|
118
|
-
lastMessageAt: session.lastMessageAt,
|
|
119
|
-
expiryHours: this.sessionExpiryHours,
|
|
120
|
-
});
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
return session;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Store or update the session ID for a channel
|
|
127
|
-
*/
|
|
128
|
-
async setSession(channelId, sessionId) {
|
|
129
|
-
const state = await this.loadState();
|
|
130
|
-
const now = new Date().toISOString();
|
|
131
|
-
const existingSession = state.channels[channelId];
|
|
132
|
-
state.channels[channelId] = {
|
|
133
|
-
sessionId,
|
|
134
|
-
lastMessageAt: now,
|
|
135
|
-
};
|
|
136
|
-
await this.saveState(state);
|
|
137
|
-
if (existingSession) {
|
|
138
|
-
this.logger.debug("Updated session", {
|
|
139
|
-
channelId,
|
|
140
|
-
oldSessionId: existingSession.sessionId,
|
|
141
|
-
newSessionId: sessionId,
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
this.logger.info("Stored new session", { channelId, sessionId });
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Clear a specific session
|
|
150
|
-
*/
|
|
151
|
-
async clearSession(channelId) {
|
|
152
|
-
const state = await this.loadState();
|
|
153
|
-
if (!state.channels[channelId]) {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
const sessionId = state.channels[channelId].sessionId;
|
|
157
|
-
delete state.channels[channelId];
|
|
158
|
-
await this.saveState(state);
|
|
159
|
-
this.logger.info("Cleared session", { channelId, sessionId });
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Clean up all expired sessions
|
|
164
|
-
*/
|
|
165
|
-
async cleanupExpiredSessions() {
|
|
166
|
-
const state = await this.loadState();
|
|
167
|
-
const channelIds = Object.keys(state.channels);
|
|
168
|
-
let cleanedUp = 0;
|
|
169
|
-
for (const channelId of channelIds) {
|
|
170
|
-
const session = state.channels[channelId];
|
|
171
|
-
if (this.isSessionExpired(session)) {
|
|
172
|
-
this.logger.debug("Cleaning up expired session", {
|
|
173
|
-
channelId,
|
|
174
|
-
sessionId: session.sessionId,
|
|
175
|
-
lastMessageAt: session.lastMessageAt,
|
|
176
|
-
});
|
|
177
|
-
delete state.channels[channelId];
|
|
178
|
-
cleanedUp++;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
if (cleanedUp > 0) {
|
|
182
|
-
await this.saveState(state);
|
|
183
|
-
this.logger.info("Cleaned up expired sessions", { count: cleanedUp });
|
|
184
|
-
}
|
|
185
|
-
return cleanedUp;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Get the count of active (non-expired) sessions
|
|
189
|
-
*/
|
|
190
|
-
async getActiveSessionCount() {
|
|
191
|
-
const state = await this.loadState();
|
|
192
|
-
let activeCount = 0;
|
|
193
|
-
for (const channelId of Object.keys(state.channels)) {
|
|
194
|
-
const session = state.channels[channelId];
|
|
195
|
-
if (!this.isSessionExpired(session)) {
|
|
196
|
-
activeCount++;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return activeCount;
|
|
200
|
-
}
|
|
201
|
-
// ===========================================================================
|
|
202
|
-
// Private Helpers
|
|
203
|
-
// ===========================================================================
|
|
204
|
-
generateSessionId() {
|
|
205
|
-
return `slack-${this.agentName}-${randomUUID()}`;
|
|
206
|
-
}
|
|
207
|
-
isSessionExpired(session) {
|
|
208
|
-
const lastMessageAt = new Date(session.lastMessageAt);
|
|
209
|
-
const now = new Date();
|
|
210
|
-
const expiryMs = this.sessionExpiryHours * 60 * 60 * 1000;
|
|
211
|
-
return now.getTime() - lastMessageAt.getTime() > expiryMs;
|
|
212
|
-
}
|
|
213
|
-
async loadState() {
|
|
214
|
-
if (this.state) {
|
|
215
|
-
return this.state;
|
|
216
|
-
}
|
|
217
|
-
let content;
|
|
218
|
-
try {
|
|
219
|
-
content = await readFile(this.stateFilePath, "utf-8");
|
|
220
|
-
}
|
|
221
|
-
catch (error) {
|
|
222
|
-
const code = error.code;
|
|
223
|
-
if (code === "ENOENT") {
|
|
224
|
-
this.state = createInitialSessionState(this.agentName);
|
|
225
|
-
return this.state;
|
|
226
|
-
}
|
|
227
|
-
throw new SessionStateReadError(this.agentName, this.stateFilePath, {
|
|
228
|
-
cause: error,
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
if (content.trim() === "") {
|
|
232
|
-
this.state = createInitialSessionState(this.agentName);
|
|
233
|
-
return this.state;
|
|
234
|
-
}
|
|
235
|
-
let parsed;
|
|
236
|
-
try {
|
|
237
|
-
parsed = parseYaml(content);
|
|
238
|
-
}
|
|
239
|
-
catch (error) {
|
|
240
|
-
this.logger.warn("Corrupted session state file, creating fresh state", {
|
|
241
|
-
error: error.message,
|
|
242
|
-
});
|
|
243
|
-
this.state = createInitialSessionState(this.agentName);
|
|
244
|
-
return this.state;
|
|
245
|
-
}
|
|
246
|
-
const validated = SlackSessionStateSchema.safeParse(parsed);
|
|
247
|
-
if (!validated.success) {
|
|
248
|
-
this.logger.warn("Corrupted session state file, creating fresh state", {
|
|
249
|
-
error: validated.error.message,
|
|
250
|
-
});
|
|
251
|
-
this.state = createInitialSessionState(this.agentName);
|
|
252
|
-
return this.state;
|
|
253
|
-
}
|
|
254
|
-
this.state = validated.data;
|
|
255
|
-
return this.state;
|
|
256
|
-
}
|
|
257
|
-
async saveState(state) {
|
|
258
|
-
await this.ensureDirectoryExists();
|
|
259
|
-
this.state = state;
|
|
260
|
-
const yamlContent = stringifyYaml(state, { indent: 2, lineWidth: 120 });
|
|
261
|
-
const tempPath = this.generateTempPath(this.stateFilePath);
|
|
262
|
-
try {
|
|
263
|
-
await writeFile(tempPath, yamlContent, "utf-8");
|
|
264
|
-
await this.renameWithRetry(tempPath, this.stateFilePath);
|
|
265
|
-
}
|
|
266
|
-
catch (error) {
|
|
267
|
-
try {
|
|
268
|
-
await unlink(tempPath);
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
// Ignore cleanup errors
|
|
272
|
-
}
|
|
273
|
-
throw new SessionStateWriteError(this.agentName, this.stateFilePath, {
|
|
274
|
-
cause: error,
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
async ensureDirectoryExists() {
|
|
279
|
-
const dir = dirname(this.stateFilePath);
|
|
280
|
-
try {
|
|
281
|
-
await mkdir(dir, { recursive: true });
|
|
282
|
-
}
|
|
283
|
-
catch (error) {
|
|
284
|
-
const code = error.code;
|
|
285
|
-
if (code !== "EEXIST") {
|
|
286
|
-
throw new SessionDirectoryCreateError(this.agentName, dir, {
|
|
287
|
-
cause: error,
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
generateTempPath(targetPath) {
|
|
293
|
-
const dir = dirname(targetPath);
|
|
294
|
-
const random = randomBytes(8).toString("hex");
|
|
295
|
-
const filename = `${this.agentName}.yaml`;
|
|
296
|
-
return join(dir, `.${filename}.tmp.${random}`);
|
|
297
|
-
}
|
|
298
|
-
async renameWithRetry(oldPath, newPath, maxRetries = 3, baseDelayMs = 50) {
|
|
299
|
-
let lastError;
|
|
300
|
-
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
301
|
-
try {
|
|
302
|
-
await rename(oldPath, newPath);
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
catch (error) {
|
|
306
|
-
lastError = error;
|
|
307
|
-
const code = error.code;
|
|
308
|
-
if (code !== "EACCES" && code !== "EPERM") {
|
|
309
|
-
throw error;
|
|
310
|
-
}
|
|
311
|
-
if (attempt < maxRetries) {
|
|
312
|
-
const delay = baseDelayMs * Math.pow(2, attempt);
|
|
313
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
throw lastError;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
//# sourceMappingURL=session-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session-manager/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type definitions for Slack session management
|
|
3
|
-
*
|
|
4
|
-
* Provides interfaces for per-channel session state tracking,
|
|
5
|
-
* enabling conversation context preservation across Slack channels.
|
|
6
|
-
*/
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
/**
|
|
9
|
-
* Schema for individual channel session mapping
|
|
10
|
-
*/
|
|
11
|
-
export declare const ChannelSessionSchema: z.ZodObject<{
|
|
12
|
-
/** Claude session ID for resuming conversations */
|
|
13
|
-
sessionId: z.ZodString;
|
|
14
|
-
/** ISO timestamp when last message was sent/received */
|
|
15
|
-
lastMessageAt: z.ZodString;
|
|
16
|
-
}, "strip", z.ZodTypeAny, {
|
|
17
|
-
sessionId: string;
|
|
18
|
-
lastMessageAt: string;
|
|
19
|
-
}, {
|
|
20
|
-
sessionId: string;
|
|
21
|
-
lastMessageAt: string;
|
|
22
|
-
}>;
|
|
23
|
-
/**
|
|
24
|
-
* Schema for the entire agent's Slack session state file
|
|
25
|
-
*
|
|
26
|
-
* Stored at .herdctl/slack-sessions/<agent-name>.yaml
|
|
27
|
-
*/
|
|
28
|
-
export declare const SlackSessionStateSchema: z.ZodObject<{
|
|
29
|
-
/** Version for future schema migrations */
|
|
30
|
-
version: z.ZodLiteral<2>;
|
|
31
|
-
/** Agent name this session state belongs to */
|
|
32
|
-
agentName: z.ZodString;
|
|
33
|
-
/** Map of channel ID to session info */
|
|
34
|
-
channels: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
35
|
-
/** Claude session ID for resuming conversations */
|
|
36
|
-
sessionId: z.ZodString;
|
|
37
|
-
/** ISO timestamp when last message was sent/received */
|
|
38
|
-
lastMessageAt: z.ZodString;
|
|
39
|
-
}, "strip", z.ZodTypeAny, {
|
|
40
|
-
sessionId: string;
|
|
41
|
-
lastMessageAt: string;
|
|
42
|
-
}, {
|
|
43
|
-
sessionId: string;
|
|
44
|
-
lastMessageAt: string;
|
|
45
|
-
}>>;
|
|
46
|
-
}, "strip", z.ZodTypeAny, {
|
|
47
|
-
agentName: string;
|
|
48
|
-
version: 2;
|
|
49
|
-
channels: Record<string, {
|
|
50
|
-
sessionId: string;
|
|
51
|
-
lastMessageAt: string;
|
|
52
|
-
}>;
|
|
53
|
-
}, {
|
|
54
|
-
agentName: string;
|
|
55
|
-
version: 2;
|
|
56
|
-
channels: Record<string, {
|
|
57
|
-
sessionId: string;
|
|
58
|
-
lastMessageAt: string;
|
|
59
|
-
}>;
|
|
60
|
-
}>;
|
|
61
|
-
export type ChannelSession = z.infer<typeof ChannelSessionSchema>;
|
|
62
|
-
export type SlackSessionState = z.infer<typeof SlackSessionStateSchema>;
|
|
63
|
-
/**
|
|
64
|
-
* Logger interface for session manager operations
|
|
65
|
-
*/
|
|
66
|
-
export interface SessionManagerLogger {
|
|
67
|
-
debug(message: string, data?: Record<string, unknown>): void;
|
|
68
|
-
info(message: string, data?: Record<string, unknown>): void;
|
|
69
|
-
warn(message: string, data?: Record<string, unknown>): void;
|
|
70
|
-
error(message: string, data?: Record<string, unknown>): void;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Options for configuring the SessionManager
|
|
74
|
-
*/
|
|
75
|
-
export interface SessionManagerOptions {
|
|
76
|
-
/** Name of the agent this session manager is for */
|
|
77
|
-
agentName: string;
|
|
78
|
-
/** Root path for state storage (e.g., .herdctl) */
|
|
79
|
-
stateDir: string;
|
|
80
|
-
/** Session expiry timeout in hours (default: 24) */
|
|
81
|
-
sessionExpiryHours?: number;
|
|
82
|
-
/** Logger for session manager operations */
|
|
83
|
-
logger?: SessionManagerLogger;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Result of getting or creating a session
|
|
87
|
-
*/
|
|
88
|
-
export interface SessionResult {
|
|
89
|
-
/** Claude session ID */
|
|
90
|
-
sessionId: string;
|
|
91
|
-
/** Whether this is a newly created session */
|
|
92
|
-
isNew: boolean;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Interface that all Slack session managers must implement
|
|
96
|
-
*
|
|
97
|
-
* Keyed by channelId (matching Discord's approach)
|
|
98
|
-
*/
|
|
99
|
-
export interface ISessionManager {
|
|
100
|
-
/**
|
|
101
|
-
* Get or create a session for a channel
|
|
102
|
-
*
|
|
103
|
-
* @param channelId - Slack channel ID (conversation key)
|
|
104
|
-
*/
|
|
105
|
-
getOrCreateSession(channelId: string): Promise<SessionResult>;
|
|
106
|
-
/**
|
|
107
|
-
* Update the last message timestamp for a session
|
|
108
|
-
*
|
|
109
|
-
* @param channelId - Slack channel ID
|
|
110
|
-
*/
|
|
111
|
-
touchSession(channelId: string): Promise<void>;
|
|
112
|
-
/**
|
|
113
|
-
* Get an existing session without creating one
|
|
114
|
-
*
|
|
115
|
-
* @param channelId - Slack channel ID
|
|
116
|
-
* @returns Session if it exists and is not expired, null otherwise
|
|
117
|
-
*/
|
|
118
|
-
getSession(channelId: string): Promise<ChannelSession | null>;
|
|
119
|
-
/**
|
|
120
|
-
* Store or update the session ID for a channel
|
|
121
|
-
*
|
|
122
|
-
* @param channelId - Slack channel ID
|
|
123
|
-
* @param sessionId - The Claude Agent SDK session ID
|
|
124
|
-
*/
|
|
125
|
-
setSession(channelId: string, sessionId: string): Promise<void>;
|
|
126
|
-
/**
|
|
127
|
-
* Clear a specific session
|
|
128
|
-
*
|
|
129
|
-
* @param channelId - Slack channel ID
|
|
130
|
-
* @returns true if cleared, false if it didn't exist
|
|
131
|
-
*/
|
|
132
|
-
clearSession(channelId: string): Promise<boolean>;
|
|
133
|
-
/**
|
|
134
|
-
* Clean up all expired sessions
|
|
135
|
-
*
|
|
136
|
-
* @returns Number of sessions cleaned up
|
|
137
|
-
*/
|
|
138
|
-
cleanupExpiredSessions(): Promise<number>;
|
|
139
|
-
/**
|
|
140
|
-
* Get the count of active (non-expired) sessions
|
|
141
|
-
*/
|
|
142
|
-
getActiveSessionCount(): Promise<number>;
|
|
143
|
-
/** Name of the agent this session manager is for */
|
|
144
|
-
readonly agentName: string;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Create initial session state for a new agent
|
|
148
|
-
*/
|
|
149
|
-
export declare function createInitialSessionState(agentName: string): SlackSessionState;
|
|
150
|
-
/**
|
|
151
|
-
* Create a new channel session
|
|
152
|
-
*/
|
|
153
|
-
export declare function createChannelSession(sessionId: string): ChannelSession;
|
|
154
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session-manager/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,eAAO,MAAM,oBAAoB;IAC/B,mDAAmD;;IAGnD,wDAAwD;;;;;;;;EAIxD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;IAClC,2CAA2C;;IAG3C,+CAA+C;;IAG/C,wCAAwC;;QArBxC,mDAAmD;;QAGnD,wDAAwD;;;;;;;;;;;;;;;;;;;;;;;EAoBxD,CAAC;AAMH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAMxE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAElB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAElB,8CAA8C;IAC9C,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE9D;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAE9D;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD;;;;OAIG;IACH,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C;;OAEG;IACH,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,GAChB,iBAAiB,CAMnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAKtE"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type definitions for Slack session management
|
|
3
|
-
*
|
|
4
|
-
* Provides interfaces for per-channel session state tracking,
|
|
5
|
-
* enabling conversation context preservation across Slack channels.
|
|
6
|
-
*/
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
// =============================================================================
|
|
9
|
-
// Session Schema
|
|
10
|
-
// =============================================================================
|
|
11
|
-
/**
|
|
12
|
-
* Schema for individual channel session mapping
|
|
13
|
-
*/
|
|
14
|
-
export const ChannelSessionSchema = z.object({
|
|
15
|
-
/** Claude session ID for resuming conversations */
|
|
16
|
-
sessionId: z.string().min(1, "Session ID cannot be empty"),
|
|
17
|
-
/** ISO timestamp when last message was sent/received */
|
|
18
|
-
lastMessageAt: z.string().datetime({
|
|
19
|
-
message: "lastMessageAt must be a valid ISO datetime string",
|
|
20
|
-
}),
|
|
21
|
-
});
|
|
22
|
-
/**
|
|
23
|
-
* Schema for the entire agent's Slack session state file
|
|
24
|
-
*
|
|
25
|
-
* Stored at .herdctl/slack-sessions/<agent-name>.yaml
|
|
26
|
-
*/
|
|
27
|
-
export const SlackSessionStateSchema = z.object({
|
|
28
|
-
/** Version for future schema migrations */
|
|
29
|
-
version: z.literal(2),
|
|
30
|
-
/** Agent name this session state belongs to */
|
|
31
|
-
agentName: z.string().min(1, "Agent name cannot be empty"),
|
|
32
|
-
/** Map of channel ID to session info */
|
|
33
|
-
channels: z.record(z.string(), ChannelSessionSchema),
|
|
34
|
-
});
|
|
35
|
-
// =============================================================================
|
|
36
|
-
// Factory Functions
|
|
37
|
-
// =============================================================================
|
|
38
|
-
/**
|
|
39
|
-
* Create initial session state for a new agent
|
|
40
|
-
*/
|
|
41
|
-
export function createInitialSessionState(agentName) {
|
|
42
|
-
return {
|
|
43
|
-
version: 2,
|
|
44
|
-
agentName,
|
|
45
|
-
channels: {},
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Create a new channel session
|
|
50
|
-
*/
|
|
51
|
-
export function createChannelSession(sessionId) {
|
|
52
|
-
return {
|
|
53
|
-
sessionId,
|
|
54
|
-
lastMessageAt: new Date().toISOString(),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session-manager/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,mDAAmD;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IAE1D,wDAAwD;IACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC;QACjC,OAAO,EAAE,mDAAmD;KAC7D,CAAC;CACH,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,2CAA2C;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAErB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IAE1D,wCAAwC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC;CACrD,CAAC,CAAC;AAmHH,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAiB;IAEjB,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS;QACT,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO;QACL,SAAS;QACT,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;AACJ,CAAC"}
|