cli-jaw 2.17.9 → 2.17.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/src/core/config.js +34 -3
  2. package/dist/src/core/config.js.map +1 -1
  3. package/dist/src/core/settings-merge.js +40 -0
  4. package/dist/src/core/settings-merge.js.map +1 -1
  5. package/dist/src/discord/bot.js +140 -26
  6. package/dist/src/discord/bot.js.map +1 -1
  7. package/dist/src/discord/reactions.js +92 -0
  8. package/dist/src/discord/reactions.js.map +1 -0
  9. package/dist/src/messaging/ack-reaction.js +192 -0
  10. package/dist/src/messaging/ack-reaction.js.map +1 -0
  11. package/dist/src/messaging/channel-capabilities.js +9 -3
  12. package/dist/src/messaging/channel-capabilities.js.map +1 -1
  13. package/dist/src/messaging/channel-validate.js +12 -0
  14. package/dist/src/messaging/channel-validate.js.map +1 -1
  15. package/dist/src/messaging/queue-notice.js +164 -0
  16. package/dist/src/messaging/queue-notice.js.map +1 -0
  17. package/dist/src/slack/api.js +93 -0
  18. package/dist/src/slack/api.js.map +1 -1
  19. package/dist/src/slack/auto-join.js +330 -0
  20. package/dist/src/slack/auto-join.js.map +1 -0
  21. package/dist/src/slack/bot.js +237 -21
  22. package/dist/src/slack/bot.js.map +1 -1
  23. package/dist/src/slack/manifest.js +12 -0
  24. package/dist/src/slack/manifest.js.map +1 -1
  25. package/dist/src/slack/send-only-client.js +14 -2
  26. package/dist/src/slack/send-only-client.js.map +1 -1
  27. package/dist/src/telegram/bot.js +146 -64
  28. package/dist/src/telegram/bot.js.map +1 -1
  29. package/dist/src/telegram/ipv4-fetch.js +74 -0
  30. package/dist/src/telegram/ipv4-fetch.js.map +1 -0
  31. package/dist/src/telegram/reactions.js +126 -0
  32. package/dist/src/telegram/reactions.js.map +1 -0
  33. package/package.json +1 -1
  34. package/public/locales/en.json +1 -0
  35. package/public/locales/ja.json +1 -0
  36. package/public/locales/ko.json +1 -0
  37. package/public/locales/zh.json +1 -0
  38. package/scripts/check-redaction-sinks.mjs +5 -0
