@mono-agent/slack-adapter 0.4.0 → 0.4.1
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 +1 -1
- package/dist/adapter.d.ts +194 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +416 -7
- package/dist/adapter.js.map +1 -1
- package/dist/config.d.ts +58 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +213 -78
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/message-stream.d.ts +11 -0
- package/dist/message-stream.d.ts.map +1 -1
- package/dist/message-stream.js +6 -0
- package/dist/message-stream.js.map +1 -1
- package/dist/slack-client.d.ts +2 -1
- package/dist/slack-client.d.ts.map +1 -1
- package/dist/slack-client.js +3 -0
- package/dist/slack-client.js.map +1 -1
- package/dist/socket-mode-runner.d.ts +110 -1
- package/dist/socket-mode-runner.d.ts.map +1 -1
- package/dist/socket-mode-runner.js +287 -22
- package/dist/socket-mode-runner.js.map +1 -1
- package/dist/start.d.ts +26 -3
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +46 -0
- package/dist/start.js.map +1 -1
- package/dist/types.d.ts +93 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -3
|
@@ -1,22 +1,90 @@
|
|
|
1
1
|
import WebSocket from "ws";
|
|
2
|
+
function onPingPong(socket, listener) {
|
|
3
|
+
const listenable = socket;
|
|
4
|
+
if (typeof listenable.on !== "function") {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
listenable.on("ping", listener);
|
|
9
|
+
listenable.on("pong", listener);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// A transport whose `on` rejects unknown events simply opts out of
|
|
13
|
+
// ping/pong-based liveness; inbound messages still refresh the watchdog.
|
|
14
|
+
}
|
|
15
|
+
}
|
|
2
16
|
const DEFAULT_INITIAL_BACKOFF_MS = 500;
|
|
3
|
-
|
|
17
|
+
// Raised from 10s to 30s (matching the Telegram poller's restart ceiling): a
|
|
18
|
+
// `too_many_websockets` disconnect signals the app exceeded Slack's per-app
|
|
19
|
+
// connection budget, so a longer cool-down gives an orphaned socket time to clear
|
|
20
|
+
// server-side instead of re-hammering the limit every 10s.
|
|
21
|
+
const DEFAULT_MAX_BACKOFF_MS = 30_000;
|
|
22
|
+
// Slack's Socket Mode server pings clients periodically; a healthy idle socket
|
|
23
|
+
// therefore sees inbound frames well within this window. These defaults probe
|
|
24
|
+
// every 30s and declare a socket dead after 90s of total silence — long enough
|
|
25
|
+
// to avoid false positives on a quiet connection, short enough to self-heal a
|
|
26
|
+
// half-open socket (e.g. after the host sleeps) within ~1.5 min.
|
|
27
|
+
const DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000;
|
|
28
|
+
const DEFAULT_HEARTBEAT_TIMEOUT_MS = 90_000;
|
|
29
|
+
const DEFAULT_STABILITY_MS = 30_000;
|
|
30
|
+
const DEFAULT_STARTUP_GRACE_MS = 10_000;
|
|
31
|
+
const DEFAULT_DRAIN_DEADLINE_MS = 5_000;
|
|
32
|
+
const DEFAULT_BACKOFF_JITTER_RATIO = 0.2;
|
|
33
|
+
// Small floor between graceful reconnects so a pathological refresh/warning storm
|
|
34
|
+
// cannot busy-loop. Far below the failure backoff, so a routine refresh is unaffected.
|
|
35
|
+
const DEFAULT_GRACEFUL_RECONNECT_FLOOR_MS = 250;
|
|
36
|
+
// Slack `disconnect` reasons that are a planned, graceful refresh: Slack is (or is
|
|
37
|
+
// about to be) closing this socket as routine maintenance. `warning` is the courtesy
|
|
38
|
+
// heads-up sent shortly before a refresh — reacting to it as a failure (the old
|
|
39
|
+
// behavior) doubled the reconnect rate and was a primary `too_many_websockets`
|
|
40
|
+
// amplifier. These reconnect immediately with no backoff and are not a degradation.
|
|
41
|
+
const GRACEFUL_DISCONNECT_REASONS = new Set(["refresh_requested", "warning"]);
|
|
4
42
|
export class SlackSocketModeRunner {
|
|
5
43
|
api;
|
|
6
44
|
handler;
|
|
7
45
|
initialBackoffMs;
|
|
8
46
|
maxBackoffMs;
|
|
47
|
+
heartbeatIntervalMs;
|
|
48
|
+
heartbeatTimeoutMs;
|
|
49
|
+
stabilityMs;
|
|
50
|
+
startupGraceMs;
|
|
51
|
+
drainDeadlineMs;
|
|
52
|
+
gracefulReconnectFloorMs;
|
|
53
|
+
jitterRatio;
|
|
54
|
+
random;
|
|
9
55
|
webSocketFactory;
|
|
10
56
|
onEventResult;
|
|
57
|
+
onInteraction;
|
|
58
|
+
onConnectionLost;
|
|
59
|
+
onConnectionRestored;
|
|
11
60
|
logger;
|
|
12
61
|
activeSocket;
|
|
62
|
+
// Per-`start()` run state (reset on each start). The backoff is class-scoped so the
|
|
63
|
+
// stability timer (inside connectOnce) can reset it only after a socket proves
|
|
64
|
+
// healthy, rather than it resetting on every connect.
|
|
65
|
+
currentBackoffMs = 0;
|
|
66
|
+
connectionDegraded = false;
|
|
67
|
+
hasEverConnected = false;
|
|
68
|
+
startedAt = 0;
|
|
13
69
|
constructor(options) {
|
|
14
70
|
this.api = options.api;
|
|
15
71
|
this.handler = options.handler;
|
|
16
72
|
this.initialBackoffMs = options.reconnect?.initialMs ?? DEFAULT_INITIAL_BACKOFF_MS;
|
|
17
73
|
this.maxBackoffMs = options.reconnect?.maxMs ?? DEFAULT_MAX_BACKOFF_MS;
|
|
74
|
+
this.heartbeatIntervalMs = options.heartbeat?.intervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
75
|
+
this.heartbeatTimeoutMs = options.heartbeat?.timeoutMs ?? DEFAULT_HEARTBEAT_TIMEOUT_MS;
|
|
76
|
+
this.stabilityMs = options.reconnect?.stabilityMs ?? DEFAULT_STABILITY_MS;
|
|
77
|
+
this.startupGraceMs = options.reconnect?.startupGraceMs ?? DEFAULT_STARTUP_GRACE_MS;
|
|
78
|
+
this.drainDeadlineMs = options.reconnect?.drainDeadlineMs ?? DEFAULT_DRAIN_DEADLINE_MS;
|
|
79
|
+
this.gracefulReconnectFloorMs =
|
|
80
|
+
options.reconnect?.gracefulReconnectFloorMs ?? DEFAULT_GRACEFUL_RECONNECT_FLOOR_MS;
|
|
81
|
+
this.jitterRatio = options.reconnect?.jitterRatio ?? DEFAULT_BACKOFF_JITTER_RATIO;
|
|
82
|
+
this.random = options.random ?? Math.random;
|
|
18
83
|
this.webSocketFactory = options.webSocketFactory ?? ((url) => new WebSocket(url));
|
|
19
84
|
this.onEventResult = options.onEventResult;
|
|
85
|
+
this.onInteraction = options.onInteraction;
|
|
86
|
+
this.onConnectionLost = options.onConnectionLost;
|
|
87
|
+
this.onConnectionRestored = options.onConnectionRestored;
|
|
20
88
|
this.logger = options.logger;
|
|
21
89
|
if (!Number.isFinite(this.initialBackoffMs) || this.initialBackoffMs < 0) {
|
|
22
90
|
throw new RangeError("SlackSocketModeRunner initial backoff must be non-negative.");
|
|
@@ -24,16 +92,46 @@ export class SlackSocketModeRunner {
|
|
|
24
92
|
if (!Number.isFinite(this.maxBackoffMs) || this.maxBackoffMs < this.initialBackoffMs) {
|
|
25
93
|
throw new RangeError("SlackSocketModeRunner max backoff must be at least the initial backoff.");
|
|
26
94
|
}
|
|
95
|
+
if (!Number.isFinite(this.heartbeatIntervalMs) || this.heartbeatIntervalMs < 0) {
|
|
96
|
+
throw new RangeError("SlackSocketModeRunner heartbeat interval must be non-negative.");
|
|
97
|
+
}
|
|
98
|
+
if (!Number.isFinite(this.heartbeatTimeoutMs) || this.heartbeatTimeoutMs < 0) {
|
|
99
|
+
throw new RangeError("SlackSocketModeRunner heartbeat timeout must be non-negative.");
|
|
100
|
+
}
|
|
101
|
+
if (!Number.isFinite(this.stabilityMs) || this.stabilityMs < 0) {
|
|
102
|
+
throw new RangeError("SlackSocketModeRunner stability window must be non-negative.");
|
|
103
|
+
}
|
|
104
|
+
if (!Number.isFinite(this.startupGraceMs) || this.startupGraceMs < 0) {
|
|
105
|
+
throw new RangeError("SlackSocketModeRunner startup grace must be non-negative.");
|
|
106
|
+
}
|
|
107
|
+
if (!Number.isFinite(this.drainDeadlineMs) || this.drainDeadlineMs < 0) {
|
|
108
|
+
throw new RangeError("SlackSocketModeRunner drain deadline must be non-negative.");
|
|
109
|
+
}
|
|
110
|
+
if (!Number.isFinite(this.gracefulReconnectFloorMs) || this.gracefulReconnectFloorMs < 0) {
|
|
111
|
+
throw new RangeError("SlackSocketModeRunner graceful reconnect floor must be non-negative.");
|
|
112
|
+
}
|
|
113
|
+
if (!Number.isFinite(this.jitterRatio) || this.jitterRatio < 0 || this.jitterRatio > 1) {
|
|
114
|
+
throw new RangeError("SlackSocketModeRunner jitter ratio must be between 0 and 1.");
|
|
115
|
+
}
|
|
27
116
|
}
|
|
28
117
|
async start(options = {}) {
|
|
29
118
|
if (isSignalAborted(options.signal)) {
|
|
30
119
|
return;
|
|
31
120
|
}
|
|
32
|
-
|
|
121
|
+
// (Re)initialize per-run state for this start cycle.
|
|
122
|
+
this.currentBackoffMs = this.initialBackoffMs;
|
|
123
|
+
this.connectionDegraded = false;
|
|
124
|
+
this.hasEverConnected = false;
|
|
125
|
+
this.startedAt = Date.now();
|
|
33
126
|
while (!isSignalAborted(options.signal)) {
|
|
34
127
|
try {
|
|
35
128
|
await this.connectOnce(options.signal);
|
|
36
|
-
|
|
129
|
+
// A graceful exit (refresh/warning/clean close) resolves here and reconnects
|
|
130
|
+
// with no backoff. Apply a small jittered floor so a degenerate server that
|
|
131
|
+
// drops every socket at/before open cannot spin into a zero-delay storm. The
|
|
132
|
+
// backoff is reset only by the stability timer once a socket proves healthy
|
|
133
|
+
// (see connectOnce), NOT on every connect — a flap must keep accumulating it.
|
|
134
|
+
await abortableDelay(this.jitteredDelay(this.gracefulReconnectFloorMs), options.signal);
|
|
37
135
|
}
|
|
38
136
|
catch (error) {
|
|
39
137
|
if (isSignalAborted(options.signal)) {
|
|
@@ -41,13 +139,25 @@ export class SlackSocketModeRunner {
|
|
|
41
139
|
}
|
|
42
140
|
this.logger?.warn?.("Slack Socket Mode connection failed; backing off.", {
|
|
43
141
|
error: error instanceof Error ? error.message : String(error),
|
|
44
|
-
backoffMs,
|
|
142
|
+
backoffMs: this.currentBackoffMs,
|
|
45
143
|
});
|
|
46
|
-
await abortableDelay(
|
|
47
|
-
|
|
144
|
+
await abortableDelay(this.jitteredDelay(this.currentBackoffMs), options.signal);
|
|
145
|
+
this.currentBackoffMs = Math.min(this.maxBackoffMs, Math.max(this.currentBackoffMs * 2, 1));
|
|
48
146
|
}
|
|
49
147
|
}
|
|
50
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Apply band jitter to a backoff base: uniformly within ±`jitterRatio` of `baseMs`.
|
|
151
|
+
* De-synchronizes reconnect attempts so colliding clients (or a restart loop) stop
|
|
152
|
+
* re-triggering Slack's `too_many_websockets` in lockstep.
|
|
153
|
+
*/
|
|
154
|
+
jitteredDelay(baseMs) {
|
|
155
|
+
if (baseMs <= 0 || this.jitterRatio <= 0) {
|
|
156
|
+
return baseMs;
|
|
157
|
+
}
|
|
158
|
+
const factor = 1 - this.jitterRatio + this.random() * this.jitterRatio * 2;
|
|
159
|
+
return baseMs * factor;
|
|
160
|
+
}
|
|
51
161
|
async connectOnce(signal) {
|
|
52
162
|
const connection = await this.api.appsConnectionsOpen({ ...(signal === undefined ? {} : { signal }) });
|
|
53
163
|
if (isSignalAborted(signal)) {
|
|
@@ -57,26 +167,58 @@ export class SlackSocketModeRunner {
|
|
|
57
167
|
const socket = this.webSocketFactory(connection.url);
|
|
58
168
|
this.activeSocket = socket;
|
|
59
169
|
let settled = false;
|
|
170
|
+
let heartbeatTimer;
|
|
171
|
+
let stabilityTimer;
|
|
172
|
+
let drainTimer;
|
|
173
|
+
let lastActivityAt = Date.now();
|
|
174
|
+
const markActivity = () => {
|
|
175
|
+
lastActivityAt = Date.now();
|
|
176
|
+
};
|
|
177
|
+
const clearTimers = () => {
|
|
178
|
+
if (heartbeatTimer !== undefined) {
|
|
179
|
+
clearInterval(heartbeatTimer);
|
|
180
|
+
heartbeatTimer = undefined;
|
|
181
|
+
}
|
|
182
|
+
if (stabilityTimer !== undefined) {
|
|
183
|
+
clearTimeout(stabilityTimer);
|
|
184
|
+
stabilityTimer = undefined;
|
|
185
|
+
}
|
|
186
|
+
if (drainTimer !== undefined) {
|
|
187
|
+
clearTimeout(drainTimer);
|
|
188
|
+
drainTimer = undefined;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
60
191
|
const settle = (action) => {
|
|
61
192
|
if (settled) {
|
|
62
193
|
return;
|
|
63
194
|
}
|
|
64
195
|
settled = true;
|
|
196
|
+
clearTimers();
|
|
65
197
|
signal?.removeEventListener("abort", onAbort);
|
|
66
198
|
if (this.activeSocket === socket) {
|
|
67
199
|
this.activeSocket = undefined;
|
|
68
200
|
}
|
|
69
201
|
action();
|
|
70
202
|
};
|
|
71
|
-
|
|
203
|
+
// Hard teardown: drop the TCP connection immediately (no closing handshake) so
|
|
204
|
+
// a throttled/half-dead peer cannot linger against Slack's per-app connection
|
|
205
|
+
// budget and re-trigger `too_many_websockets`. Falls back to close() on a
|
|
206
|
+
// transport without terminate().
|
|
207
|
+
const drainHard = () => {
|
|
72
208
|
try {
|
|
73
|
-
socket.
|
|
209
|
+
if (typeof socket.terminate === "function") {
|
|
210
|
+
socket.terminate();
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
socket.close();
|
|
214
|
+
}
|
|
74
215
|
}
|
|
75
|
-
|
|
76
|
-
settle
|
|
216
|
+
catch {
|
|
217
|
+
// settle still happens via the close/error handlers or the drain deadline.
|
|
77
218
|
}
|
|
78
219
|
};
|
|
79
|
-
|
|
220
|
+
// Graceful teardown: a normal close handshake for a planned, expected swap.
|
|
221
|
+
const drainGraceful = () => {
|
|
80
222
|
try {
|
|
81
223
|
socket.close();
|
|
82
224
|
}
|
|
@@ -84,33 +226,134 @@ export class SlackSocketModeRunner {
|
|
|
84
226
|
settle(resolve);
|
|
85
227
|
}
|
|
86
228
|
};
|
|
87
|
-
|
|
88
|
-
|
|
229
|
+
// Backstop after a watchdog terminate: if the socket emits neither close nor
|
|
230
|
+
// error in time, force-settle so the reconnect loop can never wedge on a stuck
|
|
231
|
+
// socket. (The disconnect/error paths settle synchronously and never arm this.)
|
|
232
|
+
const armDrainDeadline = () => {
|
|
233
|
+
if (this.drainDeadlineMs <= 0 || drainTimer !== undefined) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
drainTimer = setTimeout(() => {
|
|
237
|
+
this.logger?.warn?.("Slack Socket Mode socket did not close after terminate; forcing reconnect.");
|
|
238
|
+
settle(resolve);
|
|
239
|
+
}, this.drainDeadlineMs);
|
|
240
|
+
drainTimer.unref?.();
|
|
241
|
+
};
|
|
242
|
+
// Report a real degradation exactly once. Suppressed for a lingering
|
|
243
|
+
// prior-process socket inside the startup grace (the common post-restart case),
|
|
244
|
+
// where retrying quietly with backoff is expected rather than an outage.
|
|
245
|
+
const reportLost = (reason) => {
|
|
246
|
+
if (this.connectionDegraded) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (!this.hasEverConnected && Date.now() - this.startedAt < this.startupGraceMs) {
|
|
250
|
+
this.logger?.info?.("Slack Socket Mode rejected during startup grace; retrying quietly.", { reason });
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
this.connectionDegraded = true;
|
|
254
|
+
this.logger?.warn?.("Slack Socket Mode connection degraded; transport is recovering.", { reason });
|
|
255
|
+
this.onConnectionLost?.(reason);
|
|
256
|
+
};
|
|
257
|
+
// Watchdog for a silently dead ("half-open") socket: if no inbound frame
|
|
258
|
+
// arrives within heartbeatTimeoutMs, force-recycle so the reconnect loop
|
|
259
|
+
// re-establishes the connection. Without this, a connection broken by host
|
|
260
|
+
// sleep or a network blip never fires `close`, so the runner waits forever
|
|
261
|
+
// and the channel goes silent until a manual restart.
|
|
262
|
+
const startHeartbeat = () => {
|
|
263
|
+
if (this.heartbeatTimeoutMs <= 0 || this.heartbeatIntervalMs <= 0) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
markActivity();
|
|
267
|
+
heartbeatTimer = setInterval(() => {
|
|
268
|
+
if (settled) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (Date.now() - lastActivityAt >= this.heartbeatTimeoutMs) {
|
|
272
|
+
this.logger?.warn?.("Slack Socket Mode heartbeat timed out; recycling connection.", {
|
|
273
|
+
silentForMs: Date.now() - lastActivityAt,
|
|
274
|
+
});
|
|
275
|
+
reportLost("heartbeat_timeout");
|
|
276
|
+
drainHard();
|
|
277
|
+
// A silent socket may not emit close after terminate; guarantee progress.
|
|
278
|
+
armDrainDeadline();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// Otherwise probe the peer so a healthy-but-idle socket stays marked
|
|
282
|
+
// active via the resulting pong/ping frames.
|
|
283
|
+
try {
|
|
284
|
+
socket.ping?.();
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// A throwing ping means the socket is already gone; the close/error
|
|
288
|
+
// handler will settle and trigger reconnect.
|
|
289
|
+
}
|
|
290
|
+
}, this.heartbeatIntervalMs);
|
|
291
|
+
// Never let the watchdog keep the process alive on its own.
|
|
292
|
+
heartbeatTimer.unref?.();
|
|
293
|
+
};
|
|
294
|
+
const onAbort = () => {
|
|
295
|
+
// A clean stop: terminate-first so a fast stop→start (config reload, restart)
|
|
296
|
+
// cannot leave an orphaned socket counted against the per-app budget.
|
|
89
297
|
try {
|
|
90
|
-
|
|
298
|
+
drainHard();
|
|
91
299
|
}
|
|
92
|
-
|
|
93
|
-
|
|
300
|
+
finally {
|
|
301
|
+
settle(resolve);
|
|
94
302
|
}
|
|
95
303
|
};
|
|
304
|
+
// Planned, graceful refresh: reconnect immediately — no backoff, no degraded.
|
|
305
|
+
const closeForReconnect = () => {
|
|
306
|
+
drainGraceful();
|
|
307
|
+
};
|
|
308
|
+
// Real failure: report degraded, settle as a reject (so start() backs off), THEN
|
|
309
|
+
// terminate. Settling before the terminate guarantees the reject wins the race
|
|
310
|
+
// against the terminate-induced `close` (which would otherwise resolve).
|
|
311
|
+
const failForBackoff = (error, reason) => {
|
|
312
|
+
reportLost(reason);
|
|
313
|
+
settle(() => reject(error));
|
|
314
|
+
drainHard();
|
|
315
|
+
};
|
|
96
316
|
socket.on("open", () => {
|
|
97
317
|
this.logger?.info?.("Slack Socket Mode connected.");
|
|
318
|
+
this.hasEverConnected = true;
|
|
319
|
+
startHeartbeat();
|
|
320
|
+
// Stability window: a socket that stays open this long is healthy — reset the
|
|
321
|
+
// backoff curve and, if we were degraded, announce recovery. Gating recovery
|
|
322
|
+
// on `connectionDegraded` keeps it from firing on the first healthy connect.
|
|
323
|
+
if (this.stabilityMs > 0) {
|
|
324
|
+
stabilityTimer = setTimeout(() => {
|
|
325
|
+
if (settled) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
// Safe to write the class-scoped backoff here: this fires only while the
|
|
329
|
+
// socket is open and connectOnce's promise is unsettled, so start()'s
|
|
330
|
+
// post-settle read/grow always observes this reset (no cross-await race).
|
|
331
|
+
this.currentBackoffMs = this.initialBackoffMs;
|
|
332
|
+
if (this.connectionDegraded) {
|
|
333
|
+
this.connectionDegraded = false;
|
|
334
|
+
this.logger?.info?.("Slack Socket Mode connection recovered.");
|
|
335
|
+
this.onConnectionRestored?.();
|
|
336
|
+
}
|
|
337
|
+
}, this.stabilityMs);
|
|
338
|
+
stabilityTimer.unref?.();
|
|
339
|
+
}
|
|
98
340
|
});
|
|
341
|
+
onPingPong(socket, markActivity);
|
|
99
342
|
socket.on("message", (data) => {
|
|
343
|
+
markActivity();
|
|
100
344
|
const envelope = parseSocketEnvelope(data);
|
|
101
345
|
if (envelope === undefined) {
|
|
102
346
|
this.logger?.warn?.("Slack Socket Mode envelope was malformed.");
|
|
103
347
|
return;
|
|
104
348
|
}
|
|
105
349
|
if (envelope.type === "disconnect") {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
failForBackoff(new Error(`Slack Socket Mode disconnect requested: ${envelope.reason ?? "unknown"}`));
|
|
350
|
+
const reason = envelope.reason ?? "unknown";
|
|
351
|
+
this.logger?.info?.("Slack Socket Mode disconnect requested.", { reason });
|
|
352
|
+
if (GRACEFUL_DISCONNECT_REASONS.has(reason)) {
|
|
353
|
+
closeForReconnect();
|
|
111
354
|
return;
|
|
112
355
|
}
|
|
113
|
-
|
|
356
|
+
failForBackoff(new Error(`Slack Socket Mode disconnect requested: ${reason}`), reason);
|
|
114
357
|
return;
|
|
115
358
|
}
|
|
116
359
|
void this.handleEnvelope(socket, envelope).catch((error) => {
|
|
@@ -123,6 +366,7 @@ export class SlackSocketModeRunner {
|
|
|
123
366
|
settle(resolve);
|
|
124
367
|
});
|
|
125
368
|
socket.on("error", (error) => {
|
|
369
|
+
reportLost("socket_error");
|
|
126
370
|
settle(() => reject(error instanceof Error ? error : new Error(String(error))));
|
|
127
371
|
});
|
|
128
372
|
if (signal?.aborted === true) {
|
|
@@ -136,6 +380,20 @@ export class SlackSocketModeRunner {
|
|
|
136
380
|
if (envelope.envelope_id !== undefined) {
|
|
137
381
|
socket.send(JSON.stringify({ envelope_id: envelope.envelope_id }));
|
|
138
382
|
}
|
|
383
|
+
// Interactivity: a clicked ⚡ shortcut, message action, or Block Kit button.
|
|
384
|
+
// The ack above already went out, so a slow handler never risks Slack's 3s
|
|
385
|
+
// ack deadline.
|
|
386
|
+
if (envelope.type === "interactive") {
|
|
387
|
+
if (this.onInteraction === undefined) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const payload = asInteractivityPayload(envelope.payload);
|
|
391
|
+
if (payload === undefined) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
await this.onInteraction(payload);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
139
397
|
if (envelope.type !== "events_api" || !isSlackEventCallback(envelope.payload)) {
|
|
140
398
|
return;
|
|
141
399
|
}
|
|
@@ -196,6 +454,13 @@ function isSlackEventCallback(value) {
|
|
|
196
454
|
}
|
|
197
455
|
return typeof value.event_id === "string" && isRecord(value.event);
|
|
198
456
|
}
|
|
457
|
+
function asInteractivityPayload(value) {
|
|
458
|
+
if (!isRecord(value) ||
|
|
459
|
+
(value.type !== "shortcut" && value.type !== "message_action" && value.type !== "block_actions")) {
|
|
460
|
+
return undefined;
|
|
461
|
+
}
|
|
462
|
+
return value;
|
|
463
|
+
}
|
|
199
464
|
function isSignalAborted(signal) {
|
|
200
465
|
return signal?.aborted === true;
|
|
201
466
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-mode-runner.js","sourceRoot":"","sources":["../src/socket-mode-runner.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AA6C3B,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,MAAM,OAAO,qBAAqB;IACf,GAAG,CAAc;IACjB,OAAO,CAA4B;IACnC,gBAAgB,CAAS;IACzB,YAAY,CAAS;IACrB,gBAAgB,CAAwB;IACxC,aAAa,CAEhB;IACG,MAAM,CAA0C;IACzD,YAAY,CAAiC;IAErD,YAAY,OAAqC;QAC/C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,0BAA0B,CAAC;QACnF,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,sBAAsB,CAAC;QACvE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,CAAuB,CAAC,CAAC;QACxG,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,UAAU,CAAC,6DAA6D,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACrF,MAAM,IAAI,UAAU,CAAC,yEAAyE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAA6C,EAAE;QACzD,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACtC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACvC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,mDAAmD,EAAE;oBACvE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS;iBACV,CAAC,CAAC;gBACH,MAAM,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAChD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAA+B;QACvD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACvG,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,OAAO,GAAG,KAAK,CAAC;YAEpB,MAAM,MAAM,GAAG,CAAC,MAAkB,EAAQ,EAAE;gBAC1C,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;oBACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAChC,CAAC;gBACD,MAAM,EAAE,CAAC;YACX,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;wBAAS,CAAC;oBACT,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,iBAAiB,GAAG,GAAS,EAAE;gBACnC,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC;YACF,MAAM,cAAc,GAAG,CAAC,KAAY,EAAQ,EAAE;gBAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,uEAAuE;gBACzE,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACrB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,8BAA8B,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;gBACrC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,2CAA2C,CAAC,CAAC;oBACjE,OAAO;gBACT,CAAC;gBACD,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACnC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,yCAAyC,EAAE;wBAC7D,MAAM,EAAE,QAAQ,CAAC,MAAM;qBACxB,CAAC,CAAC;oBACH,IAAI,QAAQ,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;wBAC5C,cAAc,CAAC,IAAI,KAAK,CAAC,2CAA2C,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;wBACrG,OAAO;oBACT,CAAC;oBACD,iBAAiB,EAAE,CAAC;oBACpB,OAAO;gBACT,CAAC;gBACD,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBAClE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,6CAA6C,EAAE;wBAClE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;gBACpC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,MAA0B,EAC1B,QAAiC;QAEjC,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,IAAa;IACxC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC3C,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;YACzD,QAAQ,CAAC,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,CAAC;QACtE,CAAC;QACD,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;YACxB,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACpC,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,MAAM,CAAC,EAAE,CAAC;QACxE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B;IACtD,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CACrB,EAAU,EACV,MAA+B;IAE/B,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
|
|
1
|
+
{"version":3,"file":"socket-mode-runner.js","sourceRoot":"","sources":["../src/socket-mode-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/start.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SlackAdapter, type AgentResponder, type SlackAdapterLogger, type SlackAdapterMessages, type SlackAdapterStreamOptions, type SlackAttachmentOptions, type SlackEventHandlingResult } from "./adapter.js";
|
|
2
|
-
import { SlackSocketModeRunner, type SlackSocketModeRunnerBackoffOptions, type SlackSocketModeRunnerLogger, type SlackWebSocketFactory } from "./socket-mode-runner.js";
|
|
1
|
+
import { SlackAdapter, type AgentResponder, type SlackAdapterLogger, type SlackAdapterMessages, type SlackAdapterStreamOptions, type SlackAttachmentOptions, type SlackEventHandlingResult, type SlackHomeTabOptions, type SlackShortcutBinding } from "./adapter.js";
|
|
2
|
+
import { SlackSocketModeRunner, type SlackSocketModeRunnerBackoffOptions, type SlackSocketModeRunnerHeartbeatOptions, type SlackSocketModeRunnerLogger, type SlackWebSocketFactory } from "./socket-mode-runner.js";
|
|
3
3
|
import type { SlackChannelId, SlackUserId, SlackWebApi } from "./types.js";
|
|
4
4
|
export interface SlackAdapterStartLogger extends SlackAdapterLogger, SlackSocketModeRunnerLogger {
|
|
5
5
|
}
|
|
@@ -23,11 +23,34 @@ export interface SlackAdapterStartOptions {
|
|
|
23
23
|
readonly stream?: SlackAdapterStreamOptions;
|
|
24
24
|
readonly messages?: SlackAdapterMessages;
|
|
25
25
|
readonly attachments?: SlackAttachmentOptions;
|
|
26
|
+
/**
|
|
27
|
+
* Shortcut bindings (callback_id → prompt). When set, the Socket Mode runner
|
|
28
|
+
* routes shortcut payloads to the adapter, which runs the bound prompt as a
|
|
29
|
+
* proactive turn. Omitted/empty leaves interactivity ignored.
|
|
30
|
+
*/
|
|
31
|
+
readonly shortcuts?: readonly SlackShortcutBinding[];
|
|
32
|
+
/**
|
|
33
|
+
* App Home tab configuration (persistent action buttons). When enabled, the
|
|
34
|
+
* adapter publishes the tab on open and routes button clicks to their prompts.
|
|
35
|
+
*/
|
|
36
|
+
readonly homeTab?: SlackHomeTabOptions;
|
|
26
37
|
readonly logger?: SlackAdapterStartLogger;
|
|
27
|
-
/**
|
|
38
|
+
/** Resolve an in-thread reply back to the conversation that produced the message it threads off. */
|
|
39
|
+
readonly resolvePostIndex?: (channelId: string, ts: string) => Promise<string | undefined>;
|
|
40
|
+
/** Record a posted message `(channel, ts) → conversationId` for later reply resolution. */
|
|
41
|
+
readonly recordPostedMessage?: (channelId: string, ts: string, conversationId: string) => void;
|
|
42
|
+
/** Reconnect backoff bounds (and jitter/stability/startup-grace/drain tuning) forwarded to the Socket Mode runner. */
|
|
28
43
|
readonly reconnect?: SlackSocketModeRunnerBackoffOptions;
|
|
44
|
+
/** Heartbeat watchdog for detecting and recycling a silently dead socket. */
|
|
45
|
+
readonly heartbeat?: SlackSocketModeRunnerHeartbeatOptions;
|
|
29
46
|
/** Observe every Socket Mode event handling result. */
|
|
30
47
|
readonly onEventResult?: (result: SlackEventHandlingResult) => void | Promise<void>;
|
|
48
|
+
/** Called once when the connection drops into the reconnect/backoff loop (degraded). Wire to the app's onDegraded. */
|
|
49
|
+
readonly onConnectionLost?: (reason: string) => void;
|
|
50
|
+
/** Called once a reconnect has stayed up for the stability window after a prior loss (recovered). Wire to onRecovered. */
|
|
51
|
+
readonly onConnectionRestored?: () => void;
|
|
52
|
+
/** Injected RNG for backoff jitter; defaults to Math.random. Tests inject a deterministic value. */
|
|
53
|
+
readonly random?: () => number;
|
|
31
54
|
/**
|
|
32
55
|
* Injected Slack Web API factory. Defaults to constructing a real
|
|
33
56
|
* {@link SlackWebApiClient}. Tests can supply a fake transport here.
|
package/dist/start.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
|
package/dist/start.js
CHANGED
|
@@ -77,9 +77,21 @@ function buildAdapterOptions(api, options) {
|
|
|
77
77
|
if (options.attachments !== undefined) {
|
|
78
78
|
adapterOptions.attachments = options.attachments;
|
|
79
79
|
}
|
|
80
|
+
if (options.shortcuts !== undefined) {
|
|
81
|
+
adapterOptions.shortcuts = options.shortcuts;
|
|
82
|
+
}
|
|
83
|
+
if (options.homeTab !== undefined) {
|
|
84
|
+
adapterOptions.homeTab = options.homeTab;
|
|
85
|
+
}
|
|
80
86
|
if (options.logger !== undefined) {
|
|
81
87
|
adapterOptions.logger = options.logger;
|
|
82
88
|
}
|
|
89
|
+
if (options.resolvePostIndex !== undefined) {
|
|
90
|
+
adapterOptions.resolvePostIndex = options.resolvePostIndex;
|
|
91
|
+
}
|
|
92
|
+
if (options.recordPostedMessage !== undefined) {
|
|
93
|
+
adapterOptions.recordPostedMessage = options.recordPostedMessage;
|
|
94
|
+
}
|
|
83
95
|
return adapterOptions;
|
|
84
96
|
}
|
|
85
97
|
function buildRunnerOptions(api, adapter, options) {
|
|
@@ -90,12 +102,46 @@ function buildRunnerOptions(api, adapter, options) {
|
|
|
90
102
|
if (options.reconnect !== undefined) {
|
|
91
103
|
runnerOptions.reconnect = options.reconnect;
|
|
92
104
|
}
|
|
105
|
+
if (options.heartbeat !== undefined) {
|
|
106
|
+
runnerOptions.heartbeat = options.heartbeat;
|
|
107
|
+
}
|
|
93
108
|
if (options.webSocketFactory !== undefined) {
|
|
94
109
|
runnerOptions.webSocketFactory = options.webSocketFactory;
|
|
95
110
|
}
|
|
96
111
|
if (options.onEventResult !== undefined) {
|
|
97
112
|
runnerOptions.onEventResult = options.onEventResult;
|
|
98
113
|
}
|
|
114
|
+
if (options.onConnectionLost !== undefined) {
|
|
115
|
+
runnerOptions.onConnectionLost = options.onConnectionLost;
|
|
116
|
+
}
|
|
117
|
+
if (options.onConnectionRestored !== undefined) {
|
|
118
|
+
runnerOptions.onConnectionRestored = options.onConnectionRestored;
|
|
119
|
+
}
|
|
120
|
+
if (options.random !== undefined) {
|
|
121
|
+
runnerOptions.random = options.random;
|
|
122
|
+
}
|
|
123
|
+
// Only subscribe to interactivity when shortcuts or Home-tab buttons are bound,
|
|
124
|
+
// so the runner's behavior is unchanged for agents that wire none.
|
|
125
|
+
const hasShortcuts = options.shortcuts !== undefined && options.shortcuts.length > 0;
|
|
126
|
+
const hasHomeButtons = options.homeTab?.buttons !== undefined && options.homeTab.buttons.length > 0;
|
|
127
|
+
if (hasShortcuts || hasHomeButtons) {
|
|
128
|
+
runnerOptions.onInteraction = async (payload) => {
|
|
129
|
+
try {
|
|
130
|
+
const result = await adapter.handleInteraction(payload);
|
|
131
|
+
if (result.kind === "triggered") {
|
|
132
|
+
options.logger?.info?.("Slack interaction triggered.", { result });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
options.logger?.debug?.("Slack interaction ignored.", { result });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
options.logger?.error?.("Slack interaction handling failed.", {
|
|
140
|
+
error: error instanceof Error ? error.message : String(error),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
99
145
|
if (options.logger !== undefined) {
|
|
100
146
|
runnerOptions.logger = options.logger;
|
|
101
147
|
}
|
package/dist/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
|