@herdctl/core 3.0.2 → 4.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.
- package/dist/config/__tests__/schema.test.js +45 -0
- package/dist/config/__tests__/schema.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +774 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +100 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/discord-manager.test.js +1415 -84
- package/dist/fleet-manager/__tests__/discord-manager.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/slack-manager.test.d.ts +11 -0
- package/dist/fleet-manager/__tests__/slack-manager.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/slack-manager.test.js +1022 -0
- package/dist/fleet-manager/__tests__/slack-manager.test.js.map +1 -0
- package/dist/fleet-manager/context.d.ts +4 -0
- package/dist/fleet-manager/context.d.ts.map +1 -1
- package/dist/fleet-manager/discord-manager.d.ts +75 -2
- package/dist/fleet-manager/discord-manager.d.ts.map +1 -1
- package/dist/fleet-manager/discord-manager.js +374 -3
- package/dist/fleet-manager/discord-manager.js.map +1 -1
- package/dist/fleet-manager/event-types.d.ts +113 -0
- package/dist/fleet-manager/event-types.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +3 -0
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +10 -0
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts.map +1 -1
- package/dist/fleet-manager/job-control.js +5 -2
- package/dist/fleet-manager/job-control.js.map +1 -1
- package/dist/fleet-manager/slack-manager.d.ts +158 -0
- package/dist/fleet-manager/slack-manager.d.ts.map +1 -0
- package/dist/fleet-manager/slack-manager.js +570 -0
- package/dist/fleet-manager/slack-manager.js.map +1 -0
- package/dist/fleet-manager/status-queries.d.ts +2 -1
- package/dist/fleet-manager/status-queries.d.ts.map +1 -1
- package/dist/fleet-manager/status-queries.js +42 -3
- package/dist/fleet-manager/status-queries.js.map +1 -1
- package/dist/fleet-manager/types.d.ts +43 -3
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/hooks/__tests__/slack-runner.test.d.ts +5 -0
- package/dist/hooks/__tests__/slack-runner.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/slack-runner.test.js +307 -0
- package/dist/hooks/__tests__/slack-runner.test.js.map +1 -0
- package/dist/hooks/hook-executor.d.ts +1 -0
- package/dist/hooks/hook-executor.d.ts.map +1 -1
- package/dist/hooks/hook-executor.js +8 -0
- package/dist/hooks/hook-executor.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/runners/slack.d.ts +62 -0
- package/dist/hooks/runners/slack.d.ts.map +1 -0
- package/dist/hooks/runners/slack.js +329 -0
- package/dist/hooks/runners/slack.js.map +1 -0
- package/dist/hooks/types.d.ts +4 -4
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/runner/__tests__/file-sender-mcp.test.d.ts +2 -0
- package/dist/runner/__tests__/file-sender-mcp.test.d.ts.map +1 -0
- package/dist/runner/__tests__/file-sender-mcp.test.js +177 -0
- package/dist/runner/__tests__/file-sender-mcp.test.js.map +1 -0
- package/dist/runner/__tests__/job-executor.test.js +12 -12
- package/dist/runner/__tests__/job-executor.test.js.map +1 -1
- package/dist/runner/file-sender-mcp.d.ts +69 -0
- package/dist/runner/file-sender-mcp.d.ts.map +1 -0
- package/dist/runner/file-sender-mcp.js +145 -0
- package/dist/runner/file-sender-mcp.js.map +1 -0
- package/dist/runner/index.d.ts +1 -0
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +2 -0
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/job-executor.d.ts.map +1 -1
- package/dist/runner/job-executor.js +35 -5
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/runtime/__tests__/docker-security.test.js +12 -12
- package/dist/runner/runtime/__tests__/docker-security.test.js.map +1 -1
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.js +191 -0
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.js.map +1 -0
- package/dist/runner/runtime/container-manager.d.ts +5 -1
- package/dist/runner/runtime/container-manager.d.ts.map +1 -1
- package/dist/runner/runtime/container-manager.js +115 -5
- package/dist/runner/runtime/container-manager.js.map +1 -1
- package/dist/runner/runtime/container-runner.d.ts +2 -0
- package/dist/runner/runtime/container-runner.d.ts.map +1 -1
- package/dist/runner/runtime/container-runner.js +121 -74
- package/dist/runner/runtime/container-runner.js.map +1 -1
- package/dist/runner/runtime/index.d.ts +1 -0
- package/dist/runner/runtime/index.d.ts.map +1 -1
- package/dist/runner/runtime/index.js +2 -0
- package/dist/runner/runtime/index.js.map +1 -1
- package/dist/runner/runtime/interface.d.ts +2 -0
- package/dist/runner/runtime/interface.d.ts.map +1 -1
- package/dist/runner/runtime/mcp-http-bridge.d.ts +39 -0
- package/dist/runner/runtime/mcp-http-bridge.d.ts.map +1 -0
- package/dist/runner/runtime/mcp-http-bridge.js +205 -0
- package/dist/runner/runtime/mcp-http-bridge.js.map +1 -0
- package/dist/runner/runtime/sdk-runtime.d.ts.map +1 -1
- package/dist/runner/runtime/sdk-runtime.js +74 -1
- package/dist/runner/runtime/sdk-runtime.js.map +1 -1
- package/dist/runner/types.d.ts +44 -0
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/session-validation.d.ts +8 -0
- package/dist/state/session-validation.d.ts.map +1 -1
- package/dist/state/session-validation.js +36 -0
- package/dist/state/session-validation.js.map +1 -1
- package/package.json +1 -9
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Manager Module
|
|
3
|
+
*
|
|
4
|
+
* Manages a single Slack connector shared across agents that have `chat.slack` configured.
|
|
5
|
+
* This module is responsible for:
|
|
6
|
+
* - Creating ONE SlackConnector instance for the workspace
|
|
7
|
+
* - Building channel→agent routing from agent configs
|
|
8
|
+
* - Managing connector lifecycle (start/stop)
|
|
9
|
+
*
|
|
10
|
+
* Key difference from Discord:
|
|
11
|
+
* - DiscordManager has Map<string, IDiscordConnector> (N connectors, one per agent)
|
|
12
|
+
* - SlackManager has one connector + Map<string, string> (channel→agent routing)
|
|
13
|
+
*
|
|
14
|
+
* Note: This module dynamically imports @herdctl/slack at runtime to avoid
|
|
15
|
+
* a hard dependency. The @herdctl/core package can be used without Slack support.
|
|
16
|
+
*
|
|
17
|
+
* @module slack-manager
|
|
18
|
+
*/
|
|
19
|
+
import { createFileSenderDef } from "../runner/file-sender-mcp.js";
|
|
20
|
+
import { resolveWorkingDirectory } from "./working-directory-helper.js";
|
|
21
|
+
/**
|
|
22
|
+
* Lazy import the Slack package to avoid hard dependency
|
|
23
|
+
*/
|
|
24
|
+
async function importSlackPackage() {
|
|
25
|
+
try {
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const pkg = (await import("@herdctl/slack"));
|
|
28
|
+
return pkg;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
class StreamingResponder {
|
|
35
|
+
buffer = "";
|
|
36
|
+
lastSendTime = 0;
|
|
37
|
+
messagesSent = 0;
|
|
38
|
+
reply;
|
|
39
|
+
splitResponse;
|
|
40
|
+
logger;
|
|
41
|
+
agentName;
|
|
42
|
+
minMessageInterval;
|
|
43
|
+
maxBufferSize;
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.reply = options.reply;
|
|
46
|
+
this.splitResponse = options.splitResponse;
|
|
47
|
+
this.logger = options.logger;
|
|
48
|
+
this.agentName = options.agentName;
|
|
49
|
+
this.minMessageInterval = options.minMessageInterval ?? 1000;
|
|
50
|
+
this.maxBufferSize = options.maxBufferSize ?? 3500; // Leave room for Slack's ~4K practical limit
|
|
51
|
+
}
|
|
52
|
+
async addMessageAndSend(content) {
|
|
53
|
+
if (!content || content.trim().length === 0) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.buffer += content;
|
|
57
|
+
await this.sendAll();
|
|
58
|
+
}
|
|
59
|
+
async sendAll() {
|
|
60
|
+
if (this.buffer.trim().length === 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const content = this.buffer.trim();
|
|
64
|
+
this.buffer = "";
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
const timeSinceLastSend = now - this.lastSendTime;
|
|
67
|
+
if (timeSinceLastSend < this.minMessageInterval && this.lastSendTime > 0) {
|
|
68
|
+
const waitTime = this.minMessageInterval - timeSinceLastSend;
|
|
69
|
+
await this.sleep(waitTime);
|
|
70
|
+
}
|
|
71
|
+
const chunks = this.splitResponse(content);
|
|
72
|
+
for (const chunk of chunks) {
|
|
73
|
+
try {
|
|
74
|
+
await this.reply(chunk);
|
|
75
|
+
this.messagesSent++;
|
|
76
|
+
this.lastSendTime = Date.now();
|
|
77
|
+
this.logger.debug(`Streamed message to Slack`, {
|
|
78
|
+
agentName: this.agentName,
|
|
79
|
+
chunkLength: chunk.length,
|
|
80
|
+
totalSent: this.messagesSent,
|
|
81
|
+
});
|
|
82
|
+
if (chunks.length > 1) {
|
|
83
|
+
await this.sleep(500);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
88
|
+
this.logger.error(`Failed to send Slack message`, {
|
|
89
|
+
agentName: this.agentName,
|
|
90
|
+
error: errorMessage,
|
|
91
|
+
});
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async flush() {
|
|
97
|
+
await this.sendAll();
|
|
98
|
+
}
|
|
99
|
+
hasSentMessages() {
|
|
100
|
+
return this.messagesSent > 0;
|
|
101
|
+
}
|
|
102
|
+
sleep(ms) {
|
|
103
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// Slack Manager
|
|
108
|
+
// =============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* SlackManager handles Slack connections for agents
|
|
111
|
+
*
|
|
112
|
+
* Unlike DiscordManager which creates N connectors (one per agent),
|
|
113
|
+
* SlackManager creates ONE connector shared across all Slack-enabled agents,
|
|
114
|
+
* with channel→agent routing.
|
|
115
|
+
*/
|
|
116
|
+
export class SlackManager {
|
|
117
|
+
ctx;
|
|
118
|
+
connector = null;
|
|
119
|
+
sessionManagers = new Map();
|
|
120
|
+
channelAgentMap = new Map();
|
|
121
|
+
channelConfigs = new Map();
|
|
122
|
+
initialized = false;
|
|
123
|
+
constructor(ctx) {
|
|
124
|
+
this.ctx = ctx;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Initialize the Slack connector for all configured agents
|
|
128
|
+
*/
|
|
129
|
+
async initialize() {
|
|
130
|
+
if (this.initialized) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const logger = this.ctx.getLogger();
|
|
134
|
+
const config = this.ctx.getConfig();
|
|
135
|
+
if (!config) {
|
|
136
|
+
logger.debug("No config available, skipping Slack initialization");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Try to import the slack package
|
|
140
|
+
const slackPkg = await importSlackPackage();
|
|
141
|
+
if (!slackPkg) {
|
|
142
|
+
logger.debug("@herdctl/slack not installed, skipping Slack connector");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const { SlackConnector, SessionManager } = slackPkg;
|
|
146
|
+
const stateDir = this.ctx.getStateDir();
|
|
147
|
+
// Find agents with Slack configured
|
|
148
|
+
const slackAgents = config.agents.filter((agent) => agent.chat?.slack !== undefined);
|
|
149
|
+
if (slackAgents.length === 0) {
|
|
150
|
+
logger.debug("No agents with Slack configured");
|
|
151
|
+
this.initialized = true;
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
logger.info(`Initializing Slack connector for ${slackAgents.length} agent(s)`);
|
|
155
|
+
// All agents share the same bot + app token.
|
|
156
|
+
// Take the first agent's config for token resolution.
|
|
157
|
+
const firstSlackConfig = slackAgents[0].chat.slack;
|
|
158
|
+
if (!firstSlackConfig) {
|
|
159
|
+
this.initialized = true;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const botToken = process.env[firstSlackConfig.bot_token_env];
|
|
163
|
+
if (!botToken) {
|
|
164
|
+
logger.warn(`Slack bot token not found in environment variable '${firstSlackConfig.bot_token_env}'`);
|
|
165
|
+
this.initialized = true;
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const appToken = process.env[firstSlackConfig.app_token_env];
|
|
169
|
+
if (!appToken) {
|
|
170
|
+
logger.warn(`Slack app token not found in environment variable '${firstSlackConfig.app_token_env}'`);
|
|
171
|
+
this.initialized = true;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Build channel→agent routing map and create session managers
|
|
175
|
+
for (const agent of slackAgents) {
|
|
176
|
+
const slackConfig = agent.chat.slack;
|
|
177
|
+
if (!slackConfig)
|
|
178
|
+
continue;
|
|
179
|
+
// Create logger adapter for this agent
|
|
180
|
+
const createAgentLogger = (prefix) => ({
|
|
181
|
+
debug: (msg, data) => logger.debug(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
182
|
+
info: (msg, data) => logger.info(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
183
|
+
warn: (msg, data) => logger.warn(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
184
|
+
error: (msg, data) => logger.error(`${prefix} ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
185
|
+
});
|
|
186
|
+
// Create session manager for this agent
|
|
187
|
+
const sessionManager = new SessionManager({
|
|
188
|
+
agentName: agent.name,
|
|
189
|
+
stateDir,
|
|
190
|
+
sessionExpiryHours: slackConfig.session_expiry_hours,
|
|
191
|
+
logger: createAgentLogger(`[slack:${agent.name}:session]`),
|
|
192
|
+
});
|
|
193
|
+
this.sessionManagers.set(agent.name, sessionManager);
|
|
194
|
+
// Map channels to this agent
|
|
195
|
+
for (const channel of slackConfig.channels) {
|
|
196
|
+
if (this.channelAgentMap.has(channel.id)) {
|
|
197
|
+
logger.warn(`Channel ${channel.id} is already mapped to agent '${this.channelAgentMap.get(channel.id)}', ` +
|
|
198
|
+
`overriding with agent '${agent.name}'`);
|
|
199
|
+
}
|
|
200
|
+
this.channelAgentMap.set(channel.id, agent.name);
|
|
201
|
+
this.channelConfigs.set(channel.id, {
|
|
202
|
+
mode: channel.mode ?? "mention",
|
|
203
|
+
contextMessages: channel.context_messages ?? 10,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
logger.debug(`Configured Slack routing for agent '${agent.name}' with ${slackConfig.channels.length} channel(s)`);
|
|
207
|
+
}
|
|
208
|
+
// Create the single connector
|
|
209
|
+
try {
|
|
210
|
+
this.connector = new SlackConnector({
|
|
211
|
+
botToken,
|
|
212
|
+
appToken,
|
|
213
|
+
channelAgentMap: this.channelAgentMap,
|
|
214
|
+
channelConfigs: this.channelConfigs,
|
|
215
|
+
sessionManagers: this.sessionManagers,
|
|
216
|
+
stateDir,
|
|
217
|
+
logger: {
|
|
218
|
+
debug: (msg, data) => logger.debug(`[slack] ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
219
|
+
info: (msg, data) => logger.info(`[slack] ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
220
|
+
warn: (msg, data) => logger.warn(`[slack] ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
221
|
+
error: (msg, data) => logger.error(`[slack] ${msg}${data ? ` ${JSON.stringify(data)}` : ""}`),
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
logger.debug(`Created Slack connector with ${this.channelAgentMap.size} channel mapping(s)`);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
228
|
+
logger.error(`Failed to create Slack connector: ${errorMessage}`);
|
|
229
|
+
}
|
|
230
|
+
this.initialized = true;
|
|
231
|
+
logger.info(`Slack manager initialized with ${this.sessionManagers.size} agent(s), ` +
|
|
232
|
+
`${this.channelAgentMap.size} channel mapping(s)`);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Connect the Slack connector and subscribe to events
|
|
236
|
+
*/
|
|
237
|
+
async start() {
|
|
238
|
+
const logger = this.ctx.getLogger();
|
|
239
|
+
if (!this.connector) {
|
|
240
|
+
logger.debug("No Slack connector to start");
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
logger.info("Starting Slack connector...");
|
|
244
|
+
// Subscribe to events before connecting
|
|
245
|
+
this.connector.on("message", (event) => {
|
|
246
|
+
this.handleMessage(event.agentName, event).catch((error) => {
|
|
247
|
+
this.handleError(event.agentName, error);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
this.connector.on("error", (event) => {
|
|
251
|
+
this.handleError("slack", event.error);
|
|
252
|
+
});
|
|
253
|
+
try {
|
|
254
|
+
await this.connector.connect();
|
|
255
|
+
logger.info("Slack connector started");
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
259
|
+
logger.error(`Failed to connect Slack: ${errorMessage}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Disconnect the Slack connector gracefully
|
|
264
|
+
*/
|
|
265
|
+
async stop() {
|
|
266
|
+
const logger = this.ctx.getLogger();
|
|
267
|
+
if (!this.connector) {
|
|
268
|
+
logger.debug("No Slack connector to stop");
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
logger.info("Stopping Slack connector...");
|
|
272
|
+
// Log session state before shutdown
|
|
273
|
+
for (const [agentName, sessionManager] of this.sessionManagers) {
|
|
274
|
+
try {
|
|
275
|
+
const activeSessionCount = await sessionManager.getActiveSessionCount();
|
|
276
|
+
if (activeSessionCount > 0) {
|
|
277
|
+
logger.info(`Preserving ${activeSessionCount} active Slack session(s) for agent '${agentName}'`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
282
|
+
logger.warn(`Failed to get Slack session count for agent '${agentName}': ${errorMessage}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
await this.connector.disconnect();
|
|
287
|
+
logger.info("Slack connector stopped");
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
291
|
+
logger.error(`Error disconnecting Slack: ${errorMessage}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get the connector (if any)
|
|
296
|
+
*/
|
|
297
|
+
getConnector() {
|
|
298
|
+
return this.connector;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Check if the connector is connected
|
|
302
|
+
*/
|
|
303
|
+
isConnected() {
|
|
304
|
+
return this.connector?.isConnected() ?? false;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get the state of the connector
|
|
308
|
+
*/
|
|
309
|
+
getState() {
|
|
310
|
+
return this.connector?.getState() ?? null;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get the channel→agent routing map
|
|
314
|
+
*/
|
|
315
|
+
getChannelAgentMap() {
|
|
316
|
+
return this.channelAgentMap;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Check if a specific agent has Slack configured
|
|
320
|
+
*/
|
|
321
|
+
hasAgent(agentName) {
|
|
322
|
+
return this.sessionManagers.has(agentName);
|
|
323
|
+
}
|
|
324
|
+
// ===========================================================================
|
|
325
|
+
// Message Handling Pipeline
|
|
326
|
+
// ===========================================================================
|
|
327
|
+
async handleMessage(agentName, event) {
|
|
328
|
+
const logger = this.ctx.getLogger();
|
|
329
|
+
const emitter = this.ctx.getEmitter();
|
|
330
|
+
logger.info(`Slack message for agent '${agentName}': ${event.prompt.substring(0, 50)}...`);
|
|
331
|
+
// Get the agent configuration
|
|
332
|
+
const config = this.ctx.getConfig();
|
|
333
|
+
const agent = config?.agents.find((a) => a.name === agentName);
|
|
334
|
+
if (!agent) {
|
|
335
|
+
logger.error(`Agent '${agentName}' not found in configuration`);
|
|
336
|
+
try {
|
|
337
|
+
await event.reply("Sorry, I'm not properly configured. Please contact an administrator.");
|
|
338
|
+
}
|
|
339
|
+
catch (replyError) {
|
|
340
|
+
logger.error(`Failed to send error reply: ${replyError.message}`);
|
|
341
|
+
}
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
// Get existing session for this channel
|
|
345
|
+
const sessionManager = this.sessionManagers.get(agentName);
|
|
346
|
+
let existingSessionId = null;
|
|
347
|
+
if (sessionManager) {
|
|
348
|
+
try {
|
|
349
|
+
const existingSession = await sessionManager.getSession(event.metadata.channelId);
|
|
350
|
+
if (existingSession) {
|
|
351
|
+
existingSessionId = existingSession.sessionId;
|
|
352
|
+
logger.debug(`Resuming session for channel ${event.metadata.channelId}: ${existingSessionId}`);
|
|
353
|
+
emitter.emit("slack:session:lifecycle", {
|
|
354
|
+
agentName,
|
|
355
|
+
event: "resumed",
|
|
356
|
+
channelId: event.metadata.channelId,
|
|
357
|
+
sessionId: existingSessionId,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
logger.debug(`No existing session for channel ${event.metadata.channelId}, starting new conversation`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
366
|
+
logger.warn(`Failed to get session: ${errorMessage}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Create file sender definition for this message context
|
|
370
|
+
let injectedMcpServers;
|
|
371
|
+
const workingDir = resolveWorkingDirectory(agent);
|
|
372
|
+
if (this.connector && workingDir) {
|
|
373
|
+
const connector = this.connector;
|
|
374
|
+
const fileSenderContext = {
|
|
375
|
+
workingDirectory: workingDir,
|
|
376
|
+
uploadFile: async (params) => {
|
|
377
|
+
return connector.uploadFile({
|
|
378
|
+
channelId: event.metadata.channelId,
|
|
379
|
+
fileBuffer: params.fileBuffer,
|
|
380
|
+
filename: params.filename,
|
|
381
|
+
message: params.message,
|
|
382
|
+
});
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
const fileSenderDef = createFileSenderDef(fileSenderContext);
|
|
386
|
+
injectedMcpServers = { [fileSenderDef.name]: fileSenderDef };
|
|
387
|
+
}
|
|
388
|
+
// Create streaming responder
|
|
389
|
+
const streamer = new StreamingResponder({
|
|
390
|
+
reply: event.reply,
|
|
391
|
+
splitResponse: (text) => this.splitResponse(text),
|
|
392
|
+
logger,
|
|
393
|
+
agentName,
|
|
394
|
+
});
|
|
395
|
+
// Start processing indicator (hourglass emoji)
|
|
396
|
+
const stopProcessing = event.startProcessingIndicator();
|
|
397
|
+
let processingStopped = false;
|
|
398
|
+
try {
|
|
399
|
+
const fleetManager = emitter;
|
|
400
|
+
const result = await fleetManager.trigger(agentName, undefined, {
|
|
401
|
+
prompt: event.prompt,
|
|
402
|
+
resume: existingSessionId,
|
|
403
|
+
injectedMcpServers,
|
|
404
|
+
onMessage: async (message) => {
|
|
405
|
+
if (message.type === "assistant") {
|
|
406
|
+
const content = this.extractMessageContent(message);
|
|
407
|
+
if (content) {
|
|
408
|
+
await streamer.addMessageAndSend(content);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
});
|
|
413
|
+
// Stop processing indicator
|
|
414
|
+
if (!processingStopped) {
|
|
415
|
+
stopProcessing();
|
|
416
|
+
processingStopped = true;
|
|
417
|
+
}
|
|
418
|
+
// Flush remaining content
|
|
419
|
+
await streamer.flush();
|
|
420
|
+
logger.info(`Slack job completed: ${result.jobId} for agent '${agentName}'${result.sessionId ? ` (session: ${result.sessionId})` : ""}`);
|
|
421
|
+
// Fallback message if nothing was sent
|
|
422
|
+
if (!streamer.hasSentMessages()) {
|
|
423
|
+
if (result.success) {
|
|
424
|
+
await event.reply("I've completed the task, but I don't have a specific response to share.");
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
const errorMessage = result.errorDetails?.message ?? result.error?.message ?? "An unknown error occurred";
|
|
428
|
+
await event.reply(`*Error:* ${errorMessage}\n\nThe task could not be completed. Please check the logs for more details.`);
|
|
429
|
+
}
|
|
430
|
+
if (!processingStopped) {
|
|
431
|
+
stopProcessing();
|
|
432
|
+
processingStopped = true;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// Store the SDK session ID for future conversation continuity
|
|
436
|
+
if (sessionManager && result.sessionId && result.success) {
|
|
437
|
+
const isNewSession = existingSessionId === null;
|
|
438
|
+
try {
|
|
439
|
+
await sessionManager.setSession(event.metadata.channelId, result.sessionId);
|
|
440
|
+
logger.debug(`Stored session ${result.sessionId} for channel ${event.metadata.channelId}`);
|
|
441
|
+
if (isNewSession) {
|
|
442
|
+
emitter.emit("slack:session:lifecycle", {
|
|
443
|
+
agentName,
|
|
444
|
+
event: "created",
|
|
445
|
+
channelId: event.metadata.channelId,
|
|
446
|
+
sessionId: result.sessionId,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
catch (sessionError) {
|
|
451
|
+
const errorMessage = sessionError instanceof Error ? sessionError.message : String(sessionError);
|
|
452
|
+
logger.warn(`Failed to store session: ${errorMessage}`);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// Emit event for tracking
|
|
456
|
+
emitter.emit("slack:message:handled", {
|
|
457
|
+
agentName,
|
|
458
|
+
channelId: event.metadata.channelId,
|
|
459
|
+
messageTs: event.metadata.messageTs,
|
|
460
|
+
jobId: result.jobId,
|
|
461
|
+
timestamp: new Date().toISOString(),
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
466
|
+
logger.error(`Slack message handling failed for agent '${agentName}': ${err.message}`);
|
|
467
|
+
try {
|
|
468
|
+
await event.reply(this.formatErrorMessage(err));
|
|
469
|
+
}
|
|
470
|
+
catch (replyError) {
|
|
471
|
+
logger.error(`Failed to send error reply: ${replyError.message}`);
|
|
472
|
+
}
|
|
473
|
+
emitter.emit("slack:message:error", {
|
|
474
|
+
agentName,
|
|
475
|
+
channelId: event.metadata.channelId,
|
|
476
|
+
messageTs: event.metadata.messageTs,
|
|
477
|
+
error: err.message,
|
|
478
|
+
timestamp: new Date().toISOString(),
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
if (!processingStopped) {
|
|
483
|
+
stopProcessing();
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Extract text content from an SDK message
|
|
489
|
+
*/
|
|
490
|
+
extractMessageContent(message) {
|
|
491
|
+
if (typeof message.content === "string" && message.content) {
|
|
492
|
+
return message.content;
|
|
493
|
+
}
|
|
494
|
+
const apiMessage = message.message;
|
|
495
|
+
const content = apiMessage?.content;
|
|
496
|
+
if (!content)
|
|
497
|
+
return undefined;
|
|
498
|
+
if (typeof content === "string") {
|
|
499
|
+
return content;
|
|
500
|
+
}
|
|
501
|
+
if (Array.isArray(content)) {
|
|
502
|
+
const textParts = [];
|
|
503
|
+
for (const block of content) {
|
|
504
|
+
if (block && typeof block === "object" && "type" in block) {
|
|
505
|
+
if (block.type === "text" && "text" in block && typeof block.text === "string") {
|
|
506
|
+
textParts.push(block.text);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return textParts.length > 0 ? textParts.join("") : undefined;
|
|
511
|
+
}
|
|
512
|
+
return undefined;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Handle errors from the Slack connector
|
|
516
|
+
*/
|
|
517
|
+
handleError(agentName, error) {
|
|
518
|
+
const logger = this.ctx.getLogger();
|
|
519
|
+
const emitter = this.ctx.getEmitter();
|
|
520
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
521
|
+
logger.error(`Slack connector error for agent '${agentName}': ${errorMessage}`);
|
|
522
|
+
emitter.emit("slack:error", {
|
|
523
|
+
agentName,
|
|
524
|
+
error: errorMessage,
|
|
525
|
+
timestamp: new Date().toISOString(),
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
// ===========================================================================
|
|
529
|
+
// Response Formatting and Splitting
|
|
530
|
+
// ===========================================================================
|
|
531
|
+
static MAX_MESSAGE_LENGTH = 4000;
|
|
532
|
+
formatErrorMessage(error) {
|
|
533
|
+
return `*Error:* ${error.message}\n\nPlease try again or use \`!reset\` to start a new session.`;
|
|
534
|
+
}
|
|
535
|
+
splitResponse(text) {
|
|
536
|
+
const MAX_LENGTH = SlackManager.MAX_MESSAGE_LENGTH;
|
|
537
|
+
if (text.length <= MAX_LENGTH) {
|
|
538
|
+
return [text];
|
|
539
|
+
}
|
|
540
|
+
const chunks = [];
|
|
541
|
+
let remaining = text;
|
|
542
|
+
while (remaining.length > 0) {
|
|
543
|
+
if (remaining.length <= MAX_LENGTH) {
|
|
544
|
+
chunks.push(remaining);
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
const splitIndex = this.findNaturalBreak(remaining, MAX_LENGTH);
|
|
548
|
+
chunks.push(remaining.substring(0, splitIndex));
|
|
549
|
+
remaining = remaining.substring(splitIndex);
|
|
550
|
+
}
|
|
551
|
+
return chunks;
|
|
552
|
+
}
|
|
553
|
+
findNaturalBreak(text, maxLength) {
|
|
554
|
+
const searchEnd = Math.min(maxLength, text.length);
|
|
555
|
+
const doubleNewline = text.lastIndexOf("\n\n", searchEnd);
|
|
556
|
+
if (doubleNewline > 0 && doubleNewline > searchEnd - 500) {
|
|
557
|
+
return doubleNewline + 2;
|
|
558
|
+
}
|
|
559
|
+
const singleNewline = text.lastIndexOf("\n", searchEnd);
|
|
560
|
+
if (singleNewline > 0 && singleNewline > searchEnd - 200) {
|
|
561
|
+
return singleNewline + 1;
|
|
562
|
+
}
|
|
563
|
+
const space = text.lastIndexOf(" ", searchEnd);
|
|
564
|
+
if (space > 0 && space > searchEnd - 100) {
|
|
565
|
+
return space + 1;
|
|
566
|
+
}
|
|
567
|
+
return searchEnd;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
//# sourceMappingURL=slack-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-manager.js","sourceRoot":"","sources":["../../src/fleet-manager/slack-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import type { Scheduler } from "../scheduler/index.js";
|
|
|
12
12
|
import type { FleetStatus, AgentInfo, ScheduleInfo, FleetCounts } from "./types.js";
|
|
13
13
|
import type { FleetManagerContext } from "./context.js";
|
|
14
14
|
import type { DiscordManager } from "./discord-manager.js";
|
|
15
|
+
import type { SlackManager } from "./slack-manager.js";
|
|
15
16
|
/**
|
|
16
17
|
* Snapshot of fleet state from disk
|
|
17
18
|
*
|
|
@@ -90,7 +91,7 @@ export declare class StatusQueries {
|
|
|
90
91
|
* @param discordManager - Discord manager for connection status (optional)
|
|
91
92
|
* @returns Complete AgentInfo object
|
|
92
93
|
*/
|
|
93
|
-
export declare function buildAgentInfo(agent: ResolvedAgent, agentState?: AgentState, scheduler?: Scheduler | null, discordManager?: DiscordManager): AgentInfo;
|
|
94
|
+
export declare function buildAgentInfo(agent: ResolvedAgent, agentState?: AgentState, scheduler?: Scheduler | null, discordManager?: DiscordManager, slackManager?: SlackManager): AgentInfo;
|
|
94
95
|
/**
|
|
95
96
|
* Build schedule info list from agent configuration and state
|
|
96
97
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-queries.d.ts","sourceRoot":"","sources":["../../src/fleet-manager/status-queries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EACX,SAAS,
|
|
1
|
+
{"version":3,"file":"status-queries.d.ts","sourceRoot":"","sources":["../../src/fleet-manager/status-queries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAGT,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAM5C;;;;;GAKG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,mBAAmB;IAE5C;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAc3D;;;;;;;;;;;;OAYG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAuC5C;;;;;;;;;;;;OAYG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmB1C;;;;;;;;;;;;;;OAcG;IACG,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAqB3D;AAMD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,UAAU,EACvB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,YAAY,CAAC,EAAE,YAAY,GAC1B,SAAS,CAqCX;AA8ED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,UAAU,GACtB,YAAY,EAAE,CAoBhB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,WAAW,CAwC1E"}
|