@@ -0,0 +1,164 @@
1
+ // ─── Queue Notice Lifecycle ──────────────────────────
2
+ // The "added to queue" message is a promise to the user, and a promise has to
3
+ // be closed out. Three transports each hand-rolled this and each got it wrong
4
+ // in a different way, so the lifecycle lives here and the transports supply
5
+ // only two verbs.
6
+ //
7
+ // The hard part is not deletion, it is ORDERING. The notice is posted with an
8
+ // await, and the queued job can settle during that await — so cleanup routinely
9
+ // runs before there is anything to clean up. Storing the outcome and draining it
10
+ // when the handle lands is the only shape that survives that race.
11
+ export function createQueueNotice(options) {
12
+ let transport = null;
13
+ let pendingOutcome = null;
14
+ let pendingSignal;
15
+ let closed = false;
16
+ let bound = false;
17
+ let abandoned = false;
18
+ // One completion shared by every close() caller. It resolves when the vendor
19
+ // work finishes — including work that could only start once a late bind()
20
+ // supplied the handle. A close() that resolved before that would let a
21
+ // registry drain tear the transport down mid-request.
22
+ let settleCompletion = null;
23
+ let completion = null;
24
+ const swallow = (error) => { options.onError?.(error); };
25
+ const ensureCompletion = () => {
26
+ if (!completion) {
27
+ completion = new Promise((resolve) => { settleCompletion = resolve; });
28
+ }
29
+ return completion;
30
+ };
31
+ const finish = () => {
32
+ const resolve = settleCompletion;
33
+ settleCompletion = null;
34
+ resolve?.();
35
+ };
36
+ const apply = async (outcome, signal) => {
37
+ const active = transport;
38
+ // Null it first: a second close must not re-issue a vendor call even while
39
+ // the first one is still awaiting.
40
+ transport = null;
41
+ if (!active) {
42
+ finish();
43
+ return;
44
+ }
45
+ try {
46
+ if (outcome === 'answered')
47
+ await active.delete(signal);
48
+ else
49
+ await active.edit(options.expiredText, signal);
50
+ }
51
+ catch (error) {
52
+ swallow(error);
53
+ }
54
+ finally {
55
+ finish();
56
+ }
57
+ };
58
+ return {
59
+ get closed() { return closed; },
60
+ bind(next) {
61
+ // A notice has exactly one handle. A second bind would let a stale
62
+ // transport be closed twice, and after abandon() there is nothing left
63
+ // to act on — both are unconditional ignores, never a guessed outcome.
64
+ if (abandoned || bound)
65
+ return;
66
+ bound = true;
67
+ transport = next;
68
+ if (!closed)
69
+ return;
70
+ // Closed while the post was in flight: the outcome is already known, so
71
+ // honour THAT one rather than assuming the notice was answered.
72
+ const outcome = pendingOutcome;
73
+ pendingOutcome = null;
74
+ const signal = pendingSignal;
75
+ pendingSignal = undefined;
76
+ if (!outcome) {
77
+ finish();
78
+ return;
79
+ }
80
+ void apply(outcome, signal).catch(swallow);
81
+ },
82
+ close(outcome, signal) {
83
+ if (closed)
84
+ return ensureCompletion();
85
+ closed = true;
86
+ const done = ensureCompletion();
87
+ if (abandoned) {
88
+ finish();
89
+ return done;
90
+ }
91
+ if (!transport) {
92
+ // Nothing to act on yet; bind() will drain this.
93
+ pendingOutcome = outcome;
94
+ pendingSignal = signal;
95
+ return done;
96
+ }
97
+ void apply(outcome, signal).catch(swallow);
98
+ return done;
99
+ },
100
+ abandon() {
101
+ if (abandoned)
102
+ return;
103
+ abandoned = true;
104
+ pendingOutcome = null;
105
+ pendingSignal = undefined;
106
+ transport = null;
107
+ // Resolve whatever close() handed out, and pre-arm the completion so a
108
+ // later close() does not wait for a handle that will never arrive.
109
+ ensureCompletion();
110
+ finish();
111
+ },
112
+ };
113
+ }
114
+ export class QueueNoticeRegistry {
115
+ entries = new Set();
116
+ /** Returns its own unregister so a normally-completed turn can drop out
117
+ * instead of lingering until the next drain. */
118
+ add(teardown) {
119
+ this.entries.add(teardown);
120
+ return () => { this.entries.delete(teardown); };
121
+ }
122
+ get size() { return this.entries.size; }
123
+ /**
124
+ * Run every teardown, bounded, then abort whatever is still running.
125
+ *
126
+ * The bound is not decoration: grammY's client defaults to a 500s API timeout
127
+ * and this repo's Telegram fetch adapter wires no signal, so an unbounded
128
+ * await here could hold shutdown for minutes. A notice we failed to rewrite is
129
+ * a cosmetic loss; a shutdown that never finishes is not.
130
+ *
131
+ * Racing the deadline only stops WAITING, so the signal is what actually
132
+ * cancels. Transports that honour it end their request; the per-adapter proof
133
+ * of that belongs to each channel's own phase.
134
+ */
135
+ async drain(timeoutMs = 3000) {
136
+ const pending = [...this.entries];
137
+ // Cleared before awaiting: a teardown runs at most once per drain even if
138
+ // shutdown is re-entered.
139
+ this.entries.clear();
140
+ if (!pending.length)
141
+ return;
142
+ const controller = new AbortController();
143
+ let timer;
144
+ const deadline = new Promise((resolve) => {
145
+ timer = setTimeout(() => { controller.abort(); resolve(); }, timeoutMs);
146
+ });
147
+ try {
148
+ // Promise.resolve().then(fn) rather than fn(): a teardown that throws
149
+ // SYNCHRONOUSLY would otherwise escape before allSettled ever sees it,
150
+ // rejecting drain() with the entries already cleared.
151
+ const running = pending.map(fn => Promise.resolve().then(() => fn(controller.signal)));
152
+ await Promise.race([
153
+ Promise.allSettled(running).then(() => undefined),
154
+ deadline,
155
+ ]);
156
+ }
157
+ finally {
158
+ if (timer)
159
+ clearTimeout(timer);
160
+ controller.abort();
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=queue-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-notice.js","sourceRoot":"","sources":["../../../src/messaging/queue-notice.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,14 @@ export function describeSlackError(error, data) {
67
67
  return 'Slack conversation is archived';
68
68
  case 'msg_too_long':
69
69
  return 'Slack message exceeded the length limit after chunking';
70
+ case 'already_reacted':
71
+ return 'Slack reaction is already on that message';
72
+ case 'no_reaction':
73
+ return 'Slack reaction was not there to remove';
74
+ case 'invalid_name':
75
+ return 'Slack emoji name is not valid in this workspace';
76
+ case 'message_not_found':
77
+ return 'Slack message not found — it may already be deleted';
70
78
  case 'ratelimited':
71
79
  return 'Slack rate limit hit — retry shortly';
72
80
  default:
@@ -192,4 +200,89 @@ export async function slackApi(token, method, body, options = {}) {
192
200
  };
193
201
  }
194
202
  }
203
+ // ─── Reactions and notice cleanup ────────────────────
204
+ // Two Slack quirks these wrappers absorb, both of which produce confusing errors
205
+ // when got wrong:
206
+ // 1. the emoji NAME goes in WITHOUT colons — the docs' own example is
207
+ // `thumbsup`, and `:thumbsup:` fails with invalid_name;
208
+ // 2. reactions.add/remove take `timestamp` while chat.delete/chat.update take
209
+ // `ts`. Same value, different parameter name.
210
+ /** `:eyes:` and `eyes` are the same reaction to a human, and different to Slack. */
211
+ export function stripEmojiColons(name) {
212
+ return name.replace(/^:+|:+$/g, '');
213
+ }
214
+ /** Long enough for a normal Slack round trip, short enough that a shutdown drain
215
+ * is not held open by one stuck cleanup call. */
216
+ export const SLACK_CLEANUP_TIMEOUT_MS = 5000;
217
+ function callOptions(options) {
218
+ // exactOptionalPropertyTypes: an explicit undefined is not assignable here,
219
+ // so absent keys rather than undefined values.
220
+ return {
221
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
222
+ ...(options.signal ? { signal: options.signal } : {}),
223
+ timeoutMs: options.timeoutMs ?? SLACK_CLEANUP_TIMEOUT_MS,
224
+ };
225
+ }
226
+ /** Tier 3 (50+/min). Scope: reactions:write. */
227
+ export async function addSlackReaction(token, channel, timestamp, name, options = {}) {
228
+ return slackApi(token, 'reactions.add', { channel, timestamp, name: stripEmojiColons(name) }, callOptions(options));
229
+ }
230
+ /** Tier 2 (20+/min) — half of reactions.add's budget. Scope: reactions:write. */
231
+ export async function removeSlackReaction(token, channel, timestamp, name, options = {}) {
232
+ return slackApi(token, 'reactions.remove', { channel, timestamp, name: stripEmojiColons(name) }, callOptions(options));
233
+ }
234
+ /**
235
+ * Delete a message this bot posted. Uses `ts`, NOT `timestamp`.
236
+ *
237
+ * A bot token may delete only its own messages, so this needs no ownership check
238
+ * before being called on a notice we posted ourselves. Scope: chat:write.
239
+ */
240
+ export async function deleteSlackMessage(token, channel, ts, options = {}) {
241
+ return slackApi(token, 'chat.delete', { channel, ts }, callOptions(options));
242
+ }
243
+ /**
244
+ * Rewrite a message in place.
245
+ *
246
+ * Used for the timeout/shutdown path, where deleting the queue notice would
247
+ * leave no trace of a turn that never answered. Scope: chat:write.
248
+ */
249
+ export async function updateSlackMessage(token, channel, ts, text, options = {}) {
250
+ return slackApi(token, 'chat.update', { channel, ts, text }, callOptions(options));
251
+ }
252
+ /**
253
+ * Page through workspace conversations. Tier 2 (20+/min) — the slowest budget
254
+ * any of these wrappers carries, so the caller must pace itself.
255
+ *
256
+ * Scope: channels:read for public channels. Returns channels the bot has not
257
+ * joined, with `is_member` telling the two apart.
258
+ *
259
+ * Form-encoded like history/replies: these read methods take their arguments as
260
+ * query-style parameters and a JSON body is not universally accepted.
261
+ */
262
+ export async function listSlackConversations(token, params = {}, options = {}) {
263
+ const body = {
264
+ limit: params.limit ?? 200,
265
+ types: params.types ?? 'public_channel',
266
+ exclude_archived: params.excludeArchived !== false,
267
+ };
268
+ // Slack rejects an empty cursor string on some methods; omit it entirely
269
+ // for the first page rather than sending an empty cursor parameter.
270
+ if (params.cursor)
271
+ body['cursor'] = params.cursor;
272
+ return slackApi(token, 'conversations.list', body, {
273
+ ...callOptions(options),
274
+ form: true,
275
+ });
276
+ }
277
+ /**
278
+ * Join a PUBLIC channel. Tier 3 (50+/min). Scope: channels:join.
279
+ *
280
+ * Has no effect on private channels — those answer
281
+ * method_not_supported_for_channel_type and can only be entered by invitation.
282
+ * Joining posts a visible "<bot> has joined the channel" line, so this is a
283
+ * user-observable mutation, not a silent read.
284
+ */
285
+ export async function joinSlackConversation(token, channel, options = {}) {
286
+ return slackApi(token, 'conversations.join', { channel }, { ...callOptions(options), form: true });
287
+ }
195
288
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/slack/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/slack/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,330 @@
1
+ // ─── Slack public-channel auto-join ──────────────
2
+ // The bot can only read a channel it belongs to: conversations.history answers
3
+ // not_in_channel otherwise, and unlike a user token there is no "it is public,
4
+ // so it is readable" exemption for bots. Joining is therefore the only supported
5
+ // route into a channel nobody invited us to, and this module owns that policy.
6
+ //
7
+ // What this DOES buy: on-demand history lookup (/api/slack/history), being
8
+ // mentionable in that channel, and posting there as a member.
9
+ // What it does NOT buy: passive answering of ordinary chatter. The inbound gate
10
+ // keeps mentionOnly semantics (src/slack/events.ts), so joined channels deliver
11
+ // message.channels envelopes that are then discarded. That is deliberate — an
12
+ // agent replying to every message in 200 channels is not a feature.
13
+ //
14
+ // Design + audit history: devlog/_plan/260821_260821-slack-channel-reach/010.
15
+ import { log } from '../core/logger.js';
16
+ import { redactChannelSecrets } from '../messaging/redact.js';
17
+ import { listSlackConversations, joinSlackConversation, } from './api.js';
18
+ export const SLACK_AUTO_JOIN_DEFAULTS = {
19
+ // On by default: the whole point is that the agent can reach conversations
20
+ // nobody thought to invite it to. Bounded by maxJoinsPerRun and exclude.
21
+ enabled: true,
22
+ excludeArchived: true,
23
+ maxJoinsPerRun: 200,
24
+ exclude: [],
25
+ };
26
+ /**
27
+ * conversations.list is Tier 2 (20+/min). One call per 3s holds us at 20/min
28
+ * exactly, which is the documented floor rather than the real ceiling.
29
+ */
30
+ const LIST_INTERVAL_MS = 3000;
31
+ /**
32
+ * conversations.join is Tier 3 (50+/min). 1300ms leaves margin under the floor;
33
+ * a full 200-join budget therefore takes a little over four minutes. That is
34
+ * fine — the scan runs in the background and nothing waits on it.
35
+ */
36
+ const JOIN_INTERVAL_MS = 1300;
37
+ /** What to wait when Slack rate-limits us without saying for how long. */
38
+ const DEFAULT_RETRY_AFTER_MS = 5000;
39
+ /** Per-call retries for 429 only. A retry is not a failure until it runs out. */
40
+ const MAX_RATELIMIT_RETRIES = 3;
41
+ /** Page size Slack recommends; larger values are silently truncated anyway. */
42
+ const PAGE_SIZE = 200;
43
+ /** Refuse to walk forever if Slack keeps handing back cursors. */
44
+ const MAX_PAGES = 100;
45
+ /** A workspace that refuses this many joins in a row is refusing by policy. */
46
+ const MAX_CONSECUTIVE_NO_PERMISSION = 3;
47
+ /**
48
+ * Errors that prove the TOKEN or the WORKSPACE is unusable, not the channel.
49
+ * Continuing to hammer hundreds of channels after one of these is wrong.
50
+ */
51
+ const FATAL_ERRORS = new Set([
52
+ 'missing_scope', 'invalid_auth', 'not_authed', 'account_inactive',
53
+ 'token_expired', 'token_revoked', 'team_access_not_granted',
54
+ 'ekm_access_denied', 'org_login_required',
55
+ ]);
56
+ const MAX_EXCLUDE_ENTRIES = 200;
57
+ const MIN_JOINS_PER_RUN = 1;
58
+ const MAX_JOINS_PER_RUN = 1000;
59
+ function isPlainRecord(value) {
60
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
61
+ }
62
+ function boolOr(value, fallback) {
63
+ return typeof value === 'boolean' ? value : fallback;
64
+ }
65
+ /**
66
+ * One comparison form for channel ids and names.
67
+ *
68
+ * Slack stores names without the leading '#', operators type it with one, and
69
+ * ids are case-sensitive in Slack but compared case-insensitively here so a
70
+ * hand-typed 'c123abc' still matches.
71
+ */
72
+ function matchKey(value) {
73
+ return value.trim().replace(/^#/, '').toLowerCase();
74
+ }
75
+ /**
76
+ * Merge a partial autoJoin patch onto a base without dropping siblings, and
77
+ * normalize the result.
78
+ *
79
+ * The channel merges in config.ts and settings-merge.ts are one level deep,
80
+ * which is right for flat credential fields and wrong for a nested group: a
81
+ * stored {autoJoin:{enabled:false}} would otherwise erase maxJoinsPerRun and
82
+ * exclude. Same shape and reasoning as mergeAckSettings, and shared by the boot
83
+ * merge and the API/watch patch path so the ingresses cannot diverge.
84
+ *
85
+ * Normalization is not cosmetic. maxJoinsPerRun reaches a loop that mutates a
86
+ * live workspace, so NaN, -1 and '500' must not survive to that point.
87
+ */
88
+ export function mergeSlackAutoJoin(base, patch) {
89
+ const baseRecord = isPlainRecord(base) ? base : {};
90
+ const patchRecord = isPlainRecord(patch) ? patch : {};
91
+ const merged = { ...baseRecord, ...patchRecord };
92
+ return {
93
+ enabled: boolOr(merged['enabled'], SLACK_AUTO_JOIN_DEFAULTS.enabled),
94
+ excludeArchived: boolOr(merged['excludeArchived'], SLACK_AUTO_JOIN_DEFAULTS.excludeArchived),
95
+ maxJoinsPerRun: normalizeBudget(merged['maxJoinsPerRun']),
96
+ exclude: normalizeExclude(merged['exclude']),
97
+ };
98
+ }
99
+ function normalizeBudget(raw) {
100
+ const n = typeof raw === 'number' ? raw : Number(raw);
101
+ if (!Number.isFinite(n))
102
+ return SLACK_AUTO_JOIN_DEFAULTS.maxJoinsPerRun;
103
+ const floored = Math.floor(n);
104
+ if (floored < MIN_JOINS_PER_RUN)
105
+ return MIN_JOINS_PER_RUN;
106
+ if (floored > MAX_JOINS_PER_RUN)
107
+ return MAX_JOINS_PER_RUN;
108
+ return floored;
109
+ }
110
+ function normalizeExclude(raw) {
111
+ if (!Array.isArray(raw))
112
+ return [];
113
+ const out = [];
114
+ for (const entry of raw) {
115
+ if (typeof entry !== 'string')
116
+ continue;
117
+ // Slack stores channel names without the leading '#', but operators type
118
+ // it. Accept both rather than silently ignoring half the input.
119
+ const trimmed = entry.trim().replace(/^#/, '');
120
+ if (!trimmed)
121
+ continue;
122
+ out.push(trimmed);
123
+ if (out.length >= MAX_EXCLUDE_ENTRIES)
124
+ break;
125
+ }
126
+ return out;
127
+ }
128
+ /** Abortable sleep. A pending 3s pace must not hold shutdown open for 3s. */
129
+ function defaultSleep(ms, signal) {
130
+ if (ms <= 0)
131
+ return Promise.resolve();
132
+ if (signal?.aborted)
133
+ return Promise.resolve();
134
+ return new Promise(resolve => {
135
+ const timer = setTimeout(finish, ms);
136
+ function finish() {
137
+ clearTimeout(timer);
138
+ signal?.removeEventListener('abort', finish);
139
+ resolve();
140
+ }
141
+ signal?.addEventListener('abort', finish, { once: true });
142
+ });
143
+ }
144
+ /**
145
+ * Scan public channels and join the ones we are not in.
146
+ *
147
+ * Never throws: a background reconciliation must not be able to take the
148
+ * transport down with it. Every outcome is reported in the result instead.
149
+ */
150
+ export async function runSlackAutoJoin(opts) {
151
+ const result = {
152
+ scanned: 0, joined: [], skipped: 0, failed: [],
153
+ cancelled: false, budgetExhausted: false,
154
+ };
155
+ const { token, config } = opts;
156
+ if (!config.enabled || !token)
157
+ return result;
158
+ const sleep = opts.sleep ?? defaultSleep;
159
+ const signal = opts.signal;
160
+ const isCurrent = opts.isCurrent ?? (() => true);
161
+ // Normalized here as well as in mergeSlackAutoJoin. The runner must not
162
+ // depend on having been handed a merged config: a caller passing
163
+ // ['#random'] straight through would otherwise compare '#random' against
164
+ // the bare name Slack returns and silently join the channel it was told
165
+ // to leave alone.
166
+ const excluded = new Set(config.exclude.map(matchKey).filter(Boolean));
167
+ // An empty allowlist means every conversation; a non-empty one is a
168
+ // boundary the operator drew, and auto-join respects it.
169
+ const allowed = new Set((opts.allowlist ?? []).map(matchKey).filter(Boolean));
170
+ const callOptions = {
171
+ ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}),
172
+ ...(signal ? { signal } : {}),
173
+ };
174
+ const stopped = () => Boolean(signal?.aborted) || !isCurrent();
175
+ let cursor;
176
+ let pages = 0;
177
+ let budget = config.maxJoinsPerRun;
178
+ let consecutiveNoPermission = 0;
179
+ let joinAttempts = 0;
180
+ while (pages < MAX_PAGES) {
181
+ if (stopped()) {
182
+ result.cancelled = true;
183
+ return result;
184
+ }
185
+ if (pages > 0) {
186
+ await sleep(LIST_INTERVAL_MS, signal);
187
+ if (stopped()) {
188
+ result.cancelled = true;
189
+ return result;
190
+ }
191
+ }
192
+ pages++;
193
+ const page = await withRateLimitRetry(() => listSlackConversations(token, {
194
+ ...(cursor ? { cursor } : {}),
195
+ limit: PAGE_SIZE,
196
+ types: 'public_channel',
197
+ excludeArchived: config.excludeArchived,
198
+ }, callOptions), sleep, signal, stopped);
199
+ if (stopped()) {
200
+ result.cancelled = true;
201
+ return result;
202
+ }
203
+ if (!page.ok) {
204
+ result.abortedReason = page.error;
205
+ if (!FATAL_ERRORS.has(page.error)) {
206
+ result.failed.push({ id: 'conversations.list', error: page.error });
207
+ }
208
+ log.warn(redactChannelSecrets('[slack:autojoin] conversations.list failed: ' + page.error));
209
+ return result;
210
+ }
211
+ const channels = page.data?.channels ?? [];
212
+ result.scanned += channels.length;
213
+ for (const channel of channels) {
214
+ const id = String(channel.id ?? '').trim();
215
+ if (!id) {
216
+ result.skipped++;
217
+ continue;
218
+ }
219
+ if (shouldSkipChannel(channel, id, excluded, allowed, config)) {
220
+ result.skipped++;
221
+ continue;
222
+ }
223
+ // Budget is spent HERE, after filtering — never on rows merely
224
+ // scanned. A workspace where the bot already belongs to 500
225
+ // channels must not exhaust its budget before reaching the one
226
+ // channel it actually needs to join.
227
+ if (budget <= 0) {
228
+ result.budgetExhausted = true;
229
+ log.info('[slack:autojoin] join budget exhausted (' + config.maxJoinsPerRun
230
+ + ') — remaining channels wait for the next start');
231
+ return result;
232
+ }
233
+ if (stopped()) {
234
+ result.cancelled = true;
235
+ return result;
236
+ }
237
+ // Pace between joins, not before the first one.
238
+ if (joinAttempts > 0) {
239
+ await sleep(JOIN_INTERVAL_MS, signal);
240
+ if (stopped()) {
241
+ result.cancelled = true;
242
+ return result;
243
+ }
244
+ }
245
+ budget--;
246
+ joinAttempts++;
247
+ const joined = await withRateLimitRetry(() => joinSlackConversation(token, id, callOptions), sleep, signal, stopped);
248
+ if (stopped()) {
249
+ result.cancelled = true;
250
+ return result;
251
+ }
252
+ if (joined.ok) {
253
+ result.joined.push(id);
254
+ consecutiveNoPermission = 0;
255
+ continue;
256
+ }
257
+ if (FATAL_ERRORS.has(joined.error)) {
258
+ result.abortedReason = joined.error;
259
+ log.warn(redactChannelSecrets('[slack:autojoin] stopping: ' + joined.error));
260
+ return result;
261
+ }
262
+ // A channel-scoped refusal is normal (archived, converted to
263
+ // private, admin-restricted) and must not end the scan. A RUN of
264
+ // them is a workspace policy saying no, and continuing would be
265
+ // hundreds of pointless calls.
266
+ if (joined.error === 'no_permission' || joined.error === 'restricted_action') {
267
+ consecutiveNoPermission++;
268
+ if (consecutiveNoPermission >= MAX_CONSECUTIVE_NO_PERMISSION) {
269
+ result.abortedReason = joined.error;
270
+ result.failed.push({ id, error: joined.error });
271
+ log.warn(redactChannelSecrets('[slack:autojoin] stopping after ' + consecutiveNoPermission
272
+ + ' consecutive ' + joined.error + ' — workspace policy refuses joins'));
273
+ return result;
274
+ }
275
+ }
276
+ else {
277
+ consecutiveNoPermission = 0;
278
+ }
279
+ result.failed.push({ id, error: joined.error });
280
+ }
281
+ const next = String(page.data?.response_metadata?.next_cursor ?? '').trim();
282
+ // A page filtered down to nothing still carries a cursor — keep walking
283
+ // rather than reading 'no work on this page' as the end of the list.
284
+ if (!next)
285
+ break;
286
+ cursor = next;
287
+ }
288
+ return result;
289
+ }
290
+ function shouldSkipChannel(channel, id, excluded, allowed, config) {
291
+ if (channel.is_member === true)
292
+ return true;
293
+ // conversations.join cannot enter a private channel; only an invite can.
294
+ if (channel.is_private === true)
295
+ return true;
296
+ if (config.excludeArchived && channel.is_archived === true)
297
+ return true;
298
+ if (excluded.has(id.toLowerCase()))
299
+ return true;
300
+ const name = String(channel.name ?? '').trim().toLowerCase();
301
+ if (name && excluded.has(name))
302
+ return true;
303
+ // A configured allowlist is the operator's inbound boundary. Joining past
304
+ // it would give the agent history access to conversations that same
305
+ // operator silenced.
306
+ if (allowed.size > 0 && !allowed.has(id.toLowerCase()) && !(name && allowed.has(name)))
307
+ return true;
308
+ return false;
309
+ }
310
+ /**
311
+ * Retry a call that came back rate-limited, honoring Retry-After.
312
+ *
313
+ * 429 is not a channel failure — recording it as one and moving on would keep
314
+ * flooding an API that just asked us to stop.
315
+ */
316
+ async function withRateLimitRetry(call, sleep, signal, stopped) {
317
+ let attempt = 0;
318
+ let last = await call();
319
+ while (!last.ok && last.error === 'ratelimited' && attempt < MAX_RATELIMIT_RETRIES) {
320
+ if (stopped())
321
+ break;
322
+ attempt++;
323
+ await sleep(last.retryAfterMs ?? DEFAULT_RETRY_AFTER_MS, signal);
324
+ if (stopped())
325
+ break;
326
+ last = await call();
327
+ }
328
+ return { ...last, error: last.error ?? '' };
329
+ }
330
+ //# sourceMappingURL=auto-join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-join.js","sourceRoot":"","sources":["../../../src/slack/auto-join.ts"],"names":[],"mappings":"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"}