@chinchillaenterprises/mcp-slack 3.1.1 → 4.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/README.md +107 -76
- package/dist/index.d.ts +154 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1582 -1067
- package/package.json +7 -8
package/dist/index.js
CHANGED
|
@@ -11,325 +11,268 @@ import crypto from "crypto";
|
|
|
11
11
|
import { tmpdir } from "os";
|
|
12
12
|
import { execFile } from "child_process";
|
|
13
13
|
import { promisify } from "util";
|
|
14
|
+
import { fileURLToPath } from "url";
|
|
14
15
|
import Fuse from "fuse.js";
|
|
15
16
|
const execFileAsync = promisify(execFile);
|
|
16
17
|
// =====================================================================================
|
|
17
|
-
//
|
|
18
|
+
// OUTPUT FORMATTING HELPERS (Bundle 0)
|
|
19
|
+
// -------------------------------------------------------------------------------------
|
|
20
|
+
// These are the shared, framework-free building blocks the later UX bundles reuse.
|
|
21
|
+
//
|
|
22
|
+
// WHY THIS EXISTS: this server's single biggest token cost is that verbose tool
|
|
23
|
+
// RESULTS linger in the session context window and get re-sent every turn (measured
|
|
24
|
+
// at ~21% of a user's usage). Pretty-printed JSON (JSON.stringify(x, null, 2)) is the
|
|
25
|
+
// main offender. leanResult() establishes the convention: compact by default, fuller
|
|
26
|
+
// only when the caller explicitly asks for verbose. Keep these together.
|
|
18
27
|
// =====================================================================================
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
try {
|
|
84
|
-
const [ivHex, encrypted] = encryptedText.split(':');
|
|
85
|
-
const iv = Buffer.from(ivHex, 'hex');
|
|
86
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, iv);
|
|
87
|
-
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
|
|
88
|
-
decrypted += decipher.final('utf8');
|
|
89
|
-
return decrypted;
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
console.error('[CredentialManager] Failed to decrypt:', error);
|
|
93
|
-
return encryptedText; // Return as-is if decryption fails
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
async ensureInitialized() {
|
|
97
|
-
await this.initPromise;
|
|
98
|
-
}
|
|
99
|
-
async saveAccount(account) {
|
|
100
|
-
await this.ensureInitialized();
|
|
101
|
-
const persistedAccount = {
|
|
102
|
-
...account,
|
|
103
|
-
addedAt: new Date().toISOString(),
|
|
104
|
-
lastUsed: new Date().toISOString()
|
|
105
|
-
};
|
|
106
|
-
// Try keytar first
|
|
107
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
108
|
-
try {
|
|
109
|
-
await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
|
|
110
|
-
console.error(`[CredentialManager] Account ${account.id} saved to keychain`);
|
|
111
|
-
return; // Success with keytar
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
console.error('[CredentialManager] Keytar save failed, falling back to file:', error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Fallback to file-based storage
|
|
118
|
-
await this.saveToFile(persistedAccount);
|
|
119
|
-
}
|
|
120
|
-
async saveToFile(account) {
|
|
121
|
-
try {
|
|
122
|
-
// Read existing accounts
|
|
123
|
-
const accounts = await this.loadFromFile();
|
|
124
|
-
// Encrypt sensitive data
|
|
125
|
-
const encryptedAccount = {
|
|
126
|
-
...account,
|
|
127
|
-
botToken: this.encrypt(account.botToken),
|
|
128
|
-
userToken: account.userToken ? this.encrypt(account.userToken) : undefined
|
|
129
|
-
};
|
|
130
|
-
// Update or add account
|
|
131
|
-
accounts[account.id] = encryptedAccount;
|
|
132
|
-
// Save back to file
|
|
133
|
-
await fs.writeFile(this.CONFIG_FILE, JSON.stringify(accounts, null, 2), 'utf8');
|
|
134
|
-
await fs.chmod(this.CONFIG_FILE, 0o600); // Read/write for owner only
|
|
135
|
-
console.error(`[CredentialManager] Account ${account.id} saved to file`);
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
console.error('[CredentialManager] Failed to save account to file:', error);
|
|
139
|
-
throw error;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
async loadFromFile() {
|
|
143
|
-
try {
|
|
144
|
-
const data = await fs.readFile(this.CONFIG_FILE, 'utf8');
|
|
145
|
-
return JSON.parse(data);
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
// File doesn't exist or is invalid
|
|
149
|
-
return {};
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
async updateAccount(account) {
|
|
153
|
-
await this.ensureInitialized();
|
|
154
|
-
// Get existing to preserve addedAt
|
|
155
|
-
const existing = await this.getAccount(account.id);
|
|
156
|
-
const persistedAccount = {
|
|
157
|
-
...account,
|
|
158
|
-
addedAt: existing?.addedAt || new Date().toISOString(),
|
|
159
|
-
lastUsed: new Date().toISOString()
|
|
160
|
-
};
|
|
161
|
-
// Try keytar first
|
|
162
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
163
|
-
try {
|
|
164
|
-
await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
|
|
165
|
-
console.error(`[CredentialManager] Account ${account.id} updated in keychain`);
|
|
166
|
-
return; // Success with keytar
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
console.error('[CredentialManager] Keytar update failed, falling back to file:', error);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// Fallback to file-based storage
|
|
173
|
-
await this.saveToFile(persistedAccount);
|
|
174
|
-
}
|
|
175
|
-
async loadAllAccounts() {
|
|
176
|
-
await this.ensureInitialized();
|
|
177
|
-
const accounts = [];
|
|
178
|
-
// Try keytar first
|
|
179
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
180
|
-
try {
|
|
181
|
-
const credentials = await this.keytar.findCredentials(this.SERVICE_NAME);
|
|
182
|
-
for (const cred of credentials) {
|
|
183
|
-
try {
|
|
184
|
-
const account = JSON.parse(cred.password);
|
|
185
|
-
accounts.push(account);
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error(`[CredentialManager] Failed to parse keytar account ${cred.account}:`, error);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
if (accounts.length > 0) {
|
|
192
|
-
console.error(`[CredentialManager] Loaded ${accounts.length} accounts from keychain`);
|
|
193
|
-
return accounts;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
console.error('[CredentialManager] Failed to load from keychain:', error);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// Fallback to file-based storage
|
|
201
|
-
try {
|
|
202
|
-
const fileAccounts = await this.loadFromFile();
|
|
203
|
-
for (const [id, encryptedAccount] of Object.entries(fileAccounts)) {
|
|
204
|
-
try {
|
|
205
|
-
// Decrypt sensitive data
|
|
206
|
-
const account = {
|
|
207
|
-
...encryptedAccount,
|
|
208
|
-
botToken: this.decrypt(encryptedAccount.botToken),
|
|
209
|
-
userToken: encryptedAccount.userToken ? this.decrypt(encryptedAccount.userToken) : undefined
|
|
210
|
-
};
|
|
211
|
-
accounts.push(account);
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
console.error(`[CredentialManager] Failed to process file account ${id}:`, error);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
console.error(`[CredentialManager] Loaded ${accounts.length} accounts from file`);
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
console.error('[CredentialManager] Failed to load from file:', error);
|
|
221
|
-
}
|
|
222
|
-
return accounts;
|
|
223
|
-
}
|
|
224
|
-
async getAccount(accountId) {
|
|
225
|
-
await this.ensureInitialized();
|
|
226
|
-
// Try keytar first
|
|
227
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
228
|
-
try {
|
|
229
|
-
const password = await this.keytar.getPassword(this.SERVICE_NAME, `slack-${accountId}`);
|
|
230
|
-
if (password) {
|
|
231
|
-
return JSON.parse(password);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
console.error(`[CredentialManager] Failed to get account ${accountId} from keychain:`, error);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Fallback to file-based storage
|
|
239
|
-
try {
|
|
240
|
-
const accounts = await this.loadFromFile();
|
|
241
|
-
const encryptedAccount = accounts[accountId];
|
|
242
|
-
if (encryptedAccount) {
|
|
243
|
-
// Decrypt sensitive data
|
|
244
|
-
const account = {
|
|
245
|
-
...encryptedAccount,
|
|
246
|
-
botToken: this.decrypt(encryptedAccount.botToken),
|
|
247
|
-
userToken: encryptedAccount.userToken ? this.decrypt(encryptedAccount.userToken) : undefined
|
|
248
|
-
};
|
|
249
|
-
return account;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
253
|
-
console.error(`[CredentialManager] Failed to get account ${accountId} from file:`, error);
|
|
254
|
-
}
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
async deleteAccount(accountId) {
|
|
258
|
-
await this.ensureInitialized();
|
|
259
|
-
// Try keytar first
|
|
260
|
-
if (this.isKeytarAvailable && this.keytar) {
|
|
261
|
-
try {
|
|
262
|
-
await this.keytar.deletePassword(this.SERVICE_NAME, `slack-${accountId}`);
|
|
263
|
-
console.error(`[CredentialManager] Account ${accountId} deleted from keychain`);
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
console.error('[CredentialManager] Failed to delete from keychain:', error);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
// Also delete from file-based storage
|
|
270
|
-
try {
|
|
271
|
-
const accounts = await this.loadFromFile();
|
|
272
|
-
delete accounts[accountId];
|
|
273
|
-
await fs.writeFile(this.CONFIG_FILE, JSON.stringify(accounts, null, 2), 'utf8');
|
|
274
|
-
console.error(`[CredentialManager] Account ${accountId} deleted from file`);
|
|
28
|
+
/**
|
|
29
|
+
* Compact result formatter. Default (lean) form is single-line / minimal — NO
|
|
30
|
+
* pretty-print — so it doesn't bloat the context window. Pass { verbose: true } for
|
|
31
|
+
* the fuller, indented form when a human actually needs to read every field.
|
|
32
|
+
*
|
|
33
|
+
* Accepts an already-prepared `data` value. Callers are expected to have already
|
|
34
|
+
* trimmed to the fields that matter for the lean case (see the READ tools), but this
|
|
35
|
+
* function is also safe to hand a full object for the verbose path.
|
|
36
|
+
*/
|
|
37
|
+
export function leanResult(data, opts = {}) {
|
|
38
|
+
if (opts.verbose) {
|
|
39
|
+
return JSON.stringify(data, null, 2);
|
|
40
|
+
}
|
|
41
|
+
// Lean: single-line JSON. For arrays of flat objects we additionally collapse to
|
|
42
|
+
// a compact NDJSON-ish form which reads better and tokenizes smaller than one
|
|
43
|
+
// giant single-line array for long lists.
|
|
44
|
+
if (Array.isArray(data) && data.length > 0 && data.every(isFlatObject)) {
|
|
45
|
+
return data.map((row) => JSON.stringify(row)).join("\n");
|
|
46
|
+
}
|
|
47
|
+
return JSON.stringify(data);
|
|
48
|
+
}
|
|
49
|
+
// A "flat" object has only primitive / null values (no nested objects or arrays).
|
|
50
|
+
export function isFlatObject(v) {
|
|
51
|
+
if (typeof v !== "object" || v === null || Array.isArray(v))
|
|
52
|
+
return false;
|
|
53
|
+
return Object.values(v).every((val) => val === null || typeof val !== "object");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Render tabular data as a clean, column-aligned monospace ASCII table using
|
|
57
|
+
* box-drawing characters. The output is meant to be dropped inside a Slack code
|
|
58
|
+
* block (```) so it renders with a fixed-width font and column alignment survives.
|
|
59
|
+
*
|
|
60
|
+
* Accepts any of:
|
|
61
|
+
* - array of flat objects → columns inferred from keys (or pass `columns`)
|
|
62
|
+
* - 2D array (string[][]) → first row treated as header
|
|
63
|
+
* - a markdown table string (| a | b |\n|---|---|\n| 1 | 2 |)
|
|
64
|
+
*
|
|
65
|
+
* Long cells are truncated with an ellipsis past a per-column max width (default 40).
|
|
66
|
+
* Numeric-looking columns are right-aligned automatically unless overridden.
|
|
67
|
+
*/
|
|
68
|
+
export function renderTable(rows, columns) {
|
|
69
|
+
const DEFAULT_MAX = 40;
|
|
70
|
+
let headers = [];
|
|
71
|
+
let body = [];
|
|
72
|
+
let colMeta = [];
|
|
73
|
+
if (typeof rows === "string") {
|
|
74
|
+
// Parse a markdown table string.
|
|
75
|
+
const parsed = parseMarkdownTable(rows);
|
|
76
|
+
headers = parsed.headers;
|
|
77
|
+
body = parsed.body;
|
|
78
|
+
colMeta = headers.map((h) => ({ key: h, label: h }));
|
|
79
|
+
}
|
|
80
|
+
else if (Array.isArray(rows) && rows.length > 0 && Array.isArray(rows[0])) {
|
|
81
|
+
// 2D array: first row is the header.
|
|
82
|
+
const grid = rows;
|
|
83
|
+
headers = (grid[0] || []).map((c) => String(c ?? ""));
|
|
84
|
+
body = grid.slice(1).map((r) => r.map((c) => cellToString(c)));
|
|
85
|
+
colMeta = headers.map((h) => ({ key: h, label: h }));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Array of objects.
|
|
89
|
+
const objRows = rows;
|
|
90
|
+
if (columns && columns.length > 0) {
|
|
91
|
+
colMeta = columns;
|
|
275
92
|
}
|
|
276
|
-
|
|
277
|
-
|
|
93
|
+
else {
|
|
94
|
+
const keys = new Set();
|
|
95
|
+
for (const r of objRows)
|
|
96
|
+
Object.keys(r || {}).forEach((k) => keys.add(k));
|
|
97
|
+
colMeta = Array.from(keys).map((k) => ({ key: k, label: k }));
|
|
98
|
+
}
|
|
99
|
+
headers = colMeta.map((c) => c.label ?? c.key);
|
|
100
|
+
body = objRows.map((r) => colMeta.map((c) => cellToString(r?.[c.key])));
|
|
101
|
+
}
|
|
102
|
+
if (headers.length === 0)
|
|
103
|
+
return "(empty table)";
|
|
104
|
+
const colCount = headers.length;
|
|
105
|
+
// Decide alignment: explicit override wins; otherwise right-align columns whose
|
|
106
|
+
// every body cell looks numeric.
|
|
107
|
+
const aligns = colMeta.map((c, i) => {
|
|
108
|
+
if (c?.align)
|
|
109
|
+
return c.align;
|
|
110
|
+
const allNumeric = body.length > 0 &&
|
|
111
|
+
body.every((r) => {
|
|
112
|
+
const v = (r[i] ?? "").trim();
|
|
113
|
+
return v === "" || /^-?[\d,]+(\.\d+)?%?$/.test(v);
|
|
114
|
+
});
|
|
115
|
+
return allNumeric ? "right" : "left";
|
|
116
|
+
});
|
|
117
|
+
const maxWidths = colMeta.map((c) => c?.maxWidth ?? DEFAULT_MAX);
|
|
118
|
+
// Truncate then compute column widths.
|
|
119
|
+
const trunc = (s, max) => s.length > max ? s.slice(0, Math.max(0, max - 1)) + "…" : s;
|
|
120
|
+
const hdr = headers.map((h, i) => trunc(h, maxWidths[i]));
|
|
121
|
+
const cells = body.map((r) => Array.from({ length: colCount }, (_, i) => trunc(r[i] ?? "", maxWidths[i])));
|
|
122
|
+
const widths = Array.from({ length: colCount }, (_, i) => Math.max(hdr[i].length, ...cells.map((r) => r[i].length), 1));
|
|
123
|
+
const pad = (s, w, align) => align === "right" ? s.padStart(w) : s.padEnd(w);
|
|
124
|
+
const top = "┌" + widths.map((w) => "─".repeat(w + 2)).join("┬") + "┐";
|
|
125
|
+
const sep = "├" + widths.map((w) => "─".repeat(w + 2)).join("┼") + "┤";
|
|
126
|
+
const bottom = "└" + widths.map((w) => "─".repeat(w + 2)).join("┴") + "┘";
|
|
127
|
+
const fmtRow = (r) => "│ " + r.map((c, i) => pad(c, widths[i], aligns[i])).join(" │ ") + " │";
|
|
128
|
+
const lines = [top, fmtRow(hdr), sep, ...cells.map(fmtRow), bottom];
|
|
129
|
+
return lines.join("\n");
|
|
130
|
+
}
|
|
131
|
+
export function cellToString(v) {
|
|
132
|
+
if (v === null || v === undefined)
|
|
133
|
+
return "";
|
|
134
|
+
if (typeof v === "object")
|
|
135
|
+
return JSON.stringify(v);
|
|
136
|
+
return String(v);
|
|
137
|
+
}
|
|
138
|
+
// Parse a markdown pipe-table string into { headers, body }.
|
|
139
|
+
export function parseMarkdownTable(md) {
|
|
140
|
+
const lines = md
|
|
141
|
+
.split("\n")
|
|
142
|
+
.map((l) => l.trim())
|
|
143
|
+
.filter((l) => l.includes("|"));
|
|
144
|
+
if (lines.length === 0)
|
|
145
|
+
return { headers: [], body: [] };
|
|
146
|
+
const splitRow = (line) => line
|
|
147
|
+
.replace(/^\|/, "")
|
|
148
|
+
.replace(/\|$/, "")
|
|
149
|
+
.split("|")
|
|
150
|
+
.map((c) => c.trim());
|
|
151
|
+
const headers = splitRow(lines[0]);
|
|
152
|
+
// Drop the separator row (e.g. |---|---|) if present.
|
|
153
|
+
const bodyLines = lines.slice(1).filter((l) => !/^\|?[\s:|-]+\|?$/.test(l));
|
|
154
|
+
const body = bodyLines.map(splitRow);
|
|
155
|
+
return { headers, body };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Render a unicode progress bar, e.g. renderProgressBar(40) => "▰▰▰▰▱▱▱▱▱▱ 40%".
|
|
159
|
+
*/
|
|
160
|
+
export function renderProgressBar(pct, width = 20) {
|
|
161
|
+
const clamped = Math.max(0, Math.min(100, Math.round(pct)));
|
|
162
|
+
const filled = Math.round((clamped / 100) * width);
|
|
163
|
+
const empty = width - filled;
|
|
164
|
+
return "▰".repeat(filled) + "▱".repeat(empty) + ` ${clamped}%`;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Build a Slack Block Kit blocks[] array: a header block, section blocks (each with
|
|
168
|
+
* optional two-column fields), dividers between sections, and an optional context
|
|
169
|
+
* footer. Used by slack_send_card and the task-lifecycle summary cards.
|
|
170
|
+
*
|
|
171
|
+
* Returns { blocks } always, plus { attachments } when a color bar is requested
|
|
172
|
+
* (Slack only supports the colored left-bar via the legacy attachments wrapper).
|
|
173
|
+
*/
|
|
174
|
+
export function buildCard(opts) {
|
|
175
|
+
const blocks = [];
|
|
176
|
+
blocks.push({
|
|
177
|
+
type: "header",
|
|
178
|
+
text: { type: "plain_text", text: truncatePlain(opts.header, 150), emoji: true },
|
|
179
|
+
});
|
|
180
|
+
const sections = opts.sections ?? [];
|
|
181
|
+
sections.forEach((section, idx) => {
|
|
182
|
+
const block = { type: "section" };
|
|
183
|
+
if (section.text) {
|
|
184
|
+
block.text = { type: "mrkdwn", text: section.text };
|
|
185
|
+
}
|
|
186
|
+
if (section.fields && section.fields.length > 0) {
|
|
187
|
+
block.fields = section.fields.slice(0, 10).map((f) => ({
|
|
188
|
+
type: "mrkdwn",
|
|
189
|
+
text: f.label ? `*${f.label}*\n${f.value}` : f.value,
|
|
190
|
+
}));
|
|
278
191
|
}
|
|
192
|
+
// A section block must carry either text or fields.
|
|
193
|
+
if (block.text || block.fields)
|
|
194
|
+
blocks.push(block);
|
|
195
|
+
if (idx < sections.length - 1)
|
|
196
|
+
blocks.push({ type: "divider" });
|
|
197
|
+
});
|
|
198
|
+
if (opts.context) {
|
|
199
|
+
blocks.push({
|
|
200
|
+
type: "context",
|
|
201
|
+
elements: [{ type: "mrkdwn", text: opts.context }],
|
|
202
|
+
});
|
|
279
203
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return
|
|
204
|
+
if (opts.color) {
|
|
205
|
+
// Colored cards must be wrapped in an attachment to get the left color bar.
|
|
206
|
+
return { blocks: [], attachments: [{ color: opts.color, blocks }] };
|
|
283
207
|
}
|
|
208
|
+
return { blocks };
|
|
209
|
+
}
|
|
210
|
+
export function truncatePlain(s, max) {
|
|
211
|
+
return s.length > max ? s.slice(0, max - 1) + "…" : s;
|
|
284
212
|
}
|
|
285
213
|
// =====================================================================================
|
|
286
|
-
// VALIDATION SCHEMAS - Account Management Tools
|
|
214
|
+
// VALIDATION SCHEMAS - Account Management Tools (read-only)
|
|
287
215
|
// =====================================================================================
|
|
288
216
|
const ListAccountsArgsSchema = z.object({});
|
|
289
|
-
const SwitchAccountArgsSchema = z.object({
|
|
290
|
-
account_id: z.string().describe("Account ID to switch to")
|
|
291
|
-
});
|
|
292
|
-
const AddAccountArgsSchema = z.object({
|
|
293
|
-
name: z.string().describe("Human-friendly name for this account"),
|
|
294
|
-
bot_token: z.string().describe("Bot User OAuth Token (starts with xoxb-)"),
|
|
295
|
-
user_token: z.string().optional().describe("User OAuth Token (starts with xoxp-) - optional"),
|
|
296
|
-
team_id: z.string().describe("Slack team ID")
|
|
297
|
-
});
|
|
298
|
-
const RemoveAccountArgsSchema = z.object({
|
|
299
|
-
account_id: z.string().describe("Account ID to remove")
|
|
300
|
-
});
|
|
301
217
|
const GetActiveAccountArgsSchema = z.object({});
|
|
302
|
-
const SetDefaultAccountArgsSchema = z.object({
|
|
303
|
-
account_id: z.string().describe("Account ID to set as default")
|
|
304
|
-
});
|
|
305
|
-
const UpdateAccountArgsSchema = z.object({
|
|
306
|
-
account_id: z.string().describe("Account ID to update"),
|
|
307
|
-
bot_token: z.string().optional().describe("New Bot User OAuth Token (starts with xoxb-)"),
|
|
308
|
-
user_token: z.string().optional().describe("New User OAuth Token (starts with xoxp-)")
|
|
309
|
-
});
|
|
310
218
|
// =====================================================================================
|
|
311
219
|
// EXISTING TOOL SCHEMAS (from original mcp-slacker)
|
|
312
220
|
// =====================================================================================
|
|
313
221
|
const ListChannelsArgsSchema = z.object({
|
|
314
222
|
types: z.string().optional().describe("Comma-separated list of channel types: public_channel, private_channel, mpim, im"),
|
|
315
|
-
limit: z.number().optional().describe("Maximum number of channels to return (default: 100)")
|
|
223
|
+
limit: z.number().optional().describe("Maximum number of channels to return (default: 100)"),
|
|
224
|
+
verbose: z.boolean().optional().describe("Return the full raw channel objects. Default false returns lean output: id + name + is_private + num_members.")
|
|
316
225
|
});
|
|
226
|
+
// Shared session-identity fields (Bundle 4). Requires the chat:write.customize bot
|
|
227
|
+
// scope; Slack ignores them gracefully otherwise. Defaults can be set once via the
|
|
228
|
+
// SLACK_SESSION_USERNAME / SLACK_SESSION_ICON env vars.
|
|
229
|
+
const IdentityFields = {
|
|
230
|
+
username: z.string().optional().describe("Post under this display name (e.g. 'Claude · ChillMCP'). Requires chat:write.customize scope. Falls back to SLACK_SESSION_USERNAME env var."),
|
|
231
|
+
icon_emoji: z.string().optional().describe("Icon emoji like ':robot_face:'. Requires chat:write.customize. Falls back to SLACK_SESSION_ICON env var."),
|
|
232
|
+
icon_url: z.string().optional().describe("Icon image URL (overrides icon_emoji). Requires chat:write.customize.")
|
|
233
|
+
};
|
|
317
234
|
const SendMessageArgsSchema = z.object({
|
|
318
235
|
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #general)"),
|
|
319
236
|
text: z.string().describe("Text content of the message"),
|
|
320
|
-
thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread")
|
|
237
|
+
thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread"),
|
|
238
|
+
...IdentityFields
|
|
321
239
|
});
|
|
322
240
|
const GetChannelHistoryArgsSchema = z.object({
|
|
323
241
|
channel: z.string().describe("Channel ID to fetch history from"),
|
|
324
|
-
limit: z.number().optional().describe("Number of messages to return (default: 100)")
|
|
242
|
+
limit: z.number().optional().describe("Number of messages to return (default: 100)"),
|
|
243
|
+
verbose: z.boolean().optional().describe("Return the full raw API payload. Default false returns lean output: verbatim message text + user + ts, with metadata exhaust stripped.")
|
|
325
244
|
});
|
|
326
245
|
const AddReactionArgsSchema = z.object({
|
|
327
246
|
channel: z.string().describe("Channel ID where the message is"),
|
|
328
247
|
timestamp: z.string().describe("Timestamp of the message to react to"),
|
|
329
248
|
name: z.string().describe("Reaction emoji name (without colons)")
|
|
330
249
|
});
|
|
250
|
+
// ----- Legate pull/polling tools (multi-session shared-bot coordination) --------------
|
|
251
|
+
const PollArgsSchema = z.object({
|
|
252
|
+
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
|
|
253
|
+
call_sign: z.string().describe("This Legate's NATO call-sign (e.g., Alpha, Bravo)"),
|
|
254
|
+
limit: z.number().optional().describe("Max messages to scan/return (default: 15)"),
|
|
255
|
+
since: z.string().optional().describe("Slack ts to poll from; overrides the stored cursor"),
|
|
256
|
+
include_chatter: z.boolean().optional().describe("Include messages not addressed to anyone (default: false)")
|
|
257
|
+
});
|
|
258
|
+
const ClaimLaneArgsSchema = z.object({
|
|
259
|
+
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
|
|
260
|
+
call_sign: z.string().describe("This Legate's NATO call-sign"),
|
|
261
|
+
task: z.string().describe("The work being claimed (free text; normalized to a lane key)"),
|
|
262
|
+
ttl_minutes: z.number().optional().describe("How long a claim stays valid (default: 20)"),
|
|
263
|
+
lookback: z.number().optional().describe("How many recent messages to scan for prior claims (default: 30)"),
|
|
264
|
+
release: z.boolean().optional().describe("If true, post a LANE RELEASE for this task instead of claiming (default: false)")
|
|
265
|
+
});
|
|
266
|
+
const CheckinArgsSchema = z.object({
|
|
267
|
+
channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
|
|
268
|
+
call_sign: z.string().describe("This Legate's NATO call-sign"),
|
|
269
|
+
status: z.string().describe("One-line status to post"),
|
|
270
|
+
force: z.boolean().optional().describe("Post even if the status is unchanged (default: false)"),
|
|
271
|
+
heartbeat_minutes: z.number().optional().describe("If >0, re-post an unchanged status once this many minutes have elapsed (default: 0)")
|
|
272
|
+
});
|
|
331
273
|
const ListUsersArgsSchema = z.object({
|
|
332
|
-
limit: z.number().optional().describe("Maximum number of users to return (default: 100)")
|
|
274
|
+
limit: z.number().optional().describe("Maximum number of users to return (default: 100)"),
|
|
275
|
+
verbose: z.boolean().optional().describe("Return the full raw user objects. Default false returns lean output: id + name + real_name only.")
|
|
333
276
|
});
|
|
334
277
|
const GetUserByNameArgsSchema = z.object({
|
|
335
278
|
name: z.string().describe("Name or display name to search for")
|
|
@@ -345,18 +288,21 @@ const SearchFilesArgsSchema = z.object({
|
|
|
345
288
|
const SearchMessagesArgsSchema = z.object({
|
|
346
289
|
query: z.string().describe("Search query for messages"),
|
|
347
290
|
count: z.number().optional().describe("Number of results to return (default: 20)"),
|
|
348
|
-
page: z.number().optional().describe("Page number of results (default: 1)")
|
|
291
|
+
page: z.number().optional().describe("Page number of results (default: 1)"),
|
|
292
|
+
verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + user + channel + ts + permalink.")
|
|
349
293
|
});
|
|
350
294
|
const SearchByUserArgsSchema = z.object({
|
|
351
295
|
user_id: z.string().describe("User ID to search messages from"),
|
|
352
296
|
query: z.string().optional().describe("Additional search query"),
|
|
353
|
-
count: z.number().optional().describe("Number of results to return (default: 20)")
|
|
297
|
+
count: z.number().optional().describe("Number of results to return (default: 20)"),
|
|
298
|
+
verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + channel + ts + permalink.")
|
|
354
299
|
});
|
|
355
300
|
const SearchByDateRangeArgsSchema = z.object({
|
|
356
301
|
from_date: z.string().describe("Start date (YYYY-MM-DD)"),
|
|
357
302
|
to_date: z.string().describe("End date (YYYY-MM-DD)"),
|
|
358
303
|
query: z.string().optional().describe("Additional search query"),
|
|
359
|
-
count: z.number().optional().describe("Number of results to return (default: 20)")
|
|
304
|
+
count: z.number().optional().describe("Number of results to return (default: 20)"),
|
|
305
|
+
verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + user + channel + ts + permalink.")
|
|
360
306
|
});
|
|
361
307
|
const PinMessageArgsSchema = z.object({
|
|
362
308
|
channel: z.string().describe("Channel ID where the message is"),
|
|
@@ -392,11 +338,62 @@ const CreateReminderArgsSchema = z.object({
|
|
|
392
338
|
});
|
|
393
339
|
const ListRemindersArgsSchema = z.object({});
|
|
394
340
|
const GetCustomEmojiArgsSchema = z.object({});
|
|
395
|
-
const GetWorkspaceStatsArgsSchema = z.object({
|
|
341
|
+
const GetWorkspaceStatsArgsSchema = z.object({
|
|
342
|
+
verbose: z.boolean().optional().describe("Return the fuller stats payload (indented). Default false returns a lean one-line summary.")
|
|
343
|
+
});
|
|
344
|
+
const SendTableArgsSchema = z.object({
|
|
345
|
+
channel: z.string().describe("Channel ID or name to post the table to"),
|
|
346
|
+
title: z.string().optional().describe("Optional bold title rendered above the table"),
|
|
347
|
+
rows: z.union([
|
|
348
|
+
z.array(z.record(z.any())), // array of objects
|
|
349
|
+
z.array(z.array(z.any())), // 2D array (first row = header)
|
|
350
|
+
z.string() // markdown table string
|
|
351
|
+
]).describe("Table data: array of objects, a 2D array (first row = header), OR a markdown pipe-table string"),
|
|
352
|
+
as_code_block: z.boolean().optional().describe("Wrap the ASCII table in a ``` code block so columns stay aligned (default true)")
|
|
353
|
+
});
|
|
354
|
+
// ---- Block Kit cards + threaded task lifecycle (Bundle 2) ----
|
|
355
|
+
const SendCardArgsSchema = z.object({
|
|
356
|
+
channel: z.string().describe("Channel ID or name to post the card to"),
|
|
357
|
+
header: z.string().describe("Card header text (plain text)"),
|
|
358
|
+
sections: z.array(z.object({
|
|
359
|
+
text: z.string().optional().describe("mrkdwn body text for this section"),
|
|
360
|
+
fields: z.array(z.object({
|
|
361
|
+
label: z.string().optional(),
|
|
362
|
+
value: z.string()
|
|
363
|
+
})).optional().describe("Up to 10 two-column key/value fields")
|
|
364
|
+
})).optional().describe("Section blocks rendered in order, separated by dividers"),
|
|
365
|
+
context: z.string().optional().describe("Small footer context line (mrkdwn)"),
|
|
366
|
+
color: z.string().optional().describe("Hex color for the left bar, e.g. #3D8C62"),
|
|
367
|
+
...IdentityFields
|
|
368
|
+
});
|
|
369
|
+
const StartTaskArgsSchema = z.object({
|
|
370
|
+
channel: z.string().describe("Channel ID or name to post the task card to"),
|
|
371
|
+
title: z.string().describe("Task title"),
|
|
372
|
+
total_steps: z.number().optional().describe("Total number of steps (enables a progress bar on updates)"),
|
|
373
|
+
...IdentityFields
|
|
374
|
+
});
|
|
375
|
+
const UpdateTaskArgsSchema = z.object({
|
|
376
|
+
channel: z.string().describe("Channel ID where the task card lives"),
|
|
377
|
+
task_ts: z.string().describe("Timestamp of the parent task card (from slack_start_task)"),
|
|
378
|
+
message: z.string().describe("Progress update — posted as a THREADED reply. Do NOT @-mention here; routine updates must stay quiet."),
|
|
379
|
+
step: z.number().optional().describe("Current step number (with total_steps, updates the parent's progress bar)"),
|
|
380
|
+
total_steps: z.number().optional().describe("Total steps (defaults to the value from start_task if known)"),
|
|
381
|
+
...IdentityFields
|
|
382
|
+
});
|
|
383
|
+
const CompleteTaskArgsSchema = z.object({
|
|
384
|
+
channel: z.string().describe("Channel ID where the task card lives"),
|
|
385
|
+
task_ts: z.string().describe("Timestamp of the parent task card (from slack_start_task)"),
|
|
386
|
+
summary: z.string().describe("Final summary of the task outcome"),
|
|
387
|
+
status: z.enum(["done", "failed"]).describe("Final status"),
|
|
388
|
+
details: z.string().optional().describe("Optional details — commits, links, duration, etc. (mrkdwn)"),
|
|
389
|
+
notify_user: z.string().optional().describe("Optional Slack user ID to @-mention on completion. This is the ONLY task tool permitted to mention."),
|
|
390
|
+
...IdentityFields
|
|
391
|
+
});
|
|
396
392
|
const SendFormattedMessageArgsSchema = z.object({
|
|
397
393
|
channel: z.string().describe("Channel ID or name"),
|
|
398
|
-
blocks: z.array(z.
|
|
399
|
-
text: z.string().optional().describe("Fallback text")
|
|
394
|
+
blocks: z.array(z.object({ type: z.string() }).passthrough()).describe("Slack Block Kit blocks for rich formatting"),
|
|
395
|
+
text: z.string().optional().describe("Fallback text"),
|
|
396
|
+
...IdentityFields
|
|
400
397
|
});
|
|
401
398
|
const BulkReactMessagesArgsSchema = z.object({
|
|
402
399
|
channel: z.string().describe("Channel ID"),
|
|
@@ -437,536 +434,207 @@ const SendDiagramArgsSchema = z.object({
|
|
|
437
434
|
title: z.string().optional().describe("Title for the diagram"),
|
|
438
435
|
initial_comment: z.string().optional().describe("Message posted with the diagram")
|
|
439
436
|
});
|
|
440
|
-
|
|
441
|
-
// MAIN SERVER CLASS
|
|
442
|
-
// =====================================================================================
|
|
443
|
-
class SlackerV3Server {
|
|
437
|
+
export class SlackerV3Server {
|
|
444
438
|
server;
|
|
445
439
|
accountState;
|
|
446
|
-
|
|
440
|
+
// Per-account TTL caches for users.list / conversations.list (120s).
|
|
441
|
+
CACHE_TTL_MS = 120_000;
|
|
442
|
+
usersCache = new Map();
|
|
443
|
+
channelsCache = new Map();
|
|
444
|
+
// In-memory registry of active task cards keyed by `${channel}:${task_ts}`.
|
|
445
|
+
// Lets slack_update_task/slack_complete_task recall the title, total_steps, and
|
|
446
|
+
// current status reaction so they can re-render the parent and swap the reaction.
|
|
447
|
+
taskRegistry = new Map();
|
|
448
|
+
// Singleton Puppeteer browser, launched lazily and kept warm.
|
|
449
|
+
browser = null;
|
|
450
|
+
browserIdleTimer = null;
|
|
451
|
+
BROWSER_IDLE_MS = 5 * 60 * 1000; // close after 5 min idle
|
|
452
|
+
// Friendly message returned (never thrown on boot) when no bot token is configured.
|
|
453
|
+
static NO_TOKEN_MESSAGE = "No Slack bot token. Set SLACK_BOT_TOKEN in this MCP server's env block in your " +
|
|
454
|
+
"Claude config (~/.claude.json or .mcp.json).";
|
|
447
455
|
constructor() {
|
|
448
456
|
this.server = new Server({
|
|
449
457
|
name: "mcp-slack",
|
|
450
|
-
version: "
|
|
458
|
+
version: "4.0.0",
|
|
451
459
|
}, {
|
|
452
460
|
capabilities: {
|
|
453
461
|
tools: {},
|
|
454
462
|
},
|
|
455
463
|
});
|
|
456
|
-
//
|
|
464
|
+
// Load the single account from the environment. Never throws — if no token is
|
|
465
|
+
// present the server still boots and tool calls return NO_TOKEN_MESSAGE.
|
|
457
466
|
this.accountState = {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
467
|
+
account: null,
|
|
468
|
+
client: null,
|
|
469
|
+
userClient: null,
|
|
470
|
+
workspaceFetched: false
|
|
462
471
|
};
|
|
463
|
-
|
|
464
|
-
this.credentialManager = new CredentialManager();
|
|
465
|
-
// Initialize with default account if environment variables are provided
|
|
466
|
-
this.initializeDefaultAccount();
|
|
472
|
+
this.loadAccountFromEnv();
|
|
467
473
|
// Setup handlers immediately so the server can start
|
|
468
474
|
this.setupHandlers();
|
|
469
475
|
}
|
|
470
476
|
// =====================================================================================
|
|
471
|
-
// ACCOUNT
|
|
477
|
+
// ACCOUNT (env-first, single account)
|
|
472
478
|
// =====================================================================================
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
if (!this.accountState.activeAccountId) {
|
|
486
|
-
this.accountState.activeAccountId = account.id;
|
|
487
|
-
console.error(`[SlackServer] Set ${account.id} as active account`);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
const loadTime = Date.now() - startTime;
|
|
492
|
-
console.error(`[SlackServer] Account loading completed in ${loadTime}ms`);
|
|
493
|
-
console.error(`[SlackServer] Active accounts: ${Array.from(this.accountState.accounts.keys()).join(', ')}`);
|
|
494
|
-
}
|
|
495
|
-
catch (error) {
|
|
496
|
-
console.error('[SlackServer] Failed to load persisted accounts:', error);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
initializeDefaultAccount() {
|
|
500
|
-
const defaultBotToken = process.env.DEFAULT_BOT_TOKEN;
|
|
501
|
-
const defaultUserToken = process.env.DEFAULT_USER_TOKEN;
|
|
502
|
-
const defaultTeamId = process.env.DEFAULT_TEAM_ID;
|
|
503
|
-
const defaultAccountName = process.env.DEFAULT_ACCOUNT_NAME;
|
|
504
|
-
console.error("[SlackServer] Environment variables:", {
|
|
505
|
-
DEFAULT_BOT_TOKEN: defaultBotToken ? "Set" : "Not set",
|
|
506
|
-
DEFAULT_USER_TOKEN: defaultUserToken ? "Set" : "Not set",
|
|
507
|
-
DEFAULT_TEAM_ID: defaultTeamId,
|
|
508
|
-
DEFAULT_ACCOUNT_NAME: defaultAccountName
|
|
479
|
+
// Load exactly one account from env vars. SLACK_* is preferred; DEFAULT_* is a
|
|
480
|
+
// back-compat fallback. Multi-workspace = run a second MCP server entry with its own
|
|
481
|
+
// env block. No disk persistence — workspace/teamId hydrate lazily via auth.test.
|
|
482
|
+
loadAccountFromEnv() {
|
|
483
|
+
const botToken = process.env.SLACK_BOT_TOKEN || process.env.DEFAULT_BOT_TOKEN;
|
|
484
|
+
const userToken = process.env.SLACK_USER_TOKEN || process.env.DEFAULT_USER_TOKEN;
|
|
485
|
+
const teamId = process.env.SLACK_TEAM_ID || process.env.DEFAULT_TEAM_ID;
|
|
486
|
+
const name = process.env.SLACK_WORKSPACE || process.env.DEFAULT_ACCOUNT_NAME || 'Slack Workspace';
|
|
487
|
+
console.error("[SlackServer] Environment:", {
|
|
488
|
+
SLACK_BOT_TOKEN: botToken ? "Set" : "Not set",
|
|
489
|
+
SLACK_USER_TOKEN: userToken ? "Set" : "Not set",
|
|
490
|
+
SLACK_TEAM_ID: teamId || "(lazy)",
|
|
509
491
|
});
|
|
510
|
-
if (
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
name: defaultAccountName || 'Default Workspace',
|
|
514
|
-
workspace: 'Unknown', // Will be fetched on first use
|
|
515
|
-
teamId: defaultTeamId,
|
|
516
|
-
botToken: defaultBotToken,
|
|
517
|
-
userToken: defaultUserToken,
|
|
518
|
-
isDefault: true
|
|
519
|
-
};
|
|
520
|
-
this.accountState.accounts.set(defaultAccount.id, defaultAccount);
|
|
521
|
-
this.accountState.activeAccountId = defaultAccount.id;
|
|
522
|
-
this.initializeClient(defaultAccount);
|
|
523
|
-
// Save env-based account to keychain for next time
|
|
524
|
-
this.credentialManager.saveAccount(defaultAccount).catch(error => {
|
|
525
|
-
console.error('Failed to persist env-based account:', error);
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
initializeClient(account) {
|
|
530
|
-
// Initialize bot client
|
|
531
|
-
const botClient = new WebClient(account.botToken);
|
|
532
|
-
this.accountState.clients.set(account.id, botClient);
|
|
533
|
-
// Initialize user client if user token is provided
|
|
534
|
-
if (account.userToken) {
|
|
535
|
-
const userClient = new WebClient(account.userToken);
|
|
536
|
-
this.accountState.userClients.set(account.id, userClient);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
validateTokenFormat(token, type) {
|
|
540
|
-
if (type === 'bot') {
|
|
541
|
-
return token.startsWith('xoxb-');
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
return token.startsWith('xoxp-');
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
generateAccountId(name) {
|
|
548
|
-
// Generate a safe account ID from the name
|
|
549
|
-
const baseId = name.toLowerCase()
|
|
550
|
-
.replace(/[^a-z0-9]/g, '-')
|
|
551
|
-
.replace(/-+/g, '-')
|
|
552
|
-
.replace(/^-|-$/g, '');
|
|
553
|
-
let id = baseId;
|
|
554
|
-
let counter = 1;
|
|
555
|
-
// Ensure uniqueness
|
|
556
|
-
while (this.accountState.accounts.has(id)) {
|
|
557
|
-
id = `${baseId}-${counter}`;
|
|
558
|
-
counter++;
|
|
492
|
+
if (!botToken) {
|
|
493
|
+
console.error("[SlackServer] No bot token configured — server will boot but tool calls will error until SLACK_BOT_TOKEN is set.");
|
|
494
|
+
return;
|
|
559
495
|
}
|
|
560
|
-
|
|
496
|
+
this.accountState.account = {
|
|
497
|
+
id: 'default',
|
|
498
|
+
name,
|
|
499
|
+
workspace: name && name !== 'Slack Workspace' ? name : 'Unknown',
|
|
500
|
+
teamId: teamId || '',
|
|
501
|
+
botToken,
|
|
502
|
+
userToken: userToken || undefined,
|
|
503
|
+
};
|
|
504
|
+
this.accountState.client = new WebClient(botToken);
|
|
505
|
+
this.accountState.userClient = userToken ? new WebClient(userToken) : null;
|
|
561
506
|
}
|
|
562
507
|
async getActiveClient() {
|
|
563
|
-
if (!this.accountState.
|
|
564
|
-
throw new Error(
|
|
508
|
+
if (!this.accountState.client) {
|
|
509
|
+
throw new Error(SlackerV3Server.NO_TOKEN_MESSAGE);
|
|
565
510
|
}
|
|
566
|
-
|
|
511
|
+
return this.accountState.client;
|
|
512
|
+
}
|
|
513
|
+
async getActiveUserClient() {
|
|
514
|
+
// Prefer the user client; fall back to the bot client.
|
|
515
|
+
const client = this.accountState.userClient || this.accountState.client;
|
|
567
516
|
if (!client) {
|
|
568
|
-
throw new Error(
|
|
517
|
+
throw new Error(SlackerV3Server.NO_TOKEN_MESSAGE);
|
|
569
518
|
}
|
|
570
|
-
// Debug: Log token being used
|
|
571
|
-
const activeAccount = this.accountState.accounts.get(this.accountState.activeAccountId);
|
|
572
|
-
console.error("Using bot token:", activeAccount?.botToken);
|
|
573
519
|
return client;
|
|
574
520
|
}
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
521
|
+
// Lazily hydrate workspace name + teamId via auth.test on first use, cached in memory.
|
|
522
|
+
async ensureWorkspaceInfo() {
|
|
523
|
+
if (this.accountState.workspaceFetched || !this.accountState.account || !this.accountState.client) {
|
|
524
|
+
return;
|
|
578
525
|
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
526
|
+
try {
|
|
527
|
+
const info = await this.accountState.client.auth.test();
|
|
528
|
+
if (info?.team)
|
|
529
|
+
this.accountState.account.workspace = info.team;
|
|
530
|
+
if (info?.team_id)
|
|
531
|
+
this.accountState.account.teamId = info.team_id;
|
|
583
532
|
}
|
|
584
|
-
|
|
585
|
-
|
|
533
|
+
catch (error) {
|
|
534
|
+
console.error("[SlackServer] auth.test failed (workspace stays 'Unknown'):", error);
|
|
535
|
+
}
|
|
536
|
+
finally {
|
|
537
|
+
this.accountState.workspaceFetched = true;
|
|
586
538
|
}
|
|
587
|
-
return client;
|
|
588
539
|
}
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
540
|
+
// =====================================================================================
|
|
541
|
+
// TTL CACHE HELPERS (users.list / conversations.list)
|
|
542
|
+
// =====================================================================================
|
|
543
|
+
currentAccountKey() {
|
|
544
|
+
return this.accountState.account?.id || '__none__';
|
|
545
|
+
}
|
|
546
|
+
// Fetch ALL active (non-deleted, non-bot) users for the active account, paginated, cached 120s.
|
|
547
|
+
async getAllUsersCached(client) {
|
|
548
|
+
const key = this.currentAccountKey();
|
|
549
|
+
const cached = this.usersCache.get(key);
|
|
550
|
+
if (cached && cached.expires > Date.now()) {
|
|
551
|
+
return cached.value;
|
|
552
|
+
}
|
|
553
|
+
const members = [];
|
|
554
|
+
let cursor = undefined;
|
|
555
|
+
do {
|
|
556
|
+
const result = await client.users.list({ limit: 200, cursor });
|
|
557
|
+
if (result.members)
|
|
558
|
+
members.push(...result.members);
|
|
559
|
+
cursor = result.response_metadata?.next_cursor || undefined;
|
|
560
|
+
} while (cursor);
|
|
561
|
+
const active = members.filter((u) => !u.deleted && !u.is_bot);
|
|
562
|
+
this.usersCache.set(key, { value: active, expires: Date.now() + this.CACHE_TTL_MS });
|
|
563
|
+
return active;
|
|
564
|
+
}
|
|
565
|
+
// Fetch ALL public+private channels for the active account, paginated, cached 120s.
|
|
566
|
+
async getAllChannelsCached(client) {
|
|
567
|
+
const key = this.currentAccountKey();
|
|
568
|
+
const cached = this.channelsCache.get(key);
|
|
569
|
+
if (cached && cached.expires > Date.now()) {
|
|
570
|
+
return cached.value;
|
|
571
|
+
}
|
|
572
|
+
const channels = [];
|
|
573
|
+
let cursor = undefined;
|
|
574
|
+
do {
|
|
575
|
+
const result = await client.conversations.list({
|
|
576
|
+
types: 'public_channel,private_channel',
|
|
577
|
+
limit: 1000,
|
|
578
|
+
cursor
|
|
579
|
+
});
|
|
580
|
+
if (result.channels)
|
|
581
|
+
channels.push(...result.channels);
|
|
582
|
+
cursor = result.response_metadata?.next_cursor || undefined;
|
|
583
|
+
} while (cursor);
|
|
584
|
+
this.channelsCache.set(key, { value: channels, expires: Date.now() + this.CACHE_TTL_MS });
|
|
585
|
+
return channels;
|
|
593
586
|
}
|
|
594
587
|
// =====================================================================================
|
|
595
|
-
// ACCOUNT
|
|
588
|
+
// ACCOUNT TOOL IMPLEMENTATIONS (read-only — single env-loaded account)
|
|
596
589
|
// =====================================================================================
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
590
|
+
// Build the public (no-secrets) view of the active account, hydrating workspace/teamId
|
|
591
|
+
// lazily via auth.test on first use.
|
|
592
|
+
async describeActiveAccount() {
|
|
593
|
+
const account = this.accountState.account;
|
|
594
|
+
if (!account)
|
|
595
|
+
return null;
|
|
596
|
+
await this.ensureWorkspaceInfo();
|
|
597
|
+
return {
|
|
600
598
|
id: account.id,
|
|
601
599
|
name: account.name,
|
|
602
600
|
workspace: account.workspace,
|
|
603
601
|
team_id: account.teamId,
|
|
604
|
-
is_default: account.isDefault || false,
|
|
605
|
-
is_active: account.id === this.accountState.activeAccountId,
|
|
606
602
|
has_user_token: !!account.userToken,
|
|
607
|
-
bot_token: this.maskToken(account.botToken),
|
|
608
|
-
user_token: account.userToken ? this.maskToken(account.userToken) : null
|
|
609
|
-
}));
|
|
610
|
-
return {
|
|
611
|
-
content: [
|
|
612
|
-
{
|
|
613
|
-
type: "text",
|
|
614
|
-
text: JSON.stringify({
|
|
615
|
-
total_accounts: accounts.length,
|
|
616
|
-
active_account_id: this.accountState.activeAccountId,
|
|
617
|
-
accounts: accounts
|
|
618
|
-
}, null, 2)
|
|
619
|
-
}
|
|
620
|
-
]
|
|
621
|
-
};
|
|
622
|
-
}
|
|
623
|
-
async switchAccount(args) {
|
|
624
|
-
const validatedArgs = SwitchAccountArgsSchema.parse(args);
|
|
625
|
-
const account = this.accountState.accounts.get(validatedArgs.account_id);
|
|
626
|
-
if (!account) {
|
|
627
|
-
throw new Error(`Account '${validatedArgs.account_id}' not found. Use 'list_accounts' to see available accounts.`);
|
|
628
|
-
}
|
|
629
|
-
// Initialize client if not exists
|
|
630
|
-
if (!this.accountState.clients.has(account.id)) {
|
|
631
|
-
this.initializeClient(account);
|
|
632
|
-
}
|
|
633
|
-
// Switch active account
|
|
634
|
-
this.accountState.activeAccountId = account.id;
|
|
635
|
-
// Fetch workspace info if not cached
|
|
636
|
-
if (account.workspace === 'Unknown') {
|
|
637
|
-
try {
|
|
638
|
-
const client = this.accountState.clients.get(account.id);
|
|
639
|
-
const teamInfo = await client.team.info();
|
|
640
|
-
account.workspace = teamInfo.team?.name || 'Unknown';
|
|
641
|
-
}
|
|
642
|
-
catch (error) {
|
|
643
|
-
// If we can't fetch workspace info, that's ok - we'll use 'Unknown'
|
|
644
|
-
console.error(`Could not fetch workspace info for ${account.id}:`, error);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
return {
|
|
648
|
-
content: [
|
|
649
|
-
{
|
|
650
|
-
type: "text",
|
|
651
|
-
text: JSON.stringify({
|
|
652
|
-
success: true,
|
|
653
|
-
message: `Switched to ${account.name} (${account.workspace})`,
|
|
654
|
-
account: {
|
|
655
|
-
id: account.id,
|
|
656
|
-
name: account.name,
|
|
657
|
-
workspace: account.workspace,
|
|
658
|
-
team_id: account.teamId
|
|
659
|
-
}
|
|
660
|
-
}, null, 2)
|
|
661
|
-
}
|
|
662
|
-
]
|
|
663
603
|
};
|
|
664
604
|
}
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
// Validate token formats
|
|
668
|
-
if (!this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
|
|
669
|
-
throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
|
|
670
|
-
}
|
|
671
|
-
if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
|
|
672
|
-
throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
|
|
673
|
-
}
|
|
674
|
-
// Generate unique account ID
|
|
675
|
-
const accountId = this.generateAccountId(validatedArgs.name);
|
|
676
|
-
// Create new account
|
|
677
|
-
const newAccount = {
|
|
678
|
-
id: accountId,
|
|
679
|
-
name: validatedArgs.name,
|
|
680
|
-
workspace: 'Unknown', // Will be fetched on first use
|
|
681
|
-
teamId: validatedArgs.team_id,
|
|
682
|
-
botToken: validatedArgs.bot_token,
|
|
683
|
-
userToken: validatedArgs.user_token,
|
|
684
|
-
isDefault: false
|
|
685
|
-
};
|
|
686
|
-
// Test the bot token by trying to get team info
|
|
687
|
-
try {
|
|
688
|
-
const testClient = new WebClient(validatedArgs.bot_token);
|
|
689
|
-
const teamInfo = await testClient.team.info();
|
|
690
|
-
newAccount.workspace = teamInfo.team?.name || 'Unknown';
|
|
691
|
-
// Verify team ID matches
|
|
692
|
-
if (teamInfo.team?.id && teamInfo.team.id !== validatedArgs.team_id) {
|
|
693
|
-
throw new Error(`Team ID mismatch. Token belongs to team ${teamInfo.team.id}, but ${validatedArgs.team_id} was provided.`);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
catch (error) {
|
|
697
|
-
throw new Error(`Failed to verify bot token: ${error instanceof Error ? error.message : String(error)}`);
|
|
698
|
-
}
|
|
699
|
-
// Add to accounts
|
|
700
|
-
this.accountState.accounts.set(accountId, newAccount);
|
|
701
|
-
this.initializeClient(newAccount);
|
|
702
|
-
// If this is the first account, make it active
|
|
703
|
-
if (!this.accountState.activeAccountId) {
|
|
704
|
-
this.accountState.activeAccountId = accountId;
|
|
705
|
-
}
|
|
706
|
-
// Persist to keychain
|
|
707
|
-
try {
|
|
708
|
-
await this.credentialManager.saveAccount(newAccount);
|
|
709
|
-
return {
|
|
710
|
-
content: [
|
|
711
|
-
{
|
|
712
|
-
type: "text",
|
|
713
|
-
text: JSON.stringify({
|
|
714
|
-
success: true,
|
|
715
|
-
message: `Account '${validatedArgs.name}' added and saved to secure storage`,
|
|
716
|
-
account: {
|
|
717
|
-
id: accountId,
|
|
718
|
-
name: newAccount.name,
|
|
719
|
-
workspace: newAccount.workspace,
|
|
720
|
-
team_id: newAccount.teamId,
|
|
721
|
-
is_active: accountId === this.accountState.activeAccountId
|
|
722
|
-
}
|
|
723
|
-
}, null, 2)
|
|
724
|
-
}
|
|
725
|
-
]
|
|
726
|
-
};
|
|
727
|
-
}
|
|
728
|
-
catch (error) {
|
|
729
|
-
// Still works, just not persisted
|
|
730
|
-
return {
|
|
731
|
-
content: [
|
|
732
|
-
{
|
|
733
|
-
type: "text",
|
|
734
|
-
text: JSON.stringify({
|
|
735
|
-
success: true,
|
|
736
|
-
message: `Account '${validatedArgs.name}' added (temporary - secure storage unavailable)`,
|
|
737
|
-
account: {
|
|
738
|
-
id: accountId,
|
|
739
|
-
name: newAccount.name,
|
|
740
|
-
workspace: newAccount.workspace,
|
|
741
|
-
team_id: newAccount.teamId,
|
|
742
|
-
is_active: accountId === this.accountState.activeAccountId
|
|
743
|
-
}
|
|
744
|
-
}, null, 2)
|
|
745
|
-
}
|
|
746
|
-
]
|
|
747
|
-
};
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
async removeAccount(args) {
|
|
751
|
-
const validatedArgs = RemoveAccountArgsSchema.parse(args);
|
|
752
|
-
const account = this.accountState.accounts.get(validatedArgs.account_id);
|
|
753
|
-
if (!account) {
|
|
754
|
-
throw new Error(`Account '${validatedArgs.account_id}' not found.`);
|
|
755
|
-
}
|
|
756
|
-
// Check if this is the active account
|
|
757
|
-
const wasActive = this.accountState.activeAccountId === validatedArgs.account_id;
|
|
758
|
-
// Remove from all maps
|
|
759
|
-
this.accountState.accounts.delete(validatedArgs.account_id);
|
|
760
|
-
this.accountState.clients.delete(validatedArgs.account_id);
|
|
761
|
-
this.accountState.userClients.delete(validatedArgs.account_id);
|
|
762
|
-
// If this was the active account, switch to another one or clear active
|
|
763
|
-
if (wasActive) {
|
|
764
|
-
const remainingAccounts = Array.from(this.accountState.accounts.keys());
|
|
765
|
-
this.accountState.activeAccountId = remainingAccounts.length > 0 ? remainingAccounts[0] : null;
|
|
766
|
-
}
|
|
767
|
-
// Remove from keychain
|
|
768
|
-
try {
|
|
769
|
-
await this.credentialManager.deleteAccount(validatedArgs.account_id);
|
|
770
|
-
return {
|
|
771
|
-
content: [
|
|
772
|
-
{
|
|
773
|
-
type: "text",
|
|
774
|
-
text: JSON.stringify({
|
|
775
|
-
success: true,
|
|
776
|
-
message: `Account '${account.name}' removed from memory and secure storage`,
|
|
777
|
-
new_active_account: this.accountState.activeAccountId,
|
|
778
|
-
remaining_accounts: this.accountState.accounts.size
|
|
779
|
-
}, null, 2)
|
|
780
|
-
}
|
|
781
|
-
]
|
|
782
|
-
};
|
|
783
|
-
}
|
|
784
|
-
catch (error) {
|
|
785
|
-
return {
|
|
786
|
-
content: [
|
|
787
|
-
{
|
|
788
|
-
type: "text",
|
|
789
|
-
text: JSON.stringify({
|
|
790
|
-
success: true,
|
|
791
|
-
message: `Account '${account.name}' removed from memory (secure storage removal failed)`,
|
|
792
|
-
new_active_account: this.accountState.activeAccountId,
|
|
793
|
-
remaining_accounts: this.accountState.accounts.size
|
|
794
|
-
}, null, 2)
|
|
795
|
-
}
|
|
796
|
-
]
|
|
797
|
-
};
|
|
798
|
-
}
|
|
799
|
-
}
|
|
605
|
+
// get_active_account — returns the wired workspace/team/name (no secrets) so the user
|
|
606
|
+
// can confirm which workspace this server is talking to.
|
|
800
607
|
async getActiveAccount(args) {
|
|
801
608
|
GetActiveAccountArgsSchema.parse(args);
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
content: [
|
|
805
|
-
{
|
|
806
|
-
type: "text",
|
|
807
|
-
text: JSON.stringify({
|
|
808
|
-
active_account: null,
|
|
809
|
-
message: "No active account. Use 'list_accounts' to see available accounts, or 'add_account' to add one."
|
|
810
|
-
}, null, 2)
|
|
811
|
-
}
|
|
812
|
-
]
|
|
813
|
-
};
|
|
814
|
-
}
|
|
815
|
-
const account = this.accountState.accounts.get(this.accountState.activeAccountId);
|
|
816
|
-
if (!account) {
|
|
609
|
+
const active = await this.describeActiveAccount();
|
|
610
|
+
if (!active) {
|
|
817
611
|
return {
|
|
818
|
-
content: [
|
|
819
|
-
{
|
|
820
|
-
type: "text",
|
|
821
|
-
text: JSON.stringify({
|
|
612
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
822
613
|
active_account: null,
|
|
823
|
-
|
|
824
|
-
}, null, 2)
|
|
825
|
-
}
|
|
826
|
-
]
|
|
614
|
+
message: SlackerV3Server.NO_TOKEN_MESSAGE,
|
|
615
|
+
}, null, 2) }]
|
|
827
616
|
};
|
|
828
617
|
}
|
|
829
618
|
return {
|
|
830
|
-
content: [
|
|
831
|
-
{
|
|
832
|
-
type: "text",
|
|
833
|
-
text: JSON.stringify({
|
|
834
|
-
active_account: {
|
|
835
|
-
id: account.id,
|
|
836
|
-
name: account.name,
|
|
837
|
-
workspace: account.workspace,
|
|
838
|
-
team_id: account.teamId,
|
|
839
|
-
is_default: account.isDefault || false,
|
|
840
|
-
has_user_token: !!account.userToken
|
|
841
|
-
}
|
|
842
|
-
}, null, 2)
|
|
843
|
-
}
|
|
844
|
-
]
|
|
619
|
+
content: [{ type: "text", text: JSON.stringify({ active_account: active }, null, 2) }]
|
|
845
620
|
};
|
|
846
621
|
}
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
// Clear default flag from all accounts
|
|
854
|
-
for (const acc of this.accountState.accounts.values()) {
|
|
855
|
-
acc.isDefault = false;
|
|
856
|
-
}
|
|
857
|
-
// Set new default
|
|
858
|
-
account.isDefault = true;
|
|
622
|
+
// list_accounts — kept for back-compat; this server is single-account, so it simply
|
|
623
|
+
// returns the one active account (or none).
|
|
624
|
+
async listAccounts(args) {
|
|
625
|
+
ListAccountsArgsSchema.parse(args);
|
|
626
|
+
const active = await this.describeActiveAccount();
|
|
627
|
+
const accounts = active ? [{ ...active, is_active: true }] : [];
|
|
859
628
|
return {
|
|
860
|
-
content: [
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
message: `Account '${account.name}' set as default`,
|
|
866
|
-
default_account: {
|
|
867
|
-
id: account.id,
|
|
868
|
-
name: account.name,
|
|
869
|
-
workspace: account.workspace
|
|
870
|
-
}
|
|
871
|
-
}, null, 2)
|
|
872
|
-
}
|
|
873
|
-
]
|
|
629
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
630
|
+
total_accounts: accounts.length,
|
|
631
|
+
active_account_id: this.accountState.account?.id ?? null,
|
|
632
|
+
accounts,
|
|
633
|
+
}, null, 2) }]
|
|
874
634
|
};
|
|
875
635
|
}
|
|
876
|
-
async updateAccount(args) {
|
|
877
|
-
const validatedArgs = UpdateAccountArgsSchema.parse(args);
|
|
878
|
-
const account = this.accountState.accounts.get(validatedArgs.account_id);
|
|
879
|
-
if (!account) {
|
|
880
|
-
throw new Error(`Account '${validatedArgs.account_id}' not found.`);
|
|
881
|
-
}
|
|
882
|
-
// Validate new tokens if provided
|
|
883
|
-
if (validatedArgs.bot_token && !this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
|
|
884
|
-
throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
|
|
885
|
-
}
|
|
886
|
-
if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
|
|
887
|
-
throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
|
|
888
|
-
}
|
|
889
|
-
// Update tokens in memory
|
|
890
|
-
let tokensUpdated = false;
|
|
891
|
-
if (validatedArgs.bot_token && validatedArgs.bot_token !== account.botToken) {
|
|
892
|
-
account.botToken = validatedArgs.bot_token;
|
|
893
|
-
tokensUpdated = true;
|
|
894
|
-
}
|
|
895
|
-
if (validatedArgs.user_token !== undefined && validatedArgs.user_token !== account.userToken) {
|
|
896
|
-
account.userToken = validatedArgs.user_token;
|
|
897
|
-
tokensUpdated = true;
|
|
898
|
-
}
|
|
899
|
-
if (!tokensUpdated) {
|
|
900
|
-
return {
|
|
901
|
-
content: [
|
|
902
|
-
{
|
|
903
|
-
type: "text",
|
|
904
|
-
text: JSON.stringify({
|
|
905
|
-
success: false,
|
|
906
|
-
message: "No token changes provided"
|
|
907
|
-
}, null, 2)
|
|
908
|
-
}
|
|
909
|
-
]
|
|
910
|
-
};
|
|
911
|
-
}
|
|
912
|
-
// Re-initialize clients with new tokens
|
|
913
|
-
this.initializeClient(account);
|
|
914
|
-
// Update workspace info if bot token changed
|
|
915
|
-
if (validatedArgs.bot_token) {
|
|
916
|
-
try {
|
|
917
|
-
const client = this.accountState.clients.get(account.id);
|
|
918
|
-
const teamInfo = await client.team.info();
|
|
919
|
-
account.workspace = teamInfo.team?.name || account.workspace;
|
|
920
|
-
}
|
|
921
|
-
catch (error) {
|
|
922
|
-
console.error('Failed to update workspace info:', error);
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
// Persist updated account
|
|
926
|
-
try {
|
|
927
|
-
await this.credentialManager.updateAccount(account);
|
|
928
|
-
return {
|
|
929
|
-
content: [
|
|
930
|
-
{
|
|
931
|
-
type: "text",
|
|
932
|
-
text: JSON.stringify({
|
|
933
|
-
success: true,
|
|
934
|
-
message: `Updated tokens for '${account.name}' and saved to secure storage`,
|
|
935
|
-
account: {
|
|
936
|
-
id: account.id,
|
|
937
|
-
name: account.name,
|
|
938
|
-
workspace: account.workspace,
|
|
939
|
-
team_id: account.teamId,
|
|
940
|
-
has_user_token: !!account.userToken
|
|
941
|
-
}
|
|
942
|
-
}, null, 2)
|
|
943
|
-
}
|
|
944
|
-
]
|
|
945
|
-
};
|
|
946
|
-
}
|
|
947
|
-
catch (error) {
|
|
948
|
-
return {
|
|
949
|
-
content: [
|
|
950
|
-
{
|
|
951
|
-
type: "text",
|
|
952
|
-
text: JSON.stringify({
|
|
953
|
-
success: true,
|
|
954
|
-
message: `Updated tokens for '${account.name}' (temporary - secure storage unavailable)`,
|
|
955
|
-
account: {
|
|
956
|
-
id: account.id,
|
|
957
|
-
name: account.name,
|
|
958
|
-
workspace: account.workspace,
|
|
959
|
-
team_id: account.teamId,
|
|
960
|
-
has_user_token: !!account.userToken
|
|
961
|
-
}
|
|
962
|
-
}, null, 2)
|
|
963
|
-
}
|
|
964
|
-
]
|
|
965
|
-
};
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
636
|
// =====================================================================================
|
|
969
|
-
// EXISTING SLACK TOOL IMPLEMENTATIONS
|
|
637
|
+
// EXISTING SLACK TOOL IMPLEMENTATIONS
|
|
970
638
|
// =====================================================================================
|
|
971
639
|
async slackListChannels(args) {
|
|
972
640
|
const validatedArgs = ListChannelsArgsSchema.parse(args);
|
|
@@ -988,20 +656,33 @@ class SlackerV3Server {
|
|
|
988
656
|
// Get next cursor for pagination
|
|
989
657
|
cursor = result.response_metadata?.next_cursor;
|
|
990
658
|
} while (cursor);
|
|
659
|
+
// VERBOSE: full channel objects including topic/purpose.
|
|
660
|
+
if (validatedArgs.verbose) {
|
|
661
|
+
const channels = allChannels.map(channel => ({
|
|
662
|
+
id: channel.id,
|
|
663
|
+
name: channel.name,
|
|
664
|
+
is_private: channel.is_private,
|
|
665
|
+
is_member: channel.is_member,
|
|
666
|
+
topic: channel.topic?.value,
|
|
667
|
+
purpose: channel.purpose?.value,
|
|
668
|
+
num_members: channel.num_members
|
|
669
|
+
}));
|
|
670
|
+
return {
|
|
671
|
+
content: [{ type: "text", text: JSON.stringify(channels, null, 2) }]
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
// LEAN: just id + name + privacy + member count.
|
|
991
675
|
const channels = allChannels.map(channel => ({
|
|
992
676
|
id: channel.id,
|
|
993
677
|
name: channel.name,
|
|
994
|
-
is_private: channel.is_private,
|
|
995
|
-
is_member: channel.is_member,
|
|
996
|
-
topic: channel.topic?.value,
|
|
997
|
-
purpose: channel.purpose?.value,
|
|
678
|
+
is_private: !!channel.is_private,
|
|
998
679
|
num_members: channel.num_members
|
|
999
680
|
}));
|
|
1000
681
|
return {
|
|
1001
682
|
content: [
|
|
1002
683
|
{
|
|
1003
684
|
type: "text",
|
|
1004
|
-
text:
|
|
685
|
+
text: leanResult(channels)
|
|
1005
686
|
}
|
|
1006
687
|
]
|
|
1007
688
|
};
|
|
@@ -1016,7 +697,7 @@ class SlackerV3Server {
|
|
|
1016
697
|
statusCode: error.statusCode
|
|
1017
698
|
});
|
|
1018
699
|
// Get current account info for debugging
|
|
1019
|
-
const activeAccount = this.accountState.
|
|
700
|
+
const activeAccount = this.accountState.account;
|
|
1020
701
|
console.error("Active account:", {
|
|
1021
702
|
id: activeAccount?.id,
|
|
1022
703
|
name: activeAccount?.name,
|
|
@@ -1042,9 +723,11 @@ class SlackerV3Server {
|
|
|
1042
723
|
return converted;
|
|
1043
724
|
}
|
|
1044
725
|
async processExplicitMentions(text, client) {
|
|
1045
|
-
//
|
|
1046
|
-
|
|
1047
|
-
|
|
726
|
+
// Fast path: no @mentions present, skip the (cached) users.list entirely.
|
|
727
|
+
if (!/@\w+/.test(text))
|
|
728
|
+
return text;
|
|
729
|
+
// ONLY process @mentions - nothing else (cached, paginated)
|
|
730
|
+
const activeUsers = await this.getAllUsersCached(client);
|
|
1048
731
|
return text.replace(/@(\w+)/g, (match, username) => {
|
|
1049
732
|
// Try exact match first
|
|
1050
733
|
let user = activeUsers.find(u => u.name?.toLowerCase() === username.toLowerCase() ||
|
|
@@ -1072,34 +755,55 @@ class SlackerV3Server {
|
|
|
1072
755
|
}
|
|
1073
756
|
// Handle #channel-name format
|
|
1074
757
|
const cleanName = channelOrUser.replace(/^#/, '');
|
|
1075
|
-
// Try to find a channel first
|
|
1076
|
-
const
|
|
1077
|
-
|
|
1078
|
-
limit: 1000
|
|
1079
|
-
});
|
|
1080
|
-
const channel = channelsResult.channels?.find(ch => ch.name?.toLowerCase() === cleanName.toLowerCase());
|
|
758
|
+
// Try to find a channel first (cached, fully paginated so we don't miss page 2+)
|
|
759
|
+
const channels = await this.getAllChannelsCached(client);
|
|
760
|
+
const channel = channels.find(ch => ch.name?.toLowerCase() === cleanName.toLowerCase());
|
|
1081
761
|
if (channel?.id)
|
|
1082
762
|
return channel.id;
|
|
1083
|
-
// Try to find a user for DM
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
763
|
+
// No exact channel match. Try to find a user for DM — but ONLY with high
|
|
764
|
+
// confidence. A loose fuzzy match here can silently DM the WRONG human on a
|
|
765
|
+
// channel-name typo, so we require a strong match and otherwise throw.
|
|
766
|
+
const activeUsers = await this.getAllUsersCached(client);
|
|
767
|
+
// Exact (case-insensitive) match on a user handle/name takes priority.
|
|
768
|
+
const exactUser = activeUsers.find(u => u.name?.toLowerCase() === cleanName.toLowerCase() ||
|
|
769
|
+
u.real_name?.toLowerCase() === cleanName.toLowerCase() ||
|
|
770
|
+
u.profile?.display_name?.toLowerCase() === cleanName.toLowerCase());
|
|
771
|
+
if (exactUser?.id) {
|
|
772
|
+
const dmResult = await client.conversations.open({ users: exactUser.id });
|
|
773
|
+
if (dmResult.channel?.id)
|
|
774
|
+
return dmResult.channel.id;
|
|
775
|
+
}
|
|
776
|
+
// Fuzzy match with a STRICT confidence floor. Fuse score is 0 (perfect) → 1 (worst);
|
|
777
|
+
// require score <= 0.2 (>=80% similarity) before we DM a human.
|
|
1087
778
|
const fuse = new Fuse(activeUsers, {
|
|
1088
779
|
keys: ['name', 'real_name', 'profile.display_name'],
|
|
1089
|
-
threshold: 0.
|
|
780
|
+
threshold: 0.2,
|
|
1090
781
|
includeScore: true
|
|
1091
782
|
});
|
|
1092
783
|
const fuzzyResults = fuse.search(cleanName);
|
|
1093
|
-
|
|
784
|
+
const STRICT = 0.2;
|
|
785
|
+
if (fuzzyResults.length > 0 && fuzzyResults[0].score <= STRICT) {
|
|
1094
786
|
const user = fuzzyResults[0].item;
|
|
1095
787
|
if (user.id) {
|
|
1096
788
|
// Open a DM channel with the user
|
|
1097
789
|
const dmResult = await client.conversations.open({ users: user.id });
|
|
1098
|
-
|
|
790
|
+
if (dmResult.channel?.id)
|
|
791
|
+
return dmResult.channel.id;
|
|
1099
792
|
}
|
|
1100
793
|
}
|
|
1101
|
-
//
|
|
1102
|
-
|
|
794
|
+
// No high-confidence match. Do NOT silently send to the wrong place.
|
|
795
|
+
const channelCandidates = channels
|
|
796
|
+
.map(ch => ch.name)
|
|
797
|
+
.filter((n) => !!n && n.toLowerCase().includes(cleanName.toLowerCase().slice(0, 3)))
|
|
798
|
+
.slice(0, 5);
|
|
799
|
+
const userCandidates = fuzzyResults.slice(0, 5).map(r => r.item.name).filter(Boolean);
|
|
800
|
+
const candidates = [...channelCandidates, ...userCandidates];
|
|
801
|
+
throw new Error(`Could not confidently resolve recipient "${channelOrUser}". ` +
|
|
802
|
+
`No matching channel and no high-confidence user match. ` +
|
|
803
|
+
(candidates.length
|
|
804
|
+
? `Did you mean one of: ${candidates.join(', ')}? `
|
|
805
|
+
: '') +
|
|
806
|
+
`Pass an exact channel ID (C...), user ID (U...), or exact #channel-name.`);
|
|
1103
807
|
}
|
|
1104
808
|
async slackSendMessage(args) {
|
|
1105
809
|
const validatedArgs = SendMessageArgsSchema.parse(args);
|
|
@@ -1110,12 +814,13 @@ class SlackerV3Server {
|
|
|
1110
814
|
let formattedText = this.convertMarkdownToSlackMrkdwn(validatedArgs.text);
|
|
1111
815
|
// Step 3: ONLY process explicit @mentions (not context patterns)
|
|
1112
816
|
formattedText = await this.processExplicitMentions(formattedText, client);
|
|
1113
|
-
// Step 4: Send the message
|
|
817
|
+
// Step 4: Send the message (with optional session identity override)
|
|
1114
818
|
const result = await client.chat.postMessage({
|
|
1115
819
|
channel: channelId,
|
|
1116
820
|
text: formattedText,
|
|
1117
821
|
thread_ts: validatedArgs.thread_ts,
|
|
1118
|
-
mrkdwn: true
|
|
822
|
+
mrkdwn: true,
|
|
823
|
+
...this.identityOverrides(args)
|
|
1119
824
|
});
|
|
1120
825
|
return {
|
|
1121
826
|
content: [
|
|
@@ -1126,34 +831,580 @@ class SlackerV3Server {
|
|
|
1126
831
|
]
|
|
1127
832
|
};
|
|
1128
833
|
}
|
|
834
|
+
// Lightweight text-table alternative to the PNG slack_send_diagram path. Renders
|
|
835
|
+
// an aligned ASCII table inside a code block so it stays cheap (text, not an image)
|
|
836
|
+
// and readable. Use this for status/comparison grids that don't need to be pretty.
|
|
837
|
+
async slackSendTable(args) {
|
|
838
|
+
const validatedArgs = SendTableArgsSchema.parse(args);
|
|
839
|
+
const client = await this.getActiveClient();
|
|
840
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
841
|
+
const asCodeBlock = validatedArgs.as_code_block !== false;
|
|
842
|
+
const table = renderTable(validatedArgs.rows);
|
|
843
|
+
let text = "";
|
|
844
|
+
if (validatedArgs.title)
|
|
845
|
+
text += `*${validatedArgs.title}*\n`;
|
|
846
|
+
text += asCodeBlock ? "```\n" + table + "\n```" : table;
|
|
847
|
+
const result = await client.chat.postMessage({
|
|
848
|
+
channel: channelId,
|
|
849
|
+
text,
|
|
850
|
+
mrkdwn: true
|
|
851
|
+
});
|
|
852
|
+
return {
|
|
853
|
+
content: [
|
|
854
|
+
{
|
|
855
|
+
type: "text",
|
|
856
|
+
text: `Table posted. Channel: ${result.channel}, Timestamp: ${result.ts}`
|
|
857
|
+
}
|
|
858
|
+
]
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
// =====================================================================================
|
|
862
|
+
// BLOCK KIT CARDS + THREADED TASK LIFECYCLE (Bundle 2 / 3 / 4)
|
|
863
|
+
// =====================================================================================
|
|
864
|
+
taskKey(channel, ts) {
|
|
865
|
+
return `${channel}:${ts}`;
|
|
866
|
+
}
|
|
867
|
+
// Build chat.postMessage identity overrides (Bundle 4). Per-call username/icon args
|
|
868
|
+
// win, otherwise fall back to SLACK_SESSION_USERNAME / SLACK_SESSION_ICON env vars.
|
|
869
|
+
// Requires the chat:write.customize bot scope; Slack ignores/errors gracefully if
|
|
870
|
+
// absent. icon_emoji (e.g. ":robot_face:") and icon_url are both supported.
|
|
871
|
+
identityOverrides(args) {
|
|
872
|
+
const a = (args ?? {});
|
|
873
|
+
const username = a.username || process.env.SLACK_SESSION_USERNAME;
|
|
874
|
+
const icon = a.icon_emoji || process.env.SLACK_SESSION_ICON;
|
|
875
|
+
const iconUrl = a.icon_url;
|
|
876
|
+
const out = {};
|
|
877
|
+
if (username)
|
|
878
|
+
out.username = username;
|
|
879
|
+
if (iconUrl)
|
|
880
|
+
out.icon_url = iconUrl;
|
|
881
|
+
else if (icon) {
|
|
882
|
+
// Accept either ":emoji:" or a full URL in the icon var.
|
|
883
|
+
if (/^https?:\/\//.test(icon))
|
|
884
|
+
out.icon_url = icon;
|
|
885
|
+
else
|
|
886
|
+
out.icon_emoji = icon.startsWith(":") ? icon : `:${icon}:`;
|
|
887
|
+
}
|
|
888
|
+
return out;
|
|
889
|
+
}
|
|
890
|
+
// Live reaction-status indicator (Bundle 3). Swap a status reaction on a message:
|
|
891
|
+
// remove the previously-applied one (if any) and add the new one. Reuses the same
|
|
892
|
+
// reactions API as slack_add_reaction. Slack errors (already_reacted / no_reaction)
|
|
893
|
+
// are swallowed so a status flip never fails the whole task call.
|
|
894
|
+
async swapReaction(client, channel, ts, prev, next) {
|
|
895
|
+
if (prev && prev !== next) {
|
|
896
|
+
try {
|
|
897
|
+
await client.reactions.remove({ channel, timestamp: ts, name: prev });
|
|
898
|
+
}
|
|
899
|
+
catch { /* no_reaction / not_reactable — ignore */ }
|
|
900
|
+
}
|
|
901
|
+
try {
|
|
902
|
+
await client.reactions.add({ channel, timestamp: ts, name: next });
|
|
903
|
+
}
|
|
904
|
+
catch { /* already_reacted — ignore */ }
|
|
905
|
+
}
|
|
906
|
+
async slackSendCard(args) {
|
|
907
|
+
const validatedArgs = SendCardArgsSchema.parse(args);
|
|
908
|
+
const client = await this.getActiveClient();
|
|
909
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
910
|
+
const card = buildCard({
|
|
911
|
+
header: validatedArgs.header,
|
|
912
|
+
sections: validatedArgs.sections,
|
|
913
|
+
context: validatedArgs.context,
|
|
914
|
+
color: validatedArgs.color
|
|
915
|
+
});
|
|
916
|
+
const result = await client.chat.postMessage({
|
|
917
|
+
channel: channelId,
|
|
918
|
+
text: validatedArgs.header, // fallback / notification text
|
|
919
|
+
blocks: card.blocks.length ? card.blocks : undefined,
|
|
920
|
+
attachments: card.attachments,
|
|
921
|
+
...this.identityOverrides(args)
|
|
922
|
+
});
|
|
923
|
+
return {
|
|
924
|
+
content: [
|
|
925
|
+
{ type: "text", text: `Card posted. Channel: ${result.channel}, Timestamp: ${result.ts}` }
|
|
926
|
+
]
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
async slackStartTask(args) {
|
|
930
|
+
const validatedArgs = StartTaskArgsSchema.parse(args);
|
|
931
|
+
const client = await this.getActiveClient();
|
|
932
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
933
|
+
const sections = [{ text: ":hourglass_flowing_sand: *In progress*" }];
|
|
934
|
+
if (validatedArgs.total_steps) {
|
|
935
|
+
sections.push({ text: renderProgressBar(0) + ` (0/${validatedArgs.total_steps})` });
|
|
936
|
+
}
|
|
937
|
+
const card = buildCard({
|
|
938
|
+
header: `⏳ ${validatedArgs.title}`,
|
|
939
|
+
sections,
|
|
940
|
+
context: `Started ${new Date().toISOString()}`
|
|
941
|
+
});
|
|
942
|
+
const result = await client.chat.postMessage({
|
|
943
|
+
channel: channelId,
|
|
944
|
+
text: `⏳ ${validatedArgs.title}`,
|
|
945
|
+
blocks: card.blocks,
|
|
946
|
+
...this.identityOverrides(args)
|
|
947
|
+
});
|
|
948
|
+
const ts = result.ts;
|
|
949
|
+
const resolvedChannel = result.channel || channelId;
|
|
950
|
+
// Add the hourglass status reaction to the parent (Bundle 3).
|
|
951
|
+
await this.swapReaction(client, resolvedChannel, ts, undefined, "hourglass_flowing_sand");
|
|
952
|
+
this.taskRegistry.set(this.taskKey(resolvedChannel, ts), {
|
|
953
|
+
channel: resolvedChannel,
|
|
954
|
+
title: validatedArgs.title,
|
|
955
|
+
totalSteps: validatedArgs.total_steps,
|
|
956
|
+
reaction: "hourglass_flowing_sand"
|
|
957
|
+
});
|
|
958
|
+
return {
|
|
959
|
+
content: [
|
|
960
|
+
{ type: "text", text: JSON.stringify({ task_ts: ts, channel: resolvedChannel }) }
|
|
961
|
+
]
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
async slackUpdateTask(args) {
|
|
965
|
+
const validatedArgs = UpdateTaskArgsSchema.parse(args);
|
|
966
|
+
const client = await this.getActiveClient();
|
|
967
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
968
|
+
const entry = this.taskRegistry.get(this.taskKey(channelId, validatedArgs.task_ts));
|
|
969
|
+
const totalSteps = validatedArgs.total_steps ?? entry?.totalSteps;
|
|
970
|
+
// Threaded reply with the progress message. NEVER @-mentions (routine update).
|
|
971
|
+
await client.chat.postMessage({
|
|
972
|
+
channel: channelId,
|
|
973
|
+
thread_ts: validatedArgs.task_ts,
|
|
974
|
+
text: validatedArgs.message,
|
|
975
|
+
...this.identityOverrides(args)
|
|
976
|
+
});
|
|
977
|
+
// If we have step/total, re-render the parent card with a progress bar.
|
|
978
|
+
if (validatedArgs.step != null && totalSteps) {
|
|
979
|
+
const pct = Math.round((validatedArgs.step / totalSteps) * 100);
|
|
980
|
+
const title = entry?.title ?? "Task";
|
|
981
|
+
const card = buildCard({
|
|
982
|
+
header: `⏳ ${title}`,
|
|
983
|
+
sections: [
|
|
984
|
+
{ text: ":hourglass_flowing_sand: *In progress*" },
|
|
985
|
+
{ text: renderProgressBar(pct) + ` (${validatedArgs.step}/${totalSteps})` },
|
|
986
|
+
{ text: `Latest: ${validatedArgs.message}` }
|
|
987
|
+
],
|
|
988
|
+
context: `Updated ${new Date().toISOString()}`
|
|
989
|
+
});
|
|
990
|
+
try {
|
|
991
|
+
await client.chat.update({
|
|
992
|
+
channel: channelId,
|
|
993
|
+
ts: validatedArgs.task_ts,
|
|
994
|
+
text: `⏳ ${title}`,
|
|
995
|
+
blocks: card.blocks
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
catch { /* update may fail if posted under a different identity — non-fatal */ }
|
|
999
|
+
}
|
|
1000
|
+
return {
|
|
1001
|
+
content: [{ type: "text", text: `Task update posted (threaded). task_ts: ${validatedArgs.task_ts}` }]
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1004
|
+
async slackCompleteTask(args) {
|
|
1005
|
+
const validatedArgs = CompleteTaskArgsSchema.parse(args);
|
|
1006
|
+
const client = await this.getActiveClient();
|
|
1007
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1008
|
+
const entry = this.taskRegistry.get(this.taskKey(channelId, validatedArgs.task_ts));
|
|
1009
|
+
const title = entry?.title ?? "Task";
|
|
1010
|
+
const ok = validatedArgs.status === "done";
|
|
1011
|
+
const icon = ok ? "✅" : "❌";
|
|
1012
|
+
// Build the final threaded reply. This is the ONLY task tool that may @-mention.
|
|
1013
|
+
let replyText = `${icon} ${validatedArgs.summary}`;
|
|
1014
|
+
if (validatedArgs.notify_user) {
|
|
1015
|
+
replyText = `<@${validatedArgs.notify_user}> ${replyText}`;
|
|
1016
|
+
}
|
|
1017
|
+
await client.chat.postMessage({
|
|
1018
|
+
channel: channelId,
|
|
1019
|
+
thread_ts: validatedArgs.task_ts,
|
|
1020
|
+
text: replyText,
|
|
1021
|
+
...this.identityOverrides(args)
|
|
1022
|
+
});
|
|
1023
|
+
// Edit the parent into a completion summary card.
|
|
1024
|
+
const sections = [
|
|
1025
|
+
{ text: ok ? ":white_check_mark: *Complete*" : ":x: *Failed*" },
|
|
1026
|
+
{ text: validatedArgs.summary }
|
|
1027
|
+
];
|
|
1028
|
+
if (validatedArgs.details) {
|
|
1029
|
+
sections.push({ fields: [{ label: "Details", value: validatedArgs.details }] });
|
|
1030
|
+
}
|
|
1031
|
+
const card = buildCard({
|
|
1032
|
+
header: `${icon} ${title}`,
|
|
1033
|
+
sections,
|
|
1034
|
+
context: `Completed ${new Date().toISOString()}`,
|
|
1035
|
+
color: ok ? "#3D8C62" : "#E8821A"
|
|
1036
|
+
});
|
|
1037
|
+
try {
|
|
1038
|
+
await client.chat.update({
|
|
1039
|
+
channel: channelId,
|
|
1040
|
+
ts: validatedArgs.task_ts,
|
|
1041
|
+
text: `${icon} ${title}`,
|
|
1042
|
+
blocks: card.blocks.length ? card.blocks : undefined,
|
|
1043
|
+
attachments: card.attachments
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
catch { /* non-fatal */ }
|
|
1047
|
+
// Swap the hourglass reaction → ✅ / ❌ (Bundle 3).
|
|
1048
|
+
await this.swapReaction(client, channelId, validatedArgs.task_ts, entry?.reaction ?? "hourglass_flowing_sand", ok ? "white_check_mark" : "x");
|
|
1049
|
+
this.taskRegistry.delete(this.taskKey(channelId, validatedArgs.task_ts));
|
|
1050
|
+
return {
|
|
1051
|
+
content: [{ type: "text", text: `Task ${validatedArgs.status}. Parent card updated. task_ts: ${validatedArgs.task_ts}` }]
|
|
1052
|
+
};
|
|
1053
|
+
}
|
|
1054
|
+
// =====================================================================================
|
|
1055
|
+
// LEGATE PULL/POLLING TOOLS (multi-session shared-bot coordination)
|
|
1056
|
+
// -------------------------------------------------------------------------------------
|
|
1057
|
+
// Several Claude Code sessions ("Legates") share ONE Slack bot identity and each runs
|
|
1058
|
+
// a ~3-min poll loop on a shared channel (e.g. #echelon). To stay coordinated without a
|
|
1059
|
+
// server, each Legate persists its own little state file keyed by NATO call-sign:
|
|
1060
|
+
// ~/.mcp-slack/legate-state/<callSign>.json (dir 0700, file 0600)
|
|
1061
|
+
// { cursors: { [channelId]: lastSeenTs }, checkins: { [channelId]: { status, ts } } }
|
|
1062
|
+
// Keying by call-sign means 5 sessions sharing one $HOME never clobber each other.
|
|
1063
|
+
// =====================================================================================
|
|
1064
|
+
// Full NATO phonetic alphabet — the universe of known call-signs.
|
|
1065
|
+
static NATO_CALL_SIGNS = [
|
|
1066
|
+
"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel",
|
|
1067
|
+
"India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa",
|
|
1068
|
+
"Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey",
|
|
1069
|
+
"Xray", "Yankee", "Zulu"
|
|
1070
|
+
];
|
|
1071
|
+
legateStateDir() {
|
|
1072
|
+
return path.join(os.homedir(), ".mcp-slack", "legate-state");
|
|
1073
|
+
}
|
|
1074
|
+
// Sanitize a call-sign down to a safe filename stem ([A-Za-z0-9_-]).
|
|
1075
|
+
sanitizeCallSign(callSign) {
|
|
1076
|
+
const clean = String(callSign).replace(/[^A-Za-z0-9_-]/g, "");
|
|
1077
|
+
if (!clean)
|
|
1078
|
+
throw new Error(`Invalid call_sign "${callSign}" — must contain [A-Za-z0-9_-] characters.`);
|
|
1079
|
+
return clean;
|
|
1080
|
+
}
|
|
1081
|
+
// Read this Legate's state. A missing file is normal (first run) → empty state.
|
|
1082
|
+
async loadLegateState(callSign) {
|
|
1083
|
+
const file = path.join(this.legateStateDir(), `${this.sanitizeCallSign(callSign)}.json`);
|
|
1084
|
+
try {
|
|
1085
|
+
const raw = await fs.readFile(file, "utf8");
|
|
1086
|
+
const parsed = JSON.parse(raw);
|
|
1087
|
+
return {
|
|
1088
|
+
cursors: (parsed && typeof parsed.cursors === "object" && parsed.cursors) || {},
|
|
1089
|
+
checkins: (parsed && typeof parsed.checkins === "object" && parsed.checkins) || {}
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
catch {
|
|
1093
|
+
return { cursors: {}, checkins: {} };
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
async saveLegateState(callSign, state) {
|
|
1097
|
+
const dir = this.legateStateDir();
|
|
1098
|
+
await fs.mkdir(dir, { recursive: true });
|
|
1099
|
+
try {
|
|
1100
|
+
await fs.chmod(dir, 0o700);
|
|
1101
|
+
}
|
|
1102
|
+
catch { /* best-effort */ }
|
|
1103
|
+
const file = path.join(dir, `${this.sanitizeCallSign(callSign)}.json`);
|
|
1104
|
+
await fs.writeFile(file, JSON.stringify(state), { mode: 0o600 });
|
|
1105
|
+
try {
|
|
1106
|
+
await fs.chmod(file, 0o600);
|
|
1107
|
+
}
|
|
1108
|
+
catch { /* best-effort */ }
|
|
1109
|
+
}
|
|
1110
|
+
// Compare two Slack ts strings (e.g. "1700000000.000100") numerically.
|
|
1111
|
+
tsGreater(a, b) {
|
|
1112
|
+
return parseFloat(a) > parseFloat(b);
|
|
1113
|
+
}
|
|
1114
|
+
// Build a case-insensitive word-boundary matcher for a single token. Slack ts are
|
|
1115
|
+
// dotted decimals so we hand-roll the boundary to treat letters/digits as word chars.
|
|
1116
|
+
mentionsToken(text, token) {
|
|
1117
|
+
const esc = token.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1118
|
+
// boundary: start/non-word before, and ":"/","/"."/whitespace/non-word/end after.
|
|
1119
|
+
const re = new RegExp(`(^|[^A-Za-z0-9])(?:legate\\s+|@)?${esc}(?=$|[^A-Za-z0-9])`, "i");
|
|
1120
|
+
return re.test(text);
|
|
1121
|
+
}
|
|
1122
|
+
// Classify a message's addressing relative to `self`. First match wins.
|
|
1123
|
+
classifyAddressing(text, self) {
|
|
1124
|
+
const t = text || "";
|
|
1125
|
+
const selfNorm = self.toLowerCase();
|
|
1126
|
+
// to_me: self call-sign as a word (optionally "Legate "/"@" prefixed, ":"/"," suffix OK).
|
|
1127
|
+
if (this.mentionsToken(t, self))
|
|
1128
|
+
return "to_me";
|
|
1129
|
+
// to_all: broadcast phrases / Slack here|channel.
|
|
1130
|
+
const lower = t.toLowerCase();
|
|
1131
|
+
if (/all\s+legates/.test(lower) ||
|
|
1132
|
+
/all\s+agents/.test(lower) ||
|
|
1133
|
+
/\beveryone\b/.test(lower) ||
|
|
1134
|
+
/<!here>/.test(t) ||
|
|
1135
|
+
/<!channel>/.test(t)) {
|
|
1136
|
+
return "to_all";
|
|
1137
|
+
}
|
|
1138
|
+
// whoever_first: open call for any available Legate.
|
|
1139
|
+
if (/\bwhoever\b/.test(lower) ||
|
|
1140
|
+
/\banyone\b/.test(lower) ||
|
|
1141
|
+
/first\s+come/.test(lower)) {
|
|
1142
|
+
return "whoever_first";
|
|
1143
|
+
}
|
|
1144
|
+
// to_other:<Name>: another known call-sign addressed (not self).
|
|
1145
|
+
for (const cs of SlackerV3Server.NATO_CALL_SIGNS) {
|
|
1146
|
+
if (cs.toLowerCase() === selfNorm)
|
|
1147
|
+
continue;
|
|
1148
|
+
if (this.mentionsToken(t, cs))
|
|
1149
|
+
return `to_other:${cs}`;
|
|
1150
|
+
}
|
|
1151
|
+
return "chatter";
|
|
1152
|
+
}
|
|
1153
|
+
// Heuristic: does this message look self-authored by `self`? Used to EXCLUDE a Legate's
|
|
1154
|
+
// own posts from its actionable set (it must not re-process what it just said).
|
|
1155
|
+
looksSelfAuthored(text, self) {
|
|
1156
|
+
const t = (text || "").trim();
|
|
1157
|
+
if (!t)
|
|
1158
|
+
return false;
|
|
1159
|
+
const esc = self.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1160
|
+
// Sign-off near the end: "— Legate <self>" (em or double-dash), tolerant of trailing punctuation.
|
|
1161
|
+
if (new RegExp(`(—|--)\\s*legate\\s+${esc}\\b`, "i").test(t))
|
|
1162
|
+
return true;
|
|
1163
|
+
// Leads with the call-sign as a speaker label: "<self> " / "<self>:" / "<self> ·".
|
|
1164
|
+
if (new RegExp(`^${esc}(:|\\s+·|\\s)`, "i").test(t))
|
|
1165
|
+
return true;
|
|
1166
|
+
// Check-in pattern this server emits: ":repeat: <self>:".
|
|
1167
|
+
if (new RegExp(`:repeat:\\s*${esc}:`, "i").test(t))
|
|
1168
|
+
return true;
|
|
1169
|
+
return false;
|
|
1170
|
+
}
|
|
1171
|
+
async slackPoll(args) {
|
|
1172
|
+
const validatedArgs = PollArgsSchema.parse(args);
|
|
1173
|
+
const client = await this.getActiveClient();
|
|
1174
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1175
|
+
const callSign = validatedArgs.call_sign;
|
|
1176
|
+
const limit = validatedArgs.limit ?? 15;
|
|
1177
|
+
const includeChatter = validatedArgs.include_chatter ?? false;
|
|
1178
|
+
const state = await this.loadLegateState(callSign);
|
|
1179
|
+
const storedCursor = state.cursors[channelId];
|
|
1180
|
+
// First poll anchors to "now": with no stored cursor and no explicit `since`,
|
|
1181
|
+
// don't surface stale backlog. Anchor the cursor to now and start watching forward.
|
|
1182
|
+
if (!storedCursor && !validatedArgs.since) {
|
|
1183
|
+
const anchoredTs = (Date.now() / 1000).toFixed(6);
|
|
1184
|
+
state.cursors[channelId] = anchoredTs;
|
|
1185
|
+
await this.saveLegateState(callSign, state);
|
|
1186
|
+
return {
|
|
1187
|
+
content: [{
|
|
1188
|
+
type: "text",
|
|
1189
|
+
text: leanResult({
|
|
1190
|
+
new_count: 0,
|
|
1191
|
+
actionable_count: 0,
|
|
1192
|
+
skipped_count: 0,
|
|
1193
|
+
first_poll: true,
|
|
1194
|
+
anchored_ts: anchoredTs,
|
|
1195
|
+
latest_ts: anchoredTs,
|
|
1196
|
+
messages: []
|
|
1197
|
+
})
|
|
1198
|
+
}]
|
|
1199
|
+
};
|
|
1200
|
+
}
|
|
1201
|
+
// Cursor precedence: explicit `since` arg overrides the stored cursor.
|
|
1202
|
+
const cursor = validatedArgs.since ?? storedCursor;
|
|
1203
|
+
const histArgs = { channel: channelId, limit };
|
|
1204
|
+
if (cursor)
|
|
1205
|
+
histArgs.oldest = cursor;
|
|
1206
|
+
const result = await client.conversations.history(histArgs);
|
|
1207
|
+
const all = result.messages || [];
|
|
1208
|
+
// Only messages STRICTLY newer than the cursor (oldest= is inclusive of the cursor ts).
|
|
1209
|
+
const fresh = cursor ? all.filter((m) => m.ts && this.tsGreater(m.ts, cursor)) : all;
|
|
1210
|
+
let newestTs = cursor;
|
|
1211
|
+
for (const m of fresh) {
|
|
1212
|
+
if (m.ts && (!newestTs || this.tsGreater(m.ts, newestTs)))
|
|
1213
|
+
newestTs = m.ts;
|
|
1214
|
+
}
|
|
1215
|
+
const actionable = [];
|
|
1216
|
+
let skipped = 0;
|
|
1217
|
+
for (const m of fresh) {
|
|
1218
|
+
const text = m.text || "";
|
|
1219
|
+
// A Legate must never re-process its own posts.
|
|
1220
|
+
if (this.looksSelfAuthored(text, callSign)) {
|
|
1221
|
+
skipped++;
|
|
1222
|
+
continue;
|
|
1223
|
+
}
|
|
1224
|
+
const addressed = this.classifyAddressing(text, callSign);
|
|
1225
|
+
if (!includeChatter && addressed === "chatter") {
|
|
1226
|
+
skipped++;
|
|
1227
|
+
continue;
|
|
1228
|
+
}
|
|
1229
|
+
actionable.push({ ts: m.ts ?? "", user: m.user ?? "", text, addressed });
|
|
1230
|
+
}
|
|
1231
|
+
// Advance the cursor past EVERYTHING seen this poll (including skipped/chatter) so we
|
|
1232
|
+
// never re-scan them. Save even when nothing was actionable.
|
|
1233
|
+
if (newestTs) {
|
|
1234
|
+
state.cursors[channelId] = newestTs;
|
|
1235
|
+
await this.saveLegateState(callSign, state);
|
|
1236
|
+
}
|
|
1237
|
+
return {
|
|
1238
|
+
content: [{
|
|
1239
|
+
type: "text",
|
|
1240
|
+
text: leanResult({
|
|
1241
|
+
new_count: fresh.length,
|
|
1242
|
+
actionable_count: actionable.length,
|
|
1243
|
+
skipped_count: skipped,
|
|
1244
|
+
latest_ts: newestTs ?? null,
|
|
1245
|
+
messages: actionable
|
|
1246
|
+
})
|
|
1247
|
+
}]
|
|
1248
|
+
};
|
|
1249
|
+
}
|
|
1250
|
+
// Normalize free-text task → a stable lane key: lowercase, trimmed, non-alphanumeric
|
|
1251
|
+
// runs collapsed to a single "-", no leading/trailing "-".
|
|
1252
|
+
laneKey(task) {
|
|
1253
|
+
return String(task)
|
|
1254
|
+
.toLowerCase()
|
|
1255
|
+
.trim()
|
|
1256
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
1257
|
+
.replace(/^-+|-+$/g, "");
|
|
1258
|
+
}
|
|
1259
|
+
// Parse a standardized LANE CLAIM line. Returns the claiming call-sign + lane key, or null.
|
|
1260
|
+
parseLaneClaim(text) {
|
|
1261
|
+
const m = (text || "").match(/LANE CLAIM — Legate\s+([A-Za-z0-9_-]+)\s+taking:.*\[lane:([a-z0-9-]+)\]/);
|
|
1262
|
+
if (!m)
|
|
1263
|
+
return null;
|
|
1264
|
+
return { callSign: m[1], laneKey: m[2] };
|
|
1265
|
+
}
|
|
1266
|
+
async slackClaimLane(args) {
|
|
1267
|
+
const validatedArgs = ClaimLaneArgsSchema.parse(args);
|
|
1268
|
+
const client = await this.getActiveClient();
|
|
1269
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1270
|
+
const callSign = validatedArgs.call_sign;
|
|
1271
|
+
const task = validatedArgs.task;
|
|
1272
|
+
const ttlMinutes = validatedArgs.ttl_minutes ?? 20;
|
|
1273
|
+
const lookback = validatedArgs.lookback ?? 30;
|
|
1274
|
+
const laneKey = this.laneKey(task);
|
|
1275
|
+
if (validatedArgs.release === true) {
|
|
1276
|
+
await client.chat.postMessage({
|
|
1277
|
+
channel: channelId,
|
|
1278
|
+
text: `:checkered_flag: LANE RELEASE — Legate ${callSign} released: ${task} [lane:${laneKey}]`,
|
|
1279
|
+
mrkdwn: true,
|
|
1280
|
+
...this.identityOverrides(args)
|
|
1281
|
+
});
|
|
1282
|
+
return { content: [{ type: "text", text: leanResult({ released: true, lane_key: laneKey }) }] };
|
|
1283
|
+
}
|
|
1284
|
+
const ttlSeconds = ttlMinutes * 60;
|
|
1285
|
+
const nowSec = Date.now() / 1000;
|
|
1286
|
+
// Find the most-recent UNEXPIRED claim on this lane by ANOTHER call-sign.
|
|
1287
|
+
const findActiveOther = (messages, beforeTs) => {
|
|
1288
|
+
let hit = null;
|
|
1289
|
+
for (const m of messages) {
|
|
1290
|
+
const parsed = this.parseLaneClaim(m.text || "");
|
|
1291
|
+
if (!parsed || parsed.laneKey !== laneKey)
|
|
1292
|
+
continue;
|
|
1293
|
+
if (parsed.callSign === callSign)
|
|
1294
|
+
continue;
|
|
1295
|
+
const claimTs = m.ts;
|
|
1296
|
+
if (nowSec - parseFloat(claimTs) >= ttlSeconds)
|
|
1297
|
+
continue; // expired
|
|
1298
|
+
if (beforeTs && !this.tsGreater(beforeTs, claimTs))
|
|
1299
|
+
continue; // only earlier-than-mine
|
|
1300
|
+
if (!hit || this.tsGreater(claimTs, hit.claim_ts)) {
|
|
1301
|
+
hit = { claimed_by: parsed.callSign, claim_ts: claimTs };
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
return hit;
|
|
1305
|
+
};
|
|
1306
|
+
const pre = await client.conversations.history({ channel: channelId, limit: lookback });
|
|
1307
|
+
const preMsgs = pre.messages || [];
|
|
1308
|
+
const existing = findActiveOther(preMsgs);
|
|
1309
|
+
if (existing) {
|
|
1310
|
+
// Someone else already holds this lane — don't pile on.
|
|
1311
|
+
return {
|
|
1312
|
+
content: [{
|
|
1313
|
+
type: "text",
|
|
1314
|
+
text: leanResult({ granted: false, claimed_by: existing.claimed_by, claim_ts: existing.claim_ts, lane_key: laneKey })
|
|
1315
|
+
}]
|
|
1316
|
+
};
|
|
1317
|
+
}
|
|
1318
|
+
// Post our claim and capture its ts.
|
|
1319
|
+
const posted = await client.chat.postMessage({
|
|
1320
|
+
channel: channelId,
|
|
1321
|
+
text: `:triangular_flag_on_post: LANE CLAIM — Legate ${callSign} taking: ${task} [lane:${laneKey}]`,
|
|
1322
|
+
mrkdwn: true,
|
|
1323
|
+
...this.identityOverrides(args)
|
|
1324
|
+
});
|
|
1325
|
+
const myClaimTs = posted.ts;
|
|
1326
|
+
// Re-read once and check for any OTHER unexpired claim with ts < ours (we lost the race).
|
|
1327
|
+
const post = await client.conversations.history({ channel: channelId, limit: lookback });
|
|
1328
|
+
const earlier = findActiveOther(post.messages || [], myClaimTs);
|
|
1329
|
+
if (earlier) {
|
|
1330
|
+
return {
|
|
1331
|
+
content: [{
|
|
1332
|
+
type: "text",
|
|
1333
|
+
text: leanResult({ granted: false, yielded: true, claimed_by: earlier.claimed_by, claim_ts: earlier.claim_ts, my_claim_ts: myClaimTs, lane_key: laneKey })
|
|
1334
|
+
}]
|
|
1335
|
+
};
|
|
1336
|
+
}
|
|
1337
|
+
return { content: [{ type: "text", text: leanResult({ granted: true, claim_ts: myClaimTs, lane_key: laneKey }) }] };
|
|
1338
|
+
}
|
|
1339
|
+
async slackCheckin(args) {
|
|
1340
|
+
const validatedArgs = CheckinArgsSchema.parse(args);
|
|
1341
|
+
const client = await this.getActiveClient();
|
|
1342
|
+
const channelId = await this.resolveRecipient(validatedArgs.channel, client);
|
|
1343
|
+
const callSign = validatedArgs.call_sign;
|
|
1344
|
+
const status = validatedArgs.status;
|
|
1345
|
+
const force = validatedArgs.force ?? false;
|
|
1346
|
+
const heartbeatMinutes = validatedArgs.heartbeat_minutes ?? 0;
|
|
1347
|
+
const state = await this.loadLegateState(callSign);
|
|
1348
|
+
const prev = state.checkins[channelId];
|
|
1349
|
+
if (!force && prev && prev.status === status) {
|
|
1350
|
+
const heartbeatDue = heartbeatMinutes > 0 && (Date.now() / 1000 - parseFloat(prev.ts)) >= heartbeatMinutes * 60;
|
|
1351
|
+
if (!heartbeatDue) {
|
|
1352
|
+
return { content: [{ type: "text", text: leanResult({ posted: false, suppressed: true, reason: "unchanged" }) }] };
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
const posted = await client.chat.postMessage({
|
|
1356
|
+
channel: channelId,
|
|
1357
|
+
text: `:repeat: ${callSign}: ${status}`,
|
|
1358
|
+
mrkdwn: true,
|
|
1359
|
+
...this.identityOverrides(args)
|
|
1360
|
+
});
|
|
1361
|
+
const ts = posted.ts;
|
|
1362
|
+
state.checkins[channelId] = { status, ts };
|
|
1363
|
+
await this.saveLegateState(callSign, state);
|
|
1364
|
+
return { content: [{ type: "text", text: leanResult({ posted: true, ts }) }] };
|
|
1365
|
+
}
|
|
1129
1366
|
async slackGetChannelHistory(args) {
|
|
1130
1367
|
const validatedArgs = GetChannelHistoryArgsSchema.parse(args);
|
|
1131
1368
|
const client = await this.getActiveClient();
|
|
1369
|
+
const limit = validatedArgs.limit || 100;
|
|
1132
1370
|
const result = await client.conversations.history({
|
|
1133
1371
|
channel: validatedArgs.channel,
|
|
1134
|
-
limit
|
|
1372
|
+
limit
|
|
1135
1373
|
});
|
|
1136
|
-
const
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1374
|
+
const allMessages = result.messages || [];
|
|
1375
|
+
// VERBOSE: hand back the raw API payload verbatim — the firehose is one call away.
|
|
1376
|
+
if (validatedArgs.verbose) {
|
|
1377
|
+
return {
|
|
1378
|
+
content: [{ type: "text", text: JSON.stringify(allMessages, null, 2) }]
|
|
1379
|
+
};
|
|
1380
|
+
}
|
|
1381
|
+
// LEAN: keep message TEXT verbatim (never clipped), strip only the metadata
|
|
1382
|
+
// exhaust (reactions blobs, edited markers, block JSON, etc.). The only count
|
|
1383
|
+
// reduction is the item cap, which is surfaced in a footer so nothing is silently lost.
|
|
1384
|
+
const lean = allMessages.map(msg => ({
|
|
1385
|
+
user: msg.user,
|
|
1386
|
+
text: msg.text, // verbatim, character-for-character
|
|
1387
|
+
ts: msg.ts,
|
|
1388
|
+
...(msg.reply_count ? { reply_count: msg.reply_count } : {})
|
|
1389
|
+
}));
|
|
1148
1390
|
return {
|
|
1149
1391
|
content: [
|
|
1150
1392
|
{
|
|
1151
1393
|
type: "text",
|
|
1152
|
-
text:
|
|
1394
|
+
text: leanResult(lean) + this.moreFooter(lean.length, allMessages.length, limit)
|
|
1153
1395
|
}
|
|
1154
1396
|
]
|
|
1155
1397
|
};
|
|
1156
1398
|
}
|
|
1399
|
+
// Trailing footer surfaced whenever a lean result capped the item count, so the
|
|
1400
|
+
// caller knows more data is available and how to get it. Returns "" when nothing
|
|
1401
|
+
// was capped.
|
|
1402
|
+
moreFooter(shown, total, limit) {
|
|
1403
|
+
if (total > shown || shown >= limit) {
|
|
1404
|
+
return `\n(showing ${shown}${total > shown ? ` of ${total}` : ""} — pass verbose:true or a higher limit/cursor for the rest)`;
|
|
1405
|
+
}
|
|
1406
|
+
return "";
|
|
1407
|
+
}
|
|
1157
1408
|
async slackAddReaction(args) {
|
|
1158
1409
|
const validatedArgs = AddReactionArgsSchema.parse(args);
|
|
1159
1410
|
const client = await this.getActiveClient();
|
|
@@ -1174,25 +1425,38 @@ class SlackerV3Server {
|
|
|
1174
1425
|
async slackListUsers(args) {
|
|
1175
1426
|
const validatedArgs = ListUsersArgsSchema.parse(args);
|
|
1176
1427
|
const client = await this.getActiveClient();
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
const
|
|
1428
|
+
// Fully paginated + cached so we don't under-report past page 1.
|
|
1429
|
+
const allUsers = await this.getAllUsersCached(client);
|
|
1430
|
+
const limit = validatedArgs.limit || 100;
|
|
1431
|
+
const slice = allUsers.slice(0, limit);
|
|
1432
|
+
// VERBOSE: full raw user objects for the capped slice.
|
|
1433
|
+
if (validatedArgs.verbose) {
|
|
1434
|
+
const full = slice.map(user => ({
|
|
1435
|
+
id: user.id,
|
|
1436
|
+
name: user.name,
|
|
1437
|
+
real_name: user.real_name,
|
|
1438
|
+
display_name: user.profile?.display_name,
|
|
1439
|
+
email: user.profile?.email,
|
|
1440
|
+
is_admin: user.is_admin,
|
|
1441
|
+
is_owner: user.is_owner,
|
|
1442
|
+
status_text: user.profile?.status_text,
|
|
1443
|
+
status_emoji: user.profile?.status_emoji
|
|
1444
|
+
}));
|
|
1445
|
+
return {
|
|
1446
|
+
content: [{ type: "text", text: JSON.stringify(full, null, 2) + this.moreFooter(slice.length, allUsers.length, limit) }]
|
|
1447
|
+
};
|
|
1448
|
+
}
|
|
1449
|
+
// LEAN: just the essential identity fields.
|
|
1450
|
+
const users = slice.map(user => ({
|
|
1181
1451
|
id: user.id,
|
|
1182
1452
|
name: user.name,
|
|
1183
|
-
real_name: user.real_name
|
|
1184
|
-
|
|
1185
|
-
email: user.profile?.email,
|
|
1186
|
-
is_admin: user.is_admin,
|
|
1187
|
-
is_owner: user.is_owner,
|
|
1188
|
-
status_text: user.profile?.status_text,
|
|
1189
|
-
status_emoji: user.profile?.status_emoji
|
|
1190
|
-
})) || [];
|
|
1453
|
+
real_name: user.real_name
|
|
1454
|
+
}));
|
|
1191
1455
|
return {
|
|
1192
1456
|
content: [
|
|
1193
1457
|
{
|
|
1194
1458
|
type: "text",
|
|
1195
|
-
text:
|
|
1459
|
+
text: leanResult(users) + this.moreFooter(slice.length, allUsers.length, limit)
|
|
1196
1460
|
}
|
|
1197
1461
|
]
|
|
1198
1462
|
};
|
|
@@ -1200,15 +1464,16 @@ class SlackerV3Server {
|
|
|
1200
1464
|
async slackGetUserByName(args) {
|
|
1201
1465
|
const validatedArgs = GetUserByNameArgsSchema.parse(args);
|
|
1202
1466
|
const client = await this.getActiveClient();
|
|
1203
|
-
|
|
1467
|
+
// Cached + fully paginated so we don't miss users past page 1.
|
|
1468
|
+
const activeMembers = await this.getAllUsersCached(client);
|
|
1204
1469
|
const searchTerm = validatedArgs.name.toLowerCase();
|
|
1205
|
-
// First try
|
|
1206
|
-
let user =
|
|
1470
|
+
// First try (substring) match
|
|
1471
|
+
let user = activeMembers.find(u => u.name?.toLowerCase().includes(searchTerm) ||
|
|
1207
1472
|
u.real_name?.toLowerCase().includes(searchTerm) ||
|
|
1208
|
-
u.profile?.display_name?.toLowerCase().includes(searchTerm))
|
|
1209
|
-
// If no
|
|
1473
|
+
u.profile?.display_name?.toLowerCase().includes(searchTerm));
|
|
1474
|
+
// If no match, use fuzzy matching
|
|
1210
1475
|
if (!user) {
|
|
1211
|
-
const activeUsers =
|
|
1476
|
+
const activeUsers = activeMembers;
|
|
1212
1477
|
// Prepare data for fuzzy search
|
|
1213
1478
|
const searchableUsers = activeUsers.map(u => ({
|
|
1214
1479
|
...u,
|
|
@@ -1325,27 +1590,39 @@ class SlackerV3Server {
|
|
|
1325
1590
|
count: validatedArgs.count || 20,
|
|
1326
1591
|
page: validatedArgs.page || 1
|
|
1327
1592
|
});
|
|
1328
|
-
|
|
1593
|
+
// VERBOSE: raw search payload.
|
|
1594
|
+
if (validatedArgs.verbose) {
|
|
1595
|
+
return {
|
|
1596
|
+
content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
|
|
1597
|
+
};
|
|
1598
|
+
}
|
|
1599
|
+
// LEAN: verbatim text + essential locator fields. Text is never clipped.
|
|
1600
|
+
const matches = result.messages?.matches || [];
|
|
1601
|
+
const messages = matches.map(msg => ({
|
|
1329
1602
|
text: msg.text,
|
|
1330
1603
|
user: msg.user,
|
|
1331
1604
|
channel: msg.channel?.name,
|
|
1332
1605
|
channel_id: msg.channel?.id,
|
|
1333
|
-
|
|
1606
|
+
ts: msg.ts,
|
|
1334
1607
|
permalink: msg.permalink
|
|
1335
|
-
}))
|
|
1608
|
+
}));
|
|
1609
|
+
const total = result.messages?.total || matches.length;
|
|
1336
1610
|
return {
|
|
1337
1611
|
content: [
|
|
1338
1612
|
{
|
|
1339
1613
|
type: "text",
|
|
1340
|
-
text:
|
|
1341
|
-
total: result.messages?.total || 0,
|
|
1342
|
-
pagination: result.messages?.pagination,
|
|
1343
|
-
messages: messages
|
|
1344
|
-
}, null, 2)
|
|
1614
|
+
text: leanResult(messages) + this.searchFooter(messages.length, total)
|
|
1345
1615
|
}
|
|
1346
1616
|
]
|
|
1347
1617
|
};
|
|
1348
1618
|
}
|
|
1619
|
+
// Footer for search tools where `total` is Slack's reported match total.
|
|
1620
|
+
searchFooter(shown, total) {
|
|
1621
|
+
if (total > shown) {
|
|
1622
|
+
return `\n(showing ${shown} of ${total} — pass verbose:true or a higher count/page for more)`;
|
|
1623
|
+
}
|
|
1624
|
+
return "";
|
|
1625
|
+
}
|
|
1349
1626
|
async slackSearchByUser(args) {
|
|
1350
1627
|
const validatedArgs = SearchByUserArgsSchema.parse(args);
|
|
1351
1628
|
const client = await this.getActiveUserClient();
|
|
@@ -1357,21 +1634,25 @@ class SlackerV3Server {
|
|
|
1357
1634
|
query: query,
|
|
1358
1635
|
count: validatedArgs.count || 20
|
|
1359
1636
|
});
|
|
1360
|
-
|
|
1637
|
+
if (validatedArgs.verbose) {
|
|
1638
|
+
return {
|
|
1639
|
+
content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
|
|
1640
|
+
};
|
|
1641
|
+
}
|
|
1642
|
+
const matches = result.messages?.matches || [];
|
|
1643
|
+
const messages = matches.map(msg => ({
|
|
1361
1644
|
text: msg.text,
|
|
1362
1645
|
channel: msg.channel?.name,
|
|
1363
1646
|
channel_id: msg.channel?.id,
|
|
1364
|
-
|
|
1647
|
+
ts: msg.ts,
|
|
1365
1648
|
permalink: msg.permalink
|
|
1366
|
-
}))
|
|
1649
|
+
}));
|
|
1650
|
+
const total = result.messages?.total || matches.length;
|
|
1367
1651
|
return {
|
|
1368
1652
|
content: [
|
|
1369
1653
|
{
|
|
1370
1654
|
type: "text",
|
|
1371
|
-
text:
|
|
1372
|
-
total: result.messages?.total || 0,
|
|
1373
|
-
messages: messages
|
|
1374
|
-
}, null, 2)
|
|
1655
|
+
text: leanResult(messages) + this.searchFooter(messages.length, total)
|
|
1375
1656
|
}
|
|
1376
1657
|
]
|
|
1377
1658
|
};
|
|
@@ -1387,26 +1668,27 @@ class SlackerV3Server {
|
|
|
1387
1668
|
query: query,
|
|
1388
1669
|
count: validatedArgs.count || 20
|
|
1389
1670
|
});
|
|
1390
|
-
|
|
1671
|
+
if (validatedArgs.verbose) {
|
|
1672
|
+
return {
|
|
1673
|
+
content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
|
|
1674
|
+
};
|
|
1675
|
+
}
|
|
1676
|
+
const matches = result.messages?.matches || [];
|
|
1677
|
+
const messages = matches.map(msg => ({
|
|
1391
1678
|
text: msg.text,
|
|
1392
1679
|
user: msg.user,
|
|
1393
1680
|
channel: msg.channel?.name,
|
|
1394
1681
|
channel_id: msg.channel?.id,
|
|
1395
|
-
|
|
1682
|
+
ts: msg.ts,
|
|
1396
1683
|
permalink: msg.permalink
|
|
1397
|
-
}))
|
|
1684
|
+
}));
|
|
1685
|
+
const total = result.messages?.total || matches.length;
|
|
1398
1686
|
return {
|
|
1399
1687
|
content: [
|
|
1400
1688
|
{
|
|
1401
1689
|
type: "text",
|
|
1402
|
-
text:
|
|
1403
|
-
|
|
1404
|
-
date_range: {
|
|
1405
|
-
from: validatedArgs.from_date,
|
|
1406
|
-
to: validatedArgs.to_date
|
|
1407
|
-
},
|
|
1408
|
-
messages: messages
|
|
1409
|
-
}, null, 2)
|
|
1690
|
+
text: `${validatedArgs.from_date}..${validatedArgs.to_date}\n` +
|
|
1691
|
+
leanResult(messages) + this.searchFooter(messages.length, total)
|
|
1410
1692
|
}
|
|
1411
1693
|
]
|
|
1412
1694
|
};
|
|
@@ -1589,7 +1871,8 @@ class SlackerV3Server {
|
|
|
1589
1871
|
const result = await client.chat.postMessage({
|
|
1590
1872
|
channel: validatedArgs.channel,
|
|
1591
1873
|
blocks: validatedArgs.blocks,
|
|
1592
|
-
text: validatedArgs.text || "Formatted message"
|
|
1874
|
+
text: validatedArgs.text || "Formatted message",
|
|
1875
|
+
...this.identityOverrides(args)
|
|
1593
1876
|
});
|
|
1594
1877
|
return {
|
|
1595
1878
|
content: [
|
|
@@ -1707,23 +1990,43 @@ class SlackerV3Server {
|
|
|
1707
1990
|
async slackBulkForwardMessages(args) {
|
|
1708
1991
|
const validatedArgs = BulkForwardMessagesArgsSchema.parse(args);
|
|
1709
1992
|
const client = await this.getActiveClient();
|
|
1710
|
-
//
|
|
1711
|
-
const
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
});
|
|
1719
|
-
if (history.messages?.[0]) {
|
|
1720
|
-
messages.push(history.messages[0]);
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1993
|
+
// Fetch all source messages in parallel (was a serial N+1 loop).
|
|
1994
|
+
const histories = await Promise.all(validatedArgs.timestamps.map(timestamp => client.conversations.history({
|
|
1995
|
+
channel: validatedArgs.source_channel,
|
|
1996
|
+
latest: timestamp,
|
|
1997
|
+
limit: 1,
|
|
1998
|
+
inclusive: true
|
|
1999
|
+
}).then(h => h.messages?.[0]).catch(() => undefined)));
|
|
2000
|
+
const messages = histories.filter((m) => !!m);
|
|
1723
2001
|
if (messages.length === 0) {
|
|
1724
2002
|
throw new Error("No messages found to forward");
|
|
1725
2003
|
}
|
|
1726
|
-
//
|
|
2004
|
+
// Resolve each distinct user ID exactly once (was resolved per-message-per-target).
|
|
2005
|
+
const userIds = new Set();
|
|
2006
|
+
for (const msg of messages) {
|
|
2007
|
+
if (msg.user)
|
|
2008
|
+
userIds.add(msg.user);
|
|
2009
|
+
}
|
|
2010
|
+
const userNames = new Map();
|
|
2011
|
+
await Promise.all(Array.from(userIds).map(async (uid) => {
|
|
2012
|
+
try {
|
|
2013
|
+
const userInfo = await client.users.info({ user: uid });
|
|
2014
|
+
userNames.set(uid, userInfo.user?.real_name || userInfo.user?.name || "Unknown User");
|
|
2015
|
+
}
|
|
2016
|
+
catch {
|
|
2017
|
+
userNames.set(uid, "Unknown User");
|
|
2018
|
+
}
|
|
2019
|
+
}));
|
|
2020
|
+
// Build the combined message body once from the resolved name map.
|
|
2021
|
+
let body = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
|
|
2022
|
+
if (validatedArgs.comment) {
|
|
2023
|
+
body = `${validatedArgs.comment}\n\n${body}`;
|
|
2024
|
+
}
|
|
2025
|
+
for (const msg of messages) {
|
|
2026
|
+
const userName = (msg.user && userNames.get(msg.user)) || "Unknown User";
|
|
2027
|
+
body += `>>> *${userName}*: ${msg.text}\n\n`;
|
|
2028
|
+
}
|
|
2029
|
+
// Forward to each target channel.
|
|
1727
2030
|
const results = {
|
|
1728
2031
|
successful: 0,
|
|
1729
2032
|
failed: 0,
|
|
@@ -1731,27 +2034,9 @@ class SlackerV3Server {
|
|
|
1731
2034
|
};
|
|
1732
2035
|
for (const targetChannel of validatedArgs.target_channels) {
|
|
1733
2036
|
try {
|
|
1734
|
-
// Combine all messages into one
|
|
1735
|
-
let combinedText = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
|
|
1736
|
-
if (validatedArgs.comment) {
|
|
1737
|
-
combinedText = `${validatedArgs.comment}\n\n${combinedText}`;
|
|
1738
|
-
}
|
|
1739
|
-
for (const msg of messages) {
|
|
1740
|
-
let userName = "Unknown User";
|
|
1741
|
-
if (msg.user) {
|
|
1742
|
-
try {
|
|
1743
|
-
const userInfo = await client.users.info({ user: msg.user });
|
|
1744
|
-
userName = userInfo.user?.real_name || userInfo.user?.name || "Unknown User";
|
|
1745
|
-
}
|
|
1746
|
-
catch {
|
|
1747
|
-
// Ignore user lookup errors
|
|
1748
|
-
}
|
|
1749
|
-
}
|
|
1750
|
-
combinedText += `>>> *${userName}*: ${msg.text}\n\n`;
|
|
1751
|
-
}
|
|
1752
2037
|
await client.chat.postMessage({
|
|
1753
2038
|
channel: targetChannel,
|
|
1754
|
-
text:
|
|
2039
|
+
text: body
|
|
1755
2040
|
});
|
|
1756
2041
|
results.successful++;
|
|
1757
2042
|
}
|
|
@@ -1802,37 +2087,36 @@ class SlackerV3Server {
|
|
|
1802
2087
|
]
|
|
1803
2088
|
};
|
|
1804
2089
|
}
|
|
1805
|
-
async slackGetWorkspaceStats() {
|
|
2090
|
+
async slackGetWorkspaceStats(args) {
|
|
2091
|
+
const validatedArgs = GetWorkspaceStatsArgsSchema.parse(args ?? {});
|
|
1806
2092
|
const client = await this.getActiveClient();
|
|
1807
2093
|
// Get team info
|
|
1808
2094
|
const teamInfo = await client.team.info();
|
|
1809
|
-
// Get user count
|
|
1810
|
-
const
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
const
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
},
|
|
1826
|
-
stats: {
|
|
1827
|
-
total_users: activeUsers.length,
|
|
1828
|
-
total_channels: channels.channels?.length || 0,
|
|
1829
|
-
admins: activeUsers.filter(u => u.is_admin).length,
|
|
1830
|
-
owners: activeUsers.filter(u => u.is_owner).length
|
|
1831
|
-
}
|
|
1832
|
-
}, null, 2)
|
|
1833
|
-
}
|
|
1834
|
-
]
|
|
2095
|
+
// Get user count (fully paginated + cached so we don't under-report)
|
|
2096
|
+
const activeUsers = await this.getAllUsersCached(client);
|
|
2097
|
+
// Get channel count (fully paginated + cached)
|
|
2098
|
+
const channels = await this.getAllChannelsCached(client);
|
|
2099
|
+
const stats = {
|
|
2100
|
+
team: {
|
|
2101
|
+
name: teamInfo.team?.name,
|
|
2102
|
+
domain: teamInfo.team?.domain,
|
|
2103
|
+
email_domain: teamInfo.team?.email_domain
|
|
2104
|
+
},
|
|
2105
|
+
stats: {
|
|
2106
|
+
total_users: activeUsers.length,
|
|
2107
|
+
total_channels: channels.length || 0,
|
|
2108
|
+
admins: activeUsers.filter(u => u.is_admin).length,
|
|
2109
|
+
owners: activeUsers.filter(u => u.is_owner).length
|
|
2110
|
+
}
|
|
1835
2111
|
};
|
|
2112
|
+
if (validatedArgs.verbose) {
|
|
2113
|
+
return { content: [{ type: "text", text: JSON.stringify(stats, null, 2) }] };
|
|
2114
|
+
}
|
|
2115
|
+
// LEAN: one-line human-readable summary.
|
|
2116
|
+
const text = `${stats.team.name} (${stats.team.domain}) — ` +
|
|
2117
|
+
`${stats.stats.total_users} users, ${stats.stats.total_channels} channels, ` +
|
|
2118
|
+
`${stats.stats.admins} admins, ${stats.stats.owners} owners`;
|
|
2119
|
+
return { content: [{ type: "text", text }] };
|
|
1836
2120
|
}
|
|
1837
2121
|
// =====================================================================================
|
|
1838
2122
|
// FILE UPLOAD AND DIAGRAM TOOLS
|
|
@@ -1890,12 +2174,21 @@ class SlackerV3Server {
|
|
|
1890
2174
|
// Build the HTML to render
|
|
1891
2175
|
let htmlContent;
|
|
1892
2176
|
if (diagramType === "mermaid") {
|
|
2177
|
+
// HTML-escape the diagram source so it cannot break out of the <pre> and
|
|
2178
|
+
// inject arbitrary markup/scripts (prompt-injection hardening).
|
|
2179
|
+
const escaped = validatedArgs.diagram_content
|
|
2180
|
+
.replace(/&/g, "&")
|
|
2181
|
+
.replace(/</g, "<")
|
|
2182
|
+
.replace(/>/g, ">");
|
|
2183
|
+
// Prefer a locally-bundled mermaid copy if one is installed; otherwise fall
|
|
2184
|
+
// back to the single allow-listed CDN URL (see renderHtmlToPng request
|
|
2185
|
+
// interception, which blocks every other network request).
|
|
1893
2186
|
htmlContent = `<!DOCTYPE html>
|
|
1894
2187
|
<html><head>
|
|
1895
2188
|
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
|
|
1896
2189
|
<style>body { margin: 0; padding: 20px; background: white; }</style>
|
|
1897
2190
|
</head><body>
|
|
1898
|
-
<pre class="mermaid">${
|
|
2191
|
+
<pre class="mermaid">${escaped}</pre>
|
|
1899
2192
|
<script>mermaid.initialize({ startOnLoad: true, theme: 'default' });</script>
|
|
1900
2193
|
</body></html>`;
|
|
1901
2194
|
}
|
|
@@ -1914,14 +2207,13 @@ ${validatedArgs.diagram_content}
|
|
|
1914
2207
|
</body></html>`;
|
|
1915
2208
|
}
|
|
1916
2209
|
}
|
|
1917
|
-
// Create temp
|
|
2210
|
+
// Create temp output path with an unpredictable name to avoid collision /
|
|
2211
|
+
// symlink races (was `slack-diagram-${Date.now()}`).
|
|
1918
2212
|
const tempDir = tmpdir();
|
|
1919
|
-
const
|
|
1920
|
-
const tempPngPath = path.join(tempDir, `slack-diagram-${Date.now()}.png`);
|
|
2213
|
+
const tempPngPath = path.join(tempDir, `slack-diagram-${crypto.randomUUID()}.png`);
|
|
1921
2214
|
try {
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
await this.renderHtmlToPng(tempHtmlPath, tempPngPath);
|
|
2215
|
+
// Render directly from the HTML string (no file:// navigation, no temp HTML file).
|
|
2216
|
+
await this.renderHtmlToPng(htmlContent, tempPngPath);
|
|
1925
2217
|
// Upload the rendered PNG using slackUploadFile
|
|
1926
2218
|
const uploadResult = await this.slackUploadFile({
|
|
1927
2219
|
channel: validatedArgs.channel,
|
|
@@ -1932,24 +2224,81 @@ ${validatedArgs.diagram_content}
|
|
|
1932
2224
|
return uploadResult;
|
|
1933
2225
|
}
|
|
1934
2226
|
finally {
|
|
1935
|
-
// Cleanup temp
|
|
1936
|
-
await fs.unlink(tempHtmlPath).catch(() => { });
|
|
2227
|
+
// Cleanup temp file
|
|
1937
2228
|
await fs.unlink(tempPngPath).catch(() => { });
|
|
1938
2229
|
}
|
|
1939
2230
|
}
|
|
1940
|
-
|
|
1941
|
-
|
|
2231
|
+
// Lazily launch (and keep warm) a singleton Puppeteer browser.
|
|
2232
|
+
async getBrowser() {
|
|
2233
|
+
if (this.browser) {
|
|
2234
|
+
// Bump the idle timer on each use.
|
|
2235
|
+
this.scheduleBrowserIdleClose();
|
|
2236
|
+
return this.browser;
|
|
2237
|
+
}
|
|
2238
|
+
const puppeteerModule = "puppeteer";
|
|
2239
|
+
const puppeteer = await import(/* webpackIgnore: true */ puppeteerModule);
|
|
2240
|
+
// NOTE on sandbox flags: a true browser sandbox is preferred for security.
|
|
2241
|
+
// We intentionally do NOT pass --no-sandbox / --disable-setuid-sandbox here.
|
|
2242
|
+
// Combined with full request interception (below), the renderer cannot reach
|
|
2243
|
+
// the network or local filesystem regardless. If a specific CI/container env
|
|
2244
|
+
// truly requires --no-sandbox to launch Chromium, add it here with a comment.
|
|
2245
|
+
this.browser = await puppeteer.default.launch({ headless: true });
|
|
2246
|
+
this.scheduleBrowserIdleClose();
|
|
2247
|
+
return this.browser;
|
|
2248
|
+
}
|
|
2249
|
+
scheduleBrowserIdleClose() {
|
|
2250
|
+
if (this.browserIdleTimer)
|
|
2251
|
+
clearTimeout(this.browserIdleTimer);
|
|
2252
|
+
this.browserIdleTimer = setTimeout(() => {
|
|
2253
|
+
this.closeBrowser().catch(() => { });
|
|
2254
|
+
}, this.BROWSER_IDLE_MS);
|
|
2255
|
+
// Don't keep the process alive just for the idle timer.
|
|
2256
|
+
if (typeof this.browserIdleTimer.unref === "function")
|
|
2257
|
+
this.browserIdleTimer.unref();
|
|
2258
|
+
}
|
|
2259
|
+
async closeBrowser() {
|
|
2260
|
+
if (this.browserIdleTimer) {
|
|
2261
|
+
clearTimeout(this.browserIdleTimer);
|
|
2262
|
+
this.browserIdleTimer = null;
|
|
2263
|
+
}
|
|
2264
|
+
if (this.browser) {
|
|
2265
|
+
const b = this.browser;
|
|
2266
|
+
this.browser = null;
|
|
2267
|
+
try {
|
|
2268
|
+
await b.close();
|
|
2269
|
+
}
|
|
2270
|
+
catch {
|
|
2271
|
+
// ignore
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
async renderHtmlToPng(htmlContent, pngPath) {
|
|
2276
|
+
// Strategy 1: Puppeteer singleton with a locked-down sandbox.
|
|
1942
2277
|
try {
|
|
1943
|
-
const
|
|
1944
|
-
const
|
|
1945
|
-
const browser = await puppeteer.default.launch({
|
|
1946
|
-
headless: true,
|
|
1947
|
-
args: ["--no-sandbox", "--disable-setuid-sandbox"]
|
|
1948
|
-
});
|
|
2278
|
+
const browser = await this.getBrowser();
|
|
2279
|
+
const page = await browser.newPage();
|
|
1949
2280
|
try {
|
|
1950
|
-
const page = await browser.newPage();
|
|
1951
2281
|
await page.setViewport({ width: 1200, height: 800 });
|
|
1952
|
-
|
|
2282
|
+
// SECURITY: block ALL network + filesystem fetches during render. The only
|
|
2283
|
+
// exception is the allow-listed Mermaid CDN script (mermaid is not bundled
|
|
2284
|
+
// in node_modules). data: and about:blank are always allowed. Everything
|
|
2285
|
+
// else — file://, arbitrary http(s), etc. — is aborted. This neutralises
|
|
2286
|
+
// local-file exfiltration via prompt-injected diagram_content.
|
|
2287
|
+
await page.setRequestInterception(true);
|
|
2288
|
+
page.on("request", (req) => {
|
|
2289
|
+
const url = req.url();
|
|
2290
|
+
const allowed = url.startsWith("data:") ||
|
|
2291
|
+
url === "about:blank" ||
|
|
2292
|
+
url.startsWith("https://cdn.jsdelivr.net/npm/mermaid@");
|
|
2293
|
+
if (allowed) {
|
|
2294
|
+
req.continue();
|
|
2295
|
+
}
|
|
2296
|
+
else {
|
|
2297
|
+
req.abort();
|
|
2298
|
+
}
|
|
2299
|
+
});
|
|
2300
|
+
// Render from setContent (about:blank origin) — no same-origin file access.
|
|
2301
|
+
await page.setContent(htmlContent, { waitUntil: "networkidle0", timeout: 30000 });
|
|
1953
2302
|
// Auto-size: get the actual content dimensions
|
|
1954
2303
|
const dimensions = await page.evaluate(() => {
|
|
1955
2304
|
const body = document.body;
|
|
@@ -1962,21 +2311,35 @@ ${validatedArgs.diagram_content}
|
|
|
1962
2311
|
await page.screenshot({ path: pngPath, fullPage: true });
|
|
1963
2312
|
}
|
|
1964
2313
|
finally {
|
|
1965
|
-
|
|
2314
|
+
// Only close the page — keep the browser warm for reuse.
|
|
2315
|
+
await page.close().catch(() => { });
|
|
1966
2316
|
}
|
|
2317
|
+
this.scheduleBrowserIdleClose();
|
|
1967
2318
|
return;
|
|
1968
2319
|
}
|
|
1969
|
-
catch {
|
|
1970
|
-
//
|
|
2320
|
+
catch (err) {
|
|
2321
|
+
// If the singleton browser is in a bad state, drop it so the next call relaunches.
|
|
2322
|
+
await this.closeBrowser().catch(() => { });
|
|
2323
|
+
// Fall through to other strategies.
|
|
1971
2324
|
}
|
|
1972
|
-
// Strategy 2: Try Playwright (if installed)
|
|
2325
|
+
// Strategy 2: Try Playwright (if installed). Same sandboxing: route blocking + setContent.
|
|
1973
2326
|
try {
|
|
1974
2327
|
const playwrightModule = "playwright";
|
|
1975
2328
|
const playwright = await import(/* webpackIgnore: true */ playwrightModule);
|
|
1976
2329
|
const browser = await playwright.chromium.launch({ headless: true });
|
|
1977
2330
|
try {
|
|
1978
2331
|
const page = await browser.newPage({ viewport: { width: 1200, height: 800 } });
|
|
1979
|
-
await page.
|
|
2332
|
+
await page.route("**/*", (route) => {
|
|
2333
|
+
const url = route.request().url();
|
|
2334
|
+
const allowed = url.startsWith("data:") ||
|
|
2335
|
+
url === "about:blank" ||
|
|
2336
|
+
url.startsWith("https://cdn.jsdelivr.net/npm/mermaid@");
|
|
2337
|
+
if (allowed)
|
|
2338
|
+
route.continue();
|
|
2339
|
+
else
|
|
2340
|
+
route.abort();
|
|
2341
|
+
});
|
|
2342
|
+
await page.setContent(htmlContent, { waitUntil: "networkidle", timeout: 30000 });
|
|
1980
2343
|
await page.screenshot({ path: pngPath, fullPage: true });
|
|
1981
2344
|
}
|
|
1982
2345
|
finally {
|
|
@@ -1987,12 +2350,16 @@ ${validatedArgs.diagram_content}
|
|
|
1987
2350
|
catch {
|
|
1988
2351
|
// Playwright not available, try next strategy
|
|
1989
2352
|
}
|
|
1990
|
-
// Strategy 3: Try wkhtmltoimage (CLI tool)
|
|
2353
|
+
// Strategy 3: Try wkhtmltoimage (CLI tool). Needs a file path, so write a
|
|
2354
|
+
// temp HTML file with an unpredictable name and clean it up afterward.
|
|
2355
|
+
const tempHtmlPath = path.join(tmpdir(), `slack-diagram-${crypto.randomUUID()}.html`);
|
|
1991
2356
|
try {
|
|
2357
|
+
await fs.writeFile(tempHtmlPath, htmlContent);
|
|
2358
|
+
await fs.chmod(tempHtmlPath, 0o600).catch(() => { });
|
|
1992
2359
|
await execFileAsync("wkhtmltoimage", [
|
|
1993
2360
|
"--width", "1200",
|
|
1994
2361
|
"--quality", "90",
|
|
1995
|
-
|
|
2362
|
+
tempHtmlPath,
|
|
1996
2363
|
pngPath
|
|
1997
2364
|
]);
|
|
1998
2365
|
return;
|
|
@@ -2000,6 +2367,9 @@ ${validatedArgs.diagram_content}
|
|
|
2000
2367
|
catch {
|
|
2001
2368
|
// wkhtmltoimage not available
|
|
2002
2369
|
}
|
|
2370
|
+
finally {
|
|
2371
|
+
await fs.unlink(tempHtmlPath).catch(() => { });
|
|
2372
|
+
}
|
|
2003
2373
|
throw new Error("No rendering engine available. Install one of: puppeteer (npm i puppeteer), playwright (npm i playwright), or wkhtmltoimage (brew install wkhtmltopdf). " +
|
|
2004
2374
|
"Puppeteer is recommended: run 'npm install puppeteer' in the mcp-slack directory.");
|
|
2005
2375
|
}
|
|
@@ -2009,117 +2379,27 @@ ${validatedArgs.diagram_content}
|
|
|
2009
2379
|
setupHandlers() {
|
|
2010
2380
|
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
2011
2381
|
const tools = [
|
|
2012
|
-
// Account
|
|
2013
|
-
{
|
|
2014
|
-
name: "list_accounts",
|
|
2015
|
-
description: "List all configured Slack accounts with their status",
|
|
2016
|
-
inputSchema: {
|
|
2017
|
-
type: "object",
|
|
2018
|
-
properties: {}
|
|
2019
|
-
}
|
|
2020
|
-
},
|
|
2021
|
-
{
|
|
2022
|
-
name: "switch_account",
|
|
2023
|
-
description: "Switch to a different Slack workspace",
|
|
2024
|
-
inputSchema: {
|
|
2025
|
-
type: "object",
|
|
2026
|
-
properties: {
|
|
2027
|
-
account_id: {
|
|
2028
|
-
type: "string",
|
|
2029
|
-
description: "Account ID to switch to"
|
|
2030
|
-
}
|
|
2031
|
-
},
|
|
2032
|
-
required: ["account_id"]
|
|
2033
|
-
}
|
|
2034
|
-
},
|
|
2035
|
-
{
|
|
2036
|
-
name: "add_account",
|
|
2037
|
-
description: "Add a new Slack workspace configuration",
|
|
2038
|
-
inputSchema: {
|
|
2039
|
-
type: "object",
|
|
2040
|
-
properties: {
|
|
2041
|
-
name: {
|
|
2042
|
-
type: "string",
|
|
2043
|
-
description: "Human-friendly name for this account"
|
|
2044
|
-
},
|
|
2045
|
-
bot_token: {
|
|
2046
|
-
type: "string",
|
|
2047
|
-
description: "Bot User OAuth Token (starts with xoxb-)"
|
|
2048
|
-
},
|
|
2049
|
-
user_token: {
|
|
2050
|
-
type: "string",
|
|
2051
|
-
description: "User OAuth Token (starts with xoxp-) - optional"
|
|
2052
|
-
},
|
|
2053
|
-
team_id: {
|
|
2054
|
-
type: "string",
|
|
2055
|
-
description: "Slack team ID"
|
|
2056
|
-
}
|
|
2057
|
-
},
|
|
2058
|
-
required: ["name", "bot_token", "team_id"]
|
|
2059
|
-
}
|
|
2060
|
-
},
|
|
2061
|
-
{
|
|
2062
|
-
name: "remove_account",
|
|
2063
|
-
description: "Remove a Slack workspace configuration",
|
|
2064
|
-
inputSchema: {
|
|
2065
|
-
type: "object",
|
|
2066
|
-
properties: {
|
|
2067
|
-
account_id: {
|
|
2068
|
-
type: "string",
|
|
2069
|
-
description: "Account ID to remove"
|
|
2070
|
-
}
|
|
2071
|
-
},
|
|
2072
|
-
required: ["account_id"]
|
|
2073
|
-
}
|
|
2074
|
-
},
|
|
2382
|
+
// Account Tools (read-only — single account loaded from env)
|
|
2075
2383
|
{
|
|
2076
2384
|
name: "get_active_account",
|
|
2077
|
-
description: "
|
|
2385
|
+
description: "Show which Slack workspace this server is wired to (workspace name, team ID, display name). No secrets. Tokens are configured via the SLACK_BOT_TOKEN env var in this server's MCP config entry.",
|
|
2078
2386
|
inputSchema: {
|
|
2079
2387
|
type: "object",
|
|
2080
2388
|
properties: {}
|
|
2081
2389
|
}
|
|
2082
2390
|
},
|
|
2083
2391
|
{
|
|
2084
|
-
name: "
|
|
2085
|
-
description: "
|
|
2086
|
-
inputSchema: {
|
|
2087
|
-
type: "object",
|
|
2088
|
-
properties: {
|
|
2089
|
-
account_id: {
|
|
2090
|
-
type: "string",
|
|
2091
|
-
description: "Account ID to set as default"
|
|
2092
|
-
}
|
|
2093
|
-
},
|
|
2094
|
-
required: ["account_id"]
|
|
2095
|
-
}
|
|
2096
|
-
},
|
|
2097
|
-
{
|
|
2098
|
-
name: "update_account",
|
|
2099
|
-
description: "Update account credentials (e.g. for token rotation)",
|
|
2392
|
+
name: "list_accounts",
|
|
2393
|
+
description: "List the active Slack account (single-account server). For a second workspace, add a second MCP server entry with its own SLACK_BOT_TOKEN env block.",
|
|
2100
2394
|
inputSchema: {
|
|
2101
2395
|
type: "object",
|
|
2102
|
-
properties: {
|
|
2103
|
-
account_id: {
|
|
2104
|
-
type: "string",
|
|
2105
|
-
description: "Account ID to update"
|
|
2106
|
-
},
|
|
2107
|
-
bot_token: {
|
|
2108
|
-
type: "string",
|
|
2109
|
-
description: "New Bot User OAuth Token (starts with xoxb-)"
|
|
2110
|
-
},
|
|
2111
|
-
user_token: {
|
|
2112
|
-
type: "string",
|
|
2113
|
-
description: "New User OAuth Token (starts with xoxp-)"
|
|
2114
|
-
}
|
|
2115
|
-
},
|
|
2116
|
-
required: ["account_id"]
|
|
2396
|
+
properties: {}
|
|
2117
2397
|
}
|
|
2118
2398
|
},
|
|
2119
|
-
// Original Slack Tools
|
|
2399
|
+
// Original Slack Tools
|
|
2120
2400
|
{
|
|
2121
2401
|
name: "slack_list_channels",
|
|
2122
|
-
description: "List
|
|
2402
|
+
description: "List accessible Slack channels. Returns LEAN output by default (id + name + is_private + num_members). Pass verbose:true for topic/purpose/membership detail.",
|
|
2123
2403
|
inputSchema: {
|
|
2124
2404
|
type: "object",
|
|
2125
2405
|
properties: {
|
|
@@ -2130,6 +2410,10 @@ ${validatedArgs.diagram_content}
|
|
|
2130
2410
|
limit: {
|
|
2131
2411
|
type: "number",
|
|
2132
2412
|
description: "Maximum number of channels to return (default: 100)"
|
|
2413
|
+
},
|
|
2414
|
+
verbose: {
|
|
2415
|
+
type: "boolean",
|
|
2416
|
+
description: "Return full channel objects instead of lean output (default false)"
|
|
2133
2417
|
}
|
|
2134
2418
|
}
|
|
2135
2419
|
}
|
|
@@ -2151,6 +2435,18 @@ ${validatedArgs.diagram_content}
|
|
|
2151
2435
|
thread_ts: {
|
|
2152
2436
|
type: "string",
|
|
2153
2437
|
description: "Timestamp of the parent message to reply in thread"
|
|
2438
|
+
},
|
|
2439
|
+
username: {
|
|
2440
|
+
type: "string",
|
|
2441
|
+
description: "Post under this display name (requires chat:write.customize scope; falls back to SLACK_SESSION_USERNAME)"
|
|
2442
|
+
},
|
|
2443
|
+
icon_emoji: {
|
|
2444
|
+
type: "string",
|
|
2445
|
+
description: "Icon emoji like ':robot_face:' (requires chat:write.customize; falls back to SLACK_SESSION_ICON)"
|
|
2446
|
+
},
|
|
2447
|
+
icon_url: {
|
|
2448
|
+
type: "string",
|
|
2449
|
+
description: "Icon image URL (overrides icon_emoji; requires chat:write.customize)"
|
|
2154
2450
|
}
|
|
2155
2451
|
},
|
|
2156
2452
|
required: ["channel", "text"]
|
|
@@ -2158,7 +2454,7 @@ ${validatedArgs.diagram_content}
|
|
|
2158
2454
|
},
|
|
2159
2455
|
{
|
|
2160
2456
|
name: "slack_get_channel_history",
|
|
2161
|
-
description: "Get recent messages from a Slack channel",
|
|
2457
|
+
description: "Get recent messages from a Slack channel. Returns LEAN output by default (verbatim message text + user + ts, with metadata exhaust stripped) to keep context cost low. Pass verbose:true for the full raw API payload.",
|
|
2162
2458
|
inputSchema: {
|
|
2163
2459
|
type: "object",
|
|
2164
2460
|
properties: {
|
|
@@ -2169,6 +2465,10 @@ ${validatedArgs.diagram_content}
|
|
|
2169
2465
|
limit: {
|
|
2170
2466
|
type: "number",
|
|
2171
2467
|
description: "Number of messages to return (default: 100)"
|
|
2468
|
+
},
|
|
2469
|
+
verbose: {
|
|
2470
|
+
type: "boolean",
|
|
2471
|
+
description: "Return the full raw API payload instead of lean output (default false)"
|
|
2172
2472
|
}
|
|
2173
2473
|
},
|
|
2174
2474
|
required: ["channel"]
|
|
@@ -2198,13 +2498,17 @@ ${validatedArgs.diagram_content}
|
|
|
2198
2498
|
},
|
|
2199
2499
|
{
|
|
2200
2500
|
name: "slack_list_users",
|
|
2201
|
-
description: "List
|
|
2501
|
+
description: "List users in the workspace. Returns LEAN output by default (id + name + real_name). Pass verbose:true for full user objects (email, admin flags, status).",
|
|
2202
2502
|
inputSchema: {
|
|
2203
2503
|
type: "object",
|
|
2204
2504
|
properties: {
|
|
2205
2505
|
limit: {
|
|
2206
2506
|
type: "number",
|
|
2207
2507
|
description: "Maximum number of users to return (default: 100)"
|
|
2508
|
+
},
|
|
2509
|
+
verbose: {
|
|
2510
|
+
type: "boolean",
|
|
2511
|
+
description: "Return full user objects instead of lean output (default false)"
|
|
2208
2512
|
}
|
|
2209
2513
|
}
|
|
2210
2514
|
}
|
|
@@ -2261,7 +2565,7 @@ ${validatedArgs.diagram_content}
|
|
|
2261
2565
|
},
|
|
2262
2566
|
{
|
|
2263
2567
|
name: "slack_search_messages",
|
|
2264
|
-
description: "Search for messages across the workspace",
|
|
2568
|
+
description: "Search for messages across the workspace. Returns LEAN output by default (verbatim text + user + channel + ts + permalink). Pass verbose:true for the raw search payload.",
|
|
2265
2569
|
inputSchema: {
|
|
2266
2570
|
type: "object",
|
|
2267
2571
|
properties: {
|
|
@@ -2276,6 +2580,10 @@ ${validatedArgs.diagram_content}
|
|
|
2276
2580
|
page: {
|
|
2277
2581
|
type: "number",
|
|
2278
2582
|
description: "Page number of results (default: 1)"
|
|
2583
|
+
},
|
|
2584
|
+
verbose: {
|
|
2585
|
+
type: "boolean",
|
|
2586
|
+
description: "Return the raw search payload instead of lean output (default false)"
|
|
2279
2587
|
}
|
|
2280
2588
|
},
|
|
2281
2589
|
required: ["query"]
|
|
@@ -2283,7 +2591,7 @@ ${validatedArgs.diagram_content}
|
|
|
2283
2591
|
},
|
|
2284
2592
|
{
|
|
2285
2593
|
name: "slack_search_by_user",
|
|
2286
|
-
description: "Search for messages from a specific user",
|
|
2594
|
+
description: "Search for messages from a specific user. Returns LEAN output by default (verbatim text + channel + ts + permalink). Pass verbose:true for the raw search payload.",
|
|
2287
2595
|
inputSchema: {
|
|
2288
2596
|
type: "object",
|
|
2289
2597
|
properties: {
|
|
@@ -2298,6 +2606,10 @@ ${validatedArgs.diagram_content}
|
|
|
2298
2606
|
count: {
|
|
2299
2607
|
type: "number",
|
|
2300
2608
|
description: "Number of results to return (default: 20)"
|
|
2609
|
+
},
|
|
2610
|
+
verbose: {
|
|
2611
|
+
type: "boolean",
|
|
2612
|
+
description: "Return the raw search payload instead of lean output (default false)"
|
|
2301
2613
|
}
|
|
2302
2614
|
},
|
|
2303
2615
|
required: ["user_id"]
|
|
@@ -2305,7 +2617,7 @@ ${validatedArgs.diagram_content}
|
|
|
2305
2617
|
},
|
|
2306
2618
|
{
|
|
2307
2619
|
name: "slack_search_by_date_range",
|
|
2308
|
-
description: "Search for messages within a date range",
|
|
2620
|
+
description: "Search for messages within a date range. Returns LEAN output by default (verbatim text + user + channel + ts + permalink). Pass verbose:true for the raw search payload.",
|
|
2309
2621
|
inputSchema: {
|
|
2310
2622
|
type: "object",
|
|
2311
2623
|
properties: {
|
|
@@ -2324,6 +2636,10 @@ ${validatedArgs.diagram_content}
|
|
|
2324
2636
|
count: {
|
|
2325
2637
|
type: "number",
|
|
2326
2638
|
description: "Number of results to return (default: 20)"
|
|
2639
|
+
},
|
|
2640
|
+
verbose: {
|
|
2641
|
+
type: "boolean",
|
|
2642
|
+
description: "Return the raw search payload instead of lean output (default false)"
|
|
2327
2643
|
}
|
|
2328
2644
|
},
|
|
2329
2645
|
required: ["from_date", "to_date"]
|
|
@@ -2331,10 +2647,15 @@ ${validatedArgs.diagram_content}
|
|
|
2331
2647
|
},
|
|
2332
2648
|
{
|
|
2333
2649
|
name: "slack_get_workspace_stats",
|
|
2334
|
-
description: "Get workspace analytics and statistics",
|
|
2650
|
+
description: "Get workspace analytics and statistics. Returns a LEAN one-line summary by default; pass verbose:true for the structured payload.",
|
|
2335
2651
|
inputSchema: {
|
|
2336
2652
|
type: "object",
|
|
2337
|
-
properties: {
|
|
2653
|
+
properties: {
|
|
2654
|
+
verbose: {
|
|
2655
|
+
type: "boolean",
|
|
2656
|
+
description: "Return the structured stats payload instead of the lean summary (default false)"
|
|
2657
|
+
}
|
|
2658
|
+
}
|
|
2338
2659
|
}
|
|
2339
2660
|
},
|
|
2340
2661
|
{
|
|
@@ -2514,6 +2835,18 @@ ${validatedArgs.diagram_content}
|
|
|
2514
2835
|
text: {
|
|
2515
2836
|
type: "string",
|
|
2516
2837
|
description: "Fallback text"
|
|
2838
|
+
},
|
|
2839
|
+
username: {
|
|
2840
|
+
type: "string",
|
|
2841
|
+
description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)"
|
|
2842
|
+
},
|
|
2843
|
+
icon_emoji: {
|
|
2844
|
+
type: "string",
|
|
2845
|
+
description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)"
|
|
2846
|
+
},
|
|
2847
|
+
icon_url: {
|
|
2848
|
+
type: "string",
|
|
2849
|
+
description: "Icon image URL (requires chat:write.customize)"
|
|
2517
2850
|
}
|
|
2518
2851
|
},
|
|
2519
2852
|
required: ["channel", "blocks"]
|
|
@@ -2698,7 +3031,170 @@ ${validatedArgs.diagram_content}
|
|
|
2698
3031
|
},
|
|
2699
3032
|
required: ["channel", "diagram_content"]
|
|
2700
3033
|
}
|
|
2701
|
-
}
|
|
3034
|
+
},
|
|
3035
|
+
{
|
|
3036
|
+
name: "slack_send_table",
|
|
3037
|
+
description: "Post a column-aligned ASCII table to a channel inside a code block. Lightweight TEXT alternative to slack_send_diagram's PNG path — use it for status grids, comparison matrices, and metrics that don't need to be a polished image. Accepts an array of objects, a 2D array (first row = header), or a markdown pipe-table string. Long cells are truncated with an ellipsis; numeric columns auto right-align.",
|
|
3038
|
+
inputSchema: {
|
|
3039
|
+
type: "object",
|
|
3040
|
+
properties: {
|
|
3041
|
+
channel: {
|
|
3042
|
+
type: "string",
|
|
3043
|
+
description: "Channel ID or name to post the table to"
|
|
3044
|
+
},
|
|
3045
|
+
title: {
|
|
3046
|
+
type: "string",
|
|
3047
|
+
description: "Optional bold title rendered above the table"
|
|
3048
|
+
},
|
|
3049
|
+
rows: {
|
|
3050
|
+
description: "Table data: array of objects, a 2D array (first row = header), OR a markdown pipe-table string"
|
|
3051
|
+
},
|
|
3052
|
+
as_code_block: {
|
|
3053
|
+
type: "boolean",
|
|
3054
|
+
description: "Wrap the table in a ``` code block so columns stay aligned (default true)"
|
|
3055
|
+
}
|
|
3056
|
+
},
|
|
3057
|
+
required: ["channel", "rows"]
|
|
3058
|
+
}
|
|
3059
|
+
},
|
|
3060
|
+
{
|
|
3061
|
+
name: "slack_send_card",
|
|
3062
|
+
description: "Post a polished Slack Block Kit card: a header, one or more section blocks (each with optional two-column fields), an optional context footer, and an optional colored left bar. Use for structured summaries and status reports that benefit from native Block Kit layout (vs the ASCII table or PNG paths).",
|
|
3063
|
+
inputSchema: {
|
|
3064
|
+
type: "object",
|
|
3065
|
+
properties: {
|
|
3066
|
+
channel: { type: "string", description: "Channel ID or name" },
|
|
3067
|
+
header: { type: "string", description: "Card header (plain text)" },
|
|
3068
|
+
sections: {
|
|
3069
|
+
type: "array",
|
|
3070
|
+
description: "Section blocks rendered in order, separated by dividers",
|
|
3071
|
+
items: {
|
|
3072
|
+
type: "object",
|
|
3073
|
+
properties: {
|
|
3074
|
+
text: { type: "string", description: "mrkdwn body text" },
|
|
3075
|
+
fields: {
|
|
3076
|
+
type: "array",
|
|
3077
|
+
description: "Up to 10 two-column key/value fields",
|
|
3078
|
+
items: {
|
|
3079
|
+
type: "object",
|
|
3080
|
+
properties: {
|
|
3081
|
+
label: { type: "string" },
|
|
3082
|
+
value: { type: "string" }
|
|
3083
|
+
},
|
|
3084
|
+
required: ["value"]
|
|
3085
|
+
}
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
}
|
|
3089
|
+
},
|
|
3090
|
+
context: { type: "string", description: "Small footer context line (mrkdwn)" },
|
|
3091
|
+
color: { type: "string", description: "Hex color for the left bar, e.g. #3D8C62" },
|
|
3092
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3093
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3094
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3095
|
+
},
|
|
3096
|
+
required: ["channel", "header"]
|
|
3097
|
+
}
|
|
3098
|
+
},
|
|
3099
|
+
{
|
|
3100
|
+
name: "slack_start_task",
|
|
3101
|
+
description: "Begin a long-running task in ONE thread instead of spamming a channel. Posts a parent Block Kit card ('⏳ <title>') and adds a live ⏳ status reaction. Returns { task_ts, channel } — pass these back to slack_update_task and slack_complete_task. Pass total_steps to enable a progress bar.",
|
|
3102
|
+
inputSchema: {
|
|
3103
|
+
type: "object",
|
|
3104
|
+
properties: {
|
|
3105
|
+
channel: { type: "string", description: "Channel ID or name" },
|
|
3106
|
+
title: { type: "string", description: "Task title" },
|
|
3107
|
+
total_steps: { type: "number", description: "Total number of steps (enables a progress bar)" },
|
|
3108
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3109
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3110
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3111
|
+
},
|
|
3112
|
+
required: ["channel", "title"]
|
|
3113
|
+
}
|
|
3114
|
+
},
|
|
3115
|
+
{
|
|
3116
|
+
name: "slack_update_task",
|
|
3117
|
+
description: "Post a progress update as a THREADED reply under the task's parent card. Do NOT @-mention anyone here — routine updates must stay quiet (only slack_complete_task may notify). If you pass step (and total_steps), the parent card's progress bar is also updated.",
|
|
3118
|
+
inputSchema: {
|
|
3119
|
+
type: "object",
|
|
3120
|
+
properties: {
|
|
3121
|
+
channel: { type: "string", description: "Channel ID where the task card lives" },
|
|
3122
|
+
task_ts: { type: "string", description: "Timestamp of the parent task card (from slack_start_task)" },
|
|
3123
|
+
message: { type: "string", description: "Progress update (threaded reply). No @-mentions." },
|
|
3124
|
+
step: { type: "number", description: "Current step number" },
|
|
3125
|
+
total_steps: { type: "number", description: "Total steps (defaults to start_task value)" },
|
|
3126
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3127
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3128
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3129
|
+
},
|
|
3130
|
+
required: ["channel", "task_ts", "message"]
|
|
3131
|
+
}
|
|
3132
|
+
},
|
|
3133
|
+
{
|
|
3134
|
+
name: "slack_complete_task",
|
|
3135
|
+
description: "Finish a task: posts a final threaded reply AND edits the parent card into a ✅/❌ completion summary, swapping the live ⏳ status reaction to ✅ or ❌. This is the ONLY task tool permitted to @-mention — set notify_user (a Slack user ID) to ping the owner on completion or failure.",
|
|
3136
|
+
inputSchema: {
|
|
3137
|
+
type: "object",
|
|
3138
|
+
properties: {
|
|
3139
|
+
channel: { type: "string", description: "Channel ID where the task card lives" },
|
|
3140
|
+
task_ts: { type: "string", description: "Timestamp of the parent task card (from slack_start_task)" },
|
|
3141
|
+
summary: { type: "string", description: "Final summary of the outcome" },
|
|
3142
|
+
status: { type: "string", enum: ["done", "failed"], description: "Final status" },
|
|
3143
|
+
details: { type: "string", description: "Optional details — commits, links, duration (mrkdwn)" },
|
|
3144
|
+
notify_user: { type: "string", description: "Optional Slack user ID to @-mention on completion" },
|
|
3145
|
+
username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
|
|
3146
|
+
icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
|
|
3147
|
+
icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
|
|
3148
|
+
},
|
|
3149
|
+
required: ["channel", "task_ts", "summary", "status"]
|
|
3150
|
+
}
|
|
3151
|
+
},
|
|
3152
|
+
{
|
|
3153
|
+
name: "slack_poll",
|
|
3154
|
+
description: "Poll a shared channel for NEW messages addressed to this Legate (multi-session coordination). Tracks a per-call-sign cursor so each poll returns only messages newer than the last. Tags each message's addressing relative to your call_sign (to_me / to_all / whoever_first / to_other:<Name> / chatter), excludes your own posts, and by default drops chatter. ACT ONLY on messages tagged to_me, to_all, or whoever_first — ignore to_other and chatter. The FIRST poll (no stored cursor and no `since` arg) anchors the cursor to 'now' and returns nothing (first_poll:true) so a freshly-booted session never acts on stale backlog; pass `since` explicitly if you actually want history. Advances the cursor every poll.",
|
|
3155
|
+
inputSchema: {
|
|
3156
|
+
type: "object",
|
|
3157
|
+
properties: {
|
|
3158
|
+
channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
|
|
3159
|
+
call_sign: { type: "string", description: "This Legate's NATO call-sign (e.g., Alpha, Bravo)" },
|
|
3160
|
+
limit: { type: "number", description: "Max messages to scan/return (default: 15)" },
|
|
3161
|
+
since: { type: "string", description: "Slack ts to poll from; overrides the stored cursor" },
|
|
3162
|
+
include_chatter: { type: "boolean", description: "Include messages not addressed to anyone (default: false)" }
|
|
3163
|
+
},
|
|
3164
|
+
required: ["channel", "call_sign"]
|
|
3165
|
+
}
|
|
3166
|
+
},
|
|
3167
|
+
{
|
|
3168
|
+
name: "slack_claim_lane",
|
|
3169
|
+
description: "Claim a unit of work ('lane') on a shared channel so sibling Legates don't double-up. Posts a machine-parseable LANE CLAIM, then re-reads to detect a lost race (yields to an earlier claimant). Returns granted:false WITHOUT posting if another Legate already holds an unexpired claim on the same lane. Pass release:true to post a LANE RELEASE for a finished lane.",
|
|
3170
|
+
inputSchema: {
|
|
3171
|
+
type: "object",
|
|
3172
|
+
properties: {
|
|
3173
|
+
channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
|
|
3174
|
+
call_sign: { type: "string", description: "This Legate's NATO call-sign" },
|
|
3175
|
+
task: { type: "string", description: "The work being claimed (free text; normalized to a lane key)" },
|
|
3176
|
+
ttl_minutes: { type: "number", description: "How long a claim stays valid (default: 20)" },
|
|
3177
|
+
lookback: { type: "number", description: "How many recent messages to scan for prior claims (default: 30)" },
|
|
3178
|
+
release: { type: "boolean", description: "If true, post a LANE RELEASE for this task instead of claiming (default: false)" }
|
|
3179
|
+
},
|
|
3180
|
+
required: ["channel", "call_sign", "task"]
|
|
3181
|
+
}
|
|
3182
|
+
},
|
|
3183
|
+
{
|
|
3184
|
+
name: "slack_checkin",
|
|
3185
|
+
description: "Post a one-line status check-in to the shared channel, de-duplicated per call-sign + channel. Suppresses the post when the status is unchanged since the last check-in (unless force:true or a heartbeat_minutes interval has elapsed).",
|
|
3186
|
+
inputSchema: {
|
|
3187
|
+
type: "object",
|
|
3188
|
+
properties: {
|
|
3189
|
+
channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
|
|
3190
|
+
call_sign: { type: "string", description: "This Legate's NATO call-sign" },
|
|
3191
|
+
status: { type: "string", description: "One-line status to post" },
|
|
3192
|
+
force: { type: "boolean", description: "Post even if the status is unchanged (default: false)" },
|
|
3193
|
+
heartbeat_minutes: { type: "number", description: "If >0, re-post an unchanged status once this many minutes have elapsed (default: 0)" }
|
|
3194
|
+
},
|
|
3195
|
+
required: ["channel", "call_sign", "status"]
|
|
3196
|
+
}
|
|
3197
|
+
},
|
|
2702
3198
|
];
|
|
2703
3199
|
return { tools };
|
|
2704
3200
|
});
|
|
@@ -2706,21 +3202,11 @@ ${validatedArgs.diagram_content}
|
|
|
2706
3202
|
try {
|
|
2707
3203
|
const { name, arguments: args } = request.params;
|
|
2708
3204
|
switch (name) {
|
|
2709
|
-
// Account
|
|
2710
|
-
case "list_accounts":
|
|
2711
|
-
return await this.listAccounts(args);
|
|
2712
|
-
case "switch_account":
|
|
2713
|
-
return await this.switchAccount(args);
|
|
2714
|
-
case "add_account":
|
|
2715
|
-
return await this.addAccount(args);
|
|
2716
|
-
case "remove_account":
|
|
2717
|
-
return await this.removeAccount(args);
|
|
3205
|
+
// Account Tools (read-only)
|
|
2718
3206
|
case "get_active_account":
|
|
2719
3207
|
return await this.getActiveAccount(args);
|
|
2720
|
-
case "
|
|
2721
|
-
return await this.
|
|
2722
|
-
case "update_account":
|
|
2723
|
-
return await this.updateAccount(args);
|
|
3208
|
+
case "list_accounts":
|
|
3209
|
+
return await this.listAccounts(args);
|
|
2724
3210
|
// Original Slack Tools
|
|
2725
3211
|
case "slack_list_channels":
|
|
2726
3212
|
return await this.slackListChannels(args);
|
|
@@ -2745,7 +3231,7 @@ ${validatedArgs.diagram_content}
|
|
|
2745
3231
|
case "slack_search_by_date_range":
|
|
2746
3232
|
return await this.slackSearchByDateRange(args);
|
|
2747
3233
|
case "slack_get_workspace_stats":
|
|
2748
|
-
return await this.slackGetWorkspaceStats();
|
|
3234
|
+
return await this.slackGetWorkspaceStats(args);
|
|
2749
3235
|
case "slack_pin_message":
|
|
2750
3236
|
return await this.slackPinMessage(args);
|
|
2751
3237
|
case "slack_unpin_message":
|
|
@@ -2782,6 +3268,23 @@ ${validatedArgs.diagram_content}
|
|
|
2782
3268
|
return await this.slackUploadFile(args);
|
|
2783
3269
|
case "slack_send_diagram":
|
|
2784
3270
|
return await this.slackSendDiagram(args);
|
|
3271
|
+
case "slack_send_table":
|
|
3272
|
+
return await this.slackSendTable(args);
|
|
3273
|
+
case "slack_send_card":
|
|
3274
|
+
return await this.slackSendCard(args);
|
|
3275
|
+
case "slack_start_task":
|
|
3276
|
+
return await this.slackStartTask(args);
|
|
3277
|
+
case "slack_update_task":
|
|
3278
|
+
return await this.slackUpdateTask(args);
|
|
3279
|
+
case "slack_complete_task":
|
|
3280
|
+
return await this.slackCompleteTask(args);
|
|
3281
|
+
// Legate pull/polling tools (multi-session coordination)
|
|
3282
|
+
case "slack_poll":
|
|
3283
|
+
return await this.slackPoll(args);
|
|
3284
|
+
case "slack_claim_lane":
|
|
3285
|
+
return await this.slackClaimLane(args);
|
|
3286
|
+
case "slack_checkin":
|
|
3287
|
+
return await this.slackCheckin(args);
|
|
2785
3288
|
default:
|
|
2786
3289
|
throw new Error(`Unknown tool: ${name}`);
|
|
2787
3290
|
}
|
|
@@ -2803,11 +3306,23 @@ ${validatedArgs.diagram_content}
|
|
|
2803
3306
|
async run() {
|
|
2804
3307
|
const transport = new StdioServerTransport();
|
|
2805
3308
|
await this.server.connect(transport);
|
|
2806
|
-
console.error("[SlackServer] Slack MCP server
|
|
2807
|
-
//
|
|
2808
|
-
|
|
3309
|
+
console.error("[SlackServer] Slack MCP server v4.0.0 running on stdio");
|
|
3310
|
+
// Ensure the warm Puppeteer browser is shut down cleanly on exit.
|
|
3311
|
+
const shutdown = () => {
|
|
3312
|
+
Promise.resolve()
|
|
3313
|
+
.then(() => this.closeBrowser())
|
|
3314
|
+
.finally(() => process.exit(0));
|
|
3315
|
+
};
|
|
3316
|
+
process.once("SIGINT", shutdown);
|
|
3317
|
+
process.once("SIGTERM", shutdown);
|
|
2809
3318
|
}
|
|
2810
3319
|
}
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUE0QjFDLHdGQUF3RjtBQUN4RiwyQkFBMkI7QUFDM0Isd0ZBQXdGO0FBRXhGLE1BQU0saUJBQWlCO0lBQ0osWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMs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
|
|
3320
|
+
// Only start the stdio server when run directly as a CLI (e.g. `node dist/index.js`).
|
|
3321
|
+
// Guarding this lets the module be imported by the test suite without spawning the
|
|
3322
|
+
// server / connecting a transport. Uses the ESM main-module idiom.
|
|
3323
|
+
const isMain = process.argv[1] === fileURLToPath(import.meta.url);
|
|
3324
|
+
if (isMain) {
|
|
3325
|
+
const server = new SlackerV3Server();
|
|
3326
|
+
server.run().catch(console.error);
|
|
3327
|
+
}
|
|
3328
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUxQyx3RkFBd0Y7QUFDeEYsdUNBQXVDO0FBQ3ZDLHdGQUF3RjtBQUN4RixtRkFBbUY7QUFDbkYsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRixvRkFBb0Y7QUFDcEYsc0ZBQXNGO0FBQ3RGLHFGQUFxRjtBQUNyRix5RUFBeUU7QUFDekUsd0ZBQXdGO0FBRXhGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJ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QUFDLENBQUM7SUFFOUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzVFLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxLQUF1QixFQUFFLEVBQUUsQ0FDNUQsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRCxNQUFNLEdBQUcsR0FBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzFFLE1BQU0sR0FBRyxHQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDMUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUUxRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVcsRUFBRSxFQUFFLENBQzdCLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRTFFLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFVO0lBQ3JDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUztRQUFF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
|