ask-slack-mcp-server 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +20 -1
- package/dist/server.js.map +1 -1
- package/dist/slack.d.ts +5 -1
- package/dist/slack.js +178 -23
- package/dist/slack.js.map +1 -1
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -26,6 +26,17 @@ const httpServer = http.createServer(async (req, res) => {
|
|
|
26
26
|
sendJson(res, 200, { status: "ok", version: VERSION });
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
+
// Authenticated health check
|
|
30
|
+
if (req.method === "GET" && req.url === "/health/auth") {
|
|
31
|
+
const providedKey = req.headers["x-api-key"] ??
|
|
32
|
+
req.headers["authorization"]?.replace(/^Bearer\s+/i, "");
|
|
33
|
+
if (!providedKey || providedKey !== API_KEY) {
|
|
34
|
+
sendJson(res, 401, { error: "Invalid or missing API key" });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
sendJson(res, 200, { status: "ok", version: VERSION });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
29
40
|
// Main endpoint
|
|
30
41
|
if (req.method === "POST" && req.url === "/api/ask") {
|
|
31
42
|
// Validate API key
|
|
@@ -42,10 +53,18 @@ const httpServer = http.createServer(async (req, res) => {
|
|
|
42
53
|
sendJson(res, 400, { error: "Missing required field: question" });
|
|
43
54
|
return;
|
|
44
55
|
}
|
|
56
|
+
// Build the question text
|
|
45
57
|
const fullMessage = body.context
|
|
46
58
|
? `*Context:* ${body.context}\n\n*Question:* ${body.question}`
|
|
47
59
|
: `*Question:* ${body.question}`;
|
|
48
|
-
|
|
60
|
+
// Map options to SlackQuestionOption[]
|
|
61
|
+
const slackOptions = body.options && body.options.length > 0
|
|
62
|
+
? body.options.map((o) => ({
|
|
63
|
+
label: o.label,
|
|
64
|
+
description: o.description,
|
|
65
|
+
}))
|
|
66
|
+
: undefined;
|
|
67
|
+
const answer = await sendQuestionAndWait(fullMessage, body.slack_user_id, slackOptions, body.multi_select);
|
|
49
68
|
sendJson(res, 200, { answer });
|
|
50
69
|
}
|
|
51
70
|
catch (err) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,EAAuB,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE/E,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;AAC7B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;AAElC,SAAS,QAAQ,CAAC,GAAyB;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CACf,GAAwB,EACxB,MAAc,EACd,IAA6B;IAE7B,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACtD,eAAe;IACf,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAClD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,cAAc,EAAE,CAAC;QACvD,MAAM,WAAW,GACf,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QACpD,mBAAmB;QACnB,MAAM,WAAW,GACf,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAM9B,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACxD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO;gBAC9B,CAAC,CAAC,cAAc,IAAI,CAAC,OAAO,mBAAmB,IAAI,CAAC,QAAQ,EAAE;gBAC9D,CAAC,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEnC,uCAAuC;YACvC,MAAM,YAAY,GAChB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC3B,CAAC,CAAC;gBACL,CAAC,CAAC,SAAS,CAAC;YAEhB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,WAAW,EACX,IAAI,CAAC,aAAa,EAClB,YAAY,EACZ,IAAI,CAAC,YAAY,CAClB,CAAC;YAEF,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;YAC5D,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IAEpD,MAAM,YAAY,EAAE,CAAC;IAErB,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/slack.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
export interface SlackQuestionOption {
|
|
2
|
+
label: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
}
|
|
1
5
|
export declare function startBoltApp(): Promise<void>;
|
|
2
6
|
export declare function stopBoltApp(): Promise<void>;
|
|
3
|
-
export declare function sendQuestionAndWait(question: string, slackUserId?: string): Promise<string>;
|
|
7
|
+
export declare function sendQuestionAndWait(question: string, slackUserId?: string, options?: SlackQuestionOption[], multiSelect?: boolean): Promise<string>;
|
package/dist/slack.js
CHANGED
|
@@ -2,7 +2,6 @@ import { WebClient } from "@slack/web-api";
|
|
|
2
2
|
import { App } from "@slack/bolt";
|
|
3
3
|
const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
4
4
|
const STARTUP_DELAY_MS = 6000; // Wait for stale Slack connections to expire
|
|
5
|
-
// Map: channelId -> resolver of pending Promise
|
|
6
5
|
const pendingQuestions = new Map();
|
|
7
6
|
const web = new WebClient(process.env.SLACK_BOT_TOKEN);
|
|
8
7
|
const boltApp = new App({
|
|
@@ -11,7 +10,107 @@ const boltApp = new App({
|
|
|
11
10
|
socketMode: true,
|
|
12
11
|
appToken: process.env.SLACK_APP_TOKEN,
|
|
13
12
|
});
|
|
14
|
-
//
|
|
13
|
+
// --- Helpers ---
|
|
14
|
+
function resolvePending(channelId, answer) {
|
|
15
|
+
const pending = pendingQuestions.get(channelId);
|
|
16
|
+
if (!pending)
|
|
17
|
+
return false;
|
|
18
|
+
console.error("[Bolt] Resolving pending question for channel:", channelId, "with:", answer);
|
|
19
|
+
pending.resolve(answer);
|
|
20
|
+
pendingQuestions.delete(channelId);
|
|
21
|
+
// Confirm to the user on Slack that the answer was received
|
|
22
|
+
web.chat.postMessage({
|
|
23
|
+
channel: channelId,
|
|
24
|
+
text: `✅ Your answer: ${answer}`,
|
|
25
|
+
mrkdwn: true,
|
|
26
|
+
}).catch((err) => {
|
|
27
|
+
console.error("[Bolt] Failed to send confirmation message:", err);
|
|
28
|
+
});
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
function formatSelected(labels) {
|
|
32
|
+
return `Selected: ${labels.join(", ")}`;
|
|
33
|
+
}
|
|
34
|
+
function tryParseNumberedReply(text, options) {
|
|
35
|
+
const trimmed = text.trim();
|
|
36
|
+
const parts = trimmed.split(/[\s,]+/);
|
|
37
|
+
const numbers = parts.map((s) => parseInt(s, 10));
|
|
38
|
+
if (parts.length === 0)
|
|
39
|
+
return null;
|
|
40
|
+
if (numbers.some((n) => isNaN(n)))
|
|
41
|
+
return null;
|
|
42
|
+
if (numbers.some((n) => n < 1 || n > options.length))
|
|
43
|
+
return null;
|
|
44
|
+
const selectedLabels = numbers.map((n) => options[n - 1].label);
|
|
45
|
+
return formatSelected(selectedLabels);
|
|
46
|
+
}
|
|
47
|
+
// --- Block Kit message builder ---
|
|
48
|
+
function buildOptionsBlocks(questionText, options, multiSelect) {
|
|
49
|
+
const blocks = [];
|
|
50
|
+
// Question text
|
|
51
|
+
blocks.push({
|
|
52
|
+
type: "section",
|
|
53
|
+
text: { type: "mrkdwn", text: questionText },
|
|
54
|
+
});
|
|
55
|
+
// Numbered list for reference + text reply fallback
|
|
56
|
+
const numberedList = options
|
|
57
|
+
.map((o, i) => `${i + 1}. ${o.label}${o.description ? ` — _${o.description}_` : ""}`)
|
|
58
|
+
.join("\n");
|
|
59
|
+
blocks.push({
|
|
60
|
+
type: "section",
|
|
61
|
+
text: { type: "mrkdwn", text: numberedList },
|
|
62
|
+
});
|
|
63
|
+
if (multiSelect) {
|
|
64
|
+
// Checkboxes + Submit button
|
|
65
|
+
blocks.push({
|
|
66
|
+
type: "actions",
|
|
67
|
+
block_id: "ask_slack_options",
|
|
68
|
+
elements: [
|
|
69
|
+
{
|
|
70
|
+
type: "checkboxes",
|
|
71
|
+
action_id: "ask_slack_checkboxes",
|
|
72
|
+
options: options.map((o) => ({
|
|
73
|
+
text: {
|
|
74
|
+
type: "mrkdwn",
|
|
75
|
+
text: `*${o.label}*${o.description ? `\n${o.description}` : ""}`,
|
|
76
|
+
},
|
|
77
|
+
value: o.label,
|
|
78
|
+
})),
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
type: "button",
|
|
82
|
+
action_id: "ask_slack_submit",
|
|
83
|
+
text: { type: "plain_text", text: "✅ Submit" },
|
|
84
|
+
style: "primary",
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Individual buttons for single select
|
|
91
|
+
blocks.push({
|
|
92
|
+
type: "actions",
|
|
93
|
+
block_id: "ask_slack_options",
|
|
94
|
+
elements: options.map((o, i) => ({
|
|
95
|
+
type: "button",
|
|
96
|
+
action_id: `ask_slack_btn_${i}`,
|
|
97
|
+
text: { type: "plain_text", text: o.label },
|
|
98
|
+
value: o.label,
|
|
99
|
+
})),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Help text
|
|
103
|
+
const helpText = multiSelect
|
|
104
|
+
? '_You can also reply with option numbers, e.g. "1, 3"_'
|
|
105
|
+
: '_You can also reply with the option number, e.g. "1"_';
|
|
106
|
+
blocks.push({
|
|
107
|
+
type: "context",
|
|
108
|
+
elements: [{ type: "mrkdwn", text: helpText }],
|
|
109
|
+
});
|
|
110
|
+
return blocks;
|
|
111
|
+
}
|
|
112
|
+
// --- Bolt listeners ---
|
|
113
|
+
// Text reply in DM
|
|
15
114
|
boltApp.message(async ({ message }) => {
|
|
16
115
|
const msg = message;
|
|
17
116
|
console.error("[Bolt] Received message:", {
|
|
@@ -22,28 +121,67 @@ boltApp.message(async ({ message }) => {
|
|
|
22
121
|
text: msg.text,
|
|
23
122
|
pendingKeys: [...pendingQuestions.keys()],
|
|
24
123
|
});
|
|
25
|
-
// Ignore bot messages (including own)
|
|
26
124
|
if (msg.bot_id || msg.subtype === "bot_message") {
|
|
27
125
|
console.error("[Bolt] Ignoring bot message, skipping.");
|
|
28
126
|
return;
|
|
29
127
|
}
|
|
30
|
-
// Ignore other subtypes (e.g. message_changed)
|
|
31
128
|
if (msg.subtype !== undefined) {
|
|
32
129
|
console.error("[Bolt] Ignoring message subtype:", msg.subtype);
|
|
33
130
|
return;
|
|
34
131
|
}
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
console.error("[Bolt] Resolver found for channel:", msg.channel, "— resolving with answer.");
|
|
38
|
-
resolver(msg.text);
|
|
39
|
-
pendingQuestions.delete(msg.channel);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
132
|
+
const pending = pendingQuestions.get(msg.channel);
|
|
133
|
+
if (!pending || !msg.text) {
|
|
42
134
|
console.error("[Bolt] No pending question for channel:", msg.channel);
|
|
135
|
+
return;
|
|
43
136
|
}
|
|
137
|
+
let answer = msg.text;
|
|
138
|
+
// If options exist, try to parse numbered reply (e.g. "1, 3")
|
|
139
|
+
if (pending.options && pending.options.length > 0) {
|
|
140
|
+
const parsed = tryParseNumberedReply(msg.text, pending.options);
|
|
141
|
+
if (parsed) {
|
|
142
|
+
answer = parsed;
|
|
143
|
+
}
|
|
144
|
+
// Otherwise pass through as freeform text
|
|
145
|
+
}
|
|
146
|
+
resolvePending(msg.channel, answer);
|
|
147
|
+
});
|
|
148
|
+
// Single-select button click
|
|
149
|
+
boltApp.action(/^ask_slack_btn_\d+$/, async ({ body, ack }) => {
|
|
150
|
+
await ack();
|
|
151
|
+
const blockBody = body;
|
|
152
|
+
const channelId = blockBody.channel?.id;
|
|
153
|
+
if (!channelId)
|
|
154
|
+
return;
|
|
155
|
+
const action = blockBody.actions[0];
|
|
156
|
+
const selectedLabel = action.type === "button" ? action.value : "";
|
|
157
|
+
if (selectedLabel) {
|
|
158
|
+
console.error("[Bolt] Button clicked:", selectedLabel, "in channel:", channelId);
|
|
159
|
+
resolvePending(channelId, formatSelected([selectedLabel]));
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
// Checkbox toggle — just acknowledge, wait for Submit
|
|
163
|
+
boltApp.action("ask_slack_checkboxes", async ({ ack }) => {
|
|
164
|
+
await ack();
|
|
165
|
+
});
|
|
166
|
+
// Submit button for multi-select checkboxes
|
|
167
|
+
boltApp.action("ask_slack_submit", async ({ body, ack }) => {
|
|
168
|
+
await ack();
|
|
169
|
+
const blockBody = body;
|
|
170
|
+
const channelId = blockBody.channel?.id;
|
|
171
|
+
if (!channelId)
|
|
172
|
+
return;
|
|
173
|
+
const stateValues = blockBody.state?.values;
|
|
174
|
+
const checkboxState = stateValues?.["ask_slack_options"]?.["ask_slack_checkboxes"];
|
|
175
|
+
const selectedLabels = checkboxState?.selected_options?.map((opt) => opt.value) ?? [];
|
|
176
|
+
if (selectedLabels.length === 0) {
|
|
177
|
+
console.error("[Bolt] Submit clicked but no options selected");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
console.error("[Bolt] Submit — selected:", selectedLabels, "in channel:", channelId);
|
|
181
|
+
resolvePending(channelId, formatSelected(selectedLabels));
|
|
44
182
|
});
|
|
183
|
+
// --- Exported functions ---
|
|
45
184
|
export async function startBoltApp() {
|
|
46
|
-
// Wait for stale Slack connections to expire (prevents event splitting)
|
|
47
185
|
console.error(`[Bolt] Waiting ${STARTUP_DELAY_MS / 1000}s for stale connections to expire...`);
|
|
48
186
|
await new Promise((r) => setTimeout(r, STARTUP_DELAY_MS));
|
|
49
187
|
await boltApp.start();
|
|
@@ -53,7 +191,7 @@ export async function stopBoltApp() {
|
|
|
53
191
|
await boltApp.stop();
|
|
54
192
|
console.error("[Bolt] Socket Mode app stopped.");
|
|
55
193
|
}
|
|
56
|
-
export async function sendQuestionAndWait(question, slackUserId) {
|
|
194
|
+
export async function sendQuestionAndWait(question, slackUserId, options, multiSelect) {
|
|
57
195
|
const userId = slackUserId ?? process.env.SLACK_USER_ID;
|
|
58
196
|
if (!userId) {
|
|
59
197
|
throw new Error("Missing slack_user_id parameter and SLACK_USER_ID environment variable");
|
|
@@ -61,13 +199,26 @@ export async function sendQuestionAndWait(question, slackUserId) {
|
|
|
61
199
|
// Open DM channel with user
|
|
62
200
|
const dmResult = await web.conversations.open({ users: userId });
|
|
63
201
|
const channelId = dmResult.channel.id;
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
202
|
+
// Build and send message
|
|
203
|
+
const hasOptions = options && options.length > 0;
|
|
204
|
+
if (hasOptions) {
|
|
205
|
+
const blocks = buildOptionsBlocks(question, options, multiSelect ?? false);
|
|
206
|
+
await web.chat.postMessage({
|
|
207
|
+
channel: channelId,
|
|
208
|
+
text: question, // fallback for notifications
|
|
209
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
210
|
+
blocks: blocks,
|
|
211
|
+
mrkdwn: true,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
await web.chat.postMessage({
|
|
216
|
+
channel: channelId,
|
|
217
|
+
text: question,
|
|
218
|
+
mrkdwn: true,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
// Wait for response (text reply or interactive action)
|
|
71
222
|
console.error(`[Slack] Waiting for reply in channel ${channelId} (timeout: ${TIMEOUT_MS / 1000}s)`);
|
|
72
223
|
return new Promise((resolve, reject) => {
|
|
73
224
|
const timer = setTimeout(() => {
|
|
@@ -75,9 +226,13 @@ export async function sendQuestionAndWait(question, slackUserId) {
|
|
|
75
226
|
pendingQuestions.delete(channelId);
|
|
76
227
|
reject(new Error("Timeout — user did not respond within 5 minutes"));
|
|
77
228
|
}, TIMEOUT_MS);
|
|
78
|
-
pendingQuestions.set(channelId,
|
|
79
|
-
|
|
80
|
-
|
|
229
|
+
pendingQuestions.set(channelId, {
|
|
230
|
+
resolve: (answer) => {
|
|
231
|
+
clearTimeout(timer);
|
|
232
|
+
resolve(answer);
|
|
233
|
+
},
|
|
234
|
+
options: hasOptions ? options : undefined,
|
|
235
|
+
multiSelect,
|
|
81
236
|
});
|
|
82
237
|
});
|
|
83
238
|
}
|
package/dist/slack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"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"}
|