@herdctl/slack 0.3.0 → 1.1.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.
Files changed (60) hide show
  1. package/dist/__tests__/command-handler.test.js +1 -0
  2. package/dist/__tests__/command-handler.test.js.map +1 -1
  3. package/dist/__tests__/error-handler.test.js +25 -25
  4. package/dist/__tests__/error-handler.test.js.map +1 -1
  5. package/dist/__tests__/formatting.test.js +9 -9
  6. package/dist/__tests__/formatting.test.js.map +1 -1
  7. package/dist/__tests__/manager.test.d.ts +8 -0
  8. package/dist/__tests__/manager.test.d.ts.map +1 -0
  9. package/dist/__tests__/manager.test.js +278 -0
  10. package/dist/__tests__/manager.test.js.map +1 -0
  11. package/dist/__tests__/slack-connector.test.js +200 -0
  12. package/dist/__tests__/slack-connector.test.js.map +1 -1
  13. package/dist/commands/command-handler.d.ts +3 -3
  14. package/dist/commands/command-handler.d.ts.map +1 -1
  15. package/dist/commands/status.d.ts.map +1 -1
  16. package/dist/commands/status.js +1 -54
  17. package/dist/commands/status.js.map +1 -1
  18. package/dist/error-handler.d.ts +12 -33
  19. package/dist/error-handler.d.ts.map +1 -1
  20. package/dist/error-handler.js +32 -57
  21. package/dist/error-handler.js.map +1 -1
  22. package/dist/formatting.d.ts +4 -45
  23. package/dist/formatting.d.ts.map +1 -1
  24. package/dist/formatting.js +10 -96
  25. package/dist/formatting.js.map +1 -1
  26. package/dist/index.d.ts +7 -8
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +15 -11
  29. package/dist/index.js.map +1 -1
  30. package/dist/manager.d.ts +156 -0
  31. package/dist/manager.d.ts.map +1 -0
  32. package/dist/manager.js +532 -0
  33. package/dist/manager.js.map +1 -0
  34. package/dist/slack-connector.d.ts +10 -2
  35. package/dist/slack-connector.d.ts.map +1 -1
  36. package/dist/slack-connector.js +112 -32
  37. package/dist/slack-connector.js.map +1 -1
  38. package/dist/types.d.ts +8 -24
  39. package/dist/types.d.ts.map +1 -1
  40. package/package.json +3 -2
  41. package/dist/__tests__/session-manager.test.d.ts +0 -2
  42. package/dist/__tests__/session-manager.test.d.ts.map +0 -1
  43. package/dist/__tests__/session-manager.test.js +0 -214
  44. package/dist/__tests__/session-manager.test.js.map +0 -1
  45. package/dist/session-manager/errors.d.ts +0 -58
  46. package/dist/session-manager/errors.d.ts.map +0 -1
  47. package/dist/session-manager/errors.js +0 -70
  48. package/dist/session-manager/errors.js.map +0 -1
  49. package/dist/session-manager/index.d.ts +0 -9
  50. package/dist/session-manager/index.d.ts.map +0 -1
  51. package/dist/session-manager/index.js +0 -13
  52. package/dist/session-manager/index.js.map +0 -1
  53. package/dist/session-manager/session-manager.d.ts +0 -62
  54. package/dist/session-manager/session-manager.d.ts.map +0 -1
  55. package/dist/session-manager/session-manager.js +0 -320
  56. package/dist/session-manager/session-manager.js.map +0 -1
  57. package/dist/session-manager/types.d.ts +0 -154
  58. package/dist/session-manager/types.d.ts.map +0 -1
  59. package/dist/session-manager/types.js +0 -57
  60. package/dist/session-manager/types.js.map +0 -1
