@geminixiang/mikan 1.0.0-beta.66 → 1.0.0-beta.67
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 +7 -0
- package/dist/adapters/slack/auto-reply-context.d.ts +19 -0
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
- package/dist/adapters/slack/auto-reply-context.js +70 -0
- package/dist/adapters/slack/auto-reply-context.js.map +1 -0
- package/dist/adapters/slack/bot.d.ts +8 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +18 -19
- package/dist/adapters/slack/bot.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,13 @@ any release.
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [1.0.0-beta.67]
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Slack: unaddressed thread replies in shared channels now pass through the same `/pi-auto-reply` gate as top-level messages instead of being dropped unconditionally. In `jev` mode, Jev scores the message together with its surrounding scope (the channel's recent top-level messages, or the thread's messages plus whether mikan has already replied there), so bare follow-ups like "then roll it back" are judged in context. `off` still requires a mention; `on` now admits thread replies too.
|
|
17
|
+
- Deploy docs: `/pi-auto-reply` slash command description lists `on | off | jev`.
|
|
18
|
+
|
|
12
19
|
## [1.0.0-beta.66]
|
|
13
20
|
|
|
14
21
|
### Added
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** The one question Jev answers for an unaddressed shared-channel message. */
|
|
2
|
+
export declare const JEV_ADDRESSED_INSTRUCTIONS = "Given the recent Slack conversation, does the NEW message address, ask, or request the mikan AI assistant to do something (including continuing something mikan was already helping with), rather than being conversation between humans that needs no reply from mikan?";
|
|
3
|
+
/**
|
|
4
|
+
* Build the shared `state` Jev scores when deciding whether an unaddressed
|
|
5
|
+
* shared-channel message is meant for mikan. A single line like "好啊" is
|
|
6
|
+
* unjudgeable on its own, so the state carries the surrounding scope: the
|
|
7
|
+
* channel's recent top-level messages, or the thread's messages plus whether
|
|
8
|
+
* mikan has already taken part in it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildAutoReplyState(conversationDir: string, event: {
|
|
11
|
+
ts: string;
|
|
12
|
+
thread_ts?: string;
|
|
13
|
+
user: string;
|
|
14
|
+
text: string;
|
|
15
|
+
}, options?: {
|
|
16
|
+
speaker?: string;
|
|
17
|
+
limit?: number;
|
|
18
|
+
}): string;
|
|
19
|
+
//# sourceMappingURL=auto-reply-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-reply-context.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/auto-reply-context.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,eAAO,MAAM,0BAA0B,6QACqO,CAAC;AAmD7Q;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACrE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,MAAM,CAiBR"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { isRecord, readTextFileIfExists } from "../../file-guards.js";
|
|
3
|
+
/** The one question Jev answers for an unaddressed shared-channel message. */
|
|
4
|
+
export const JEV_ADDRESSED_INSTRUCTIONS = "Given the recent Slack conversation, does the NEW message address, ask, or request the mikan AI assistant to do something (including continuing something mikan was already helping with), rather than being conversation between humans that needs no reply from mikan?";
|
|
5
|
+
/** Recent messages in the same scope as `event` (channel top level or its thread), oldest first. */
|
|
6
|
+
function readRecentScope(conversationDir, event, limit) {
|
|
7
|
+
const raw = readTextFileIfExists(join(conversationDir, "log.jsonl"));
|
|
8
|
+
if (raw === undefined)
|
|
9
|
+
return [];
|
|
10
|
+
const lines = [];
|
|
11
|
+
for (const line of raw.split("\n")) {
|
|
12
|
+
if (!line)
|
|
13
|
+
continue;
|
|
14
|
+
let entry;
|
|
15
|
+
try {
|
|
16
|
+
entry = JSON.parse(line);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (!isRecord(entry) || typeof entry.ts !== "string" || typeof entry.text !== "string") {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const threadTs = typeof entry.threadTs === "string" ? entry.threadTs : undefined;
|
|
25
|
+
// Thread replies belong to their thread; everything else is the channel's top level.
|
|
26
|
+
const inScope = event.thread_ts
|
|
27
|
+
? threadTs === event.thread_ts || entry.ts === event.thread_ts
|
|
28
|
+
: threadTs === undefined;
|
|
29
|
+
if (!inScope || entry.ts === event.ts)
|
|
30
|
+
continue;
|
|
31
|
+
const isMikan = entry.isMessagingBot === true && entry.user === "bot";
|
|
32
|
+
const speaker = isMikan
|
|
33
|
+
? "mikan"
|
|
34
|
+
: String(entry.displayName ?? entry.userName ?? entry.user ?? "unknown");
|
|
35
|
+
const previous = lines.at(-1);
|
|
36
|
+
// Streamed bot responses are logged in chunks sharing one ts; merge them.
|
|
37
|
+
if (previous && previous.isMikan && isMikan && previous.ts === entry.ts) {
|
|
38
|
+
previous.text += entry.text;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
lines.push({ ts: entry.ts, threadTs, speaker, text: entry.text, isMikan });
|
|
42
|
+
}
|
|
43
|
+
return lines.slice(-limit);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build the shared `state` Jev scores when deciding whether an unaddressed
|
|
47
|
+
* shared-channel message is meant for mikan. A single line like "好啊" is
|
|
48
|
+
* unjudgeable on its own, so the state carries the surrounding scope: the
|
|
49
|
+
* channel's recent top-level messages, or the thread's messages plus whether
|
|
50
|
+
* mikan has already taken part in it.
|
|
51
|
+
*/
|
|
52
|
+
export function buildAutoReplyState(conversationDir, event, options = {}) {
|
|
53
|
+
const recent = readRecentScope(conversationDir, event, options.limit ?? 12);
|
|
54
|
+
const header = event.thread_ts
|
|
55
|
+
? `Slack thread reply. mikan has ${recent.some((l) => l.isMikan) ? "already replied" : "not replied"} in this thread.`
|
|
56
|
+
: "Slack channel top-level message.";
|
|
57
|
+
const context = recent.length
|
|
58
|
+
? recent.map((l) => `- ${l.speaker}: ${l.text}`).join("\n")
|
|
59
|
+
: "(none)";
|
|
60
|
+
return [
|
|
61
|
+
header,
|
|
62
|
+
"",
|
|
63
|
+
"Recent messages (oldest first):",
|
|
64
|
+
context,
|
|
65
|
+
"",
|
|
66
|
+
`NEW message from ${options.speaker ?? event.user}:`,
|
|
67
|
+
event.text,
|
|
68
|
+
].join("\n");
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=auto-reply-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-reply-context.js","sourceRoot":"","sources":["../../../src/adapters/slack/auto-reply-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { isRecord, readTextFileIfExists } from \"../../file-guards.js\";\n\n/** The one question Jev answers for an unaddressed shared-channel message. */\nexport const JEV_ADDRESSED_INSTRUCTIONS =\n \"Given the recent Slack conversation, does the NEW message address, ask, or request the mikan AI assistant to do something (including continuing something mikan was already helping with), rather than being conversation between humans that needs no reply from mikan?\";\n\ninterface LogLine {\n ts: string;\n threadTs?: string;\n speaker: string;\n text: string;\n isMikan: boolean;\n}\n\n/** Recent messages in the same scope as `event` (channel top level or its thread), oldest first. */\nfunction readRecentScope(\n conversationDir: string,\n event: { ts: string; thread_ts?: string },\n limit: number,\n): LogLine[] {\n const raw = readTextFileIfExists(join(conversationDir, \"log.jsonl\"));\n if (raw === undefined) return [];\n const lines: LogLine[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (!line) continue;\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n continue;\n }\n if (!isRecord(entry) || typeof entry.ts !== \"string\" || typeof entry.text !== \"string\") {\n continue;\n }\n const threadTs = typeof entry.threadTs === \"string\" ? entry.threadTs : undefined;\n // Thread replies belong to their thread; everything else is the channel's top level.\n const inScope = event.thread_ts\n ? threadTs === event.thread_ts || entry.ts === event.thread_ts\n : threadTs === undefined;\n if (!inScope || entry.ts === event.ts) continue;\n const isMikan = entry.isMessagingBot === true && entry.user === \"bot\";\n const speaker = isMikan\n ? \"mikan\"\n : String(entry.displayName ?? entry.userName ?? entry.user ?? \"unknown\");\n const previous = lines.at(-1);\n // Streamed bot responses are logged in chunks sharing one ts; merge them.\n if (previous && previous.isMikan && isMikan && previous.ts === entry.ts) {\n previous.text += entry.text;\n continue;\n }\n lines.push({ ts: entry.ts, threadTs, speaker, text: entry.text, isMikan });\n }\n return lines.slice(-limit);\n}\n\n/**\n * Build the shared `state` Jev scores when deciding whether an unaddressed\n * shared-channel message is meant for mikan. A single line like \"好啊\" is\n * unjudgeable on its own, so the state carries the surrounding scope: the\n * channel's recent top-level messages, or the thread's messages plus whether\n * mikan has already taken part in it.\n */\nexport function buildAutoReplyState(\n conversationDir: string,\n event: { ts: string; thread_ts?: string; user: string; text: string },\n options: { speaker?: string; limit?: number } = {},\n): string {\n const recent = readRecentScope(conversationDir, event, options.limit ?? 12);\n const header = event.thread_ts\n ? `Slack thread reply. mikan has ${recent.some((l) => l.isMikan) ? \"already replied\" : \"not replied\"} in this thread.`\n : \"Slack channel top-level message.\";\n const context = recent.length\n ? recent.map((l) => `- ${l.speaker}: ${l.text}`).join(\"\\n\")\n : \"(none)\";\n return [\n header,\n \"\",\n \"Recent messages (oldest first):\",\n context,\n \"\",\n `NEW message from ${options.speaker ?? event.user}:`,\n event.text,\n ].join(\"\\n\");\n}\n"]}
|
|
@@ -187,12 +187,14 @@ export declare class SlackMessagingBot implements MessagingBot {
|
|
|
187
187
|
private deliverTaskUpdate;
|
|
188
188
|
/**
|
|
189
189
|
* Ask Jev a single typed yes/no question about whether this unaddressed
|
|
190
|
-
* shared-channel message
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
190
|
+
* shared-channel message (top-level or thread reply) addresses mikan. The
|
|
191
|
+
* scored state carries the surrounding scope from log.jsonl, since a bare
|
|
192
|
+
* thread reply cannot be judged from its own text. Only called in `jev`
|
|
193
|
+
* auto-reply mode, and only awaited by the caller in that mode, so
|
|
194
|
+
* `on`/`off` stay synchronous (magic-word `stop` handling depends on that).
|
|
195
|
+
* Any failure (including a missing `OPENROUTER_API_KEY`) fails closed to
|
|
196
|
+
* "not addressed" so a misconfiguration cannot make the bot noisy in a
|
|
197
|
+
* shared channel.
|
|
196
198
|
*/
|
|
197
199
|
private evaluateJevAddressed;
|
|
198
200
|
private handleMessageEvent;
|
|
@@ -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,EAElB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOnG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,KAAK,EAGV,YAAY,EAEZ,SAAS,EACV,MAAM,YAAY,CAAC;AAiBpB,OAAO,EASL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ import { reportUserFacingError } from "../../observability/index.js";
|
|
|
23
23
|
import { recordSlackUpdate } from "./update-diagnostics.js";
|
|
24
24
|
import { renderSlackBlocks, resolveSlackMentions } from "./blocks.js";
|
|
25
25
|
import { querySlackTasks, isTaskStatusQuestion, formatTaskStatus, readTaskRoots, } from "./task-status.js";
|
|
26
|
+
import { buildAutoReplyState, JEV_ADDRESSED_INSTRUCTIONS } from "./auto-reply-context.js";
|
|
26
27
|
import { StreamStartLimiter } from "./stream-limits.js";
|
|
27
28
|
const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
|
|
28
29
|
function hasMessageContent(message, includeBlocks = true) {
|
|
@@ -1292,22 +1293,25 @@ export class SlackMessagingBot {
|
|
|
1292
1293
|
}
|
|
1293
1294
|
/**
|
|
1294
1295
|
* Ask Jev a single typed yes/no question about whether this unaddressed
|
|
1295
|
-
* shared-channel message
|
|
1296
|
-
*
|
|
1297
|
-
*
|
|
1298
|
-
*
|
|
1299
|
-
*
|
|
1300
|
-
*
|
|
1296
|
+
* shared-channel message (top-level or thread reply) addresses mikan. The
|
|
1297
|
+
* scored state carries the surrounding scope from log.jsonl, since a bare
|
|
1298
|
+
* thread reply cannot be judged from its own text. Only called in `jev`
|
|
1299
|
+
* auto-reply mode, and only awaited by the caller in that mode, so
|
|
1300
|
+
* `on`/`off` stay synchronous (magic-word `stop` handling depends on that).
|
|
1301
|
+
* Any failure (including a missing `OPENROUTER_API_KEY`) fails closed to
|
|
1302
|
+
* "not addressed" so a misconfiguration cannot make the bot noisy in a
|
|
1303
|
+
* shared channel.
|
|
1301
1304
|
*/
|
|
1302
1305
|
async evaluateJevAddressed(event) {
|
|
1303
1306
|
if (!event.text.trim() || matchMagicWord(event.text) === "stop")
|
|
1304
1307
|
return false;
|
|
1305
1308
|
try {
|
|
1306
|
-
const
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1309
|
+
const user = this.users.get(event.user);
|
|
1310
|
+
const state = buildAutoReplyState(this.conversationDir(event.channel), event, {
|
|
1311
|
+
speaker: user?.displayName ?? user?.userName,
|
|
1312
|
+
});
|
|
1313
|
+
const result = await evaluateWithJev(state, {
|
|
1314
|
+
addressed: { type: "boolean", instructions: JEV_ADDRESSED_INSTRUCTIONS },
|
|
1311
1315
|
});
|
|
1312
1316
|
const probability = result.answers.addressed.probability;
|
|
1313
1317
|
log.logInfo(`[${event.channel}] jev auto-reply: probability=${probability.toFixed(2)} addressed=${probability > 0.5} text="${event.text.slice(0, 80)}"`);
|
|
@@ -1344,7 +1348,6 @@ export class SlackMessagingBot {
|
|
|
1344
1348
|
ack();
|
|
1345
1349
|
return;
|
|
1346
1350
|
}
|
|
1347
|
-
const isThreadReply = !!e.thread_ts;
|
|
1348
1351
|
const sessionKey = isDM ? resolveSlackSessionKey(e.channel, e.thread_ts) : undefined;
|
|
1349
1352
|
// Name the conversation from the first thing the person said. Guarded on
|
|
1350
1353
|
// the assistant registry, so classic DM threads are untouched, and it
|
|
@@ -1375,13 +1378,6 @@ export class SlackMessagingBot {
|
|
|
1375
1378
|
ack();
|
|
1376
1379
|
return;
|
|
1377
1380
|
}
|
|
1378
|
-
if (!isDM && isThreadReply && matchMagicWord(slackEvent.text) !== "stop") {
|
|
1379
|
-
void attachmentsPromise.catch((err) => {
|
|
1380
|
-
log.logWarning("Failed to log Slack message", String(err));
|
|
1381
|
-
});
|
|
1382
|
-
ack();
|
|
1383
|
-
return;
|
|
1384
|
-
}
|
|
1385
1381
|
const activeSessionKey = slackEvent.sessionKey ?? resolveSlackSessionKey(e.channel, e.thread_ts);
|
|
1386
1382
|
slackEvent.sessionKey = activeSessionKey;
|
|
1387
1383
|
const taskThread = isDM && !!e.thread_ts && this.isTaskThread(e.channel, e.thread_ts);
|
|
@@ -1391,6 +1387,9 @@ export class SlackMessagingBot {
|
|
|
1391
1387
|
if (await this.deliverTaskUpdate(slackEvent, attachmentsPromise))
|
|
1392
1388
|
return;
|
|
1393
1389
|
}
|
|
1390
|
+
// Shared-channel messages without a mention, top-level or in a thread,
|
|
1391
|
+
// all go through the same auto-reply gate; jev mode sees the surrounding
|
|
1392
|
+
// scope so thread follow-ups are judged in context rather than dropped.
|
|
1394
1393
|
const autoReplyMode = isDM
|
|
1395
1394
|
? "off"
|
|
1396
1395
|
: slackConversationAutoReplyMode(this.workspace.office(slackEvent.address));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import { SocketModeClient } from \"@slack/socket-mode\";\nimport type { KnownBlock } from \"@slack/types\";\nimport { WebAPIRateLimitedError, WebClient } from \"@slack/web-api\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport {\n createConversationEvent,\n createConversationMessage,\n type MessagingBot,\n type ConversationContext,\n type ConversationEvent,\n type MessagingEventHandler,\n type ConversationResponder,\n type ChatToolResult,\n type ConversationKind,\n type MessagingInfo,\n type OfficeAddress,\n type PlatformHistoryMessage,\n type PlatformHistoryOptions,\n type PlatformUserInfo,\n} from \"../index.js\";\nimport { createOfficeAddress, listRegisteredOffices, type Workspace } from \"../../office/index.js\";\nimport { COMMAND_MANIFEST, type SlackSlashRoute } from \"../commands/manifest.js\";\nimport {\n slackConversationAutoReplyMode,\n resolveConversationSettings,\n} from \"../../settings/index.js\";\nimport { evaluateWithJev, JevNotConfiguredError } from \"../../harness/index.js\";\nimport type { EventScheduler } from \"../../events/scheduler.js\";\nimport * as log from \"../../log.js\";\nimport type { Attachment } from \"../../types.js\";\nimport type {\n SlackBlockAction,\n SlackBlockActionBody,\n SlackChannel,\n SlackEvent,\n SlackUser,\n} from \"./types.js\";\nimport { isRecord, readTextFileIfExists } from \"../../file-guards.js\";\nimport { PRODUCT_NAME, formatForceStopped } from \"../messages.js\";\nimport {\n appendBotResponseLog,\n appendChannelLog,\n MessagingEventQueue,\n MessagingIntakeTracker,\n saveIncomingAttachments,\n withRetry,\n} from \"../shared.js\";\nimport { matchMagicWord, processMessageIntake } from \"../intake.js\";\nimport {\n readPlatformChannelKind,\n recordPlatformChannelKind,\n type PlatformChannelKind,\n} from \"../../office/projection.js\";\nimport {\n AssistantThreadRegistry,\n handleAgentContextChanged,\n handleAgentDmOpened,\n handleAssistantThreadStarted,\n titleAssistantThread,\n type AgentContext,\n type AssistantSurfaceOps,\n type AssistantThreadPayload,\n type SuggestedPrompt,\n} from \"./assistant.js\";\nimport { createSlackAdapters } from \"./context.js\";\nimport {\n hasMaterializedChatSession,\n registerThreadSession,\n} from \"../../sessions/chat-history-sync.js\";\nimport type { SlackPersonaIdentity } from \"./persona.js\";\nimport { conversationIdOf } from \"../../sessions/session-key.js\";\nimport {\n isSlackThreadSessionKey,\n planSlackAdapterSession,\n planSlackEventAnchorRun,\n resolveSlackSessionKey,\n} from \"./session.js\";\nimport { reportUserFacingError } from \"../../observability/index.js\";\nimport { recordSlackUpdate } from \"./update-diagnostics.js\";\nimport { renderSlackBlocks, resolveSlackMentions } from \"./blocks.js\";\nimport {\n querySlackTasks,\n isTaskStatusQuestion,\n formatTaskStatus,\n readTaskRoots,\n} from \"./task-status.js\";\nimport { StreamStartLimiter } from \"./stream-limits.js\";\n\nconst SLACK_EVENT_ANCHOR_TEXT = \"Working on it...\";\n\ntype SlackIncomingMessage = {\n text?: string;\n channel: string;\n user?: string;\n ts: string;\n thread_ts?: string;\n channel_type?: string;\n subtype?: string;\n bot_id?: string;\n app_id?: string;\n username?: string;\n bot_profile?: { id?: string; app_id?: string; name?: string; real_name?: string };\n blocks?: unknown[];\n attachments?: unknown[];\n files?: Array<{ name: string; url_private_download?: string; url_private?: string }>;\n};\n\ntype SlackHistoryMessage = Omit<SlackIncomingMessage, \"channel\" | \"ts\"> & { ts?: string };\n\nfunction hasMessageContent(message: SlackHistoryMessage, includeBlocks = true): boolean {\n const content: Array<string | unknown[] | undefined> = [message.text, message.files];\n if (includeBlocks) content.push(message.blocks, message.attachments);\n return content.some((part) => !!part?.length);\n}\n\nfunction hasBotIdentity(message: SlackHistoryMessage): boolean {\n return !!message.bot_id || message.subtype === \"bot_message\";\n}\n\nconst USER_MESSAGE_SUBTYPES = new Set([undefined, \"file_share\"]);\nconst BOT_MESSAGE_SUBTYPES = new Set([...USER_MESSAGE_SUBTYPES, \"bot_message\"]);\n\ntype CommandAdapterInput = {\n conversationId: string;\n userId: string;\n userName: string | undefined;\n text: string;\n ts: string;\n ephemeralChannelId?: string;\n threadTs?: string;\n sessionKey?: string;\n};\n\n/**\n * Slack's per-call limit on `markdown_text`: \"Limit this field to 12,000\n * characters.\" mikan allows far more in a message, so streamed text is split\n * to fit rather than truncated.\n */\nconst MAX_STREAM_TEXT_CHARS = 12_000;\n\n/** Slices `text` into pieces that each fit one streaming call. */\nexport function chunkStreamText(text: string, limit = MAX_STREAM_TEXT_CHARS): string[] {\n if (text.length <= limit) return [text];\n const chunks: string[] = [];\n for (let index = 0; index < text.length; index += limit) {\n chunks.push(text.slice(index, index + limit));\n }\n return chunks;\n}\n\n// web-api v8 throws WebAPIRateLimitedError; the duck-typed shapes cover\n// platform `data.error === \"rate_limited\"` / 429 responses and older callers.\nfunction slackIsRateLimited(err: Error): boolean {\n if (err instanceof WebAPIRateLimitedError) return true;\n if ((err as { code?: unknown }).code === \"rate_limited\") return true;\n const data = (err as { data?: { error?: string; response?: { status?: number } } }).data;\n return data?.error === \"rate_limited\" || data?.response?.status === 429;\n}\n\nconst slackRetry = <T>(fn: () => Promise<T>): Promise<T> =>\n withRetry(fn, { isRateLimited: slackIsRateLimited });\n\nfunction collectSlackText(value: unknown, parts: string[]): void {\n if (value === null || value === undefined) return;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed) parts.push(trimmed);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectSlackText(item, parts);\n return;\n }\n if (typeof value !== \"object\") return;\n\n const obj = value as Record<string, unknown>;\n for (const key of [\"text\", \"fallback\", \"title\", \"value\"] as const) {\n collectSlackText(obj[key], parts);\n }\n collectSlackText(obj.fields, parts);\n collectSlackText(obj.elements, parts);\n collectSlackText(obj.blocks, parts);\n}\n\nfunction buildSlackAppMessageText(event: {\n text?: string;\n blocks?: unknown[];\n attachments?: unknown[];\n}): string {\n const parts: string[] = [];\n collectSlackText(event.text, parts);\n collectSlackText(event.blocks, parts);\n collectSlackText(event.attachments, parts);\n const deduped = parts.filter((part, index) => parts.indexOf(part) === index);\n return deduped.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Shared mrkdwn truncation helper\n// ---------------------------------------------------------------------------\n\nconst MRKDWN_CONTEXT_TEXT_LIMIT = 3000;\n\n/**\n * Build a Slack context block whose text is capped at the mrkdwn limit.\n * Used for muted diagnostics and ephemeral command responses.\n */\nexport function buildMrkdwnContextBlock(text: string): object {\n const blockText =\n text.length > MRKDWN_CONTEXT_TEXT_LIMIT\n ? text.substring(0, MRKDWN_CONTEXT_TEXT_LIMIT - 20) + \"\\n_(truncated)_\"\n : text;\n return { type: \"context\", elements: [{ type: \"mrkdwn\", text: blockText }] };\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { SlackChannel, SlackEvent, SlackUser } from \"./types.js\";\n\n// ============================================================================\n// SlackMessagingBot\n// ============================================================================\n\nclass AttachmentDownloadHttpError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n }\n}\n\nfunction isRetryableAttachmentDownloadError(error: unknown): boolean {\n if (!(error instanceof AttachmentDownloadHttpError)) return true;\n return error.status === 408 || error.status === 429 || error.status >= 500;\n}\n\nexport class SlackMessagingBot implements MessagingBot {\n private socketClient: SocketModeClient;\n private webClient: WebClient;\n // Status is cosmetic: its rate limits must never pause the message client's queue.\n private readonly statusClient: WebClient;\n private readonly statusUpdates = new Map<string, Promise<void>>();\n private handler: MessagingEventHandler;\n private workspace: Workspace;\n private botToken: string;\n private botUserId: string | null = null;\n private botId: string | null = null;\n private teamId: string | null = null;\n private ownMentionRegex: RegExp | null = null;\n private startupTs: string | null = null; // Messages older than this are just logged, not processed\n\n private users = new Map<string, SlackUser>();\n private channels = new Map<string, SlackChannel>();\n /** Which threads belong to the assistant pane, and their last known context. */\n private assistantThreads = new AssistantThreadRegistry();\n /**\n * Native response streams opened recently. Per bot rather than per module:\n * the rate tier applies per workspace, and this bot is the connection to\n * one — which also means a test constructing a bot gets a fresh budget\n * instead of inheriting whatever ran before it.\n */\n private streamStarts = new StreamStartLimiter();\n private stopped = false;\n private queues = new Map<string, MessagingEventQueue>();\n private intake = new MessagingIntakeTracker(\"Slack\");\n private eventScheduler: EventScheduler | null = null;\n\n /** Host office dir for a Slack conversation. */\n private conversationDir(channelId: string): string {\n return this.workspace.office(createOfficeAddress(\"slack\", channelId)).dir;\n }\n\n private resolveReplyMode(address: OfficeAddress): \"top-level\" | \"thread\" {\n return (\n resolveConversationSettings(this.workspace.office(address)).slack?.replyMode ?? \"top-level\"\n );\n }\n\n private createContext(event: SlackEvent): ConversationContext {\n const context = createSlackAdapters(event, this, {\n replyMode: this.resolveReplyMode(event.address),\n });\n if (event.conversationKind === \"direct\") {\n context.responder.getTaskStatus = (key) =>\n querySlackTasks(\n this.conversationDir(event.channel),\n event.channel,\n this.handler\n .getRunningSessions()\n .filter(\n (s) => s.address.platform === \"slack\" && s.address.conversationId === event.channel,\n ),\n key,\n );\n }\n if (\n event.conversationKind === \"direct\" &&\n event.thread_ts &&\n this.isTaskThread(event.channel, event.thread_ts)\n ) {\n let notified = false;\n context.responder.notifyCompletion = async () => {\n if (notified) return;\n const text = `<@${event.user}> 這一輪處理已結束,請查看上方結果。`;\n const ts = await this.postInThread(event.channel, event.thread_ts!, text);\n notified = true;\n this.logBotResponse(event.channel, text, ts, event.thread_ts);\n };\n }\n if (event.conversationKind === \"direct\" && !event.thread_ts) {\n context.responder.startTask = async (message, task) => {\n if (this.stopped) throw new Error(\"Slack is shutting down; task was not started.\");\n await context.responder.deleteResponse();\n const root = await this.postMessage(event.channel, message);\n this.logToFile(event.channel, {\n date: new Date().toISOString(),\n ts: root,\n user: \"bot\",\n text: message,\n isMessagingBot: true,\n taskRoot: true,\n });\n const sessionKey = resolveSlackSessionKey(event.channel, root);\n try {\n registerThreadSession({\n conversationDir: this.conversationDir(event.channel),\n sessionKey,\n });\n const child: SlackEvent = {\n ...event,\n ts: `task:${root}`,\n thread_ts: root,\n sessionKey,\n text: task,\n };\n if (\n !this.getQueue(sessionKey).enqueue(async () => {\n try {\n await this.handler.handleEvent(\n {\n ...child,\n attachments: child.attachments?.map((a) => ({\n name: a.original,\n localPath: a.localPath,\n })),\n },\n this,\n this.createContext(child),\n );\n } catch (error) {\n reportUserFacingError(error, {\n domain: \"mikan\",\n surface: \"task_handoff\",\n operation: \"start_task_run\",\n severity: \"error\",\n platform: \"slack\",\n context: { conversationId: event.channel, sessionKey, threadTs: root },\n });\n await this.postInThread(\n event.channel,\n root,\n \"Task could not start. Please reply here to try again.\",\n );\n throw error;\n }\n })\n )\n throw new Error(\"Task queue is closed.\");\n } catch (error) {\n await this.updateMessage(event.channel, root, `${message}\\n\\nTask could not start.`);\n throw error;\n }\n return sessionKey;\n };\n }\n return context;\n }\n\n constructor(\n handler: MessagingEventHandler,\n config: { appToken: string; botToken: string; workspace: Workspace },\n ) {\n this.handler = handler;\n this.workspace = config.workspace;\n this.botToken = config.botToken;\n this.socketClient = new SocketModeClient({\n appToken: config.appToken,\n // Default 5s is too tight: brief event-loop stalls (e.g. backfill, sync fs)\n // cause false pong timeouts; 4 in a row makes Slack drop the socket.\n clientPingTimeout: 12_000,\n });\n this.webClient = new WebClient(config.botToken);\n this.statusClient = new WebClient(config.botToken, {\n timeout: 3000,\n retryConfig: { retries: 0 },\n rejectRateLimitedCalls: true,\n });\n }\n\n setEventScheduler(scheduler: EventScheduler): void {\n this.eventScheduler = scheduler;\n }\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n\n async start(): Promise<void> {\n this.stopped = false;\n const auth = await this.webClient.auth.test();\n this.botUserId = auth.user_id as string;\n this.botId = typeof auth.bot_id === \"string\" ? auth.bot_id : null;\n this.teamId = typeof auth.team_id === \"string\" ? auth.team_id : null;\n\n await Promise.all([this.fetchUsers(), this.fetchChannels()]);\n if (this.stopped) return;\n log.logInfo(`Loaded ${this.channels.size} channels, ${this.users.size} users`);\n this.backfillChannelKinds();\n\n // Record startup time before opening the socket. Slack may replay older events;\n // those should be logged but not processed. Backfill runs in the background up\n // to this timestamp so startup is not blocked by one history call per channel.\n this.startupTs = (Date.now() / 1000).toFixed(6);\n\n this.setupEventHandlers();\n await this.socketClient.start();\n\n log.logConnected(\"Slack\");\n\n void this.backfillAllChannels(this.startupTs).catch((error) => {\n log.logWarning(\"Slack backfill failed\", String(error));\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n try {\n await this.socketClient.disconnect();\n } finally {\n await this.intake.close();\n await Promise.all([...this.queues.values()].map((queue) => queue.close()));\n }\n }\n\n getUser(userId: string): SlackUser | undefined {\n return this.users.get(userId);\n }\n\n getChannel(channelId: string): SlackChannel | undefined {\n return this.channels.get(channelId);\n }\n\n getAllUsers(): SlackUser[] {\n return Array.from(this.users.values());\n }\n\n getAllChannels(): SlackChannel[] {\n return Array.from(this.channels.values());\n }\n\n private stripOwnMention(text: string | undefined): string {\n const source = text ?? \"\";\n if (!this.botUserId) return source.trim();\n if (!this.ownMentionRegex || !this.ownMentionRegex.source.includes(this.botUserId)) {\n this.ownMentionRegex = new RegExp(`<@${this.botUserId}>`, \"gi\");\n }\n return source.replace(this.ownMentionRegex, \"\").trim();\n }\n\n /**\n * Response-source `<@userName>` mentions become native `<@U…>` here — the\n * one conversion every outgoing response path funnels through. Slack only\n * links and notifies on raw user ids.\n */\n private resolveMentions(text: string): string {\n return resolveSlackMentions(text, this.users.values());\n }\n\n async postMessage(\n channel: string,\n text: string,\n threadTs?: string,\n identity?: SlackPersonaIdentity,\n ): Promise<string> {\n return slackRetry(async () => {\n const payload = {\n channel,\n ...(threadTs !== undefined ? { thread_ts: threadTs } : {}),\n ...(identity ? { username: identity.username, icon_emoji: identity.iconEmoji } : {}),\n ...renderSlackBlocks(this.resolveMentions(text)),\n };\n const result = await this.webClient.chat.postMessage(payload);\n return result.ts as string;\n });\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n // Slack reaction names are colon-free short names; strip any wrapping colons.\n const name = emoji.replace(/^:|:$/g, \"\");\n await slackRetry(async () => {\n try {\n await this.webClient.reactions.add({ channel, timestamp: messageTs, name });\n } catch (err) {\n // Re-reacting with the same emoji is not an error worth surfacing.\n if ((err as { data?: { error?: string } })?.data?.error === \"already_reacted\") return;\n throw err;\n }\n });\n }\n\n async postEphemeral(\n channel: string,\n user: string,\n text: string,\n threadTs?: string,\n blocks?: object[],\n ): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.chat.postEphemeral({\n channel,\n user,\n text,\n ...(blocks !== undefined ? { blocks: blocks as KnownBlock[] } : {}),\n ...(threadTs ? { thread_ts: threadTs } : {}),\n });\n });\n }\n\n async postEphemeralBlocks(\n channel: string,\n user: string,\n text: string,\n blocks: object[],\n threadTs?: string,\n ): Promise<void> {\n return this.postEphemeral(channel, user, text, threadTs, blocks);\n }\n\n async postMessageBlocks(\n channel: string,\n text: string,\n blocks: object[],\n threadTs?: string,\n ): Promise<string> {\n return slackRetry(async () => {\n const payload = {\n channel,\n text,\n blocks: blocks as KnownBlock[],\n ...(threadTs !== undefined ? { thread_ts: threadTs } : {}),\n };\n const result = await this.webClient.chat.postMessage(payload);\n return result.ts as string;\n });\n }\n\n async updateMessageBlocks(\n channel: string,\n ts: string,\n text: string,\n blocks: object[],\n ): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.chat.update({ channel, ts, text, blocks: blocks as KnownBlock[] });\n });\n }\n\n async postPrivate(conversationId: string, userId: string, text: string): Promise<void> {\n await this.postEphemeral(conversationId, userId, text);\n }\n\n async postPrivateDiagnostic(\n conversationId: string,\n userId: string,\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n ): Promise<void> {\n if (options?.style !== \"muted\") {\n await this.postEphemeral(\n conversationId,\n userId,\n options?.style === \"error\" ? `_${text}_` : text,\n );\n return;\n }\n await this.postEphemeralBlocks(conversationId, userId, text, [buildMrkdwnContextBlock(text)]);\n }\n\n async openDirectConversation(userId: string): Promise<string> {\n return slackRetry(async () => {\n const result = await this.webClient.conversations.open({ users: userId });\n const channelId = result.channel?.id;\n if (!channelId) {\n throw new Error(`Failed to open DM for user ${userId}`);\n }\n return channelId;\n });\n }\n\n /**\n * Fetch recent messages from a channel, oldest first. Without `threadTs`\n * this is one `conversations.history` page of top-level messages (thread\n * replies are not expanded); with it, one `conversations.replies` page of\n * that thread's replies, excluding the parent. Callers page forward by\n * passing the last returned `ts` as `oldest`.\n */\n async fetchHistory(\n channel: string,\n options?: PlatformHistoryOptions,\n ): Promise<PlatformHistoryMessage[]> {\n const limit = Math.min(Math.max(options?.limit ?? 200, 1), 999);\n const threadTs = options?.threadTs;\n return slackRetry(async () => {\n const result = threadTs\n ? await this.webClient.conversations.replies({\n channel,\n ts: threadTs,\n ...(options?.oldest ? { oldest: options.oldest, inclusive: false } : {}),\n limit,\n })\n : await this.webClient.conversations.history({\n channel,\n ...(options?.oldest ? { oldest: options.oldest, inclusive: false } : {}),\n limit,\n });\n const messages = (result.messages ?? []) as Array<{\n ts?: string;\n thread_ts?: string;\n user?: string;\n bot_id?: string;\n subtype?: string;\n text?: string;\n }>;\n const mapped = messages\n .filter((msg): msg is typeof msg & { ts: string } => !!msg.ts)\n // conversations.replies leads with the thread parent; the caller asked\n // for the replies to it, and including it would re-ingest the bot's\n // own message on every poll.\n .filter((msg) => msg.ts !== threadTs)\n .map((msg) => {\n const user = msg.user ? this.users.get(msg.user) : undefined;\n const message: PlatformHistoryMessage = {\n ts: msg.ts,\n text: msg.text ?? \"\",\n isBot: !!msg.bot_id || msg.subtype === \"bot_message\" || user?.isBot === true,\n };\n if (msg.thread_ts && msg.thread_ts !== msg.ts) message.threadTs = msg.thread_ts;\n if (msg.user) message.userId = msg.user;\n if (user) message.userName = user.userName;\n return message;\n });\n // history returns newest-first, replies oldest-first; the contract is\n // oldest-first either way.\n return threadTs ? mapped : mapped.toReversed();\n });\n }\n\n /** Refresh and list the workspace's active users (`users.list`). */\n async listUsers(): Promise<PlatformUserInfo[]> {\n await slackRetry(() => this.fetchUsers());\n return this.getAllUsers().map((user) => ({\n id: user.id,\n userName: user.userName,\n displayName: user.displayName,\n isBot: user.isBot === true,\n }));\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n return slackRetry(async () => {\n const payload = { channel, ts, ...renderSlackBlocks(this.resolveMentions(text)) };\n try {\n await this.webClient.chat.update(payload);\n } catch (error) {\n recordSlackUpdate(this, { channel, ts }, text, payload, { error });\n throw error;\n }\n recordSlackUpdate(this, { channel, ts }, text, payload, { success: true });\n });\n }\n\n /**\n * Claim one native stream, or decline. Declining is not an error: the caller\n * falls back to edit-based updates, which is a working answer rather than a\n * degraded one, and costs no request against the tighter start tier.\n */\n tryReserveStreamStart(): boolean {\n return this.streamStarts.tryReserve();\n }\n\n /**\n * Open a stream, carrying text of any length.\n *\n * Slack caps `markdown_text` at 12,000 characters per call, and a long first\n * render exceeds that easily — mikan allows 35,000 in a message. Rather than\n * truncating (losing the answer) or failing (falling back to edit mode for\n * the whole response), the opening call takes the first slice and the rest\n * follows as appends before this resolves. The caller sees one operation\n * that sent everything, so the renderer's idea of what has been streamed\n * stays true.\n *\n * Splitting mid-word or mid-fence is harmless here: a stream concatenates,\n * so Slack renders the reassembled text, not the pieces.\n */\n async startMessageStream(\n channel: string,\n text: string,\n threadTs?: string,\n recipientUserId?: string,\n ): Promise<string> {\n const [head, ...tail] = chunkStreamText(text);\n const ts = await slackRetry(async () => {\n const result = await this.webClient.apiCall(\"chat.startStream\", {\n channel,\n markdown_text: this.resolveMentions(head ?? \"\"),\n ...(threadTs ? { thread_ts: threadTs } : {}),\n ...(this.teamId ? { recipient_team_id: this.teamId } : {}),\n ...(recipientUserId ? { recipient_user_id: recipientUserId } : {}),\n });\n const streamTs = (result as { ts?: string }).ts;\n if (!streamTs) throw new Error(\"Slack chat.startStream did not return ts\");\n return streamTs;\n });\n for (const part of tail) await this.appendStreamChunk(channel, ts, part);\n return ts;\n }\n\n /** Append a delta of any length, split to the per-call cap. */\n async appendMessageStream(channel: string, ts: string, text: string): Promise<void> {\n for (const part of chunkStreamText(text)) {\n await this.appendStreamChunk(channel, ts, part);\n }\n }\n\n private async appendStreamChunk(channel: string, ts: string, text: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.apiCall(\"chat.appendStream\", {\n channel,\n ts,\n // A mention split across stream deltas stays unresolved here; the\n // canonical final render (updateMessage) resolves the full text.\n markdown_text: this.resolveMentions(text),\n });\n });\n }\n\n async stopMessageStream(channel: string, ts: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.apiCall(\"chat.stopStream\", { channel, ts });\n });\n }\n\n async deleteMessage(channel: string, ts: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.chat.delete({ channel, ts });\n });\n }\n\n // ==========================================================================\n // Slack Assistant API (AI assistant experience)\n // ==========================================================================\n\n /** Set the status for an assistant thread (shows \"thinking\" state) */\n async setAssistantStatus(channel: string, threadTs: string, status: string): Promise<void> {\n const key = `${channel}:${threadTs}`;\n const previous = this.statusUpdates.get(key) ?? Promise.resolve();\n const update = previous\n .catch(() => undefined)\n .then(async () => {\n await this.statusClient.assistant.threads.setStatus({\n channel_id: channel,\n thread_ts: threadTs,\n status,\n });\n });\n this.statusUpdates.set(key, update);\n try {\n await update;\n } finally {\n if (this.statusUpdates.get(key) === update) this.statusUpdates.delete(key);\n }\n }\n\n /** Offer starting points in a new assistant thread. */\n async setAssistantSuggestedPrompts(\n channel: string,\n threadTs: string | undefined,\n prompts: SuggestedPrompt[],\n ): Promise<void> {\n return slackRetry(async () => {\n // Omitting thread_ts pins the prompts to the DM itself, which is what\n // the agent surface wants: there is no thread yet when it opens.\n await this.webClient.assistant.threads.setSuggestedPrompts({\n channel_id: channel,\n ...(threadTs ? { thread_ts: threadTs } : {}),\n prompts,\n });\n });\n }\n\n /** Name an assistant thread, which is what the sidebar conversation list shows. */\n async setAssistantTitle(channel: string, threadTs: string, title: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.assistant.threads.setTitle({\n channel_id: channel,\n thread_ts: threadTs,\n title,\n });\n });\n }\n\n /** The assistant surface's view of this bot, handed to the lifecycle handlers. */\n private assistantOps(): AssistantSurfaceOps {\n return {\n postInThread: (channel, threadTs, text) => this.postInThread(channel, threadTs, text),\n setSuggestedPrompts: (channel, threadTs, prompts) =>\n this.setAssistantSuggestedPrompts(channel, threadTs, prompts),\n setTitle: (channel, threadTs, title) => this.setAssistantTitle(channel, threadTs, title),\n channelName: (channelId) => this.channels.get(channelId)?.name,\n };\n }\n\n /**\n * A new conversation opened in the assistant pane. Slack waits for the app\n * to speak first here; staying silent is what makes the pane look broken.\n */\n private handleAssistantThreadStarted({ event, ack }: { event: unknown; ack: () => void }): void {\n ack();\n const payload = event as { assistant_thread?: AssistantThreadPayload };\n if (!payload.assistant_thread) return;\n void handleAssistantThreadStarted(\n this.assistantOps(),\n this.assistantThreads,\n payload.assistant_thread,\n );\n }\n\n /**\n * The person navigated to another channel while the pane is open. Slack\n * sends this as `assistant_thread_context_changed` under `assistant_view`\n * and `app_context_changed` under `agent_view`; the payload differs enough\n * to normalize here rather than in the handler.\n */\n private handleAgentContextChangedEvent({\n event,\n ack,\n }: {\n event: unknown;\n ack: () => void;\n }): void {\n ack();\n const payload = event as {\n assistant_thread?: AssistantThreadPayload;\n channel_id?: string;\n channel?: string;\n context?: AgentContext;\n };\n if (payload.assistant_thread) {\n handleAgentContextChanged(this.assistantThreads, payload.assistant_thread);\n return;\n }\n const channelId = payload.channel_id ?? payload.channel;\n if (channelId) {\n handleAgentContextChanged(this.assistantThreads, {\n channel_id: channelId,\n context: payload.context,\n });\n }\n }\n\n async postInThread(\n channel: string,\n threadTs: string,\n text: string,\n identity?: SlackPersonaIdentity,\n ): Promise<string> {\n return identity\n ? this.postMessage(channel, text, threadTs, identity)\n : this.postMessage(channel, text, threadTs);\n }\n\n async postInThreadBlocks(\n channel: string,\n threadTs: string,\n text: string,\n blocks: object[],\n ): Promise<string> {\n return this.postMessageBlocks(channel, text, blocks, threadTs);\n }\n\n async uploadFile(\n channel: string,\n filePath: string,\n title?: string,\n threadTs?: string,\n ): Promise<void> {\n return slackRetry(async () => {\n const fileName = title || basename(filePath);\n const fileContent = readFileSync(filePath);\n await this.webClient.files.uploadV2({\n channel_id: channel,\n file: fileContent,\n filename: fileName,\n title: fileName,\n ...(threadTs ? { thread_ts: threadTs } : {}),\n } as Parameters<typeof this.webClient.files.uploadV2>[0]);\n });\n }\n\n logToFile(channel: string, entry: object): void {\n appendChannelLog(this.workspace.office(createOfficeAddress(\"slack\", channel)), entry);\n }\n\n logBotResponse(\n channel: string,\n text: string,\n ts: string,\n threadTs?: string,\n slackBlocks?: object[],\n ): void {\n appendBotResponseLog(\n this.workspace.office(createOfficeAddress(\"slack\", channel)),\n text,\n ts,\n threadTs,\n {\n platform: \"slack\",\n ...(slackBlocks ? { slackBlocks } : {}),\n },\n );\n }\n\n ownsBlockKitMessage(channel: string, ts: string, threadTs?: string): boolean {\n const content = readTextFileIfExists(join(this.conversationDir(channel), \"log.jsonl\"));\n if (content === undefined) return false;\n for (const line of content.trim().split(\"\\n\").toReversed()) {\n try {\n const entry: unknown = JSON.parse(line);\n if (!isRecord(entry) || entry.ts !== ts) continue;\n return (\n entry.isMessagingBot === true &&\n entry.platform === \"slack\" &&\n Array.isArray(entry.slackBlocks) &&\n entry.threadTs === threadTs\n );\n } catch {\n continue;\n }\n }\n return false;\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"slack\",\n ...(this.teamId ? { workspaceId: this.teamId } : {}),\n trustModel: \"membership\",\n formattingGuide:\n \"## Slack Formatting\\nWrite standard Markdown/GFM: **bold**, _italic_, ~~strike~~, `code`, fenced code blocks, [links](url), lists, and pipe tables (rendered as native Slack tables).\\nDo NOT use Slack mrkdwn syntax like *single-asterisk bold* or <url|label> links.\",\n channels: this.getAllChannels().map((c) => ({ id: c.id, name: c.name })),\n users: this.getAllUsers().map((u) => ({\n id: u.id,\n userName: u.userName,\n displayName: u.displayName,\n })),\n diagnostics: {\n showUsageSummary: true,\n },\n };\n }\n\n // ==========================================================================\n // Events Integration\n // ==========================================================================\n\n /**\n * Enqueue an event for processing. Always queues (no \"already working\" rejection).\n * Returns true if enqueued, false if queue is full (max 5).\n */\n enqueueEvent(event: ConversationEvent): boolean {\n if (this.stopped) return false;\n const conversationId = event.conversationId;\n const queue = this.getQueue(conversationId);\n if (queue.size() >= 5) {\n log.logWarning(\n `Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`,\n );\n return false;\n }\n log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);\n return queue.enqueue(async () => {\n let anchorTs: string | undefined;\n if (!event.thread_ts) {\n try {\n anchorTs = await this.postMessage(conversationId, SLACK_EVENT_ANCHOR_TEXT);\n } catch (err) {\n log.logWarning(\n `Failed to post Slack event anchor for ${conversationId}`,\n err instanceof Error ? err.message : String(err),\n );\n reportUserFacingError(err, {\n domain: \"events\",\n surface: \"event_delivery\",\n operation: \"slack_anchor_post\",\n severity: \"error\",\n platform: \"slack\",\n context: {\n conversationId,\n conversationKind: event.conversationKind,\n eventTs: event.ts,\n textLength: event.text.length,\n },\n });\n throw err;\n }\n }\n const eventPlan = planSlackEventAnchorRun(event, anchorTs);\n const eventForRun = eventPlan.event;\n if (eventPlan.initialMessageTs && eventForRun.sessionKey) {\n registerThreadSession({\n conversationDir: this.conversationDir(conversationId),\n sessionKey: eventForRun.sessionKey,\n });\n }\n\n const runQueueKey = planSlackAdapterSession(eventForRun, {\n initialMessageTs: eventPlan.initialMessageTs,\n }).sessionKey;\n const run = async () => {\n const slackEvent = createConversationEvent({\n platform: \"slack\",\n address: eventForRun.address,\n type: eventForRun.type as SlackEvent[\"type\"],\n conversationId,\n conversationKind: eventForRun.conversationKind,\n channel: conversationId,\n ts: eventForRun.ts,\n thread_ts: eventForRun.thread_ts,\n user: eventForRun.user,\n text: eventForRun.text,\n attachments: eventForRun.attachments,\n sessionKey: eventForRun.sessionKey,\n }) as SlackEvent;\n const context = createSlackAdapters(slackEvent, this, {\n initialMessageTs: eventPlan.initialMessageTs,\n replyMode: this.resolveReplyMode(eventForRun.address),\n });\n return this.handler.handleEvent(eventForRun, this, context);\n };\n const runQueue = this.getQueue(runQueueKey);\n if (!runQueue.enqueue(run)) {\n await runQueue.close();\n await run();\n }\n });\n }\n\n // ==========================================================================\n // Private - Event Handlers\n // ==========================================================================\n\n private getQueue(channelId: string): MessagingEventQueue {\n let queue = this.queues.get(channelId);\n if (!queue) {\n queue = new MessagingEventQueue(\"Slack\");\n if (this.stopped) void queue.close();\n this.queues.set(channelId, queue);\n }\n return queue;\n }\n\n private resolveQueueKey(conversationId: string, sessionKey: string): string {\n if (!isSlackThreadSessionKey(sessionKey)) return sessionKey;\n if (this.handler.isRunning(createOfficeAddress(\"slack\", conversationId), sessionKey)) {\n return sessionKey;\n }\n return this.hasKnownThreadSession(conversationId, sessionKey) ? sessionKey : conversationId;\n }\n\n private isTaskThread(channel: string, root: string): boolean {\n return readTaskRoots(this.conversationDir(channel)).has(root);\n }\n\n private hasKnownThreadSession(conversationId: string, sessionKey: string): boolean {\n return hasMaterializedChatSession({\n conversationDir: this.conversationDir(conversationId),\n sessionKey,\n });\n }\n\n /**\n * Slack's own conversation vocabulary for this channel, from the metadata\n * fetchChannels() already loads. Externally shared channels report\n * \"external\" regardless of privacy — platform-public within one workspace\n * is the sharing condition, and a channel visible to another organization\n * does not satisfy it. Unknown channels return undefined (never recorded,\n * so the projection keeps its isolated default).\n */\n private channelKindFor(channelId: string): PlatformChannelKind | undefined {\n if (channelId.startsWith(\"D\")) return \"im\";\n const channel = this.channels.get(channelId);\n if (!channel) return undefined;\n if (channel.name.startsWith(\"DM:\")) return \"im\";\n if (channel.isExternallyShared) return \"external\";\n if (channel.isPrivate === true) return \"private_channel\";\n if (channel.isPrivate === false) return \"public_channel\";\n return undefined;\n }\n\n /**\n * Office visibility follows the recorded channel kind, and an unrecorded\n * kind fails closed to private (ADR 0008). Offices created before kinds\n * were recorded would therefore lose public status until their next\n * message; the channel list loaded at startup already knows every kind, so\n * record it for all registered Slack offices now. Metadata only.\n */\n private backfillChannelKinds(): void {\n let recorded = 0;\n for (const record of listRegisteredOffices(this.workspace.stateDir)) {\n if (record.platform !== \"slack\") continue;\n const kind = this.channelKindFor(record.conversationId);\n if (!kind) continue;\n try {\n const office = this.workspace.office(record);\n if (readPlatformChannelKind(office) === kind) continue;\n recordPlatformChannelKind(office, kind);\n recorded++;\n } catch (err) {\n log.logWarning(\"Failed to backfill Slack channel kind\", String(err));\n }\n }\n if (recorded > 0) log.logInfo(`Recorded channel kind for ${recorded} Slack offices`);\n }\n\n private processSlackMessageIntake(options: {\n event: SlackEvent;\n attachmentsPromise: Promise<Attachment[]>;\n queueKey: string;\n addressed: boolean;\n magicWordAddressed?: boolean;\n }): Promise<void> {\n const kind = this.channelKindFor(options.event.conversationId);\n if (kind) {\n try {\n recordPlatformChannelKind(this.workspace.office(options.event.address), kind);\n } catch (err) {\n // A failed snapshot must not block the message; the projection just\n // keeps its previous (or isolated default) posture.\n log.logWarning(\"Failed to record Slack channel kind\", String(err));\n }\n }\n const absorbAttachmentFailure = () => {\n void options.attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n };\n return processMessageIntake({\n eventBase: options.event as unknown as ConversationEvent,\n addressed: options.addressed,\n magicWord: {\n addressed: options.magicWordAddressed ?? options.addressed,\n scopeFallback: \"top-level\",\n },\n busyPolicy: \"queue\",\n logEntryBase: {},\n processAttachments: () => options.attachmentsPromise,\n queueKey: options.queueKey,\n enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => this.createContext(event as SlackEvent),\n deferAttachmentsUntilRun: true,\n }).then(\n (outcome) => {\n // Slack logs eagerly via logUserMessage; when intake does not enqueue,\n // nothing awaits the attachment download, so absorb its failure here.\n if (outcome !== \"enqueued\") absorbAttachmentFailure();\n },\n (err) => {\n log.logWarning(\"Slack message intake failed\", String(err));\n absorbAttachmentFailure();\n },\n );\n }\n\n private appendRunningTasks(blocks: object[]): void {\n const runningSessions = this.handler.getRunningSessions();\n blocks.push(\n { type: \"divider\" },\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: `Running Tasks (${runningSessions.length})`,\n emoji: true,\n },\n },\n );\n if (runningSessions.length === 0) {\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: \"_No tasks running right now._\" }],\n });\n return;\n }\n\n const stuckThresholdMs = 10 * 60 * 1000;\n for (const session of runningSessions) {\n const channelId = conversationIdOf(session.sessionKey);\n const channelName = this.channels.get(channelId)?.name;\n const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);\n const elapsedStr = elapsed < 1 ? \"<1 min\" : `${elapsed} min`;\n const lastActivity = session.lastActivityAt ? Date.now() - session.lastActivityAt : 0;\n const isStuck = lastActivity > stuckThresholdMs;\n let statusLine = `${isStuck ? \"_stuck_\" : \"_running_\"} · ${elapsedStr}`;\n if (session.currentTool) statusLine += ` · ${session.currentTool}`;\n if (isStuck) statusLine += ` · idle ${Math.floor(lastActivity / 60000)}m`;\n blocks.push({\n type: \"context\",\n elements: [\n {\n type: \"mrkdwn\",\n text: `*${channelName ? `#${channelName}` : channelId}* · ${statusLine}`,\n },\n ],\n });\n if (isStuck) {\n blocks.push({\n type: \"context\",\n elements: [\n { type: \"mrkdwn\", text: \" \" },\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Force Stop\", emoji: true },\n // `value` preserves the raw key; action_id is only a unique route.\n action_id: `force_stop_${session.sessionKey.replace(/:/g, \"_\")}`,\n value: session.sessionKey,\n style: \"danger\",\n },\n ],\n });\n }\n }\n }\n\n /**\n * Scheduled jobs of the opener's own DM office only: the App Home is a\n * personal surface, so other offices' schedules are not listed here.\n */\n private appendScheduledJobs(blocks: object[], dmChannelId: string | undefined): void {\n const periodicEvents =\n dmChannelId && this.eventScheduler\n ? this.eventScheduler.periodicEvents(createOfficeAddress(\"slack\", dmChannelId))\n : [];\n blocks.push(\n { type: \"divider\" },\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: `Scheduled Jobs (${periodicEvents.length})`,\n emoji: true,\n },\n },\n );\n if (periodicEvents.length === 0) {\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: \"_No scheduled jobs._\" }],\n });\n return;\n }\n\n for (const event of periodicEvents) {\n const channel =\n event.platform === \"slack\" ? this.channels.get(event.conversationId) : undefined;\n const channelId = channel ? `#${channel.name}` : event.conversationId;\n const channelLabel = `${event.platform}:${channelId}`;\n const nextRun = event.nextRun\n ? new Date(event.nextRun).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n })\n : \"—\";\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*${event.text}*\\n└ \\`${event.schedule}\\` · ${channelLabel} · Next: ${nextRun}`,\n },\n });\n }\n }\n\n private buildHomeView(dmChannelId: string | undefined): { type: \"home\"; blocks: KnownBlock[] } {\n const blocks: object[] = [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*${PRODUCT_NAME}*\\nStart a new task or check on running work.`,\n },\n accessory: {\n type: \"image\",\n image_url: \"https://media1.tenor.com/m/lfDATg4Bhc0AAAAC/happy-cat.gif\",\n alt_text: PRODUCT_NAME,\n },\n },\n ];\n this.appendRunningTasks(blocks);\n this.appendScheduledJobs(blocks, dmChannelId);\n blocks.push(\n { type: \"divider\" },\n {\n type: \"context\",\n elements: [\n { type: \"mrkdwn\", text: \"💡 @mention in a channel or send a DM to start a new task\" },\n ],\n },\n );\n return { type: \"home\", blocks: blocks as KnownBlock[] };\n }\n\n private createCommandAdapters(input: CommandAdapterInput): ConversationContext {\n const { conversationId, userId, userName, text, ts, ...options } = input;\n const message = createConversationMessage({\n platform: \"slack\",\n conversationId,\n id: ts,\n // One session identity per dispatch: the caller's thread-resolved key.\n // Defaulting to the top-level conversation here while the event carried\n // a thread key made the same run answer to two different sessions.\n sessionKey: options.sessionKey ?? conversationId,\n conversationKind: options.ephemeralChannelId ? \"shared\" : \"direct\",\n userId,\n userName,\n text,\n attachments: [],\n });\n\n const respond = async (responseText: string, blocks?: object[]) => {\n if (options.ephemeralChannelId) {\n await this.postEphemeral(\n options.ephemeralChannelId,\n userId,\n responseText,\n options.threadTs,\n blocks,\n );\n return;\n }\n const messageTs = blocks\n ? await this.postMessageBlocks(conversationId, responseText, blocks)\n : await this.postMessage(conversationId, responseText);\n this.logBotResponse(conversationId, responseText, messageTs);\n };\n\n const responder: ConversationResponder = {\n respond,\n replaceResponse: (responseText) => respond(responseText),\n respondDiagnostic: async (\n responseText: string,\n responseOptions?: { style?: \"muted\" | \"error\" },\n ) => {\n if (responseOptions?.style === \"muted\") {\n await respond(responseText, [buildMrkdwnContextBlock(responseText)]);\n return;\n }\n await respond(responseOptions?.style === \"error\" ? `_${responseText}_` : responseText);\n },\n respondToolResult: async (result: ChatToolResult) => {\n const duration = (result.durationMs / 1000).toFixed(1);\n await respond(\n `${result.isError ? \"Error\" : \"Done\"} ${result.toolName} (${duration}s)\\n${result.result}`,\n );\n },\n setTyping: async () => {},\n setWorking: async () => {},\n uploadFile: async (filePath: string, title?: string) => {\n await this.uploadFile(conversationId, filePath, title);\n },\n deleteResponse: async () => {},\n };\n\n return {\n address: message.address,\n message,\n responder,\n platform: this.getMessagingInfo(),\n };\n }\n\n private buildSlashCommandEvent(\n payload: {\n command: string;\n text?: string;\n channel_id: string;\n user_id: string;\n user_name?: string;\n thread_ts?: string;\n },\n options: { type?: ConversationEvent[\"type\"]; includeText?: boolean; thread?: boolean } = {},\n ): { event: ConversationEvent; context: ConversationContext } {\n const conversationId = payload.channel_id;\n const isDirectMessage = conversationId.startsWith(\"D\");\n const createdAt = new Date();\n const eventTs = (createdAt.getTime() / 1000).toFixed(6);\n const userName = payload.user_name ?? this.getUser(payload.user_id)?.userName;\n const commandSuffix = options.includeText ? payload.text?.trim() : undefined;\n const commandText = commandSuffix ? `${payload.command} ${commandSuffix}` : payload.command;\n const threadTs = options.thread ? payload.thread_ts : undefined;\n const sessionKey = options.thread\n ? resolveSlackSessionKey(conversationId, threadTs)\n : conversationId;\n\n this.logToFile(conversationId, {\n date: createdAt.toISOString(),\n ts: eventTs,\n user: payload.user_id,\n userName,\n text: commandText,\n attachments: [],\n isMessagingBot: false,\n ...(threadTs ? { threadTs } : {}),\n });\n\n const event = createConversationEvent({\n platform: \"slack\",\n conversationId,\n type: options.type ?? (isDirectMessage ? \"dm\" : \"mention\"),\n conversationKind: isDirectMessage ? \"direct\" : \"shared\",\n ts: eventTs,\n user: payload.user_id,\n text: commandText,\n attachments: [],\n ...(threadTs ? { thread_ts: threadTs } : {}),\n sessionKey,\n });\n\n const context = this.createCommandAdapters({\n conversationId,\n userId: payload.user_id,\n userName,\n text: commandText,\n ts: eventTs,\n ...(isDirectMessage\n ? { threadTs, sessionKey }\n : { ephemeralChannelId: conversationId, threadTs, sessionKey }),\n });\n\n return { event, context };\n }\n\n /**\n * Generic slash-command route: synthesize the command text per the\n * manifest's SlackSlashRoute data and dispatch to the handler. Every\n * routed command — including `/pi-new` — reaches its CommandHandler\n * through runtime dispatch; the adapter holds no per-command behavior.\n */\n private async routeSlashCommand(\n route: SlackSlashRoute,\n payload: {\n command: string;\n text?: string;\n channel_id: string;\n user_id: string;\n user_name?: string;\n thread_ts?: string;\n },\n ): Promise<void> {\n const { event, context } = this.buildSlashCommandEvent(payload, {\n includeText: route.includeText,\n thread: route.thread,\n ...(route.privateCommand\n ? {\n type: payload.channel_id.startsWith(\"D\")\n ? (\"dm\" as const)\n : (\"private_command\" as const),\n }\n : {}),\n });\n await this.handler.handleEvent(event, this, context);\n }\n\n private setupEventHandlers(): void {\n this.socketClient.on(\"disconnect\", (err: unknown) => {\n log.logWarning(\"Slack socket disconnect\", err ? String(err) : \"\");\n });\n this.socketClient.on(\"error\", (err: unknown) => {\n log.logWarning(\"Slack socket error\", err ? String(err) : \"\");\n });\n this.socketClient.on(\"unable_to_socket_mode_start\", (err: unknown) => {\n log.logWarning(\"Slack socket unable_to_start\", err ? String(err) : \"\");\n });\n\n this.socketClient.on(\"app_mention\", (payload) => {\n void this.intake.run(() => this.handleAppMention(payload));\n });\n this.socketClient.on(\"message\", (payload) => {\n void this.intake.run(() => this.handleMessageEvent(payload));\n });\n this.socketClient.on(\"slash_commands\", (payload) => {\n void this.intake.run(() => this.handleSlashCommand(payload));\n });\n this.socketClient.on(\"app_home_opened\", (payload) => {\n void this.intake.run(() => this.handleAppHomeOpened(payload));\n });\n // The assistant surface's lifecycle. Both events were already subscribed\n // in the app manifest and then dropped on the floor, which is why the pane\n // opened empty and the sidebar filled with untitled conversations.\n this.socketClient.on(\"assistant_thread_started\", (payload) => {\n void this.intake.run(() => this.handleAssistantThreadStarted(payload));\n });\n this.socketClient.on(\"assistant_thread_context_changed\", (payload) => {\n void this.intake.run(() => this.handleAgentContextChangedEvent(payload));\n });\n // agent_view's spelling of the same signal.\n this.socketClient.on(\"app_context_changed\", (payload) => {\n void this.intake.run(() => this.handleAgentContextChangedEvent(payload));\n });\n this.socketClient.on(\"block_actions\", (payload) => {\n void this.intake.run(() => this.handleBlockAction(payload));\n });\n this.socketClient.on(\"interactive\", (payload) => {\n void this.intake.run(() =>\n this.handleBlockAction(payload as { body: SlackBlockActionBody; ack: () => void }),\n );\n });\n }\n\n private async handleAppMention({\n event,\n ack,\n }: {\n event: unknown;\n ack: () => void;\n }): Promise<void> {\n const e = event as {\n text: string;\n channel: string;\n user: string;\n ts: string;\n thread_ts?: string;\n files?: Array<{ name: string; url_private_download?: string; url_private?: string }>;\n };\n\n // Skip DMs (handled by message event)\n if (e.channel.startsWith(\"D\")) {\n ack();\n return;\n }\n\n // Top-level mentions use a persistent channel session.\n // Thread replies get their own isolated session (channelId:thread_ts).\n const sessionKey = resolveSlackSessionKey(e.channel, e.thread_ts);\n\n const mentionText = this.stripOwnMention(e.text);\n const slackEvent = createConversationEvent({\n platform: \"slack\",\n conversationId: e.channel,\n type: \"mention\" as const,\n conversationKind: \"shared\",\n ts: e.ts,\n thread_ts: e.thread_ts,\n user: e.user,\n text: mentionText || \"Please respond to the recent conversation context.\",\n sessionKey,\n channel: e.channel,\n files: e.files,\n }) as SlackEvent;\n\n const attachmentsPromise = this.logUserMessage(slackEvent);\n\n // Only trigger processing for messages AFTER startup (not replayed old messages)\n if (this.startupTs && e.ts < this.startupTs) {\n log.logInfo(\n `[${e.channel}] Logged old message (pre-startup), not triggering: ${slackEvent.text.substring(0, 30)}`,\n );\n void attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n ack();\n return;\n }\n\n const intake = this.processSlackMessageIntake({\n event: slackEvent,\n attachmentsPromise,\n queueKey: this.resolveQueueKey(e.channel, sessionKey),\n addressed: true,\n });\n\n ack();\n await intake;\n }\n\n private admitHumanMessage(\n event: SlackIncomingMessage,\n ack: () => void,\n ): event is SlackIncomingMessage & { user: string } {\n const hasSlackContent = hasMessageContent(event);\n const isOwnMessage =\n event.user === this.botUserId || (!!this.botId && event.bot_id === this.botId);\n if (isOwnMessage) {\n ack();\n return false;\n }\n\n // User-token posts carry bot_id/app_id beside the human user. Only unknown\n // authors and known bot users take the external-bot loop-protection path.\n const authorIsKnownHuman = !!event.user && this.users.get(event.user)?.isBot === false;\n const isExternalMessage =\n event.subtype === \"bot_message\" || (!!event.bot_id && !authorIsKnownHuman);\n if (isExternalMessage) {\n const supportedSubtype = BOT_MESSAGE_SUBTYPES.has(event.subtype);\n if (supportedSubtype && hasSlackContent) {\n void this.logExternalMessagingBotMessage(event).catch((err) => {\n log.logWarning(\"Failed to log Slack bot message\", String(err));\n });\n }\n ack();\n return false;\n }\n\n const isSupportedUserMessage =\n !!event.user && USER_MESSAGE_SUBTYPES.has(event.subtype) && hasSlackContent;\n if (isSupportedUserMessage) return true;\n ack();\n return false;\n }\n\n private async deliverTaskUpdate(\n event: SlackEvent,\n attachmentsPromise: Promise<Attachment[]>,\n ): Promise<boolean> {\n if (matchMagicWord(event.text) === \"stop\" || event.text.startsWith(\"/\")) return false;\n event.attachments = await attachmentsPromise;\n const context = this.createContext(event);\n const post = (text: string) =>\n event.thread_ts\n ? this.postInThread(event.channel, event.thread_ts, text)\n : this.postMessage(event.channel, text);\n try {\n if (!event.attachments?.length && isTaskStatusQuestion(event.text)) {\n const tasks = await context.responder.getTaskStatus!(\n event.thread_ts ? event.sessionKey : undefined,\n );\n if (!tasks.length) return false;\n const active = tasks.filter((t) => t.status === \"running\" || t.status === \"stopping\");\n const selection = event.thread_ts ? tasks : active.length ? active : tasks.slice(0, 1);\n const text =\n selection.length > 1\n ? \"目前有多個任務在處理,請到你想查詢的任務對話串詢問,避免弄錯。\"\n : formatTaskStatus(selection);\n const ts = await post(text);\n this.logBotResponse(event.channel, text, ts, event.thread_ts);\n return true;\n }\n if (event.thread_ts && (await this.handler.steer?.(context.message))) {\n await post(\"收到補充,會在下一個處理步驟納入;目前的操作不會立即中斷。\");\n return true;\n }\n } catch (error) {\n await post(error instanceof Error ? error.message : \"Could not deliver task update.\");\n return true;\n }\n return false;\n }\n\n /**\n * Ask Jev a single typed yes/no question about whether this unaddressed\n * shared-channel message addresses mikan. Only called in `jev` auto-reply\n * mode, and only awaited by the caller in that mode, so `on`/`off` stay\n * synchronous (magic-word `stop` handling depends on that). Any failure\n * (including a missing `OPENROUTER_API_KEY`) fails closed to \"not\n * addressed\" so a misconfiguration cannot make the bot noisy in a shared\n * channel.\n */\n private async evaluateJevAddressed(event: SlackEvent): Promise<boolean> {\n if (!event.text.trim() || matchMagicWord(event.text) === \"stop\") return false;\n\n try {\n const result = await evaluateWithJev(event.text, {\n addressed: {\n type: \"boolean\",\n instructions:\n \"Does this Slack channel message address, ask, or request the mikan AI assistant to do something, rather than being casual conversation between humans that needs no reply?\",\n },\n });\n const probability = result.answers.addressed.probability;\n log.logInfo(\n `[${event.channel}] jev auto-reply: probability=${probability.toFixed(2)} addressed=${probability > 0.5} text=\"${event.text.slice(0, 80)}\"`,\n );\n return probability > 0.5;\n } catch (err) {\n if (err instanceof JevNotConfiguredError) {\n log.logWarning(\n \"Slack auto-reply jev mode requires OPENROUTER_API_KEY; treating message as unaddressed\",\n String(err),\n );\n return false;\n }\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"slack_auto_reply_jev\",\n operation: \"evaluate\",\n severity: \"warning\",\n context: { conversationId: event.conversationId },\n });\n return false;\n }\n }\n\n private async handleMessageEvent({\n event,\n ack,\n }: {\n event: unknown;\n ack: () => void;\n }): Promise<void> {\n const e = event as SlackIncomingMessage;\n if (!this.admitHumanMessage(e, ack)) return;\n\n // message.im normally carries channel_type \"im\", but fall back to the\n // D-prefix convention (used by handleAppMention and session keys) so a\n // missing channel_type cannot silently classify a DM as an unaddressed\n // channel message that never triggers.\n const isDM = e.channel_type === \"im\" || e.channel.startsWith(\"D\");\n const conversationKind: ConversationKind = isDM ? \"direct\" : \"shared\";\n const isMessagingBotMention = e.text?.includes(`<@${this.botUserId}>`);\n\n // Skip channel @mentions - already handled by app_mention event\n if (!isDM && isMessagingBotMention) {\n ack();\n return;\n }\n\n const isThreadReply = !!e.thread_ts;\n const sessionKey = isDM ? resolveSlackSessionKey(e.channel, e.thread_ts) : undefined;\n\n // Name the conversation from the first thing the person said. Guarded on\n // the assistant registry, so classic DM threads are untouched, and it\n // claims the title once per thread.\n if (isDM && e.thread_ts && e.text) {\n void titleAssistantThread(\n this.assistantOps(),\n this.assistantThreads,\n e.channel,\n e.thread_ts,\n this.stripOwnMention(e.text),\n );\n }\n\n const slackEvent = createConversationEvent({\n platform: \"slack\",\n conversationId: e.channel,\n type: (isDM ? \"dm\" : \"mention\") as SlackEvent[\"type\"],\n conversationKind,\n ts: e.ts,\n thread_ts: e.thread_ts,\n user: e.user,\n text: this.stripOwnMention(e.text),\n sessionKey,\n channel: e.channel,\n files: e.files,\n }) as SlackEvent;\n\n const attachmentsPromise = this.logUserMessage(slackEvent);\n\n // Only trigger processing for messages AFTER startup (not replayed old messages)\n if (this.startupTs && e.ts < this.startupTs) {\n log.logInfo(\n `[${e.channel}] Skipping old message (pre-startup): ${slackEvent.text.substring(0, 30)}`,\n );\n void attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n ack();\n return;\n }\n\n if (!isDM && isThreadReply && matchMagicWord(slackEvent.text) !== \"stop\") {\n void attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n ack();\n return;\n }\n\n const activeSessionKey =\n slackEvent.sessionKey ?? resolveSlackSessionKey(e.channel, e.thread_ts);\n slackEvent.sessionKey = activeSessionKey;\n const taskThread = isDM && !!e.thread_ts && this.isTaskThread(e.channel, e.thread_ts);\n const taskControl =\n taskThread || (isDM && !e.thread_ts && isTaskStatusQuestion(slackEvent.text));\n if (taskControl) {\n ack();\n if (await this.deliverTaskUpdate(slackEvent, attachmentsPromise)) return;\n }\n const autoReplyMode = isDM\n ? \"off\"\n : slackConversationAutoReplyMode(this.workspace.office(slackEvent.address));\n const autoReply =\n autoReplyMode === \"on\"\n ? true\n : autoReplyMode === \"jev\"\n ? await this.evaluateJevAddressed(slackEvent)\n : false;\n const intake = this.processSlackMessageIntake({\n event: slackEvent,\n attachmentsPromise,\n queueKey: this.resolveQueueKey(e.channel, activeSessionKey),\n addressed: isDM || autoReply,\n magicWordAddressed: isDM,\n });\n\n if (!taskControl) ack();\n await intake;\n }\n\n private async handleSlashCommand({\n body,\n ack,\n }: {\n body: unknown;\n ack: () => Promise<void>;\n }): Promise<void> {\n const payload = body as {\n command?: string;\n text?: string;\n channel_id?: string;\n user_id?: string;\n user_name?: string;\n thread_ts?: string;\n };\n\n await ack();\n\n if (!payload.command || !payload.channel_id || !payload.user_id) {\n return;\n }\n\n const { command, text, channel_id, user_id, user_name, thread_ts } = payload;\n const entry = COMMAND_MANIFEST.find((candidate) => candidate.slackCommand === command);\n if (!entry) return;\n\n if (!entry.slackRoute) return;\n try {\n await this.routeSlashCommand(entry.slackRoute, {\n command,\n text,\n channel_id,\n user_id,\n user_name,\n thread_ts,\n });\n } catch (err) {\n log.logWarning(\"Slack slash command error\", err instanceof Error ? err.message : String(err));\n }\n }\n\n private handleAppHomeOpened({ event, ack }: { event: unknown; ack: () => void }): void {\n const e = event as { user: string; tab: string; channel?: string; context?: AgentContext };\n ack();\n\n // Under agent_view this is how Slack says \"the person opened the app's\n // DM\" — the signal assistant_thread_started used to carry. It fires on\n // every open, not once per conversation, so this path refreshes the\n // pinned prompts and deliberately does not greet.\n if (e.tab === \"messages\") {\n if (e.channel) {\n void handleAgentDmOpened(this.assistantOps(), this.assistantThreads, e.channel, e.context);\n }\n return;\n }\n if (e.tab !== \"home\") return;\n\n this.webClient.views\n .publish({\n user_id: e.user,\n view: this.buildHomeView(e.channel),\n })\n .catch((err) => {\n log.logWarning(`Failed to publish App Home view`, String(err));\n });\n }\n\n private async handleBlockAction({\n body,\n ack,\n }: {\n body: SlackBlockActionBody;\n ack: () => void;\n }): Promise<void> {\n const action = body.actions?.[0];\n if (!action) {\n ack();\n return;\n }\n\n if (!action.action_id?.startsWith(\"force_stop_\")) {\n ack();\n this.handleSlackInteraction(body, action);\n return;\n }\n\n ack();\n // Prefer the verbatim key from `value`; the action_id fallback only\n // serves buttons rendered before `value` existed and misdecodes session\n // keys whose conversation id contains \"_\".\n const sessionKey =\n action.value ?? action.action_id.replace(\"force_stop_\", \"\").replace(/_/g, \":\");\n const userId = body.user?.id;\n const channelId = body.container?.channel_id || conversationIdOf(sessionKey);\n\n log.logInfo(`[Force Stop] User ${userId} requested force stop for ${sessionKey}`);\n\n // Use handler's forceStop method\n this.handler.forceStop(createOfficeAddress(\"slack\", channelId), sessionKey);\n\n // Notify in channel\n await this.postMessage(channelId, formatForceStopped(\"slack\", userId ?? \"unknown\"));\n\n // Refresh home tab\n if (userId) {\n this.openDirectConversation(userId)\n .then((dmChannelId) =>\n this.webClient.views.publish({\n user_id: userId,\n view: this.buildHomeView(dmChannelId),\n }),\n )\n .catch((err) => {\n log.logWarning(`Failed to refresh App Home view`, String(err));\n });\n }\n }\n\n private handleSlackInteraction(body: SlackBlockActionBody, action: SlackBlockAction): void {\n const container = body.container ?? {};\n const channelId = container.channel_id;\n const userId = body.user?.id;\n if (!channelId || !userId) return;\n\n const selectedOption = action.selected_option;\n const selectedOptions = Array.isArray(action.selected_options)\n ? action.selected_options\n : undefined;\n const threadTs = container.thread_ts;\n const sessionKey = resolveSlackSessionKey(channelId, threadTs);\n\n const selectedText = selectedOption?.text?.text ?? selectedOption?.value;\n const selectedTexts = selectedOptions?.map((option) => option.text?.text ?? option.value);\n const valueText = selectedTexts?.length\n ? selectedTexts.join(\", \")\n : (selectedText ?? action.value ?? action.action_id);\n const text = `[Slack action] ${action.action_id}: ${valueText}`;\n const ts = `action:${Date.now()}`;\n\n this.logToFile(channelId, {\n date: new Date().toISOString(),\n ts,\n ...(threadTs ? { threadTs } : {}),\n user: userId,\n userName: body.user?.username ?? body.user?.name,\n text,\n attachments: [],\n isMessagingBot: false,\n platform: \"slack\",\n slackInteraction: {\n type: \"block_actions\",\n actionId: action.action_id,\n blockId: action.block_id,\n actionType: action.type,\n value: action.value,\n selectedOption: selectedOption\n ? { text: selectedOption.text?.text, value: selectedOption.value }\n : undefined,\n selectedOptions: selectedOptions?.map((option) => ({\n text: option.text?.text,\n value: option.value,\n })),\n messageTs: container.message_ts,\n },\n });\n\n const event = createConversationEvent({\n platform: \"slack\",\n conversationId: channelId,\n type: \"slack_action\",\n conversationKind: channelId.startsWith(\"D\") ? \"direct\" : \"shared\",\n ts,\n user: userId,\n text,\n attachments: [],\n ...(threadTs ? { thread_ts: threadTs } : {}),\n sessionKey,\n });\n\n this.getQueue(this.resolveQueueKey(channelId, sessionKey)).enqueue(async () => {\n const slackEvent: SlackEvent = {\n ...createConversationEvent({\n platform: \"slack\",\n conversationId: channelId,\n type: (event.conversationKind === \"direct\" ? \"dm\" : \"mention\") as SlackEvent[\"type\"],\n conversationKind: event.conversationKind,\n ts,\n thread_ts: threadTs,\n user: userId,\n text,\n attachments: [],\n sessionKey,\n }),\n channel: channelId,\n attachments: [],\n };\n return this.handler.handleEvent(event, this, this.createContext(slackEvent));\n });\n }\n\n /**\n * Download Slack message files into the office's attachments directory.\n * The Slack contract is all-or-error: any failed download throws after the\n * successful ones are on disk, so callers still log the message text.\n */\n private async processAttachments(\n channelId: string,\n files: Array<{ name?: string; url_private_download?: string; url_private?: string }>,\n timestamp: string,\n ): Promise<Attachment[]> {\n const items = [];\n for (const file of files) {\n const url = file.url_private_download || file.url_private;\n if (!url) continue;\n if (!file.name) {\n throw new Error(`Attachment missing name for URL: ${url}`);\n }\n items.push({\n name: file.name,\n // Slack timestamps are float seconds; the stored filename uses ms.\n timestampMs: Math.floor(parseFloat(timestamp) * 1000),\n download: (destPath: string) => this.downloadSlackFile(url, destPath),\n });\n }\n\n const office = this.workspace.office(createOfficeAddress(\"slack\", channelId));\n const { saved, failed } = await saveIncomingAttachments(office, items);\n const firstFailure = failed[0];\n if (firstFailure) {\n const { name, error } = firstFailure;\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to download attachment ${name}: ${errorMsg}`, { cause: error });\n }\n return saved;\n }\n\n /** Authorized download with retry; Slack file URLs require the bot token. */\n private async downloadSlackFile(url: string, destPath: string): Promise<void> {\n await withRetry(\n async () => {\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${this.botToken}` },\n });\n if (!response.ok) {\n throw new AttachmentDownloadHttpError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n );\n }\n const buffer = await response.arrayBuffer();\n await writeFile(destPath, Buffer.from(buffer));\n },\n { maxAttempts: 3, baseDelayMs: 250, isRateLimited: isRetryableAttachmentDownloadError },\n );\n }\n\n /**\n * Log a user message to log.jsonl after attachments are ready.\n */\n private async logUserMessage(event: SlackEvent): Promise<Attachment[]> {\n const user = this.users.get(event.user);\n let attachments: Attachment[] = [];\n let attachmentError: unknown;\n if (event.files) {\n try {\n attachments = await this.processAttachments(event.channel, event.files, event.ts);\n } catch (err) {\n attachmentError = err;\n }\n }\n // Always write the text log, even if attachment processing failed — we want\n // a record of the user message regardless of file-handling errors.\n this.logToFile(event.channel, {\n date: new Date(parseFloat(event.ts) * 1000).toISOString(),\n ts: event.ts,\n threadTs: event.thread_ts,\n user: event.user,\n userName: user?.userName,\n displayName: user?.displayName,\n text: event.text,\n attachments,\n isMessagingBot: false,\n });\n if (attachmentError) throw attachmentError;\n return attachments;\n }\n\n private async logExternalMessagingBotMessage(event: {\n channel: string;\n ts: string;\n thread_ts?: string;\n text?: string;\n subtype?: string;\n bot_id?: string;\n app_id?: string;\n username?: string;\n bot_profile?: { app_id?: string; name?: string; real_name?: string };\n blocks?: unknown[];\n attachments?: unknown[];\n files?: Array<{ name: string; url_private_download?: string; url_private?: string }>;\n }): Promise<Attachment[]> {\n const attachments = event.files\n ? await this.processAttachments(event.channel, event.files, event.ts)\n : [];\n const botName =\n event.username ?? event.bot_profile?.name ?? event.bot_profile?.real_name ?? event.bot_id;\n this.logToFile(event.channel, {\n date: new Date(parseFloat(event.ts) * 1000).toISOString(),\n ts: event.ts,\n threadTs: event.thread_ts,\n user: event.bot_id ? `bot:${event.bot_id}` : \"external-bot\",\n userName: botName,\n displayName: botName,\n text: buildSlackAppMessageText(event),\n attachments,\n isMessagingBot: true,\n botId: event.bot_id,\n appId: event.app_id ?? event.bot_profile?.app_id,\n subtype: event.subtype,\n });\n return attachments;\n }\n\n // ==========================================================================\n // Private - Backfill\n // ==========================================================================\n\n private async getExistingTimestamps(channelId: string): Promise<Set<string>> {\n const logPath = join(this.conversationDir(channelId), \"log.jsonl\");\n const timestamps = new Set<string>();\n if (!existsSync(logPath)) return timestamps;\n\n const content = await readFile(logPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n for (let i = 0; i < lines.length; i++) {\n try {\n const entry = JSON.parse(lines[i] ?? \"\");\n if (entry.ts) timestamps.add(entry.ts);\n } catch (err) {\n log.logWarning(\n `Skipping malformed log entry at ${logPath}:${i + 1}`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n return timestamps;\n }\n\n private isBackfillableMessage(message: SlackHistoryMessage): boolean {\n if (message.user === this.botUserId) return true;\n if (hasBotIdentity(message)) {\n if (this.botId && message.bot_id === this.botId) return false;\n return BOT_MESSAGE_SUBTYPES.has(message.subtype) && hasMessageContent(message);\n }\n // Unlike live intake, historical human posts need text or files, not just blocks.\n return (\n !!message.user &&\n USER_MESSAGE_SUBTYPES.has(message.subtype) &&\n hasMessageContent(message, false)\n );\n }\n\n private async backfillChannel(channelId: string, upperBoundTs?: string): Promise<number> {\n const existingTs = await this.getExistingTimestamps(channelId);\n\n // Find the biggest ts in log.jsonl\n let lastLoggedTs: string | undefined;\n for (const ts of existingTs) {\n if (!lastLoggedTs || parseFloat(ts) > parseFloat(lastLoggedTs)) lastLoggedTs = ts;\n }\n\n const allMessages: SlackHistoryMessage[] = [];\n\n let cursor: string | undefined;\n let pageCount = 0;\n const maxPages = 3;\n\n do {\n const result = await this.webClient.conversations.history({\n channel: channelId,\n oldest: lastLoggedTs, // Only fetch messages newer than what we have\n latest: upperBoundTs, // Do not race live socket events after startup\n inclusive: false,\n limit: 1000,\n cursor,\n });\n if (result.messages) {\n allMessages.push(...(result.messages as SlackHistoryMessage[]));\n }\n cursor = result.response_metadata?.next_cursor;\n pageCount++;\n } while (cursor && pageCount < maxPages);\n\n // Filter: include mikan's messages, external app/bot messages, and user messages.\n const relevantMessages = allMessages.filter((msg) => {\n if (!msg.ts || existingTs.has(msg.ts)) return false; // Skip duplicates\n return this.isBackfillableMessage(msg);\n });\n\n // Reverse to chronological order\n relevantMessages.reverse();\n\n // Log each message to log.jsonl\n for (const msg of relevantMessages) {\n const isMikanMessage = msg.user === this.botUserId;\n const isExternalMessagingBotMessage = !isMikanMessage && hasBotIdentity(msg);\n if (isExternalMessagingBotMessage) {\n await this.logExternalMessagingBotMessage({ ...msg, channel: channelId, ts: msg.ts! });\n continue;\n }\n\n const user = this.users.get(msg.user!);\n const text = this.stripOwnMention(msg.text);\n const attachments = msg.files\n ? await this.processAttachments(channelId, msg.files, msg.ts!)\n : [];\n\n this.logToFile(channelId, {\n date: new Date(parseFloat(msg.ts!) * 1000).toISOString(),\n ts: msg.ts!,\n threadTs: msg.thread_ts,\n user: isMikanMessage ? \"bot\" : msg.user!,\n userName: isMikanMessage ? undefined : user?.userName,\n displayName: isMikanMessage ? undefined : user?.displayName,\n text,\n attachments,\n isMessagingBot: isMikanMessage,\n });\n }\n\n return relevantMessages.length;\n }\n\n private async backfillAllChannels(upperBoundTs?: string): Promise<void> {\n const startTime = Date.now();\n\n // Only backfill channels that already have a log.jsonl (mikan has interacted with them before)\n const channelsToBackfill: Array<[string, SlackChannel]> = [];\n for (const [channelId, channel] of this.channels) {\n const logPath = join(this.conversationDir(channelId), \"log.jsonl\");\n if (existsSync(logPath)) {\n channelsToBackfill.push([channelId, channel]);\n }\n }\n\n log.logBackfillStart(channelsToBackfill.length);\n\n let totalMessages = 0;\n for (const [channelId, channel] of channelsToBackfill) {\n try {\n const count = await this.backfillChannel(channelId, upperBoundTs);\n if (count > 0) log.logBackfillChannel(channel.name, count);\n totalMessages += count;\n } catch (error) {\n log.logWarning(`Failed to backfill #${channel.name}`, String(error));\n }\n\n // Add delay between channels to avoid hitting Slack rate limits\n if (channelId !== channelsToBackfill[channelsToBackfill.length - 1]?.[0]) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n const durationMs = Date.now() - startTime;\n log.logBackfillComplete(totalMessages, durationMs);\n }\n\n // ==========================================================================\n // Private - Fetch Users/Channels\n // ==========================================================================\n\n private async fetchUsers(): Promise<void> {\n let cursor: string | undefined;\n do {\n const result = await this.webClient.users.list({ limit: 200, cursor });\n const members = result.members as\n | Array<{\n id?: string;\n name?: string;\n real_name?: string;\n deleted?: boolean;\n is_bot?: boolean;\n }>\n | undefined;\n for (const u of members ?? []) {\n if (!u.id || !u.name || u.deleted) continue;\n this.users.set(u.id, {\n id: u.id,\n userName: u.name,\n displayName: u.real_name || u.name,\n isBot: !!u.is_bot,\n });\n }\n cursor = result.response_metadata?.next_cursor;\n } while (cursor);\n }\n\n private async fetchChannels(): Promise<void> {\n // Fetch public/private channels\n let cursor: string | undefined;\n do {\n const result = await this.webClient.conversations.list({\n types: \"public_channel,private_channel\",\n exclude_archived: true,\n limit: 200,\n cursor,\n });\n const channels = result.channels as\n | Array<{\n id?: string;\n name?: string;\n is_member?: boolean;\n is_private?: boolean;\n is_shared?: boolean;\n is_ext_shared?: boolean;\n }>\n | undefined;\n for (const c of channels ?? []) {\n if (!c.id || !c.name || !c.is_member) continue;\n this.channels.set(c.id, {\n id: c.id,\n name: c.name,\n ...(typeof c.is_private === \"boolean\" ? { isPrivate: c.is_private } : {}),\n ...(c.is_shared || c.is_ext_shared ? { isExternallyShared: true } : {}),\n });\n }\n cursor = result.response_metadata?.next_cursor;\n } while (cursor);\n\n // Also fetch DM channels (IMs)\n cursor = undefined;\n do {\n const result = await this.webClient.conversations.list({\n types: \"im\",\n limit: 200,\n cursor,\n });\n const ims = result.channels as Array<{ id?: string; user?: string }> | undefined;\n for (const im of ims ?? []) {\n if (!im.id) continue;\n // Use user's name as channel name for DMs\n const user = im.user ? this.users.get(im.user) : undefined;\n const name = user ? `DM:${user.userName}` : `DM:${im.id}`;\n this.channels.set(im.id, { id: im.id, name });\n }\n cursor = result.response_metadata?.next_cursor;\n } while (cursor);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import { SocketModeClient } from \"@slack/socket-mode\";\nimport type { KnownBlock } from \"@slack/types\";\nimport { WebAPIRateLimitedError, WebClient } from \"@slack/web-api\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport {\n createConversationEvent,\n createConversationMessage,\n type MessagingBot,\n type ConversationContext,\n type ConversationEvent,\n type MessagingEventHandler,\n type ConversationResponder,\n type ChatToolResult,\n type ConversationKind,\n type MessagingInfo,\n type OfficeAddress,\n type PlatformHistoryMessage,\n type PlatformHistoryOptions,\n type PlatformUserInfo,\n} from \"../index.js\";\nimport { createOfficeAddress, listRegisteredOffices, type Workspace } from \"../../office/index.js\";\nimport { COMMAND_MANIFEST, type SlackSlashRoute } from \"../commands/manifest.js\";\nimport {\n slackConversationAutoReplyMode,\n resolveConversationSettings,\n} from \"../../settings/index.js\";\nimport { evaluateWithJev, JevNotConfiguredError } from \"../../harness/index.js\";\nimport type { EventScheduler } from \"../../events/scheduler.js\";\nimport * as log from \"../../log.js\";\nimport type { Attachment } from \"../../types.js\";\nimport type {\n SlackBlockAction,\n SlackBlockActionBody,\n SlackChannel,\n SlackEvent,\n SlackUser,\n} from \"./types.js\";\nimport { isRecord, readTextFileIfExists } from \"../../file-guards.js\";\nimport { PRODUCT_NAME, formatForceStopped } from \"../messages.js\";\nimport {\n appendBotResponseLog,\n appendChannelLog,\n MessagingEventQueue,\n MessagingIntakeTracker,\n saveIncomingAttachments,\n withRetry,\n} from \"../shared.js\";\nimport { matchMagicWord, processMessageIntake } from \"../intake.js\";\nimport {\n readPlatformChannelKind,\n recordPlatformChannelKind,\n type PlatformChannelKind,\n} from \"../../office/projection.js\";\nimport {\n AssistantThreadRegistry,\n handleAgentContextChanged,\n handleAgentDmOpened,\n handleAssistantThreadStarted,\n titleAssistantThread,\n type AgentContext,\n type AssistantSurfaceOps,\n type AssistantThreadPayload,\n type SuggestedPrompt,\n} from \"./assistant.js\";\nimport { createSlackAdapters } from \"./context.js\";\nimport {\n hasMaterializedChatSession,\n registerThreadSession,\n} from \"../../sessions/chat-history-sync.js\";\nimport type { SlackPersonaIdentity } from \"./persona.js\";\nimport { conversationIdOf } from \"../../sessions/session-key.js\";\nimport {\n isSlackThreadSessionKey,\n planSlackAdapterSession,\n planSlackEventAnchorRun,\n resolveSlackSessionKey,\n} from \"./session.js\";\nimport { reportUserFacingError } from \"../../observability/index.js\";\nimport { recordSlackUpdate } from \"./update-diagnostics.js\";\nimport { renderSlackBlocks, resolveSlackMentions } from \"./blocks.js\";\nimport {\n querySlackTasks,\n isTaskStatusQuestion,\n formatTaskStatus,\n readTaskRoots,\n} from \"./task-status.js\";\nimport { buildAutoReplyState, JEV_ADDRESSED_INSTRUCTIONS } from \"./auto-reply-context.js\";\nimport { StreamStartLimiter } from \"./stream-limits.js\";\n\nconst SLACK_EVENT_ANCHOR_TEXT = \"Working on it...\";\n\ntype SlackIncomingMessage = {\n text?: string;\n channel: string;\n user?: string;\n ts: string;\n thread_ts?: string;\n channel_type?: string;\n subtype?: string;\n bot_id?: string;\n app_id?: string;\n username?: string;\n bot_profile?: { id?: string; app_id?: string; name?: string; real_name?: string };\n blocks?: unknown[];\n attachments?: unknown[];\n files?: Array<{ name: string; url_private_download?: string; url_private?: string }>;\n};\n\ntype SlackHistoryMessage = Omit<SlackIncomingMessage, \"channel\" | \"ts\"> & { ts?: string };\n\nfunction hasMessageContent(message: SlackHistoryMessage, includeBlocks = true): boolean {\n const content: Array<string | unknown[] | undefined> = [message.text, message.files];\n if (includeBlocks) content.push(message.blocks, message.attachments);\n return content.some((part) => !!part?.length);\n}\n\nfunction hasBotIdentity(message: SlackHistoryMessage): boolean {\n return !!message.bot_id || message.subtype === \"bot_message\";\n}\n\nconst USER_MESSAGE_SUBTYPES = new Set([undefined, \"file_share\"]);\nconst BOT_MESSAGE_SUBTYPES = new Set([...USER_MESSAGE_SUBTYPES, \"bot_message\"]);\n\ntype CommandAdapterInput = {\n conversationId: string;\n userId: string;\n userName: string | undefined;\n text: string;\n ts: string;\n ephemeralChannelId?: string;\n threadTs?: string;\n sessionKey?: string;\n};\n\n/**\n * Slack's per-call limit on `markdown_text`: \"Limit this field to 12,000\n * characters.\" mikan allows far more in a message, so streamed text is split\n * to fit rather than truncated.\n */\nconst MAX_STREAM_TEXT_CHARS = 12_000;\n\n/** Slices `text` into pieces that each fit one streaming call. */\nexport function chunkStreamText(text: string, limit = MAX_STREAM_TEXT_CHARS): string[] {\n if (text.length <= limit) return [text];\n const chunks: string[] = [];\n for (let index = 0; index < text.length; index += limit) {\n chunks.push(text.slice(index, index + limit));\n }\n return chunks;\n}\n\n// web-api v8 throws WebAPIRateLimitedError; the duck-typed shapes cover\n// platform `data.error === \"rate_limited\"` / 429 responses and older callers.\nfunction slackIsRateLimited(err: Error): boolean {\n if (err instanceof WebAPIRateLimitedError) return true;\n if ((err as { code?: unknown }).code === \"rate_limited\") return true;\n const data = (err as { data?: { error?: string; response?: { status?: number } } }).data;\n return data?.error === \"rate_limited\" || data?.response?.status === 429;\n}\n\nconst slackRetry = <T>(fn: () => Promise<T>): Promise<T> =>\n withRetry(fn, { isRateLimited: slackIsRateLimited });\n\nfunction collectSlackText(value: unknown, parts: string[]): void {\n if (value === null || value === undefined) return;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed) parts.push(trimmed);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectSlackText(item, parts);\n return;\n }\n if (typeof value !== \"object\") return;\n\n const obj = value as Record<string, unknown>;\n for (const key of [\"text\", \"fallback\", \"title\", \"value\"] as const) {\n collectSlackText(obj[key], parts);\n }\n collectSlackText(obj.fields, parts);\n collectSlackText(obj.elements, parts);\n collectSlackText(obj.blocks, parts);\n}\n\nfunction buildSlackAppMessageText(event: {\n text?: string;\n blocks?: unknown[];\n attachments?: unknown[];\n}): string {\n const parts: string[] = [];\n collectSlackText(event.text, parts);\n collectSlackText(event.blocks, parts);\n collectSlackText(event.attachments, parts);\n const deduped = parts.filter((part, index) => parts.indexOf(part) === index);\n return deduped.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Shared mrkdwn truncation helper\n// ---------------------------------------------------------------------------\n\nconst MRKDWN_CONTEXT_TEXT_LIMIT = 3000;\n\n/**\n * Build a Slack context block whose text is capped at the mrkdwn limit.\n * Used for muted diagnostics and ephemeral command responses.\n */\nexport function buildMrkdwnContextBlock(text: string): object {\n const blockText =\n text.length > MRKDWN_CONTEXT_TEXT_LIMIT\n ? text.substring(0, MRKDWN_CONTEXT_TEXT_LIMIT - 20) + \"\\n_(truncated)_\"\n : text;\n return { type: \"context\", elements: [{ type: \"mrkdwn\", text: blockText }] };\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { SlackChannel, SlackEvent, SlackUser } from \"./types.js\";\n\n// ============================================================================\n// SlackMessagingBot\n// ============================================================================\n\nclass AttachmentDownloadHttpError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n }\n}\n\nfunction isRetryableAttachmentDownloadError(error: unknown): boolean {\n if (!(error instanceof AttachmentDownloadHttpError)) return true;\n return error.status === 408 || error.status === 429 || error.status >= 500;\n}\n\nexport class SlackMessagingBot implements MessagingBot {\n private socketClient: SocketModeClient;\n private webClient: WebClient;\n // Status is cosmetic: its rate limits must never pause the message client's queue.\n private readonly statusClient: WebClient;\n private readonly statusUpdates = new Map<string, Promise<void>>();\n private handler: MessagingEventHandler;\n private workspace: Workspace;\n private botToken: string;\n private botUserId: string | null = null;\n private botId: string | null = null;\n private teamId: string | null = null;\n private ownMentionRegex: RegExp | null = null;\n private startupTs: string | null = null; // Messages older than this are just logged, not processed\n\n private users = new Map<string, SlackUser>();\n private channels = new Map<string, SlackChannel>();\n /** Which threads belong to the assistant pane, and their last known context. */\n private assistantThreads = new AssistantThreadRegistry();\n /**\n * Native response streams opened recently. Per bot rather than per module:\n * the rate tier applies per workspace, and this bot is the connection to\n * one — which also means a test constructing a bot gets a fresh budget\n * instead of inheriting whatever ran before it.\n */\n private streamStarts = new StreamStartLimiter();\n private stopped = false;\n private queues = new Map<string, MessagingEventQueue>();\n private intake = new MessagingIntakeTracker(\"Slack\");\n private eventScheduler: EventScheduler | null = null;\n\n /** Host office dir for a Slack conversation. */\n private conversationDir(channelId: string): string {\n return this.workspace.office(createOfficeAddress(\"slack\", channelId)).dir;\n }\n\n private resolveReplyMode(address: OfficeAddress): \"top-level\" | \"thread\" {\n return (\n resolveConversationSettings(this.workspace.office(address)).slack?.replyMode ?? \"top-level\"\n );\n }\n\n private createContext(event: SlackEvent): ConversationContext {\n const context = createSlackAdapters(event, this, {\n replyMode: this.resolveReplyMode(event.address),\n });\n if (event.conversationKind === \"direct\") {\n context.responder.getTaskStatus = (key) =>\n querySlackTasks(\n this.conversationDir(event.channel),\n event.channel,\n this.handler\n .getRunningSessions()\n .filter(\n (s) => s.address.platform === \"slack\" && s.address.conversationId === event.channel,\n ),\n key,\n );\n }\n if (\n event.conversationKind === \"direct\" &&\n event.thread_ts &&\n this.isTaskThread(event.channel, event.thread_ts)\n ) {\n let notified = false;\n context.responder.notifyCompletion = async () => {\n if (notified) return;\n const text = `<@${event.user}> 這一輪處理已結束,請查看上方結果。`;\n const ts = await this.postInThread(event.channel, event.thread_ts!, text);\n notified = true;\n this.logBotResponse(event.channel, text, ts, event.thread_ts);\n };\n }\n if (event.conversationKind === \"direct\" && !event.thread_ts) {\n context.responder.startTask = async (message, task) => {\n if (this.stopped) throw new Error(\"Slack is shutting down; task was not started.\");\n await context.responder.deleteResponse();\n const root = await this.postMessage(event.channel, message);\n this.logToFile(event.channel, {\n date: new Date().toISOString(),\n ts: root,\n user: \"bot\",\n text: message,\n isMessagingBot: true,\n taskRoot: true,\n });\n const sessionKey = resolveSlackSessionKey(event.channel, root);\n try {\n registerThreadSession({\n conversationDir: this.conversationDir(event.channel),\n sessionKey,\n });\n const child: SlackEvent = {\n ...event,\n ts: `task:${root}`,\n thread_ts: root,\n sessionKey,\n text: task,\n };\n if (\n !this.getQueue(sessionKey).enqueue(async () => {\n try {\n await this.handler.handleEvent(\n {\n ...child,\n attachments: child.attachments?.map((a) => ({\n name: a.original,\n localPath: a.localPath,\n })),\n },\n this,\n this.createContext(child),\n );\n } catch (error) {\n reportUserFacingError(error, {\n domain: \"mikan\",\n surface: \"task_handoff\",\n operation: \"start_task_run\",\n severity: \"error\",\n platform: \"slack\",\n context: { conversationId: event.channel, sessionKey, threadTs: root },\n });\n await this.postInThread(\n event.channel,\n root,\n \"Task could not start. Please reply here to try again.\",\n );\n throw error;\n }\n })\n )\n throw new Error(\"Task queue is closed.\");\n } catch (error) {\n await this.updateMessage(event.channel, root, `${message}\\n\\nTask could not start.`);\n throw error;\n }\n return sessionKey;\n };\n }\n return context;\n }\n\n constructor(\n handler: MessagingEventHandler,\n config: { appToken: string; botToken: string; workspace: Workspace },\n ) {\n this.handler = handler;\n this.workspace = config.workspace;\n this.botToken = config.botToken;\n this.socketClient = new SocketModeClient({\n appToken: config.appToken,\n // Default 5s is too tight: brief event-loop stalls (e.g. backfill, sync fs)\n // cause false pong timeouts; 4 in a row makes Slack drop the socket.\n clientPingTimeout: 12_000,\n });\n this.webClient = new WebClient(config.botToken);\n this.statusClient = new WebClient(config.botToken, {\n timeout: 3000,\n retryConfig: { retries: 0 },\n rejectRateLimitedCalls: true,\n });\n }\n\n setEventScheduler(scheduler: EventScheduler): void {\n this.eventScheduler = scheduler;\n }\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n\n async start(): Promise<void> {\n this.stopped = false;\n const auth = await this.webClient.auth.test();\n this.botUserId = auth.user_id as string;\n this.botId = typeof auth.bot_id === \"string\" ? auth.bot_id : null;\n this.teamId = typeof auth.team_id === \"string\" ? auth.team_id : null;\n\n await Promise.all([this.fetchUsers(), this.fetchChannels()]);\n if (this.stopped) return;\n log.logInfo(`Loaded ${this.channels.size} channels, ${this.users.size} users`);\n this.backfillChannelKinds();\n\n // Record startup time before opening the socket. Slack may replay older events;\n // those should be logged but not processed. Backfill runs in the background up\n // to this timestamp so startup is not blocked by one history call per channel.\n this.startupTs = (Date.now() / 1000).toFixed(6);\n\n this.setupEventHandlers();\n await this.socketClient.start();\n\n log.logConnected(\"Slack\");\n\n void this.backfillAllChannels(this.startupTs).catch((error) => {\n log.logWarning(\"Slack backfill failed\", String(error));\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n try {\n await this.socketClient.disconnect();\n } finally {\n await this.intake.close();\n await Promise.all([...this.queues.values()].map((queue) => queue.close()));\n }\n }\n\n getUser(userId: string): SlackUser | undefined {\n return this.users.get(userId);\n }\n\n getChannel(channelId: string): SlackChannel | undefined {\n return this.channels.get(channelId);\n }\n\n getAllUsers(): SlackUser[] {\n return Array.from(this.users.values());\n }\n\n getAllChannels(): SlackChannel[] {\n return Array.from(this.channels.values());\n }\n\n private stripOwnMention(text: string | undefined): string {\n const source = text ?? \"\";\n if (!this.botUserId) return source.trim();\n if (!this.ownMentionRegex || !this.ownMentionRegex.source.includes(this.botUserId)) {\n this.ownMentionRegex = new RegExp(`<@${this.botUserId}>`, \"gi\");\n }\n return source.replace(this.ownMentionRegex, \"\").trim();\n }\n\n /**\n * Response-source `<@userName>` mentions become native `<@U…>` here — the\n * one conversion every outgoing response path funnels through. Slack only\n * links and notifies on raw user ids.\n */\n private resolveMentions(text: string): string {\n return resolveSlackMentions(text, this.users.values());\n }\n\n async postMessage(\n channel: string,\n text: string,\n threadTs?: string,\n identity?: SlackPersonaIdentity,\n ): Promise<string> {\n return slackRetry(async () => {\n const payload = {\n channel,\n ...(threadTs !== undefined ? { thread_ts: threadTs } : {}),\n ...(identity ? { username: identity.username, icon_emoji: identity.iconEmoji } : {}),\n ...renderSlackBlocks(this.resolveMentions(text)),\n };\n const result = await this.webClient.chat.postMessage(payload);\n return result.ts as string;\n });\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n // Slack reaction names are colon-free short names; strip any wrapping colons.\n const name = emoji.replace(/^:|:$/g, \"\");\n await slackRetry(async () => {\n try {\n await this.webClient.reactions.add({ channel, timestamp: messageTs, name });\n } catch (err) {\n // Re-reacting with the same emoji is not an error worth surfacing.\n if ((err as { data?: { error?: string } })?.data?.error === \"already_reacted\") return;\n throw err;\n }\n });\n }\n\n async postEphemeral(\n channel: string,\n user: string,\n text: string,\n threadTs?: string,\n blocks?: object[],\n ): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.chat.postEphemeral({\n channel,\n user,\n text,\n ...(blocks !== undefined ? { blocks: blocks as KnownBlock[] } : {}),\n ...(threadTs ? { thread_ts: threadTs } : {}),\n });\n });\n }\n\n async postEphemeralBlocks(\n channel: string,\n user: string,\n text: string,\n blocks: object[],\n threadTs?: string,\n ): Promise<void> {\n return this.postEphemeral(channel, user, text, threadTs, blocks);\n }\n\n async postMessageBlocks(\n channel: string,\n text: string,\n blocks: object[],\n threadTs?: string,\n ): Promise<string> {\n return slackRetry(async () => {\n const payload = {\n channel,\n text,\n blocks: blocks as KnownBlock[],\n ...(threadTs !== undefined ? { thread_ts: threadTs } : {}),\n };\n const result = await this.webClient.chat.postMessage(payload);\n return result.ts as string;\n });\n }\n\n async updateMessageBlocks(\n channel: string,\n ts: string,\n text: string,\n blocks: object[],\n ): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.chat.update({ channel, ts, text, blocks: blocks as KnownBlock[] });\n });\n }\n\n async postPrivate(conversationId: string, userId: string, text: string): Promise<void> {\n await this.postEphemeral(conversationId, userId, text);\n }\n\n async postPrivateDiagnostic(\n conversationId: string,\n userId: string,\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n ): Promise<void> {\n if (options?.style !== \"muted\") {\n await this.postEphemeral(\n conversationId,\n userId,\n options?.style === \"error\" ? `_${text}_` : text,\n );\n return;\n }\n await this.postEphemeralBlocks(conversationId, userId, text, [buildMrkdwnContextBlock(text)]);\n }\n\n async openDirectConversation(userId: string): Promise<string> {\n return slackRetry(async () => {\n const result = await this.webClient.conversations.open({ users: userId });\n const channelId = result.channel?.id;\n if (!channelId) {\n throw new Error(`Failed to open DM for user ${userId}`);\n }\n return channelId;\n });\n }\n\n /**\n * Fetch recent messages from a channel, oldest first. Without `threadTs`\n * this is one `conversations.history` page of top-level messages (thread\n * replies are not expanded); with it, one `conversations.replies` page of\n * that thread's replies, excluding the parent. Callers page forward by\n * passing the last returned `ts` as `oldest`.\n */\n async fetchHistory(\n channel: string,\n options?: PlatformHistoryOptions,\n ): Promise<PlatformHistoryMessage[]> {\n const limit = Math.min(Math.max(options?.limit ?? 200, 1), 999);\n const threadTs = options?.threadTs;\n return slackRetry(async () => {\n const result = threadTs\n ? await this.webClient.conversations.replies({\n channel,\n ts: threadTs,\n ...(options?.oldest ? { oldest: options.oldest, inclusive: false } : {}),\n limit,\n })\n : await this.webClient.conversations.history({\n channel,\n ...(options?.oldest ? { oldest: options.oldest, inclusive: false } : {}),\n limit,\n });\n const messages = (result.messages ?? []) as Array<{\n ts?: string;\n thread_ts?: string;\n user?: string;\n bot_id?: string;\n subtype?: string;\n text?: string;\n }>;\n const mapped = messages\n .filter((msg): msg is typeof msg & { ts: string } => !!msg.ts)\n // conversations.replies leads with the thread parent; the caller asked\n // for the replies to it, and including it would re-ingest the bot's\n // own message on every poll.\n .filter((msg) => msg.ts !== threadTs)\n .map((msg) => {\n const user = msg.user ? this.users.get(msg.user) : undefined;\n const message: PlatformHistoryMessage = {\n ts: msg.ts,\n text: msg.text ?? \"\",\n isBot: !!msg.bot_id || msg.subtype === \"bot_message\" || user?.isBot === true,\n };\n if (msg.thread_ts && msg.thread_ts !== msg.ts) message.threadTs = msg.thread_ts;\n if (msg.user) message.userId = msg.user;\n if (user) message.userName = user.userName;\n return message;\n });\n // history returns newest-first, replies oldest-first; the contract is\n // oldest-first either way.\n return threadTs ? mapped : mapped.toReversed();\n });\n }\n\n /** Refresh and list the workspace's active users (`users.list`). */\n async listUsers(): Promise<PlatformUserInfo[]> {\n await slackRetry(() => this.fetchUsers());\n return this.getAllUsers().map((user) => ({\n id: user.id,\n userName: user.userName,\n displayName: user.displayName,\n isBot: user.isBot === true,\n }));\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n return slackRetry(async () => {\n const payload = { channel, ts, ...renderSlackBlocks(this.resolveMentions(text)) };\n try {\n await this.webClient.chat.update(payload);\n } catch (error) {\n recordSlackUpdate(this, { channel, ts }, text, payload, { error });\n throw error;\n }\n recordSlackUpdate(this, { channel, ts }, text, payload, { success: true });\n });\n }\n\n /**\n * Claim one native stream, or decline. Declining is not an error: the caller\n * falls back to edit-based updates, which is a working answer rather than a\n * degraded one, and costs no request against the tighter start tier.\n */\n tryReserveStreamStart(): boolean {\n return this.streamStarts.tryReserve();\n }\n\n /**\n * Open a stream, carrying text of any length.\n *\n * Slack caps `markdown_text` at 12,000 characters per call, and a long first\n * render exceeds that easily — mikan allows 35,000 in a message. Rather than\n * truncating (losing the answer) or failing (falling back to edit mode for\n * the whole response), the opening call takes the first slice and the rest\n * follows as appends before this resolves. The caller sees one operation\n * that sent everything, so the renderer's idea of what has been streamed\n * stays true.\n *\n * Splitting mid-word or mid-fence is harmless here: a stream concatenates,\n * so Slack renders the reassembled text, not the pieces.\n */\n async startMessageStream(\n channel: string,\n text: string,\n threadTs?: string,\n recipientUserId?: string,\n ): Promise<string> {\n const [head, ...tail] = chunkStreamText(text);\n const ts = await slackRetry(async () => {\n const result = await this.webClient.apiCall(\"chat.startStream\", {\n channel,\n markdown_text: this.resolveMentions(head ?? \"\"),\n ...(threadTs ? { thread_ts: threadTs } : {}),\n ...(this.teamId ? { recipient_team_id: this.teamId } : {}),\n ...(recipientUserId ? { recipient_user_id: recipientUserId } : {}),\n });\n const streamTs = (result as { ts?: string }).ts;\n if (!streamTs) throw new Error(\"Slack chat.startStream did not return ts\");\n return streamTs;\n });\n for (const part of tail) await this.appendStreamChunk(channel, ts, part);\n return ts;\n }\n\n /** Append a delta of any length, split to the per-call cap. */\n async appendMessageStream(channel: string, ts: string, text: string): Promise<void> {\n for (const part of chunkStreamText(text)) {\n await this.appendStreamChunk(channel, ts, part);\n }\n }\n\n private async appendStreamChunk(channel: string, ts: string, text: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.apiCall(\"chat.appendStream\", {\n channel,\n ts,\n // A mention split across stream deltas stays unresolved here; the\n // canonical final render (updateMessage) resolves the full text.\n markdown_text: this.resolveMentions(text),\n });\n });\n }\n\n async stopMessageStream(channel: string, ts: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.apiCall(\"chat.stopStream\", { channel, ts });\n });\n }\n\n async deleteMessage(channel: string, ts: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.chat.delete({ channel, ts });\n });\n }\n\n // ==========================================================================\n // Slack Assistant API (AI assistant experience)\n // ==========================================================================\n\n /** Set the status for an assistant thread (shows \"thinking\" state) */\n async setAssistantStatus(channel: string, threadTs: string, status: string): Promise<void> {\n const key = `${channel}:${threadTs}`;\n const previous = this.statusUpdates.get(key) ?? Promise.resolve();\n const update = previous\n .catch(() => undefined)\n .then(async () => {\n await this.statusClient.assistant.threads.setStatus({\n channel_id: channel,\n thread_ts: threadTs,\n status,\n });\n });\n this.statusUpdates.set(key, update);\n try {\n await update;\n } finally {\n if (this.statusUpdates.get(key) === update) this.statusUpdates.delete(key);\n }\n }\n\n /** Offer starting points in a new assistant thread. */\n async setAssistantSuggestedPrompts(\n channel: string,\n threadTs: string | undefined,\n prompts: SuggestedPrompt[],\n ): Promise<void> {\n return slackRetry(async () => {\n // Omitting thread_ts pins the prompts to the DM itself, which is what\n // the agent surface wants: there is no thread yet when it opens.\n await this.webClient.assistant.threads.setSuggestedPrompts({\n channel_id: channel,\n ...(threadTs ? { thread_ts: threadTs } : {}),\n prompts,\n });\n });\n }\n\n /** Name an assistant thread, which is what the sidebar conversation list shows. */\n async setAssistantTitle(channel: string, threadTs: string, title: string): Promise<void> {\n return slackRetry(async () => {\n await this.webClient.assistant.threads.setTitle({\n channel_id: channel,\n thread_ts: threadTs,\n title,\n });\n });\n }\n\n /** The assistant surface's view of this bot, handed to the lifecycle handlers. */\n private assistantOps(): AssistantSurfaceOps {\n return {\n postInThread: (channel, threadTs, text) => this.postInThread(channel, threadTs, text),\n setSuggestedPrompts: (channel, threadTs, prompts) =>\n this.setAssistantSuggestedPrompts(channel, threadTs, prompts),\n setTitle: (channel, threadTs, title) => this.setAssistantTitle(channel, threadTs, title),\n channelName: (channelId) => this.channels.get(channelId)?.name,\n };\n }\n\n /**\n * A new conversation opened in the assistant pane. Slack waits for the app\n * to speak first here; staying silent is what makes the pane look broken.\n */\n private handleAssistantThreadStarted({ event, ack }: { event: unknown; ack: () => void }): void {\n ack();\n const payload = event as { assistant_thread?: AssistantThreadPayload };\n if (!payload.assistant_thread) return;\n void handleAssistantThreadStarted(\n this.assistantOps(),\n this.assistantThreads,\n payload.assistant_thread,\n );\n }\n\n /**\n * The person navigated to another channel while the pane is open. Slack\n * sends this as `assistant_thread_context_changed` under `assistant_view`\n * and `app_context_changed` under `agent_view`; the payload differs enough\n * to normalize here rather than in the handler.\n */\n private handleAgentContextChangedEvent({\n event,\n ack,\n }: {\n event: unknown;\n ack: () => void;\n }): void {\n ack();\n const payload = event as {\n assistant_thread?: AssistantThreadPayload;\n channel_id?: string;\n channel?: string;\n context?: AgentContext;\n };\n if (payload.assistant_thread) {\n handleAgentContextChanged(this.assistantThreads, payload.assistant_thread);\n return;\n }\n const channelId = payload.channel_id ?? payload.channel;\n if (channelId) {\n handleAgentContextChanged(this.assistantThreads, {\n channel_id: channelId,\n context: payload.context,\n });\n }\n }\n\n async postInThread(\n channel: string,\n threadTs: string,\n text: string,\n identity?: SlackPersonaIdentity,\n ): Promise<string> {\n return identity\n ? this.postMessage(channel, text, threadTs, identity)\n : this.postMessage(channel, text, threadTs);\n }\n\n async postInThreadBlocks(\n channel: string,\n threadTs: string,\n text: string,\n blocks: object[],\n ): Promise<string> {\n return this.postMessageBlocks(channel, text, blocks, threadTs);\n }\n\n async uploadFile(\n channel: string,\n filePath: string,\n title?: string,\n threadTs?: string,\n ): Promise<void> {\n return slackRetry(async () => {\n const fileName = title || basename(filePath);\n const fileContent = readFileSync(filePath);\n await this.webClient.files.uploadV2({\n channel_id: channel,\n file: fileContent,\n filename: fileName,\n title: fileName,\n ...(threadTs ? { thread_ts: threadTs } : {}),\n } as Parameters<typeof this.webClient.files.uploadV2>[0]);\n });\n }\n\n logToFile(channel: string, entry: object): void {\n appendChannelLog(this.workspace.office(createOfficeAddress(\"slack\", channel)), entry);\n }\n\n logBotResponse(\n channel: string,\n text: string,\n ts: string,\n threadTs?: string,\n slackBlocks?: object[],\n ): void {\n appendBotResponseLog(\n this.workspace.office(createOfficeAddress(\"slack\", channel)),\n text,\n ts,\n threadTs,\n {\n platform: \"slack\",\n ...(slackBlocks ? { slackBlocks } : {}),\n },\n );\n }\n\n ownsBlockKitMessage(channel: string, ts: string, threadTs?: string): boolean {\n const content = readTextFileIfExists(join(this.conversationDir(channel), \"log.jsonl\"));\n if (content === undefined) return false;\n for (const line of content.trim().split(\"\\n\").toReversed()) {\n try {\n const entry: unknown = JSON.parse(line);\n if (!isRecord(entry) || entry.ts !== ts) continue;\n return (\n entry.isMessagingBot === true &&\n entry.platform === \"slack\" &&\n Array.isArray(entry.slackBlocks) &&\n entry.threadTs === threadTs\n );\n } catch {\n continue;\n }\n }\n return false;\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"slack\",\n ...(this.teamId ? { workspaceId: this.teamId } : {}),\n trustModel: \"membership\",\n formattingGuide:\n \"## Slack Formatting\\nWrite standard Markdown/GFM: **bold**, _italic_, ~~strike~~, `code`, fenced code blocks, [links](url), lists, and pipe tables (rendered as native Slack tables).\\nDo NOT use Slack mrkdwn syntax like *single-asterisk bold* or <url|label> links.\",\n channels: this.getAllChannels().map((c) => ({ id: c.id, name: c.name })),\n users: this.getAllUsers().map((u) => ({\n id: u.id,\n userName: u.userName,\n displayName: u.displayName,\n })),\n diagnostics: {\n showUsageSummary: true,\n },\n };\n }\n\n // ==========================================================================\n // Events Integration\n // ==========================================================================\n\n /**\n * Enqueue an event for processing. Always queues (no \"already working\" rejection).\n * Returns true if enqueued, false if queue is full (max 5).\n */\n enqueueEvent(event: ConversationEvent): boolean {\n if (this.stopped) return false;\n const conversationId = event.conversationId;\n const queue = this.getQueue(conversationId);\n if (queue.size() >= 5) {\n log.logWarning(\n `Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`,\n );\n return false;\n }\n log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);\n return queue.enqueue(async () => {\n let anchorTs: string | undefined;\n if (!event.thread_ts) {\n try {\n anchorTs = await this.postMessage(conversationId, SLACK_EVENT_ANCHOR_TEXT);\n } catch (err) {\n log.logWarning(\n `Failed to post Slack event anchor for ${conversationId}`,\n err instanceof Error ? err.message : String(err),\n );\n reportUserFacingError(err, {\n domain: \"events\",\n surface: \"event_delivery\",\n operation: \"slack_anchor_post\",\n severity: \"error\",\n platform: \"slack\",\n context: {\n conversationId,\n conversationKind: event.conversationKind,\n eventTs: event.ts,\n textLength: event.text.length,\n },\n });\n throw err;\n }\n }\n const eventPlan = planSlackEventAnchorRun(event, anchorTs);\n const eventForRun = eventPlan.event;\n if (eventPlan.initialMessageTs && eventForRun.sessionKey) {\n registerThreadSession({\n conversationDir: this.conversationDir(conversationId),\n sessionKey: eventForRun.sessionKey,\n });\n }\n\n const runQueueKey = planSlackAdapterSession(eventForRun, {\n initialMessageTs: eventPlan.initialMessageTs,\n }).sessionKey;\n const run = async () => {\n const slackEvent = createConversationEvent({\n platform: \"slack\",\n address: eventForRun.address,\n type: eventForRun.type as SlackEvent[\"type\"],\n conversationId,\n conversationKind: eventForRun.conversationKind,\n channel: conversationId,\n ts: eventForRun.ts,\n thread_ts: eventForRun.thread_ts,\n user: eventForRun.user,\n text: eventForRun.text,\n attachments: eventForRun.attachments,\n sessionKey: eventForRun.sessionKey,\n }) as SlackEvent;\n const context = createSlackAdapters(slackEvent, this, {\n initialMessageTs: eventPlan.initialMessageTs,\n replyMode: this.resolveReplyMode(eventForRun.address),\n });\n return this.handler.handleEvent(eventForRun, this, context);\n };\n const runQueue = this.getQueue(runQueueKey);\n if (!runQueue.enqueue(run)) {\n await runQueue.close();\n await run();\n }\n });\n }\n\n // ==========================================================================\n // Private - Event Handlers\n // ==========================================================================\n\n private getQueue(channelId: string): MessagingEventQueue {\n let queue = this.queues.get(channelId);\n if (!queue) {\n queue = new MessagingEventQueue(\"Slack\");\n if (this.stopped) void queue.close();\n this.queues.set(channelId, queue);\n }\n return queue;\n }\n\n private resolveQueueKey(conversationId: string, sessionKey: string): string {\n if (!isSlackThreadSessionKey(sessionKey)) return sessionKey;\n if (this.handler.isRunning(createOfficeAddress(\"slack\", conversationId), sessionKey)) {\n return sessionKey;\n }\n return this.hasKnownThreadSession(conversationId, sessionKey) ? sessionKey : conversationId;\n }\n\n private isTaskThread(channel: string, root: string): boolean {\n return readTaskRoots(this.conversationDir(channel)).has(root);\n }\n\n private hasKnownThreadSession(conversationId: string, sessionKey: string): boolean {\n return hasMaterializedChatSession({\n conversationDir: this.conversationDir(conversationId),\n sessionKey,\n });\n }\n\n /**\n * Slack's own conversation vocabulary for this channel, from the metadata\n * fetchChannels() already loads. Externally shared channels report\n * \"external\" regardless of privacy — platform-public within one workspace\n * is the sharing condition, and a channel visible to another organization\n * does not satisfy it. Unknown channels return undefined (never recorded,\n * so the projection keeps its isolated default).\n */\n private channelKindFor(channelId: string): PlatformChannelKind | undefined {\n if (channelId.startsWith(\"D\")) return \"im\";\n const channel = this.channels.get(channelId);\n if (!channel) return undefined;\n if (channel.name.startsWith(\"DM:\")) return \"im\";\n if (channel.isExternallyShared) return \"external\";\n if (channel.isPrivate === true) return \"private_channel\";\n if (channel.isPrivate === false) return \"public_channel\";\n return undefined;\n }\n\n /**\n * Office visibility follows the recorded channel kind, and an unrecorded\n * kind fails closed to private (ADR 0008). Offices created before kinds\n * were recorded would therefore lose public status until their next\n * message; the channel list loaded at startup already knows every kind, so\n * record it for all registered Slack offices now. Metadata only.\n */\n private backfillChannelKinds(): void {\n let recorded = 0;\n for (const record of listRegisteredOffices(this.workspace.stateDir)) {\n if (record.platform !== \"slack\") continue;\n const kind = this.channelKindFor(record.conversationId);\n if (!kind) continue;\n try {\n const office = this.workspace.office(record);\n if (readPlatformChannelKind(office) === kind) continue;\n recordPlatformChannelKind(office, kind);\n recorded++;\n } catch (err) {\n log.logWarning(\"Failed to backfill Slack channel kind\", String(err));\n }\n }\n if (recorded > 0) log.logInfo(`Recorded channel kind for ${recorded} Slack offices`);\n }\n\n private processSlackMessageIntake(options: {\n event: SlackEvent;\n attachmentsPromise: Promise<Attachment[]>;\n queueKey: string;\n addressed: boolean;\n magicWordAddressed?: boolean;\n }): Promise<void> {\n const kind = this.channelKindFor(options.event.conversationId);\n if (kind) {\n try {\n recordPlatformChannelKind(this.workspace.office(options.event.address), kind);\n } catch (err) {\n // A failed snapshot must not block the message; the projection just\n // keeps its previous (or isolated default) posture.\n log.logWarning(\"Failed to record Slack channel kind\", String(err));\n }\n }\n const absorbAttachmentFailure = () => {\n void options.attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n };\n return processMessageIntake({\n eventBase: options.event as unknown as ConversationEvent,\n addressed: options.addressed,\n magicWord: {\n addressed: options.magicWordAddressed ?? options.addressed,\n scopeFallback: \"top-level\",\n },\n busyPolicy: \"queue\",\n logEntryBase: {},\n processAttachments: () => options.attachmentsPromise,\n queueKey: options.queueKey,\n enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => this.createContext(event as SlackEvent),\n deferAttachmentsUntilRun: true,\n }).then(\n (outcome) => {\n // Slack logs eagerly via logUserMessage; when intake does not enqueue,\n // nothing awaits the attachment download, so absorb its failure here.\n if (outcome !== \"enqueued\") absorbAttachmentFailure();\n },\n (err) => {\n log.logWarning(\"Slack message intake failed\", String(err));\n absorbAttachmentFailure();\n },\n );\n }\n\n private appendRunningTasks(blocks: object[]): void {\n const runningSessions = this.handler.getRunningSessions();\n blocks.push(\n { type: \"divider\" },\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: `Running Tasks (${runningSessions.length})`,\n emoji: true,\n },\n },\n );\n if (runningSessions.length === 0) {\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: \"_No tasks running right now._\" }],\n });\n return;\n }\n\n const stuckThresholdMs = 10 * 60 * 1000;\n for (const session of runningSessions) {\n const channelId = conversationIdOf(session.sessionKey);\n const channelName = this.channels.get(channelId)?.name;\n const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);\n const elapsedStr = elapsed < 1 ? \"<1 min\" : `${elapsed} min`;\n const lastActivity = session.lastActivityAt ? Date.now() - session.lastActivityAt : 0;\n const isStuck = lastActivity > stuckThresholdMs;\n let statusLine = `${isStuck ? \"_stuck_\" : \"_running_\"} · ${elapsedStr}`;\n if (session.currentTool) statusLine += ` · ${session.currentTool}`;\n if (isStuck) statusLine += ` · idle ${Math.floor(lastActivity / 60000)}m`;\n blocks.push({\n type: \"context\",\n elements: [\n {\n type: \"mrkdwn\",\n text: `*${channelName ? `#${channelName}` : channelId}* · ${statusLine}`,\n },\n ],\n });\n if (isStuck) {\n blocks.push({\n type: \"context\",\n elements: [\n { type: \"mrkdwn\", text: \" \" },\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Force Stop\", emoji: true },\n // `value` preserves the raw key; action_id is only a unique route.\n action_id: `force_stop_${session.sessionKey.replace(/:/g, \"_\")}`,\n value: session.sessionKey,\n style: \"danger\",\n },\n ],\n });\n }\n }\n }\n\n /**\n * Scheduled jobs of the opener's own DM office only: the App Home is a\n * personal surface, so other offices' schedules are not listed here.\n */\n private appendScheduledJobs(blocks: object[], dmChannelId: string | undefined): void {\n const periodicEvents =\n dmChannelId && this.eventScheduler\n ? this.eventScheduler.periodicEvents(createOfficeAddress(\"slack\", dmChannelId))\n : [];\n blocks.push(\n { type: \"divider\" },\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: `Scheduled Jobs (${periodicEvents.length})`,\n emoji: true,\n },\n },\n );\n if (periodicEvents.length === 0) {\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: \"_No scheduled jobs._\" }],\n });\n return;\n }\n\n for (const event of periodicEvents) {\n const channel =\n event.platform === \"slack\" ? this.channels.get(event.conversationId) : undefined;\n const channelId = channel ? `#${channel.name}` : event.conversationId;\n const channelLabel = `${event.platform}:${channelId}`;\n const nextRun = event.nextRun\n ? new Date(event.nextRun).toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n })\n : \"—\";\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*${event.text}*\\n└ \\`${event.schedule}\\` · ${channelLabel} · Next: ${nextRun}`,\n },\n });\n }\n }\n\n private buildHomeView(dmChannelId: string | undefined): { type: \"home\"; blocks: KnownBlock[] } {\n const blocks: object[] = [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*${PRODUCT_NAME}*\\nStart a new task or check on running work.`,\n },\n accessory: {\n type: \"image\",\n image_url: \"https://media1.tenor.com/m/lfDATg4Bhc0AAAAC/happy-cat.gif\",\n alt_text: PRODUCT_NAME,\n },\n },\n ];\n this.appendRunningTasks(blocks);\n this.appendScheduledJobs(blocks, dmChannelId);\n blocks.push(\n { type: \"divider\" },\n {\n type: \"context\",\n elements: [\n { type: \"mrkdwn\", text: \"💡 @mention in a channel or send a DM to start a new task\" },\n ],\n },\n );\n return { type: \"home\", blocks: blocks as KnownBlock[] };\n }\n\n private createCommandAdapters(input: CommandAdapterInput): ConversationContext {\n const { conversationId, userId, userName, text, ts, ...options } = input;\n const message = createConversationMessage({\n platform: \"slack\",\n conversationId,\n id: ts,\n // One session identity per dispatch: the caller's thread-resolved key.\n // Defaulting to the top-level conversation here while the event carried\n // a thread key made the same run answer to two different sessions.\n sessionKey: options.sessionKey ?? conversationId,\n conversationKind: options.ephemeralChannelId ? \"shared\" : \"direct\",\n userId,\n userName,\n text,\n attachments: [],\n });\n\n const respond = async (responseText: string, blocks?: object[]) => {\n if (options.ephemeralChannelId) {\n await this.postEphemeral(\n options.ephemeralChannelId,\n userId,\n responseText,\n options.threadTs,\n blocks,\n );\n return;\n }\n const messageTs = blocks\n ? await this.postMessageBlocks(conversationId, responseText, blocks)\n : await this.postMessage(conversationId, responseText);\n this.logBotResponse(conversationId, responseText, messageTs);\n };\n\n const responder: ConversationResponder = {\n respond,\n replaceResponse: (responseText) => respond(responseText),\n respondDiagnostic: async (\n responseText: string,\n responseOptions?: { style?: \"muted\" | \"error\" },\n ) => {\n if (responseOptions?.style === \"muted\") {\n await respond(responseText, [buildMrkdwnContextBlock(responseText)]);\n return;\n }\n await respond(responseOptions?.style === \"error\" ? `_${responseText}_` : responseText);\n },\n respondToolResult: async (result: ChatToolResult) => {\n const duration = (result.durationMs / 1000).toFixed(1);\n await respond(\n `${result.isError ? \"Error\" : \"Done\"} ${result.toolName} (${duration}s)\\n${result.result}`,\n );\n },\n setTyping: async () => {},\n setWorking: async () => {},\n uploadFile: async (filePath: string, title?: string) => {\n await this.uploadFile(conversationId, filePath, title);\n },\n deleteResponse: async () => {},\n };\n\n return {\n address: message.address,\n message,\n responder,\n platform: this.getMessagingInfo(),\n };\n }\n\n private buildSlashCommandEvent(\n payload: {\n command: string;\n text?: string;\n channel_id: string;\n user_id: string;\n user_name?: string;\n thread_ts?: string;\n },\n options: { type?: ConversationEvent[\"type\"]; includeText?: boolean; thread?: boolean } = {},\n ): { event: ConversationEvent; context: ConversationContext } {\n const conversationId = payload.channel_id;\n const isDirectMessage = conversationId.startsWith(\"D\");\n const createdAt = new Date();\n const eventTs = (createdAt.getTime() / 1000).toFixed(6);\n const userName = payload.user_name ?? this.getUser(payload.user_id)?.userName;\n const commandSuffix = options.includeText ? payload.text?.trim() : undefined;\n const commandText = commandSuffix ? `${payload.command} ${commandSuffix}` : payload.command;\n const threadTs = options.thread ? payload.thread_ts : undefined;\n const sessionKey = options.thread\n ? resolveSlackSessionKey(conversationId, threadTs)\n : conversationId;\n\n this.logToFile(conversationId, {\n date: createdAt.toISOString(),\n ts: eventTs,\n user: payload.user_id,\n userName,\n text: commandText,\n attachments: [],\n isMessagingBot: false,\n ...(threadTs ? { threadTs } : {}),\n });\n\n const event = createConversationEvent({\n platform: \"slack\",\n conversationId,\n type: options.type ?? (isDirectMessage ? \"dm\" : \"mention\"),\n conversationKind: isDirectMessage ? \"direct\" : \"shared\",\n ts: eventTs,\n user: payload.user_id,\n text: commandText,\n attachments: [],\n ...(threadTs ? { thread_ts: threadTs } : {}),\n sessionKey,\n });\n\n const context = this.createCommandAdapters({\n conversationId,\n userId: payload.user_id,\n userName,\n text: commandText,\n ts: eventTs,\n ...(isDirectMessage\n ? { threadTs, sessionKey }\n : { ephemeralChannelId: conversationId, threadTs, sessionKey }),\n });\n\n return { event, context };\n }\n\n /**\n * Generic slash-command route: synthesize the command text per the\n * manifest's SlackSlashRoute data and dispatch to the handler. Every\n * routed command — including `/pi-new` — reaches its CommandHandler\n * through runtime dispatch; the adapter holds no per-command behavior.\n */\n private async routeSlashCommand(\n route: SlackSlashRoute,\n payload: {\n command: string;\n text?: string;\n channel_id: string;\n user_id: string;\n user_name?: string;\n thread_ts?: string;\n },\n ): Promise<void> {\n const { event, context } = this.buildSlashCommandEvent(payload, {\n includeText: route.includeText,\n thread: route.thread,\n ...(route.privateCommand\n ? {\n type: payload.channel_id.startsWith(\"D\")\n ? (\"dm\" as const)\n : (\"private_command\" as const),\n }\n : {}),\n });\n await this.handler.handleEvent(event, this, context);\n }\n\n private setupEventHandlers(): void {\n this.socketClient.on(\"disconnect\", (err: unknown) => {\n log.logWarning(\"Slack socket disconnect\", err ? String(err) : \"\");\n });\n this.socketClient.on(\"error\", (err: unknown) => {\n log.logWarning(\"Slack socket error\", err ? String(err) : \"\");\n });\n this.socketClient.on(\"unable_to_socket_mode_start\", (err: unknown) => {\n log.logWarning(\"Slack socket unable_to_start\", err ? String(err) : \"\");\n });\n\n this.socketClient.on(\"app_mention\", (payload) => {\n void this.intake.run(() => this.handleAppMention(payload));\n });\n this.socketClient.on(\"message\", (payload) => {\n void this.intake.run(() => this.handleMessageEvent(payload));\n });\n this.socketClient.on(\"slash_commands\", (payload) => {\n void this.intake.run(() => this.handleSlashCommand(payload));\n });\n this.socketClient.on(\"app_home_opened\", (payload) => {\n void this.intake.run(() => this.handleAppHomeOpened(payload));\n });\n // The assistant surface's lifecycle. Both events were already subscribed\n // in the app manifest and then dropped on the floor, which is why the pane\n // opened empty and the sidebar filled with untitled conversations.\n this.socketClient.on(\"assistant_thread_started\", (payload) => {\n void this.intake.run(() => this.handleAssistantThreadStarted(payload));\n });\n this.socketClient.on(\"assistant_thread_context_changed\", (payload) => {\n void this.intake.run(() => this.handleAgentContextChangedEvent(payload));\n });\n // agent_view's spelling of the same signal.\n this.socketClient.on(\"app_context_changed\", (payload) => {\n void this.intake.run(() => this.handleAgentContextChangedEvent(payload));\n });\n this.socketClient.on(\"block_actions\", (payload) => {\n void this.intake.run(() => this.handleBlockAction(payload));\n });\n this.socketClient.on(\"interactive\", (payload) => {\n void this.intake.run(() =>\n this.handleBlockAction(payload as { body: SlackBlockActionBody; ack: () => void }),\n );\n });\n }\n\n private async handleAppMention({\n event,\n ack,\n }: {\n event: unknown;\n ack: () => void;\n }): Promise<void> {\n const e = event as {\n text: string;\n channel: string;\n user: string;\n ts: string;\n thread_ts?: string;\n files?: Array<{ name: string; url_private_download?: string; url_private?: string }>;\n };\n\n // Skip DMs (handled by message event)\n if (e.channel.startsWith(\"D\")) {\n ack();\n return;\n }\n\n // Top-level mentions use a persistent channel session.\n // Thread replies get their own isolated session (channelId:thread_ts).\n const sessionKey = resolveSlackSessionKey(e.channel, e.thread_ts);\n\n const mentionText = this.stripOwnMention(e.text);\n const slackEvent = createConversationEvent({\n platform: \"slack\",\n conversationId: e.channel,\n type: \"mention\" as const,\n conversationKind: \"shared\",\n ts: e.ts,\n thread_ts: e.thread_ts,\n user: e.user,\n text: mentionText || \"Please respond to the recent conversation context.\",\n sessionKey,\n channel: e.channel,\n files: e.files,\n }) as SlackEvent;\n\n const attachmentsPromise = this.logUserMessage(slackEvent);\n\n // Only trigger processing for messages AFTER startup (not replayed old messages)\n if (this.startupTs && e.ts < this.startupTs) {\n log.logInfo(\n `[${e.channel}] Logged old message (pre-startup), not triggering: ${slackEvent.text.substring(0, 30)}`,\n );\n void attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n ack();\n return;\n }\n\n const intake = this.processSlackMessageIntake({\n event: slackEvent,\n attachmentsPromise,\n queueKey: this.resolveQueueKey(e.channel, sessionKey),\n addressed: true,\n });\n\n ack();\n await intake;\n }\n\n private admitHumanMessage(\n event: SlackIncomingMessage,\n ack: () => void,\n ): event is SlackIncomingMessage & { user: string } {\n const hasSlackContent = hasMessageContent(event);\n const isOwnMessage =\n event.user === this.botUserId || (!!this.botId && event.bot_id === this.botId);\n if (isOwnMessage) {\n ack();\n return false;\n }\n\n // User-token posts carry bot_id/app_id beside the human user. Only unknown\n // authors and known bot users take the external-bot loop-protection path.\n const authorIsKnownHuman = !!event.user && this.users.get(event.user)?.isBot === false;\n const isExternalMessage =\n event.subtype === \"bot_message\" || (!!event.bot_id && !authorIsKnownHuman);\n if (isExternalMessage) {\n const supportedSubtype = BOT_MESSAGE_SUBTYPES.has(event.subtype);\n if (supportedSubtype && hasSlackContent) {\n void this.logExternalMessagingBotMessage(event).catch((err) => {\n log.logWarning(\"Failed to log Slack bot message\", String(err));\n });\n }\n ack();\n return false;\n }\n\n const isSupportedUserMessage =\n !!event.user && USER_MESSAGE_SUBTYPES.has(event.subtype) && hasSlackContent;\n if (isSupportedUserMessage) return true;\n ack();\n return false;\n }\n\n private async deliverTaskUpdate(\n event: SlackEvent,\n attachmentsPromise: Promise<Attachment[]>,\n ): Promise<boolean> {\n if (matchMagicWord(event.text) === \"stop\" || event.text.startsWith(\"/\")) return false;\n event.attachments = await attachmentsPromise;\n const context = this.createContext(event);\n const post = (text: string) =>\n event.thread_ts\n ? this.postInThread(event.channel, event.thread_ts, text)\n : this.postMessage(event.channel, text);\n try {\n if (!event.attachments?.length && isTaskStatusQuestion(event.text)) {\n const tasks = await context.responder.getTaskStatus!(\n event.thread_ts ? event.sessionKey : undefined,\n );\n if (!tasks.length) return false;\n const active = tasks.filter((t) => t.status === \"running\" || t.status === \"stopping\");\n const selection = event.thread_ts ? tasks : active.length ? active : tasks.slice(0, 1);\n const text =\n selection.length > 1\n ? \"目前有多個任務在處理,請到你想查詢的任務對話串詢問,避免弄錯。\"\n : formatTaskStatus(selection);\n const ts = await post(text);\n this.logBotResponse(event.channel, text, ts, event.thread_ts);\n return true;\n }\n if (event.thread_ts && (await this.handler.steer?.(context.message))) {\n await post(\"收到補充,會在下一個處理步驟納入;目前的操作不會立即中斷。\");\n return true;\n }\n } catch (error) {\n await post(error instanceof Error ? error.message : \"Could not deliver task update.\");\n return true;\n }\n return false;\n }\n\n /**\n * Ask Jev a single typed yes/no question about whether this unaddressed\n * shared-channel message (top-level or thread reply) addresses mikan. The\n * scored state carries the surrounding scope from log.jsonl, since a bare\n * thread reply cannot be judged from its own text. Only called in `jev`\n * auto-reply mode, and only awaited by the caller in that mode, so\n * `on`/`off` stay synchronous (magic-word `stop` handling depends on that).\n * Any failure (including a missing `OPENROUTER_API_KEY`) fails closed to\n * \"not addressed\" so a misconfiguration cannot make the bot noisy in a\n * shared channel.\n */\n private async evaluateJevAddressed(event: SlackEvent): Promise<boolean> {\n if (!event.text.trim() || matchMagicWord(event.text) === \"stop\") return false;\n\n try {\n const user = this.users.get(event.user);\n const state = buildAutoReplyState(this.conversationDir(event.channel), event, {\n speaker: user?.displayName ?? user?.userName,\n });\n const result = await evaluateWithJev(state, {\n addressed: { type: \"boolean\", instructions: JEV_ADDRESSED_INSTRUCTIONS },\n });\n const probability = result.answers.addressed.probability;\n log.logInfo(\n `[${event.channel}] jev auto-reply: probability=${probability.toFixed(2)} addressed=${probability > 0.5} text=\"${event.text.slice(0, 80)}\"`,\n );\n return probability > 0.5;\n } catch (err) {\n if (err instanceof JevNotConfiguredError) {\n log.logWarning(\n \"Slack auto-reply jev mode requires OPENROUTER_API_KEY; treating message as unaddressed\",\n String(err),\n );\n return false;\n }\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"slack_auto_reply_jev\",\n operation: \"evaluate\",\n severity: \"warning\",\n context: { conversationId: event.conversationId },\n });\n return false;\n }\n }\n\n private async handleMessageEvent({\n event,\n ack,\n }: {\n event: unknown;\n ack: () => void;\n }): Promise<void> {\n const e = event as SlackIncomingMessage;\n if (!this.admitHumanMessage(e, ack)) return;\n\n // message.im normally carries channel_type \"im\", but fall back to the\n // D-prefix convention (used by handleAppMention and session keys) so a\n // missing channel_type cannot silently classify a DM as an unaddressed\n // channel message that never triggers.\n const isDM = e.channel_type === \"im\" || e.channel.startsWith(\"D\");\n const conversationKind: ConversationKind = isDM ? \"direct\" : \"shared\";\n const isMessagingBotMention = e.text?.includes(`<@${this.botUserId}>`);\n\n // Skip channel @mentions - already handled by app_mention event\n if (!isDM && isMessagingBotMention) {\n ack();\n return;\n }\n\n const sessionKey = isDM ? resolveSlackSessionKey(e.channel, e.thread_ts) : undefined;\n\n // Name the conversation from the first thing the person said. Guarded on\n // the assistant registry, so classic DM threads are untouched, and it\n // claims the title once per thread.\n if (isDM && e.thread_ts && e.text) {\n void titleAssistantThread(\n this.assistantOps(),\n this.assistantThreads,\n e.channel,\n e.thread_ts,\n this.stripOwnMention(e.text),\n );\n }\n\n const slackEvent = createConversationEvent({\n platform: \"slack\",\n conversationId: e.channel,\n type: (isDM ? \"dm\" : \"mention\") as SlackEvent[\"type\"],\n conversationKind,\n ts: e.ts,\n thread_ts: e.thread_ts,\n user: e.user,\n text: this.stripOwnMention(e.text),\n sessionKey,\n channel: e.channel,\n files: e.files,\n }) as SlackEvent;\n\n const attachmentsPromise = this.logUserMessage(slackEvent);\n\n // Only trigger processing for messages AFTER startup (not replayed old messages)\n if (this.startupTs && e.ts < this.startupTs) {\n log.logInfo(\n `[${e.channel}] Skipping old message (pre-startup): ${slackEvent.text.substring(0, 30)}`,\n );\n void attachmentsPromise.catch((err) => {\n log.logWarning(\"Failed to log Slack message\", String(err));\n });\n ack();\n return;\n }\n\n const activeSessionKey =\n slackEvent.sessionKey ?? resolveSlackSessionKey(e.channel, e.thread_ts);\n slackEvent.sessionKey = activeSessionKey;\n const taskThread = isDM && !!e.thread_ts && this.isTaskThread(e.channel, e.thread_ts);\n const taskControl =\n taskThread || (isDM && !e.thread_ts && isTaskStatusQuestion(slackEvent.text));\n if (taskControl) {\n ack();\n if (await this.deliverTaskUpdate(slackEvent, attachmentsPromise)) return;\n }\n // Shared-channel messages without a mention, top-level or in a thread,\n // all go through the same auto-reply gate; jev mode sees the surrounding\n // scope so thread follow-ups are judged in context rather than dropped.\n const autoReplyMode = isDM\n ? \"off\"\n : slackConversationAutoReplyMode(this.workspace.office(slackEvent.address));\n const autoReply =\n autoReplyMode === \"on\"\n ? true\n : autoReplyMode === \"jev\"\n ? await this.evaluateJevAddressed(slackEvent)\n : false;\n const intake = this.processSlackMessageIntake({\n event: slackEvent,\n attachmentsPromise,\n queueKey: this.resolveQueueKey(e.channel, activeSessionKey),\n addressed: isDM || autoReply,\n magicWordAddressed: isDM,\n });\n\n if (!taskControl) ack();\n await intake;\n }\n\n private async handleSlashCommand({\n body,\n ack,\n }: {\n body: unknown;\n ack: () => Promise<void>;\n }): Promise<void> {\n const payload = body as {\n command?: string;\n text?: string;\n channel_id?: string;\n user_id?: string;\n user_name?: string;\n thread_ts?: string;\n };\n\n await ack();\n\n if (!payload.command || !payload.channel_id || !payload.user_id) {\n return;\n }\n\n const { command, text, channel_id, user_id, user_name, thread_ts } = payload;\n const entry = COMMAND_MANIFEST.find((candidate) => candidate.slackCommand === command);\n if (!entry) return;\n\n if (!entry.slackRoute) return;\n try {\n await this.routeSlashCommand(entry.slackRoute, {\n command,\n text,\n channel_id,\n user_id,\n user_name,\n thread_ts,\n });\n } catch (err) {\n log.logWarning(\"Slack slash command error\", err instanceof Error ? err.message : String(err));\n }\n }\n\n private handleAppHomeOpened({ event, ack }: { event: unknown; ack: () => void }): void {\n const e = event as { user: string; tab: string; channel?: string; context?: AgentContext };\n ack();\n\n // Under agent_view this is how Slack says \"the person opened the app's\n // DM\" — the signal assistant_thread_started used to carry. It fires on\n // every open, not once per conversation, so this path refreshes the\n // pinned prompts and deliberately does not greet.\n if (e.tab === \"messages\") {\n if (e.channel) {\n void handleAgentDmOpened(this.assistantOps(), this.assistantThreads, e.channel, e.context);\n }\n return;\n }\n if (e.tab !== \"home\") return;\n\n this.webClient.views\n .publish({\n user_id: e.user,\n view: this.buildHomeView(e.channel),\n })\n .catch((err) => {\n log.logWarning(`Failed to publish App Home view`, String(err));\n });\n }\n\n private async handleBlockAction({\n body,\n ack,\n }: {\n body: SlackBlockActionBody;\n ack: () => void;\n }): Promise<void> {\n const action = body.actions?.[0];\n if (!action) {\n ack();\n return;\n }\n\n if (!action.action_id?.startsWith(\"force_stop_\")) {\n ack();\n this.handleSlackInteraction(body, action);\n return;\n }\n\n ack();\n // Prefer the verbatim key from `value`; the action_id fallback only\n // serves buttons rendered before `value` existed and misdecodes session\n // keys whose conversation id contains \"_\".\n const sessionKey =\n action.value ?? action.action_id.replace(\"force_stop_\", \"\").replace(/_/g, \":\");\n const userId = body.user?.id;\n const channelId = body.container?.channel_id || conversationIdOf(sessionKey);\n\n log.logInfo(`[Force Stop] User ${userId} requested force stop for ${sessionKey}`);\n\n // Use handler's forceStop method\n this.handler.forceStop(createOfficeAddress(\"slack\", channelId), sessionKey);\n\n // Notify in channel\n await this.postMessage(channelId, formatForceStopped(\"slack\", userId ?? \"unknown\"));\n\n // Refresh home tab\n if (userId) {\n this.openDirectConversation(userId)\n .then((dmChannelId) =>\n this.webClient.views.publish({\n user_id: userId,\n view: this.buildHomeView(dmChannelId),\n }),\n )\n .catch((err) => {\n log.logWarning(`Failed to refresh App Home view`, String(err));\n });\n }\n }\n\n private handleSlackInteraction(body: SlackBlockActionBody, action: SlackBlockAction): void {\n const container = body.container ?? {};\n const channelId = container.channel_id;\n const userId = body.user?.id;\n if (!channelId || !userId) return;\n\n const selectedOption = action.selected_option;\n const selectedOptions = Array.isArray(action.selected_options)\n ? action.selected_options\n : undefined;\n const threadTs = container.thread_ts;\n const sessionKey = resolveSlackSessionKey(channelId, threadTs);\n\n const selectedText = selectedOption?.text?.text ?? selectedOption?.value;\n const selectedTexts = selectedOptions?.map((option) => option.text?.text ?? option.value);\n const valueText = selectedTexts?.length\n ? selectedTexts.join(\", \")\n : (selectedText ?? action.value ?? action.action_id);\n const text = `[Slack action] ${action.action_id}: ${valueText}`;\n const ts = `action:${Date.now()}`;\n\n this.logToFile(channelId, {\n date: new Date().toISOString(),\n ts,\n ...(threadTs ? { threadTs } : {}),\n user: userId,\n userName: body.user?.username ?? body.user?.name,\n text,\n attachments: [],\n isMessagingBot: false,\n platform: \"slack\",\n slackInteraction: {\n type: \"block_actions\",\n actionId: action.action_id,\n blockId: action.block_id,\n actionType: action.type,\n value: action.value,\n selectedOption: selectedOption\n ? { text: selectedOption.text?.text, value: selectedOption.value }\n : undefined,\n selectedOptions: selectedOptions?.map((option) => ({\n text: option.text?.text,\n value: option.value,\n })),\n messageTs: container.message_ts,\n },\n });\n\n const event = createConversationEvent({\n platform: \"slack\",\n conversationId: channelId,\n type: \"slack_action\",\n conversationKind: channelId.startsWith(\"D\") ? \"direct\" : \"shared\",\n ts,\n user: userId,\n text,\n attachments: [],\n ...(threadTs ? { thread_ts: threadTs } : {}),\n sessionKey,\n });\n\n this.getQueue(this.resolveQueueKey(channelId, sessionKey)).enqueue(async () => {\n const slackEvent: SlackEvent = {\n ...createConversationEvent({\n platform: \"slack\",\n conversationId: channelId,\n type: (event.conversationKind === \"direct\" ? \"dm\" : \"mention\") as SlackEvent[\"type\"],\n conversationKind: event.conversationKind,\n ts,\n thread_ts: threadTs,\n user: userId,\n text,\n attachments: [],\n sessionKey,\n }),\n channel: channelId,\n attachments: [],\n };\n return this.handler.handleEvent(event, this, this.createContext(slackEvent));\n });\n }\n\n /**\n * Download Slack message files into the office's attachments directory.\n * The Slack contract is all-or-error: any failed download throws after the\n * successful ones are on disk, so callers still log the message text.\n */\n private async processAttachments(\n channelId: string,\n files: Array<{ name?: string; url_private_download?: string; url_private?: string }>,\n timestamp: string,\n ): Promise<Attachment[]> {\n const items = [];\n for (const file of files) {\n const url = file.url_private_download || file.url_private;\n if (!url) continue;\n if (!file.name) {\n throw new Error(`Attachment missing name for URL: ${url}`);\n }\n items.push({\n name: file.name,\n // Slack timestamps are float seconds; the stored filename uses ms.\n timestampMs: Math.floor(parseFloat(timestamp) * 1000),\n download: (destPath: string) => this.downloadSlackFile(url, destPath),\n });\n }\n\n const office = this.workspace.office(createOfficeAddress(\"slack\", channelId));\n const { saved, failed } = await saveIncomingAttachments(office, items);\n const firstFailure = failed[0];\n if (firstFailure) {\n const { name, error } = firstFailure;\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to download attachment ${name}: ${errorMsg}`, { cause: error });\n }\n return saved;\n }\n\n /** Authorized download with retry; Slack file URLs require the bot token. */\n private async downloadSlackFile(url: string, destPath: string): Promise<void> {\n await withRetry(\n async () => {\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${this.botToken}` },\n });\n if (!response.ok) {\n throw new AttachmentDownloadHttpError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n );\n }\n const buffer = await response.arrayBuffer();\n await writeFile(destPath, Buffer.from(buffer));\n },\n { maxAttempts: 3, baseDelayMs: 250, isRateLimited: isRetryableAttachmentDownloadError },\n );\n }\n\n /**\n * Log a user message to log.jsonl after attachments are ready.\n */\n private async logUserMessage(event: SlackEvent): Promise<Attachment[]> {\n const user = this.users.get(event.user);\n let attachments: Attachment[] = [];\n let attachmentError: unknown;\n if (event.files) {\n try {\n attachments = await this.processAttachments(event.channel, event.files, event.ts);\n } catch (err) {\n attachmentError = err;\n }\n }\n // Always write the text log, even if attachment processing failed — we want\n // a record of the user message regardless of file-handling errors.\n this.logToFile(event.channel, {\n date: new Date(parseFloat(event.ts) * 1000).toISOString(),\n ts: event.ts,\n threadTs: event.thread_ts,\n user: event.user,\n userName: user?.userName,\n displayName: user?.displayName,\n text: event.text,\n attachments,\n isMessagingBot: false,\n });\n if (attachmentError) throw attachmentError;\n return attachments;\n }\n\n private async logExternalMessagingBotMessage(event: {\n channel: string;\n ts: string;\n thread_ts?: string;\n text?: string;\n subtype?: string;\n bot_id?: string;\n app_id?: string;\n username?: string;\n bot_profile?: { app_id?: string; name?: string; real_name?: string };\n blocks?: unknown[];\n attachments?: unknown[];\n files?: Array<{ name: string; url_private_download?: string; url_private?: string }>;\n }): Promise<Attachment[]> {\n const attachments = event.files\n ? await this.processAttachments(event.channel, event.files, event.ts)\n : [];\n const botName =\n event.username ?? event.bot_profile?.name ?? event.bot_profile?.real_name ?? event.bot_id;\n this.logToFile(event.channel, {\n date: new Date(parseFloat(event.ts) * 1000).toISOString(),\n ts: event.ts,\n threadTs: event.thread_ts,\n user: event.bot_id ? `bot:${event.bot_id}` : \"external-bot\",\n userName: botName,\n displayName: botName,\n text: buildSlackAppMessageText(event),\n attachments,\n isMessagingBot: true,\n botId: event.bot_id,\n appId: event.app_id ?? event.bot_profile?.app_id,\n subtype: event.subtype,\n });\n return attachments;\n }\n\n // ==========================================================================\n // Private - Backfill\n // ==========================================================================\n\n private async getExistingTimestamps(channelId: string): Promise<Set<string>> {\n const logPath = join(this.conversationDir(channelId), \"log.jsonl\");\n const timestamps = new Set<string>();\n if (!existsSync(logPath)) return timestamps;\n\n const content = await readFile(logPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n for (let i = 0; i < lines.length; i++) {\n try {\n const entry = JSON.parse(lines[i] ?? \"\");\n if (entry.ts) timestamps.add(entry.ts);\n } catch (err) {\n log.logWarning(\n `Skipping malformed log entry at ${logPath}:${i + 1}`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n return timestamps;\n }\n\n private isBackfillableMessage(message: SlackHistoryMessage): boolean {\n if (message.user === this.botUserId) return true;\n if (hasBotIdentity(message)) {\n if (this.botId && message.bot_id === this.botId) return false;\n return BOT_MESSAGE_SUBTYPES.has(message.subtype) && hasMessageContent(message);\n }\n // Unlike live intake, historical human posts need text or files, not just blocks.\n return (\n !!message.user &&\n USER_MESSAGE_SUBTYPES.has(message.subtype) &&\n hasMessageContent(message, false)\n );\n }\n\n private async backfillChannel(channelId: string, upperBoundTs?: string): Promise<number> {\n const existingTs = await this.getExistingTimestamps(channelId);\n\n // Find the biggest ts in log.jsonl\n let lastLoggedTs: string | undefined;\n for (const ts of existingTs) {\n if (!lastLoggedTs || parseFloat(ts) > parseFloat(lastLoggedTs)) lastLoggedTs = ts;\n }\n\n const allMessages: SlackHistoryMessage[] = [];\n\n let cursor: string | undefined;\n let pageCount = 0;\n const maxPages = 3;\n\n do {\n const result = await this.webClient.conversations.history({\n channel: channelId,\n oldest: lastLoggedTs, // Only fetch messages newer than what we have\n latest: upperBoundTs, // Do not race live socket events after startup\n inclusive: false,\n limit: 1000,\n cursor,\n });\n if (result.messages) {\n allMessages.push(...(result.messages as SlackHistoryMessage[]));\n }\n cursor = result.response_metadata?.next_cursor;\n pageCount++;\n } while (cursor && pageCount < maxPages);\n\n // Filter: include mikan's messages, external app/bot messages, and user messages.\n const relevantMessages = allMessages.filter((msg) => {\n if (!msg.ts || existingTs.has(msg.ts)) return false; // Skip duplicates\n return this.isBackfillableMessage(msg);\n });\n\n // Reverse to chronological order\n relevantMessages.reverse();\n\n // Log each message to log.jsonl\n for (const msg of relevantMessages) {\n const isMikanMessage = msg.user === this.botUserId;\n const isExternalMessagingBotMessage = !isMikanMessage && hasBotIdentity(msg);\n if (isExternalMessagingBotMessage) {\n await this.logExternalMessagingBotMessage({ ...msg, channel: channelId, ts: msg.ts! });\n continue;\n }\n\n const user = this.users.get(msg.user!);\n const text = this.stripOwnMention(msg.text);\n const attachments = msg.files\n ? await this.processAttachments(channelId, msg.files, msg.ts!)\n : [];\n\n this.logToFile(channelId, {\n date: new Date(parseFloat(msg.ts!) * 1000).toISOString(),\n ts: msg.ts!,\n threadTs: msg.thread_ts,\n user: isMikanMessage ? \"bot\" : msg.user!,\n userName: isMikanMessage ? undefined : user?.userName,\n displayName: isMikanMessage ? undefined : user?.displayName,\n text,\n attachments,\n isMessagingBot: isMikanMessage,\n });\n }\n\n return relevantMessages.length;\n }\n\n private async backfillAllChannels(upperBoundTs?: string): Promise<void> {\n const startTime = Date.now();\n\n // Only backfill channels that already have a log.jsonl (mikan has interacted with them before)\n const channelsToBackfill: Array<[string, SlackChannel]> = [];\n for (const [channelId, channel] of this.channels) {\n const logPath = join(this.conversationDir(channelId), \"log.jsonl\");\n if (existsSync(logPath)) {\n channelsToBackfill.push([channelId, channel]);\n }\n }\n\n log.logBackfillStart(channelsToBackfill.length);\n\n let totalMessages = 0;\n for (const [channelId, channel] of channelsToBackfill) {\n try {\n const count = await this.backfillChannel(channelId, upperBoundTs);\n if (count > 0) log.logBackfillChannel(channel.name, count);\n totalMessages += count;\n } catch (error) {\n log.logWarning(`Failed to backfill #${channel.name}`, String(error));\n }\n\n // Add delay between channels to avoid hitting Slack rate limits\n if (channelId !== channelsToBackfill[channelsToBackfill.length - 1]?.[0]) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n const durationMs = Date.now() - startTime;\n log.logBackfillComplete(totalMessages, durationMs);\n }\n\n // ==========================================================================\n // Private - Fetch Users/Channels\n // ==========================================================================\n\n private async fetchUsers(): Promise<void> {\n let cursor: string | undefined;\n do {\n const result = await this.webClient.users.list({ limit: 200, cursor });\n const members = result.members as\n | Array<{\n id?: string;\n name?: string;\n real_name?: string;\n deleted?: boolean;\n is_bot?: boolean;\n }>\n | undefined;\n for (const u of members ?? []) {\n if (!u.id || !u.name || u.deleted) continue;\n this.users.set(u.id, {\n id: u.id,\n userName: u.name,\n displayName: u.real_name || u.name,\n isBot: !!u.is_bot,\n });\n }\n cursor = result.response_metadata?.next_cursor;\n } while (cursor);\n }\n\n private async fetchChannels(): Promise<void> {\n // Fetch public/private channels\n let cursor: string | undefined;\n do {\n const result = await this.webClient.conversations.list({\n types: \"public_channel,private_channel\",\n exclude_archived: true,\n limit: 200,\n cursor,\n });\n const channels = result.channels as\n | Array<{\n id?: string;\n name?: string;\n is_member?: boolean;\n is_private?: boolean;\n is_shared?: boolean;\n is_ext_shared?: boolean;\n }>\n | undefined;\n for (const c of channels ?? []) {\n if (!c.id || !c.name || !c.is_member) continue;\n this.channels.set(c.id, {\n id: c.id,\n name: c.name,\n ...(typeof c.is_private === \"boolean\" ? { isPrivate: c.is_private } : {}),\n ...(c.is_shared || c.is_ext_shared ? { isExternallyShared: true } : {}),\n });\n }\n cursor = result.response_metadata?.next_cursor;\n } while (cursor);\n\n // Also fetch DM channels (IMs)\n cursor = undefined;\n do {\n const result = await this.webClient.conversations.list({\n types: \"im\",\n limit: 200,\n cursor,\n });\n const ims = result.channels as Array<{ id?: string; user?: string }> | undefined;\n for (const im of ims ?? []) {\n if (!im.id) continue;\n // Use user's name as channel name for DMs\n const user = im.user ? this.users.get(im.user) : undefined;\n const name = user ? `DM:${user.userName}` : `DM:${im.id}`;\n this.channels.set(im.id, { id: im.id, name });\n }\n cursor = result.response_metadata?.next_cursor;\n } while (cursor);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geminixiang/mikan",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.67",
|
|
4
4
|
"description": "Self-hosted AI coding agent for organizations: every Slack channel and DM gets its own sandboxed workspace, credentials, and memory.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|