@geminixiang/mikan 1.0.0-beta.37 → 1.0.0-beta.39
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/CHANGELOG.md +21 -0
- package/README.md +1 -1
- package/dist/adapter.js +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +3 -6
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +16 -39
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +2 -0
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +15 -11
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +1 -1
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +2 -1
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/repo.d.ts +2 -1
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +2 -3
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/types.d.ts +1 -1
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/intake.js +1 -1
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/shared.d.ts +17 -5
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +44 -8
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +14 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +34 -0
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +19 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +88 -21
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +5 -6
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +29 -51
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/types.d.ts +19 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +0 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +79 -101
- package/dist/agent.js.map +1 -1
- package/dist/cli/ext-dev.d.ts.map +1 -1
- package/dist/cli/ext-dev.js +8 -8
- package/dist/cli/ext-dev.js.map +1 -1
- package/dist/cli/ext.js +3 -3
- package/dist/cli/ext.js.map +1 -1
- package/dist/cli/office.js +2 -2
- package/dist/cli/office.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +1 -2
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +3 -1
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +3 -7
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +7 -7
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +1 -2
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +2 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +10 -18
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -15
- package/dist/config.js.map +1 -1
- package/dist/execution-resolver.d.ts +4 -6
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +10 -19
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/extensions/loader.js +1 -1
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/skills.d.ts +8 -0
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +46 -4
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/types.d.ts +2 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +16 -16
- package/dist/main.js.map +1 -1
- package/dist/{office-address.d.ts → office/address.d.ts} +13 -14
- package/dist/office/address.d.ts.map +1 -0
- package/dist/{office-address.js → office/address.js} +13 -18
- package/dist/office/address.js.map +1 -0
- package/dist/office/index.d.ts +11 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +11 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/layout.d.ts +20 -0
- package/dist/office/layout.d.ts.map +1 -0
- package/dist/office/layout.js +88 -0
- package/dist/office/layout.js.map +1 -0
- package/dist/{office-migration.d.ts → office/migration.d.ts} +3 -3
- package/dist/office/migration.d.ts.map +1 -0
- package/dist/{office-migration.js → office/migration.js} +8 -12
- package/dist/office/migration.js.map +1 -0
- package/dist/{office-registry.d.ts → office/registry.d.ts} +18 -24
- package/dist/office/registry.d.ts.map +1 -0
- package/dist/{office-registry.js → office/registry.js} +22 -83
- package/dist/office/registry.js.map +1 -0
- package/dist/office/types.d.ts +71 -0
- package/dist/office/types.d.ts.map +1 -0
- package/dist/office/types.js +2 -0
- package/dist/office/types.js.map +1 -0
- package/dist/packages/admin.js +5 -5
- package/dist/packages/admin.js.map +1 -1
- package/dist/packages/inspect.d.ts.map +1 -1
- package/dist/packages/inspect.js +3 -8
- package/dist/packages/inspect.js.map +1 -1
- package/dist/packages/materialize.js +1 -1
- package/dist/packages/materialize.js.map +1 -1
- package/dist/packages/resolve.js +5 -8
- package/dist/packages/resolve.js.map +1 -1
- package/dist/packages/types.d.ts +2 -5
- package/dist/packages/types.d.ts.map +1 -1
- package/dist/packages/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +13 -15
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.js +1 -1
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +3 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/identity.js +1 -1
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/settings-mutation.d.ts +3 -2
- package/dist/settings-mutation.d.ts.map +1 -1
- package/dist/settings-mutation.js +6 -7
- package/dist/settings-mutation.js.map +1 -1
- package/dist/tools/generate-image.d.ts +8 -2
- package/dist/tools/generate-image.d.ts.map +1 -1
- package/dist/tools/generate-image.js +5 -3
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/trigger.d.ts +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +5 -10
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +3 -22
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.js +1 -1
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/injection.d.ts +3 -1
- package/dist/vault/injection.d.ts.map +1 -1
- package/dist/vault/injection.js +2 -2
- package/dist/vault/injection.js.map +1 -1
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +67 -80
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +2 -1
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/server.d.ts +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +3 -3
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.js +1 -1
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +2 -4
- package/dist/workspace-projection/index.d.ts.map +1 -1
- package/dist/workspace-projection/index.js +21 -56
- package/dist/workspace-projection/index.js.map +1 -1
- package/dist/workspace-projection/types.d.ts +0 -2
- package/dist/workspace-projection/types.d.ts.map +1 -1
- package/dist/workspace-projection/types.js.map +1 -1
- package/package.json +41 -16
- package/dist/office-address.d.ts.map +0 -1
- package/dist/office-address.js.map +0 -1
- package/dist/office-migration.d.ts.map +0 -1
- package/dist/office-migration.js.map +0 -1
- package/dist/office-registry.d.ts.map +0 -1
- package/dist/office-registry.js.map +0 -1
- package/dist/store.d.ts +0 -51
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -185
- package/dist/store.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAI1B,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { SocketModeClient } from "@slack/socket-mode";
|
|
2
2
|
import { WebAPIRateLimitedError, WebClient } from "@slack/web-api";
|
|
3
3
|
import { existsSync, readFileSync } from "fs";
|
|
4
|
-
import { readFile } from "fs/promises";
|
|
4
|
+
import { readFile, writeFile } from "fs/promises";
|
|
5
5
|
import { basename, join } from "path";
|
|
6
6
|
import { createConversationEvent, createConversationMessage, } from "../../adapter.js";
|
|
7
|
-
import {
|
|
7
|
+
import { createOfficeAddress } from "../../office/index.js";
|
|
8
8
|
import { COMMAND_MANIFEST } from "../../commands/manifest.js";
|
|
9
9
|
import { resolveConversationSettings } from "../../config.js";
|
|
10
10
|
import { parseExtActionId } from "../../harness/extensions/blockkit.js";
|
|
11
11
|
import * as log from "../../log.js";
|
|
12
12
|
import { isRecord, readTextFileIfExists } from "../../utils/file-guards.js";
|
|
13
13
|
import { PRODUCT_NAME, formatForceStopped } from "../../platform-messages.js";
|
|
14
|
-
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, withRetry, } from "../shared.js";
|
|
14
|
+
import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, saveIncomingAttachments, withRetry, } from "../shared.js";
|
|
15
15
|
import { processMessageIntake } from "../intake.js";
|
|
16
16
|
import { createSlackAdapters } from "./context.js";
|
|
17
17
|
import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-history-sync.js";
|
|
18
18
|
import { conversationIdOf } from "../../sessions/session-key.js";
|
|
19
19
|
import { isSlackThreadSessionKey, planSlackAdapterSession, planSlackEventAnchorRun, resolveSlackSessionKey, } from "./session.js";
|
|
20
20
|
import { reportUserFacingError } from "../../observability/sentry.js";
|
|
21
|
-
import { renderSlackBlocks } from "./blocks.js";
|
|
21
|
+
import { renderSlackBlocks, resolveSlackMentions } from "./blocks.js";
|
|
22
22
|
const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
|
|
23
23
|
// web-api v8 throws WebAPIRateLimitedError; the duck-typed shapes cover
|
|
24
24
|
// platform `data.error === "rate_limited"` / 429 responses and older callers.
|
|
@@ -80,14 +80,24 @@ export function buildMrkdwnContextBlock(text) {
|
|
|
80
80
|
// ============================================================================
|
|
81
81
|
// SlackMessagingBot
|
|
82
82
|
// ============================================================================
|
|
83
|
+
class AttachmentDownloadHttpError extends Error {
|
|
84
|
+
constructor(message, status) {
|
|
85
|
+
super(message);
|
|
86
|
+
this.status = status;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function isRetryableAttachmentDownloadError(error) {
|
|
90
|
+
if (!(error instanceof AttachmentDownloadHttpError))
|
|
91
|
+
return true;
|
|
92
|
+
return error.status === 408 || error.status === 429 || error.status >= 500;
|
|
93
|
+
}
|
|
83
94
|
export class SlackMessagingBot {
|
|
84
|
-
/** Host office dir for a Slack conversation
|
|
95
|
+
/** Host office dir for a Slack conversation. */
|
|
85
96
|
conversationDir(channelId) {
|
|
86
|
-
return
|
|
97
|
+
return this.workspace.office(createOfficeAddress("slack", channelId)).dir;
|
|
87
98
|
}
|
|
88
99
|
resolveReplyMode(address) {
|
|
89
|
-
|
|
90
|
-
return resolveConversationSettings(scope).slack?.replyMode ?? "top-level";
|
|
100
|
+
return (resolveConversationSettings(this.workspace.office(address)).slack?.replyMode ?? "top-level");
|
|
91
101
|
}
|
|
92
102
|
createContext(event) {
|
|
93
103
|
return createSlackAdapters(event, this, {
|
|
@@ -105,8 +115,8 @@ export class SlackMessagingBot {
|
|
|
105
115
|
this.queues = new Map();
|
|
106
116
|
this.eventsWatcher = null;
|
|
107
117
|
this.handler = handler;
|
|
108
|
-
this.
|
|
109
|
-
this.
|
|
118
|
+
this.workspace = config.workspace;
|
|
119
|
+
this.botToken = config.botToken;
|
|
110
120
|
this.socketClient = new SocketModeClient({
|
|
111
121
|
appToken: config.appToken,
|
|
112
122
|
// Default 5s is too tight: brief event-loop stalls (e.g. backfill, sync fs)
|
|
@@ -160,9 +170,17 @@ export class SlackMessagingBot {
|
|
|
160
170
|
}
|
|
161
171
|
return source.replace(this.ownMentionRegex, "").trim();
|
|
162
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Response-source `<@userName>` mentions become native `<@U…>` here — the
|
|
175
|
+
* one conversion every outgoing response path funnels through. Slack only
|
|
176
|
+
* links and notifies on raw user ids.
|
|
177
|
+
*/
|
|
178
|
+
resolveMentions(text) {
|
|
179
|
+
return resolveSlackMentions(text, this.users.values());
|
|
180
|
+
}
|
|
163
181
|
async postMessage(channel, text) {
|
|
164
182
|
return slackRetry(async () => {
|
|
165
|
-
const payload = { channel, ...renderSlackBlocks(text) };
|
|
183
|
+
const payload = { channel, ...renderSlackBlocks(this.resolveMentions(text)) };
|
|
166
184
|
const result = await this.webClient.chat.postMessage(payload);
|
|
167
185
|
return result.ts;
|
|
168
186
|
});
|
|
@@ -237,7 +255,7 @@ export class SlackMessagingBot {
|
|
|
237
255
|
}
|
|
238
256
|
async updateMessage(channel, ts, text) {
|
|
239
257
|
return slackRetry(async () => {
|
|
240
|
-
const payload = { channel, ts, ...renderSlackBlocks(text) };
|
|
258
|
+
const payload = { channel, ts, ...renderSlackBlocks(this.resolveMentions(text)) };
|
|
241
259
|
await this.webClient.chat.update(payload);
|
|
242
260
|
});
|
|
243
261
|
}
|
|
@@ -245,7 +263,7 @@ export class SlackMessagingBot {
|
|
|
245
263
|
return slackRetry(async () => {
|
|
246
264
|
const result = await this.webClient.apiCall("chat.startStream", {
|
|
247
265
|
channel,
|
|
248
|
-
markdown_text: text,
|
|
266
|
+
markdown_text: this.resolveMentions(text),
|
|
249
267
|
...(threadTs ? { thread_ts: threadTs } : {}),
|
|
250
268
|
...(this.teamId ? { recipient_team_id: this.teamId } : {}),
|
|
251
269
|
...(recipientUserId ? { recipient_user_id: recipientUserId } : {}),
|
|
@@ -261,7 +279,9 @@ export class SlackMessagingBot {
|
|
|
261
279
|
await this.webClient.apiCall("chat.appendStream", {
|
|
262
280
|
channel,
|
|
263
281
|
ts,
|
|
264
|
-
|
|
282
|
+
// A mention split across stream deltas stays unresolved here; the
|
|
283
|
+
// canonical final render (updateMessage) resolves the full text.
|
|
284
|
+
markdown_text: this.resolveMentions(text),
|
|
265
285
|
});
|
|
266
286
|
});
|
|
267
287
|
}
|
|
@@ -290,7 +310,11 @@ export class SlackMessagingBot {
|
|
|
290
310
|
}
|
|
291
311
|
async postInThread(channel, threadTs, text) {
|
|
292
312
|
return slackRetry(async () => {
|
|
293
|
-
const payload = {
|
|
313
|
+
const payload = {
|
|
314
|
+
channel,
|
|
315
|
+
thread_ts: threadTs,
|
|
316
|
+
...renderSlackBlocks(this.resolveMentions(text)),
|
|
317
|
+
};
|
|
294
318
|
const result = await this.webClient.chat.postMessage(payload);
|
|
295
319
|
return result.ts;
|
|
296
320
|
});
|
|
@@ -321,10 +345,10 @@ export class SlackMessagingBot {
|
|
|
321
345
|
});
|
|
322
346
|
}
|
|
323
347
|
logToFile(channel, entry) {
|
|
324
|
-
appendChannelLog(this.
|
|
348
|
+
appendChannelLog(this.workspace.office(createOfficeAddress("slack", channel)), entry);
|
|
325
349
|
}
|
|
326
350
|
logBotResponse(channel, text, ts, threadTs, slackBlocks) {
|
|
327
|
-
appendBotResponseLog(this.
|
|
351
|
+
appendBotResponseLog(this.workspace.office(createOfficeAddress("slack", channel)), text, ts, threadTs, {
|
|
328
352
|
platform: "slack",
|
|
329
353
|
...(slackBlocks ? { slackBlocks } : {}),
|
|
330
354
|
});
|
|
@@ -472,7 +496,7 @@ export class SlackMessagingBot {
|
|
|
472
496
|
};
|
|
473
497
|
processMessageIntake({
|
|
474
498
|
eventBase: options.event,
|
|
475
|
-
|
|
499
|
+
office: this.workspace.office(options.event.address),
|
|
476
500
|
isAutoReplyCandidate: options.isAutoReplyCandidate,
|
|
477
501
|
magicWord: { addressed: options.addressed, scopeFallback: "top-level" },
|
|
478
502
|
busyPolicy: "queue",
|
|
@@ -1141,6 +1165,49 @@ export class SlackMessagingBot {
|
|
|
1141
1165
|
return this.handler.handleEvent(event, this, this.createContext(slackEvent));
|
|
1142
1166
|
});
|
|
1143
1167
|
}
|
|
1168
|
+
/**
|
|
1169
|
+
* Download Slack message files into the office's attachments directory.
|
|
1170
|
+
* The Slack contract is all-or-error: any failed download throws after the
|
|
1171
|
+
* successful ones are on disk, so callers still log the message text.
|
|
1172
|
+
*/
|
|
1173
|
+
async processAttachments(channelId, files, timestamp) {
|
|
1174
|
+
const items = [];
|
|
1175
|
+
for (const file of files) {
|
|
1176
|
+
const url = file.url_private_download || file.url_private;
|
|
1177
|
+
if (!url)
|
|
1178
|
+
continue;
|
|
1179
|
+
if (!file.name) {
|
|
1180
|
+
throw new Error(`Attachment missing name for URL: ${url}`);
|
|
1181
|
+
}
|
|
1182
|
+
items.push({
|
|
1183
|
+
name: file.name,
|
|
1184
|
+
// Slack timestamps are float seconds; the stored filename uses ms.
|
|
1185
|
+
timestampMs: Math.floor(parseFloat(timestamp) * 1000),
|
|
1186
|
+
download: (destPath) => this.downloadSlackFile(url, destPath),
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
const office = this.workspace.office(createOfficeAddress("slack", channelId));
|
|
1190
|
+
const { saved, failed } = await saveIncomingAttachments(office, items);
|
|
1191
|
+
if (failed.length > 0) {
|
|
1192
|
+
const { name, error } = failed[0];
|
|
1193
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
1194
|
+
throw new Error(`Failed to download attachment ${name}: ${errorMsg}`, { cause: error });
|
|
1195
|
+
}
|
|
1196
|
+
return saved;
|
|
1197
|
+
}
|
|
1198
|
+
/** Authorized download with retry; Slack file URLs require the bot token. */
|
|
1199
|
+
async downloadSlackFile(url, destPath) {
|
|
1200
|
+
await withRetry(async () => {
|
|
1201
|
+
const response = await fetch(url, {
|
|
1202
|
+
headers: { Authorization: `Bearer ${this.botToken}` },
|
|
1203
|
+
});
|
|
1204
|
+
if (!response.ok) {
|
|
1205
|
+
throw new AttachmentDownloadHttpError(`HTTP ${response.status}: ${response.statusText}`, response.status);
|
|
1206
|
+
}
|
|
1207
|
+
const buffer = await response.arrayBuffer();
|
|
1208
|
+
await writeFile(destPath, Buffer.from(buffer));
|
|
1209
|
+
}, { maxAttempts: 3, baseDelayMs: 250, isRateLimited: isRetryableAttachmentDownloadError });
|
|
1210
|
+
}
|
|
1144
1211
|
/**
|
|
1145
1212
|
* Log a user message to log.jsonl after attachments are ready.
|
|
1146
1213
|
*/
|
|
@@ -1150,7 +1217,7 @@ export class SlackMessagingBot {
|
|
|
1150
1217
|
let attachmentError;
|
|
1151
1218
|
if (event.files) {
|
|
1152
1219
|
try {
|
|
1153
|
-
attachments = await this.
|
|
1220
|
+
attachments = await this.processAttachments(event.channel, event.files, event.ts);
|
|
1154
1221
|
}
|
|
1155
1222
|
catch (err) {
|
|
1156
1223
|
attachmentError = err;
|
|
@@ -1175,7 +1242,7 @@ export class SlackMessagingBot {
|
|
|
1175
1242
|
}
|
|
1176
1243
|
async logExternalMessagingBotMessage(event) {
|
|
1177
1244
|
const attachments = event.files
|
|
1178
|
-
? await this.
|
|
1245
|
+
? await this.processAttachments(event.channel, event.files, event.ts)
|
|
1179
1246
|
: [];
|
|
1180
1247
|
const botName = event.username ?? event.bot_profile?.name ?? event.bot_profile?.real_name ?? event.bot_id;
|
|
1181
1248
|
this.logToFile(event.channel, {
|
|
@@ -1284,7 +1351,7 @@ export class SlackMessagingBot {
|
|
|
1284
1351
|
const user = this.users.get(msg.user);
|
|
1285
1352
|
const text = this.stripOwnMention(msg.text);
|
|
1286
1353
|
const attachments = msg.files
|
|
1287
|
-
? await this.
|
|
1354
|
+
? await this.processAttachments(channelId, msg.files, msg.ts)
|
|
1288
1355
|
: [];
|
|
1289
1356
|
this.logToFile(channelId, {
|
|
1290
1357
|
date: new Date(parseFloat(msg.ts) * 1000).toISOString(),
|