@@ -0,0 +1,532 @@
1
+ /**
2
+ * Slack Manager Module
3
+ *
4
+ * Manages Slack connectors for agents that have `chat.slack` configured.
5
+ * This module is responsible for:
6
+ * - Creating one SlackConnector instance per Slack-enabled agent
7
+ * - Managing connector lifecycle (start/stop)
8
+ * - Providing access to connectors for status queries
9
+ *
10
+ * @module manager
11
+ */
12
+ import { createFileSenderDef, } from "@herdctl/core";
13
+ import { StreamingResponder, extractMessageContent, splitMessage, ChatSessionManager, } from "@herdctl/chat";
14
+ import { SlackConnector } from "./slack-connector.js";
15
+ import { markdownToMrkdwn } from "./formatting.js";
16
+ /**
17
+ * SlackManager handles Slack connections for agents
18
+ *
19
+ * This class encapsulates the creation and lifecycle management of
20
+ * SlackConnector instances for agents that have Slack chat configured.
21
+ *
22
+ * Implements IChatManager so FleetManager can interact with it through
23
+ * the generic chat manager interface.
24
+ */
25
+ export class SlackManager {
26
+ ctx;
27
+ connectors = new Map();
28
+ initialized = false;
29
+ constructor(ctx) {
30
+ this.ctx = ctx;
31
+ }
32
+ /**
33
+ * Initialize Slack connectors for all configured agents
34
+ *
35
+ * This method:
36
+ * 1. Iterates through agents to find those with Slack configured
37
+ * 2. Creates a SlackConnector for each Slack-enabled agent
38
+ *
39
+ * Should be called during FleetManager initialization.
40
+ */
41
+ async initialize() {
42
+ if (this.initialized) {
43
+ return;
44
+ }
45
+ const logger = this.ctx.getLogger();
46
+ const config = this.ctx.getConfig();
47
+ if (!config) {
48
+ logger.debug("No config available, skipping Slack initialization");
49
+ return;
50
+ }
51
+ const stateDir = this.ctx.getStateDir();
52
+ // Find agents with Slack configured
53
+ const slackAgents = config.agents.filter((agent) => agent.chat?.slack !== undefined);
54
+ if (slackAgents.length === 0) {
55
+ logger.debug("No agents with Slack configured");
56
+ this.initialized = true;
57
+ return;
58
+ }
59
+ logger.debug(`Initializing Slack connectors for ${slackAgents.length} agent(s)`);
60
+ for (const agent of slackAgents) {
61
+ try {
62
+ const slackConfig = agent.chat.slack;
63
+ if (!slackConfig)
64
+ continue;
65
+ // Get bot token from environment variable
66
+ const botToken = process.env[slackConfig.bot_token_env];
67
+ if (!botToken) {
68
+ logger.warn(`Slack bot token not found in environment variable '${slackConfig.bot_token_env}' for agent '${agent.name}'`);
69
+ continue;
70
+ }
71
+ // Get app token from environment variable
72
+ const appToken = process.env[slackConfig.app_token_env];
73
+ if (!appToken) {
74
+ logger.warn(`Slack app token not found in environment variable '${slackConfig.app_token_env}' for agent '${agent.name}'`);
75
+ continue;
76
+ }
77
+ // Create logger adapter for this agent
78
+ const createAgentLogger = (prefix) => ({
79
+ debug: (msg, data) => logger.debug(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
80
+ info: (msg, data) => logger.info(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
81
+ warn: (msg, data) => logger.warn(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
82
+ error: (msg, data) => logger.error(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
83
+ });
84
+ // Create session manager for this agent
85
+ const sessionManager = new ChatSessionManager({
86
+ platform: "slack",
87
+ agentName: agent.name,
88
+ stateDir,
89
+ sessionExpiryHours: slackConfig.session_expiry_hours,
90
+ logger: createAgentLogger(`[slack:${agent.name}:session]`),
91
+ });
92
+ // Create the connector
93
+ const connector = new SlackConnector({
94
+ agentName: agent.name,
95
+ botToken,
96
+ appToken,
97
+ channels: slackConfig.channels.map((ch) => ({ id: ch.id, mode: ch.mode })),
98
+ dm: slackConfig.dm,
99
+ sessionManager,
100
+ logger: createAgentLogger(`[slack:${agent.name}]`),
101
+ });
102
+ this.connectors.set(agent.name, connector);
103
+ logger.debug(`Created Slack connector for agent '${agent.name}'`);
104
+ }
105
+ catch (error) {
106
+ const errorMessage = error instanceof Error ? error.message : String(error);
107
+ logger.error(`Failed to create Slack connector for agent '${agent.name}': ${errorMessage}`);
108
+ // Continue with other agents - don't fail the whole initialization
109
+ }
110
+ }
111
+ this.initialized = true;
112
+ logger.debug(`Slack manager initialized with ${this.connectors.size} connector(s)`);
113
+ }
114
+ /**
115
+ * Connect all Slack connectors
116
+ *
117
+ * Connects each connector to Slack via Socket Mode and subscribes to events.
118
+ * Errors are logged but don't stop other connectors from connecting.
119
+ */
120
+ async start() {
121
+ const logger = this.ctx.getLogger();
122
+ if (this.connectors.size === 0) {
123
+ logger.debug("No Slack connectors to start");
124
+ return;
125
+ }
126
+ logger.debug(`Starting ${this.connectors.size} Slack connector(s)...`);
127
+ const connectPromises = [];
128
+ for (const [agentName, connector] of this.connectors) {
129
+ // Subscribe to connector events before connecting
130
+ connector.on("message", (event) => {
131
+ this.handleMessage(agentName, event).catch((error) => {
132
+ this.handleError(agentName, error);
133
+ });
134
+ });
135
+ connector.on("error", (event) => {
136
+ this.handleError(event.agentName, event.error);
137
+ });
138
+ connectPromises.push(connector.connect().catch((error) => {
139
+ const errorMessage = error instanceof Error ? error.message : String(error);
140
+ logger.error(`Failed to connect Slack for agent '${agentName}': ${errorMessage}`);
141
+ // Don't re-throw - we want to continue connecting other agents
142
+ }));
143
+ }
144
+ await Promise.all(connectPromises);
145
+ const connectedCount = Array.from(this.connectors.values()).filter((c) => c.isConnected()).length;
146
+ logger.info(`Slack connectors started: ${connectedCount}/${this.connectors.size} connected`);
147
+ }
148
+ /**
149
+ * Disconnect all Slack connectors gracefully
150
+ *
151
+ * Sessions are automatically persisted to disk on every update,
152
+ * so they survive bot restarts. This method logs session state
153
+ * before disconnecting for monitoring purposes.
154
+ *
155
+ * Errors are logged but don't prevent other connectors from disconnecting.
156
+ */
157
+ async stop() {
158
+ const logger = this.ctx.getLogger();
159
+ if (this.connectors.size === 0) {
160
+ logger.debug("No Slack connectors to stop");
161
+ return;
162
+ }
163
+ logger.debug(`Stopping ${this.connectors.size} Slack connector(s)...`);
164
+ // Log session state before shutdown (sessions are already persisted to disk)
165
+ for (const [agentName, connector] of this.connectors) {
166
+ try {
167
+ const activeSessionCount = await connector.sessionManager.getActiveSessionCount();
168
+ if (activeSessionCount > 0) {
169
+ logger.debug(`Preserving ${activeSessionCount} active Slack session(s) for agent '${agentName}'`);
170
+ }
171
+ }
172
+ catch (error) {
173
+ const errorMessage = error instanceof Error ? error.message : String(error);
174
+ logger.warn(`Failed to get Slack session count for agent '${agentName}': ${errorMessage}`);
175
+ // Continue with shutdown - this is just informational logging
176
+ }
177
+ }
178
+ const disconnectPromises = [];
179
+ for (const [agentName, connector] of this.connectors) {
180
+ disconnectPromises.push(connector.disconnect().catch((error) => {
181
+ const errorMessage = error instanceof Error ? error.message : String(error);
182
+ logger.error(`Error disconnecting Slack for agent '${agentName}': ${errorMessage}`);
183
+ // Don't re-throw - graceful shutdown should continue
184
+ }));
185
+ }
186
+ await Promise.all(disconnectPromises);
187
+ logger.debug("All Slack connectors stopped");
188
+ }
189
+ /**
190
+ * Get a connector for a specific agent
191
+ *
192
+ * @param agentName - Name of the agent
193
+ * @returns The SlackConnector instance, or undefined if not found
194
+ */
195
+ getConnector(agentName) {
196
+ return this.connectors.get(agentName);
197
+ }
198
+ /**
199
+ * Get all connector names
200
+ *
201
+ * @returns Array of agent names that have Slack connectors
202
+ */
203
+ getConnectorNames() {
204
+ return Array.from(this.connectors.keys());
205
+ }
206
+ /**
207
+ * Get the number of active connectors
208
+ *
209
+ * @returns Number of connectors that are currently connected
210
+ */
211
+ getConnectedCount() {
212
+ return Array.from(this.connectors.values()).filter((c) => c.isConnected()).length;
213
+ }
214
+ /**
215
+ * Check if the manager has been initialized
216
+ */
217
+ isInitialized() {
218
+ return this.initialized;
219
+ }
220
+ /**
221
+ * Check if a specific agent has a Slack connector
222
+ *
223
+ * @param agentName - Name of the agent
224
+ * @returns true if the agent has a Slack connector
225
+ */
226
+ hasConnector(agentName) {
227
+ return this.connectors.has(agentName);
228
+ }
229
+ /**
230
+ * Check if a specific agent has a connector (alias for hasConnector)
231
+ *
232
+ * @param agentName - Name of the agent
233
+ * @returns true if the agent has a connector
234
+ */
235
+ hasAgent(agentName) {
236
+ return this.connectors.has(agentName);
237
+ }
238
+ /**
239
+ * Get the state of a connector for a specific agent
240
+ *
241
+ * @param agentName - Name of the agent
242
+ * @returns The connector state, or undefined if not found
243
+ */
244
+ getState(agentName) {
245
+ const connector = this.connectors.get(agentName);
246
+ if (!connector)
247
+ return undefined;
248
+ const state = connector.getState();
249
+ return {
250
+ status: state.status,
251
+ connectedAt: state.connectedAt,
252
+ disconnectedAt: state.disconnectedAt,
253
+ reconnectAttempts: state.reconnectAttempts,
254
+ lastError: state.lastError,
255
+ botUser: state.botUser ? { id: state.botUser.id, username: state.botUser.username } : null,
256
+ messageStats: state.messageStats,
257
+ };
258
+ }
259
+ // ===========================================================================
260
+ // Message Handling Pipeline
261
+ // ===========================================================================
262
+ /**
263
+ * Handle an incoming Slack message
264
+ *
265
+ * This method:
266
+ * 1. Gets or creates a session for the channel
267
+ * 2. Builds job context from the message
268
+ * 3. Executes the job via trigger
269
+ * 4. Sends the response back to Slack
270
+ *
271
+ * @param agentName - Name of the agent handling the message
272
+ * @param event - The Slack message event
273
+ */
274
+ async handleMessage(agentName, event) {
275
+ const logger = this.ctx.getLogger();
276
+ const emitter = this.ctx.getEmitter();
277
+ logger.info(`Slack message for agent '${agentName}': ${event.prompt.substring(0, 50)}...`);
278
+ // Get the agent configuration
279
+ const config = this.ctx.getConfig();
280
+ const agent = config?.agents.find((a) => a.name === agentName);
281
+ if (!agent) {
282
+ logger.error(`Agent '${agentName}' not found in configuration`);
283
+ try {
284
+ await event.reply("Sorry, I'm not properly configured. Please contact an administrator.");
285
+ }
286
+ catch (replyError) {
287
+ logger.error(`Failed to send error reply: ${replyError.message}`);
288
+ }
289
+ return;
290
+ }
291
+ // Get existing session for this channel (for conversation continuity)
292
+ const connector = this.connectors.get(agentName);
293
+ let existingSessionId = null;
294
+ if (connector) {
295
+ try {
296
+ const existingSession = await connector.sessionManager.getSession(event.metadata.channelId);
297
+ if (existingSession) {
298
+ existingSessionId = existingSession.sessionId;
299
+ logger.debug(`Resuming session for channel ${event.metadata.channelId}: ${existingSessionId}`);
300
+ emitter.emit("slack:session:lifecycle", {
301
+ agentName,
302
+ event: "resumed",
303
+ channelId: event.metadata.channelId,
304
+ sessionId: existingSessionId,
305
+ });
306
+ }
307
+ else {
308
+ logger.debug(`No existing session for channel ${event.metadata.channelId}, starting new conversation`);
309
+ }
310
+ }
311
+ catch (error) {
312
+ const errorMessage = error instanceof Error ? error.message : String(error);
313
+ logger.warn(`Failed to get session: ${errorMessage}`);
314
+ // Continue processing - session failure shouldn't block message handling
315
+ }
316
+ }
317
+ // Create file sender definition for this message context
318
+ let injectedMcpServers;
319
+ const workingDir = this.resolveWorkingDirectory(agent);
320
+ if (connector && workingDir) {
321
+ const agentConnector = connector;
322
+ const fileSenderContext = {
323
+ workingDirectory: workingDir,
324
+ uploadFile: async (params) => {
325
+ return agentConnector.uploadFile({
326
+ channelId: event.metadata.channelId,
327
+ fileBuffer: params.fileBuffer,
328
+ filename: params.filename,
329
+ message: params.message,
330
+ });
331
+ },
332
+ };
333
+ const fileSenderDef = createFileSenderDef(fileSenderContext);
334
+ injectedMcpServers = { [fileSenderDef.name]: fileSenderDef };
335
+ }
336
+ // Create streaming responder for incremental message delivery
337
+ const streamer = new StreamingResponder({
338
+ reply: (content) => event.reply(markdownToMrkdwn(content)),
339
+ logger: logger,
340
+ agentName,
341
+ maxMessageLength: 4000, // Slack's limit
342
+ maxBufferSize: 3500,
343
+ platformName: "Slack",
344
+ });
345
+ // Start processing indicator (hourglass emoji)
346
+ const stopProcessing = event.startProcessingIndicator();
347
+ let processingStopped = false;
348
+ try {
349
+ // Execute job via FleetManager.trigger() through the context
350
+ // Pass resume option for conversation continuity
351
+ // The onMessage callback streams output incrementally to Slack
352
+ const result = await this.ctx.trigger(agentName, undefined, {
353
+ prompt: event.prompt,
354
+ resume: existingSessionId,
355
+ injectedMcpServers,
356
+ onMessage: async (message) => {
357
+ // Extract text content from assistant messages and stream to Slack
358
+ if (message.type === "assistant") {
359
+ // Cast to the SDKMessage shape expected by extractMessageContent
360
+ const sdkMessage = message;
361
+ const content = extractMessageContent(sdkMessage);
362
+ if (content) {
363
+ // Each assistant message is a complete turn - send immediately
364
+ await streamer.addMessageAndSend(content);
365
+ }
366
+ }
367
+ },
368
+ });
369
+ // Stop processing indicator immediately after SDK execution completes
370
+ if (!processingStopped) {
371
+ stopProcessing();
372
+ processingStopped = true;
373
+ }
374
+ // Flush any remaining buffered content
375
+ await streamer.flush();
376
+ logger.info(`Slack job completed: ${result.jobId} for agent '${agentName}'${result.sessionId ? ` (session: ${result.sessionId})` : ""}`);
377
+ // If no messages were sent, send an appropriate fallback
378
+ if (!streamer.hasSentMessages()) {
379
+ if (result.success) {
380
+ await event.reply("I've completed the task, but I don't have a specific response to share.");
381
+ }
382
+ else {
383
+ // Job failed without streaming any messages - send error details
384
+ const errorMessage = result.errorDetails?.message ?? result.error?.message ?? "An unknown error occurred";
385
+ await event.reply(`*Error:* ${errorMessage}\n\nThe task could not be completed. Please check the logs for more details.`);
386
+ }
387
+ // Stop processing after sending fallback message (if not already stopped)
388
+ if (!processingStopped) {
389
+ stopProcessing();
390
+ processingStopped = true;
391
+ }
392
+ }
393
+ // Store the SDK session ID for future conversation continuity
394
+ // Only store if the job succeeded - failed jobs may return invalid session IDs
395
+ if (connector && result.sessionId && result.success) {
396
+ const isNewSession = existingSessionId === null;
397
+ try {
398
+ await connector.sessionManager.setSession(event.metadata.channelId, result.sessionId);
399
+ logger.debug(`Stored session ${result.sessionId} for channel ${event.metadata.channelId}`);
400
+ if (isNewSession) {
401
+ emitter.emit("slack:session:lifecycle", {
402
+ agentName,
403
+ event: "created",
404
+ channelId: event.metadata.channelId,
405
+ sessionId: result.sessionId,
406
+ });
407
+ }
408
+ }
409
+ catch (sessionError) {
410
+ const errorMessage = sessionError instanceof Error ? sessionError.message : String(sessionError);
411
+ logger.warn(`Failed to store session: ${errorMessage}`);
412
+ // Don't fail the message handling for session storage failure
413
+ }
414
+ }
415
+ else if (connector && result.sessionId && !result.success) {
416
+ logger.debug(`Not storing session ${result.sessionId} for channel ${event.metadata.channelId} - job failed`);
417
+ }
418
+ // Emit event for tracking
419
+ emitter.emit("slack:message:handled", {
420
+ agentName,
421
+ channelId: event.metadata.channelId,
422
+ messageTs: event.metadata.messageTs,
423
+ jobId: result.jobId,
424
+ timestamp: new Date().toISOString(),
425
+ });
426
+ }
427
+ catch (error) {
428
+ const err = error instanceof Error ? error : new Error(String(error));
429
+ logger.error(`Slack message handling failed for agent '${agentName}': ${err.message}`);
430
+ // Send user-friendly error message
431
+ try {
432
+ await event.reply(this.formatErrorMessage(err));
433
+ }
434
+ catch (replyError) {
435
+ logger.error(`Failed to send error reply: ${replyError.message}`);
436
+ }
437
+ // Emit error event for tracking
438
+ emitter.emit("slack:message:error", {
439
+ agentName,
440
+ channelId: event.metadata.channelId,
441
+ messageTs: event.metadata.messageTs,
442
+ error: err.message,
443
+ timestamp: new Date().toISOString(),
444
+ });
445
+ }
446
+ finally {
447
+ // Safety net: stop processing indicator if not already stopped
448
+ if (!processingStopped) {
449
+ stopProcessing();
450
+ }
451
+ }
452
+ }
453
+ /**
454
+ * Handle errors from Slack connectors
455
+ *
456
+ * Logs errors without crashing the connector
457
+ *
458
+ * @param agentName - Name of the agent that encountered the error
459
+ * @param error - The error that occurred
460
+ */
461
+ handleError(agentName, error) {
462
+ const logger = this.ctx.getLogger();
463
+ const emitter = this.ctx.getEmitter();
464
+ const errorMessage = error instanceof Error ? error.message : String(error);
465
+ logger.error(`Slack connector error for agent '${agentName}': ${errorMessage}`);
466
+ // Emit error event for monitoring
467
+ emitter.emit("slack:error", {
468
+ agentName,
469
+ error: errorMessage,
470
+ timestamp: new Date().toISOString(),
471
+ });
472
+ }
473
+ // ===========================================================================
474
+ // Response Formatting and Splitting
475
+ // ===========================================================================
476
+ /** Slack's maximum message length */
477
+ static MAX_MESSAGE_LENGTH = 4000;
478
+ /**
479
+ * Format an error message for Slack display
480
+ *
481
+ * Creates a user-friendly error message with guidance on how to proceed.
482
+ *
483
+ * @param error - The error that occurred
484
+ * @returns Formatted error message string
485
+ */
486
+ formatErrorMessage(error) {
487
+ return `*Error:* ${error.message}\n\nPlease try again or use \`!reset\` to start a new session.`;
488
+ }
489
+ /**
490
+ * Split a response into chunks that fit Slack's 4000 character limit
491
+ *
492
+ * Uses the shared splitMessage utility from @herdctl/chat.
493
+ *
494
+ * @param text - The text to split
495
+ * @returns Array of text chunks, each under 4000 characters
496
+ */
497
+ splitResponse(text) {
498
+ const result = splitMessage(text, { maxLength: SlackManager.MAX_MESSAGE_LENGTH });
499
+ return result.chunks;
500
+ }
501
+ /**
502
+ * Send a response to Slack, splitting if necessary
503
+ *
504
+ * @param reply - The reply function from the message event
505
+ * @param content - The content to send
506
+ */
507
+ async sendResponse(reply, content) {
508
+ const chunks = this.splitResponse(content);
509
+ for (const chunk of chunks) {
510
+ await reply(chunk);
511
+ }
512
+ }
513
+ // ===========================================================================
514
+ // Utility Methods
515
+ // ===========================================================================
516
+ /**
517
+ * Resolve the agent's working directory to an absolute path string
518
+ *
519
+ * @param agent - The resolved agent configuration
520
+ * @returns Absolute path to working directory, or undefined if not configured
521
+ */
522
+ resolveWorkingDirectory(agent) {
523
+ if (!agent.working_directory) {
524
+ return undefined;
525
+ }
526
+ if (typeof agent.working_directory === "string") {
527
+ return agent.working_directory;
528
+ }
529
+ return agent.working_directory.root;
530
+ }
531
+ }
532
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
@@ -10,13 +10,15 @@
10
10
  * - Hourglass emoji reaction as typing indicator
11
11
  */
12
12
  import { EventEmitter } from "node:events";
13
- import type { SlackConnectorOptions, SlackConnectorState, SlackFileUploadParams, ISlackConnector, ISlackSessionManager, SlackConnectorEventMap, SlackConnectorEventName } from "./types.js";
13
+ import type { IChatSessionManager } from "@herdctl/chat";
14
+ import type { SlackConnectorOptions, SlackConnectorState, SlackFileUploadParams, ISlackConnector, SlackConnectorEventMap, SlackConnectorEventName } from "./types.js";
14
15
  export declare class SlackConnector extends EventEmitter implements ISlackConnector {
15
16
  readonly agentName: string;
16
- readonly sessionManager: ISlackSessionManager;
17
+ readonly sessionManager: IChatSessionManager;
17
18
  private readonly botToken;
18
19
  private readonly appToken;
19
20
  private readonly channels;
21
+ private readonly dmConfig;
20
22
  private readonly logger;
21
23
  private app;
22
24
  private commandHandler;
@@ -39,6 +41,12 @@ export declare class SlackConnector extends EventEmitter implements ISlackConnec
39
41
  fileId: string;
40
42
  }>;
41
43
  private registerEventHandlers;
44
+ /**
45
+ * Check if a DM is allowed based on DM config (enabled, allowlist, blocklist).
46
+ * Returns true if the DM should be processed, false if it was filtered.
47
+ * Emits messageIgnored events when filtered.
48
+ */
49
+ private checkDMAccess;
42
50
  /**
43
51
  * Try to execute a prefix command. Returns true if a command was handled.
44
52
  */
@@ -1 +1 @@
1
- {"version":3,"file":"slack-connector.d.ts","sourceRoot":"","sources":["../src/slack-connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EAKnB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAoBpB,qBAAa,cAAe,SAAQ,YAAa,YAAW,eAAe;IACzE,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,cAAc,EAAE,oBAAoB,CAAC;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAI9C,OAAO,CAAC,GAAG,CAAa;IAGxB,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAG1C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAa;gBAExB,OAAO,EAAE,qBAAqB;IAqBpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwFxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCjC,WAAW,IAAI,OAAO;IAItB,QAAQ,IAAI,mBAAmB;IAyBzB,UAAU,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B5E,OAAO,CAAC,qBAAqB;IAuK7B;;OAEG;YACW,iBAAiB;IA4C/B,OAAO,CAAC,iBAAiB;IAgEhB,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAC7C,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GACjC,OAAO;IAID,EAAE,CAAC,CAAC,SAAS,uBAAuB,EAC3C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAIE,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAC7C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAIE,GAAG,CAAC,CAAC,SAAS,uBAAuB,EAC5C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;CAGR"}
1
+ {"version":3,"file":"slack-connector.d.ts","sourceRoot":"","sources":["../src/slack-connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAY,MAAM,eAAe,CAAC;AAEnE,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EAKnB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAoBpB,qBAAa,cAAe,SAAQ,YAAa,YAAW,eAAe;IACzE,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,cAAc,EAAE,mBAAmB,CAAC;IAEpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAI9C,OAAO,CAAC,GAAG,CAAa;IAGxB,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAG1C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAa;gBAExB,OAAO,EAAE,qBAAqB;IAsBpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwFxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCjC,WAAW,IAAI,OAAO;IAItB,QAAQ,IAAI,mBAAmB;IAyBzB,UAAU,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B5E,OAAO,CAAC,qBAAqB;IAoM7B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;YACW,iBAAiB;IA4C/B,OAAO,CAAC,iBAAiB;IAkEhB,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAC7C,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GACjC,OAAO;IAID,EAAE,CAAC,CAAC,SAAS,uBAAuB,EAC3C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAIE,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAC7C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;IAIE,GAAG,CAAC,CAAC,SAAS,uBAAuB,EAC5C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACrD,IAAI;CAGR"}