@letta-ai/letta-code 0.30.19 → 0.30.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-server-client.cjs +2 -2
- package/dist/app-server-client.cjs.map +3 -3
- package/dist/app-server-client.js +2 -2
- package/dist/app-server-client.js.map +3 -3
- package/dist/channels-public.js +29 -6
- package/dist/channels-public.js.map +4 -5
- package/dist/channels-slack.js +98 -9
- package/dist/channels-slack.js.map +7 -6
- package/dist/gateway-core.js +34 -4
- package/dist/gateway-core.js.map +4 -4
- package/dist/mcp-client.js +2 -2
- package/dist/mcp-client.js.map +1 -1
- package/dist/types/agent/model.d.ts.map +1 -1
- package/dist/types/agent/subagents/subagent-launcher.d.ts.map +1 -1
- package/dist/types/backend/dev/headless-turn-executor.d.ts.map +1 -1
- package/dist/types/backend/dev/pi-model-factory.d.ts +1 -0
- package/dist/types/backend/dev/pi-model-factory.d.ts.map +1 -1
- package/dist/types/backend/dev/pi-models-runtime.d.ts +3 -1
- package/dist/types/backend/dev/pi-models-runtime.d.ts.map +1 -1
- package/dist/types/backend/dev/pi-ollama-provider.d.ts +35 -0
- package/dist/types/backend/dev/pi-ollama-provider.d.ts.map +1 -1
- package/dist/types/backend/dev/pi-stream-adapter.d.ts.map +1 -1
- package/dist/types/backend/dev/provider-turn-executor.d.ts +8 -0
- package/dist/types/backend/dev/provider-turn-executor.d.ts.map +1 -1
- package/dist/types/channels/gateway-core.d.ts +3 -0
- package/dist/types/channels/gateway-core.d.ts.map +1 -1
- package/dist/types/channels/message-references.d.ts +12 -0
- package/dist/types/channels/message-references.d.ts.map +1 -0
- package/dist/types/channels/slack/ingress-policy.d.ts +3 -0
- package/dist/types/channels/slack/ingress-policy.d.ts.map +1 -1
- package/dist/types/channels/slack/public-utils.d.ts +0 -1
- package/dist/types/channels/slack/public-utils.d.ts.map +1 -1
- package/dist/types/channels/slack/user-mentions.d.ts +10 -0
- package/dist/types/channels/slack/user-mentions.d.ts.map +1 -0
- package/dist/types/channels/slack/utils.d.ts +0 -1
- package/dist/types/channels/slack/utils.d.ts.map +1 -1
- package/dist/types/channels/types.d.ts +8 -1
- package/dist/types/channels/types.d.ts.map +1 -1
- package/dist/types/channels/xml.d.ts +2 -7
- package/dist/types/channels/xml.d.ts.map +1 -1
- package/dist/types/channels-public.d.ts +1 -0
- package/dist/types/channels-public.d.ts.map +1 -1
- package/dist/types/channels-slack.d.ts +2 -1
- package/dist/types/channels-slack.d.ts.map +1 -1
- package/dist/types/mods/capabilities.d.ts +4 -0
- package/dist/types/mods/capabilities.d.ts.map +1 -1
- package/dist/types/mods/conversation-handle.d.ts.map +1 -1
- package/dist/types/mods/conversation-title-events.d.ts +9 -0
- package/dist/types/mods/conversation-title-events.d.ts.map +1 -0
- package/dist/types/mods/mod-adapter.d.ts.map +1 -1
- package/dist/types/mods/types.d.ts +2 -0
- package/dist/types/mods/types.d.ts.map +1 -1
- package/dist/types/permissions/checker.d.ts.map +1 -1
- package/dist/types/permissions/workspace-sandbox.d.ts +19 -0
- package/dist/types/permissions/workspace-sandbox.d.ts.map +1 -0
- package/dist/types/runtime-context.d.ts +7 -0
- package/dist/types/runtime-context.d.ts.map +1 -1
- package/dist/types/telemetry/fatal-error-handler.d.ts +13 -0
- package/dist/types/telemetry/fatal-error-handler.d.ts.map +1 -0
- package/dist/types/telemetry/index.d.ts +2 -0
- package/dist/types/telemetry/index.d.ts.map +1 -1
- package/dist/types/tools/impl/shell-sandbox.d.ts +1 -1
- package/dist/types/tools/impl/shell-sandbox.d.ts.map +1 -1
- package/dist/types/tools/impl/task-update.d.ts +1 -1
- package/dist/types/tools/impl/task-update.d.ts.map +1 -1
- package/dist/types/tools/impl/task.d.ts +1 -0
- package/dist/types/tools/impl/task.d.ts.map +1 -1
- package/dist/types/tools/impl/tasks/store.d.ts +3 -6
- package/dist/types/tools/impl/tasks/store.d.ts.map +1 -1
- package/dist/types/tools/toolset.d.ts +1 -0
- package/dist/types/tools/toolset.d.ts.map +1 -1
- package/dist/types/types/app-server-info.d.ts +1 -0
- package/dist/types/types/app-server-info.d.ts.map +1 -1
- package/dist/types/types/protocol.d.ts +1 -1
- package/dist/types/types/protocol_v2.d.ts +12 -10
- package/dist/types/types/protocol_v2.d.ts.map +1 -1
- package/dist/types/types/service-protocol.d.ts +11 -0
- package/dist/types/types/service-protocol.d.ts.map +1 -1
- package/dist/types/types/teleport-protocol.d.ts +54 -0
- package/dist/types/types/teleport-protocol.d.ts.map +1 -0
- package/dist/types/utils/error.d.ts +1 -1
- package/dist/types/utils/error.d.ts.map +1 -1
- package/dist/types/websocket/listener/runtime.d.ts.map +1 -1
- package/dist/types/websocket/listener/types.d.ts +16 -1
- package/dist/types/websocket/listener/types.d.ts.map +1 -1
- package/letta.js +4478 -3170
- package/package.json +1 -1
- package/scripts/isolated-unit-tests.json +5 -0
- package/scripts/source-file-size-baseline.json +4 -4
- package/skills/creating-mods/references/tools.md +1 -0
- package/skills/scheduling-tasks/SKILL.md +10 -8
- package/skills/teleporting-between-environments/SKILL.md +100 -0
- package/dist/types/cli/helpers/session-context.d.ts +0 -25
- package/dist/types/cli/helpers/session-context.d.ts.map +0 -1
- package/dist/types/utils/shell-context.d.ts +0 -7
- package/dist/types/utils/shell-context.d.ts.map +0 -1
package/dist/channels-slack.js
CHANGED
|
@@ -34,9 +34,6 @@ function isNonEmptyString2(value) {
|
|
|
34
34
|
function firstNonEmptyString(...values) {
|
|
35
35
|
return values.find(isNonEmptyString2);
|
|
36
36
|
}
|
|
37
|
-
function normalizeSlackText(text) {
|
|
38
|
-
return text.replace(/^(?:\s*<@[A-Z0-9]+>\s*)+/, "").trim();
|
|
39
|
-
}
|
|
40
37
|
function resolveSlackChatType(chatId) {
|
|
41
38
|
return chatId.startsWith("D") ? "direct" : "channel";
|
|
42
39
|
}
|
|
@@ -65,6 +62,94 @@ function slackTimestampToMillis(value) {
|
|
|
65
62
|
return Math.round(Number.parseFloat(value) * 1000);
|
|
66
63
|
}
|
|
67
64
|
|
|
65
|
+
// src/channels/slack/user-mentions.ts
|
|
66
|
+
var SLACK_USER_MENTION_PATTERN = /<@([A-Z0-9]+)(?:\|[^>]*)?>/g;
|
|
67
|
+
var MAX_SLACK_DISPLAY_NAME_LENGTH = 80;
|
|
68
|
+
function escapeRegExp(text) {
|
|
69
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
70
|
+
}
|
|
71
|
+
function stripSlackBotMention(text, botUserId) {
|
|
72
|
+
if (!botUserId)
|
|
73
|
+
return text.trim();
|
|
74
|
+
const botMentionPattern = new RegExp(`^\\s*<@${escapeRegExp(botUserId)}(?:\\|[^>]*)?>`);
|
|
75
|
+
return text.replace(botMentionPattern, "").trim();
|
|
76
|
+
}
|
|
77
|
+
function sanitizeSlackUserDisplayName(value, fallbackUserId) {
|
|
78
|
+
const sanitized = (value ?? "").replace(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu, " ").replace(/\s+/gu, " ").trim().slice(0, MAX_SLACK_DISPLAY_NAME_LENGTH).trim();
|
|
79
|
+
return sanitized || fallbackUserId;
|
|
80
|
+
}
|
|
81
|
+
function extractSlackUserMentionTokens(text) {
|
|
82
|
+
if (!text?.includes("<@"))
|
|
83
|
+
return [];
|
|
84
|
+
return Array.from(text.matchAll(SLACK_USER_MENTION_PATTERN), (match) => ({
|
|
85
|
+
start: match.index,
|
|
86
|
+
end: match.index + match[0].length,
|
|
87
|
+
userId: match[1] ?? ""
|
|
88
|
+
})).filter((mention) => mention.userId.length > 0);
|
|
89
|
+
}
|
|
90
|
+
function buildChannelUserMentions(text, displayNames) {
|
|
91
|
+
const mentions = extractSlackUserMentionTokens(text).map((mention) => ({
|
|
92
|
+
...mention,
|
|
93
|
+
displayName: displayNames.get(mention.userId) ?? mention.userId
|
|
94
|
+
}));
|
|
95
|
+
return mentions.length > 0 ? mentions : undefined;
|
|
96
|
+
}
|
|
97
|
+
function collectMentionUserIds(msg) {
|
|
98
|
+
const ids = new Set;
|
|
99
|
+
const collect = (text) => {
|
|
100
|
+
for (const mention of extractSlackUserMentionTokens(text)) {
|
|
101
|
+
ids.add(mention.userId);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
collect(msg.text);
|
|
105
|
+
collect(msg.replyContext?.text);
|
|
106
|
+
collect(msg.threadContext?.starter?.text);
|
|
107
|
+
for (const entry of msg.threadContext?.history ?? [])
|
|
108
|
+
collect(entry.text);
|
|
109
|
+
return [...ids];
|
|
110
|
+
}
|
|
111
|
+
function withResolvedReplyMentions(replyContext, displayNames) {
|
|
112
|
+
if (!replyContext)
|
|
113
|
+
return;
|
|
114
|
+
const userMentions = buildChannelUserMentions(replyContext.text, displayNames);
|
|
115
|
+
return userMentions ? { ...replyContext, userMentions } : replyContext;
|
|
116
|
+
}
|
|
117
|
+
function withResolvedEntryMentions(entry, displayNames) {
|
|
118
|
+
const userMentions = buildChannelUserMentions(entry.text, displayNames);
|
|
119
|
+
return userMentions ? { ...entry, userMentions } : entry;
|
|
120
|
+
}
|
|
121
|
+
async function resolveSlackUserMentionsInMessage(params) {
|
|
122
|
+
const { message } = params;
|
|
123
|
+
const userIds = collectMentionUserIds(message);
|
|
124
|
+
if (userIds.length === 0)
|
|
125
|
+
return message;
|
|
126
|
+
const resolvedNames = await Promise.all(userIds.map(async (userId) => {
|
|
127
|
+
try {
|
|
128
|
+
const name = await params.resolveUserName(userId);
|
|
129
|
+
return [userId, sanitizeSlackUserDisplayName(name, userId)];
|
|
130
|
+
} catch {
|
|
131
|
+
return [userId, userId];
|
|
132
|
+
}
|
|
133
|
+
}));
|
|
134
|
+
const displayNames = new Map(resolvedNames);
|
|
135
|
+
const userMentions = buildChannelUserMentions(message.text, displayNames);
|
|
136
|
+
const replyContext = withResolvedReplyMentions(message.replyContext, displayNames);
|
|
137
|
+
const starter = message.threadContext?.starter ? withResolvedEntryMentions(message.threadContext.starter, displayNames) : undefined;
|
|
138
|
+
const history = message.threadContext?.history?.map((entry) => withResolvedEntryMentions(entry, displayNames));
|
|
139
|
+
return {
|
|
140
|
+
...message,
|
|
141
|
+
...userMentions ? { userMentions } : {},
|
|
142
|
+
...replyContext ? { replyContext } : {},
|
|
143
|
+
...message.threadContext ? {
|
|
144
|
+
threadContext: {
|
|
145
|
+
...message.threadContext,
|
|
146
|
+
...starter ? { starter } : {},
|
|
147
|
+
...history ? { history } : {}
|
|
148
|
+
}
|
|
149
|
+
} : {}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
68
153
|
// src/channels/slack/ingress-policy.ts
|
|
69
154
|
var IGNORED_SLACK_MESSAGE_SUBTYPES = new Set([
|
|
70
155
|
"assistant_app_thread",
|
|
@@ -168,11 +253,12 @@ function resolveSlackMessageIngressPolicy(params) {
|
|
|
168
253
|
messageId: message.ts,
|
|
169
254
|
threadId,
|
|
170
255
|
chatType,
|
|
171
|
-
text: wasMentioned ?
|
|
256
|
+
text: wasMentioned ? stripSlackBotMention(rawText, params.botUserId) : rawText,
|
|
172
257
|
rawText,
|
|
173
258
|
wasMentioned,
|
|
174
259
|
effectiveMention,
|
|
175
|
-
isAgentThread
|
|
260
|
+
isAgentThread,
|
|
261
|
+
routedBy: wasMentioned ? "mention" : chatType === "direct" ? "dm" : "thread"
|
|
176
262
|
};
|
|
177
263
|
}
|
|
178
264
|
function resolveSlackAppMentionIngressPolicy(params) {
|
|
@@ -197,11 +283,12 @@ function resolveSlackAppMentionIngressPolicy(params) {
|
|
|
197
283
|
messageId: event.ts,
|
|
198
284
|
threadId: firstNonEmptyString(event.thread_ts, event.ts) ?? event.ts,
|
|
199
285
|
chatType: "channel",
|
|
200
|
-
text:
|
|
286
|
+
text: stripSlackBotMention(rawText, params.botUserId),
|
|
201
287
|
rawText,
|
|
202
288
|
wasMentioned: true,
|
|
203
289
|
effectiveMention: true,
|
|
204
|
-
isAgentThread: false
|
|
290
|
+
isAgentThread: false,
|
|
291
|
+
routedBy: "mention"
|
|
205
292
|
};
|
|
206
293
|
}
|
|
207
294
|
function resolveSlackReactionIngressPolicy(params) {
|
|
@@ -1171,10 +1258,13 @@ ${loadingText}`;
|
|
|
1171
1258
|
};
|
|
1172
1259
|
}
|
|
1173
1260
|
export {
|
|
1261
|
+
stripSlackBotMention,
|
|
1174
1262
|
slackTimestampToMillis,
|
|
1175
1263
|
shouldSkipSlackMessageByLastSeen,
|
|
1176
1264
|
shouldPostSlackTerminalError,
|
|
1177
1265
|
shouldAcceptSlackInboundBotMessage,
|
|
1266
|
+
sanitizeSlackUserDisplayName,
|
|
1267
|
+
resolveSlackUserMentionsInMessage,
|
|
1178
1268
|
resolveSlackSelectedModel,
|
|
1179
1269
|
resolveSlackReactionIngressPolicy,
|
|
1180
1270
|
resolveSlackOutboundThreadTs,
|
|
@@ -1182,7 +1272,6 @@ export {
|
|
|
1182
1272
|
resolveSlackConcreteActivity,
|
|
1183
1273
|
resolveSlackChatType,
|
|
1184
1274
|
resolveSlackAppMentionIngressPolicy,
|
|
1185
|
-
normalizeSlackText,
|
|
1186
1275
|
normalizeSlackReactionName,
|
|
1187
1276
|
isSlackBotAuthoredInboundMessage,
|
|
1188
1277
|
isProcessableSlackInboundMessage,
|
|
@@ -1197,4 +1286,4 @@ export {
|
|
|
1197
1286
|
SLACK_ASSISTANT_STARTUP_STATUS
|
|
1198
1287
|
};
|
|
1199
1288
|
|
|
1200
|
-
//# debugId=
|
|
1289
|
+
//# debugId=00F2BC6B76D5D4FA64756E2164756E21
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/channels/slack/bot-policy.ts", "../src/channels/slack/public-utils.ts", "../src/channels/slack/ingress-policy.ts", "../src/channels/slack/message-action-contract.ts", "../src/channels/command-runtime-executor.ts", "../src/channels/slack/utils.ts", "../src/channels/slack/model-picker-blocks.ts", "../src/agent/agent-id.ts", "../src/utils/conversation-busy-error.ts", "../src/channels/lifecycle-error.ts", "../src/channels/progress-formatting.ts", "../src/channels/slack/progress.ts", "../src/channels/slack/presentation.ts", "../src/channels/slack/sender.ts", "../src/channels/slack/status-controller.ts"],
|
|
3
|
+
"sources": ["../src/channels/slack/bot-policy.ts", "../src/channels/slack/public-utils.ts", "../src/channels/slack/user-mentions.ts", "../src/channels/slack/ingress-policy.ts", "../src/channels/slack/message-action-contract.ts", "../src/channels/command-runtime-executor.ts", "../src/channels/slack/utils.ts", "../src/channels/slack/model-picker-blocks.ts", "../src/agent/agent-id.ts", "../src/utils/conversation-busy-error.ts", "../src/channels/lifecycle-error.ts", "../src/channels/progress-formatting.ts", "../src/channels/slack/progress.ts", "../src/channels/slack/presentation.ts", "../src/channels/slack/sender.ts", "../src/channels/slack/status-controller.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { SlackAllowBotsMode } from \"@/channels/types\";\n\nexport type SlackResolvedAllowBotsMode = \"off\" | \"mentions\";\n\nexport function isValidSlackAllowBotsConfigValue(\n value: unknown,\n): value is SlackAllowBotsMode | undefined {\n return value === undefined || value === false || value === \"mentions\";\n}\n\nexport function normalizeSlackAllowBotsMode(\n value: unknown,\n): SlackAllowBotsMode {\n if (value === \"mentions\") return \"mentions\";\n return false;\n}\n\nexport function resolveSlackAllowBotsMode(\n value: SlackAllowBotsMode | undefined,\n): SlackResolvedAllowBotsMode {\n if (value === \"mentions\") return \"mentions\";\n return \"off\";\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\ntype SlackBotPolicyMessage = {\n user?: unknown;\n bot_id?: unknown;\n subtype?: unknown;\n};\n\nexport function isSlackBotAuthoredInboundMessage(\n message: SlackBotPolicyMessage,\n): boolean {\n return isNonEmptyString(message.bot_id) || message.subtype === \"bot_message\";\n}\n\nexport function isOwnSlackBotInboundMessage(params: {\n message: SlackBotPolicyMessage;\n botUserId: string | null;\n botId: string | null;\n}): boolean {\n return (\n (isNonEmptyString(params.botUserId) &&\n params.message.user === params.botUserId) ||\n (isNonEmptyString(params.botId) && params.message.bot_id === params.botId)\n );\n}\n\nexport function shouldAcceptSlackInboundBotMessage(params: {\n message: SlackBotPolicyMessage;\n allowBots: SlackAllowBotsMode | undefined;\n botUserId: string | null;\n botId: string | null;\n wasMentioned: boolean;\n}): boolean {\n if (\n isOwnSlackBotInboundMessage({\n message: params.message,\n botUserId: params.botUserId,\n botId: params.botId,\n })\n ) {\n return false;\n }\n\n if (!isSlackBotAuthoredInboundMessage(params.message)) {\n return true;\n }\n\n // This is the loop-guard boundary Letta has today: suppress our own Slack\n // app identity and gate foreign bots at ingress. Foreign bots are accepted\n // only on explicit mentions, even in DMs or agent-participated threads,\n // because the requested use case is explicit agent handoff and Letta does\n // not have OpenClaw's shared pair-loop guard yet.\n const mode = resolveSlackAllowBotsMode(params.allowBots);\n return mode === \"mentions\" && params.wasMentioned;\n}\n",
|
|
6
|
-
"import type {\n ChannelTurnSource,\n OutboundChannelMessage,\n} from \"@/channels/types\";\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function firstNonEmptyString(...values: unknown[]): string | undefined {\n return values.find(isNonEmptyString);\n}\n\nexport function
|
|
7
|
-
"import {\n firstNonEmptyString,\n isNonEmptyString,\n normalizeSlackText,\n resolveSlackChatType,\n} from \"./public-utils\";\n\nconst IGNORED_SLACK_MESSAGE_SUBTYPES = new Set([\n \"assistant_app_thread\",\n \"channel_archive\",\n \"channel_convert_to_private\",\n \"channel_convert_to_public\",\n \"channel_join\",\n \"channel_leave\",\n \"channel_name\",\n \"channel_posting_permissions\",\n \"channel_purpose\",\n \"channel_topic\",\n \"channel_unarchive\",\n \"document_mention\",\n \"ekm_access_denied\",\n \"file_comment\",\n \"group_archive\",\n \"group_join\",\n \"group_leave\",\n \"group_name\",\n \"group_purpose\",\n \"group_topic\",\n \"group_unarchive\",\n \"pinned_item\",\n \"reminder_add\",\n \"unpinned_item\",\n]);\n\nconst WRAPPER_SLACK_MESSAGE_SUBTYPES = new Set([\n \"message_changed\",\n \"message_deleted\",\n \"message_replied\",\n]);\n\nexport interface SlackInboundMessageEventLike {\n channel?: unknown;\n user?: unknown;\n bot_id?: unknown;\n ts?: unknown;\n text?: unknown;\n thread_ts?: unknown;\n subtype?: unknown;\n hidden?: boolean;\n message?: unknown;\n}\n\nexport interface SlackAppMentionEventLike {\n channel?: unknown;\n user?: unknown;\n bot_id?: unknown;\n ts?: unknown;\n text?: unknown;\n thread_ts?: unknown;\n}\n\nexport interface SlackReactionEventLike {\n user?: unknown;\n item_user?: unknown;\n reaction?: unknown;\n event_ts?: unknown;\n item?: unknown;\n}\n\nexport interface ResolveSlackMessageIngressPolicyParams {\n message: SlackInboundMessageEventLike;\n botUserId?: string | null;\n isAgentThread?: boolean;\n appMentionEventWillHandleMentions?: boolean;\n}\n\nexport interface ResolveSlackAppMentionIngressPolicyParams {\n event: SlackAppMentionEventLike;\n}\n\nexport interface ResolveSlackReactionIngressPolicyParams {\n event: SlackReactionEventLike;\n action: \"added\" | \"removed\";\n botUserId?: string | null;\n mentionOnlyChannels?: readonly string[];\n threadId?: string | null;\n}\n\nexport interface SlackMessageIngressAccepted {\n shouldRoute: true;\n channelId: string;\n senderId: string;\n senderUserId?: string;\n senderBotId?: string;\n messageId: string;\n threadId: string | null;\n chatType: \"direct\" | \"channel\";\n text: string;\n rawText: string;\n wasMentioned: boolean;\n effectiveMention: boolean;\n isAgentThread: boolean;\n}\n\nexport interface SlackAppMentionIngressAccepted {\n shouldRoute: true;\n channelId: string;\n senderId: string;\n senderUserId?: string;\n senderBotId?: string;\n messageId: string;\n threadId: string;\n chatType: \"channel\";\n text: string;\n rawText: string;\n wasMentioned: true;\n effectiveMention: true;\n isAgentThread: false;\n}\n\nexport interface SlackReactionIngressAccepted {\n shouldRoute: true;\n channelId: string;\n senderId: string;\n messageId: string;\n threadId: string | null;\n chatType: \"direct\" | \"channel\";\n text: string;\n reaction: {\n action: \"added\" | \"removed\";\n emoji: string;\n targetMessageId: string;\n targetSenderId?: string;\n };\n}\n\nexport type SlackIngressIgnoreReason =\n | \"missing_channel\"\n | \"missing_sender\"\n | \"missing_timestamp\"\n | \"hidden_message\"\n | \"ignored_subtype\"\n | \"wrapper_message\"\n | \"top_level_channel_message\"\n | \"handled_by_app_mention\"\n | \"invalid_reaction_item\"\n | \"missing_reaction\"\n | \"own_bot_reaction\"\n | \"mention_only_channel\";\n\nexport interface SlackIngressIgnored {\n shouldRoute: false;\n reason: SlackIngressIgnoreReason;\n}\n\nexport type SlackMessageIngressPolicy =\n | SlackMessageIngressAccepted\n | SlackIngressIgnored;\n\nexport type SlackAppMentionIngressPolicy =\n | SlackAppMentionIngressAccepted\n | SlackIngressIgnored;\n\nexport type SlackReactionIngressPolicy =\n | SlackReactionIngressAccepted\n | SlackIngressIgnored;\n\nexport function isSlackMentionOnlyChannel(\n channelId: string,\n mentionOnlyChannels: readonly string[] | undefined,\n): boolean {\n return mentionOnlyChannels?.includes(channelId) === true;\n}\n\nfunction hasRecordValue(value: unknown): boolean {\n return value !== null && typeof value === \"object\";\n}\n\nfunction hasSlackMention(\n text: string,\n userId: string | null | undefined,\n): boolean {\n return (\n isNonEmptyString(text) &&\n isNonEmptyString(userId) &&\n (text.includes(`<@${userId}>`) || text.includes(`<@${userId}|`))\n );\n}\n\nfunction isBotAuthoredMessage(message: SlackInboundMessageEventLike): boolean {\n return isNonEmptyString(message.bot_id) || message.subtype === \"bot_message\";\n}\n\nfunction resolveMessageSubtypeIgnoreReason(\n message: SlackInboundMessageEventLike,\n): SlackIngressIgnoreReason | null {\n const subtype = isNonEmptyString(message.subtype) ? message.subtype : null;\n if (!subtype) {\n return null;\n }\n if (IGNORED_SLACK_MESSAGE_SUBTYPES.has(subtype)) {\n return \"ignored_subtype\";\n }\n if (\n WRAPPER_SLACK_MESSAGE_SUBTYPES.has(subtype) &&\n hasRecordValue(message.message)\n ) {\n return \"wrapper_message\";\n }\n return null;\n}\n\nexport function isProcessableSlackInboundMessage(\n message: SlackInboundMessageEventLike,\n): boolean {\n return resolveSlackMessageIngressPolicy({ message }).shouldRoute;\n}\n\nexport function shouldSkipSlackMessageByLastSeen(params: {\n lastSeenMessageTs?: string | null;\n messageTs: string;\n}): boolean {\n return Boolean(\n params.lastSeenMessageTs && params.lastSeenMessageTs >= params.messageTs,\n );\n}\n\nexport function resolveSlackMessageIngressPolicy(\n params: ResolveSlackMessageIngressPolicyParams,\n): SlackMessageIngressPolicy {\n const { message } = params;\n if (!isNonEmptyString(message.channel)) {\n return { shouldRoute: false, reason: \"missing_channel\" };\n }\n const senderId = firstNonEmptyString(message.user, message.bot_id);\n if (!senderId) {\n return { shouldRoute: false, reason: \"missing_sender\" };\n }\n if (!isNonEmptyString(message.ts)) {\n return { shouldRoute: false, reason: \"missing_timestamp\" };\n }\n if (message.hidden === true) {\n return { shouldRoute: false, reason: \"hidden_message\" };\n }\n\n const subtypeIgnoreReason = resolveMessageSubtypeIgnoreReason(message);\n if (subtypeIgnoreReason) {\n return { shouldRoute: false, reason: subtypeIgnoreReason };\n }\n\n const chatType = resolveSlackChatType(message.channel);\n const threadId =\n chatType === \"direct\"\n ? (firstNonEmptyString(message.thread_ts) ?? null)\n : (firstNonEmptyString(message.thread_ts, message.ts) ?? null);\n\n if (chatType === \"channel\" && !isNonEmptyString(message.thread_ts)) {\n return { shouldRoute: false, reason: \"top_level_channel_message\" };\n }\n\n const rawText = isNonEmptyString(message.text) ? message.text : \"\";\n const wasMentioned = hasSlackMention(rawText, params.botUserId);\n if (\n chatType === \"channel\" &&\n wasMentioned &&\n params.appMentionEventWillHandleMentions === true\n ) {\n return { shouldRoute: false, reason: \"handled_by_app_mention\" };\n }\n const isAgentThread = params.isAgentThread === true;\n const effectiveMention = isBotAuthoredMessage(message)\n ? wasMentioned\n : wasMentioned || isAgentThread;\n\n return {\n shouldRoute: true,\n channelId: message.channel,\n senderId,\n ...(isNonEmptyString(message.user) ? { senderUserId: message.user } : {}),\n ...(isNonEmptyString(message.bot_id)\n ? { senderBotId: message.bot_id }\n : {}),\n messageId: message.ts,\n threadId,\n chatType,\n text: wasMentioned ? normalizeSlackText(rawText) : rawText,\n rawText,\n wasMentioned,\n effectiveMention,\n isAgentThread,\n };\n}\n\nexport function resolveSlackAppMentionIngressPolicy(\n params: ResolveSlackAppMentionIngressPolicyParams,\n): SlackAppMentionIngressPolicy {\n const { event } = params;\n if (!isNonEmptyString(event.channel)) {\n return { shouldRoute: false, reason: \"missing_channel\" };\n }\n const senderId = firstNonEmptyString(event.user, event.bot_id);\n if (!senderId) {\n return { shouldRoute: false, reason: \"missing_sender\" };\n }\n if (!isNonEmptyString(event.ts)) {\n return { shouldRoute: false, reason: \"missing_timestamp\" };\n }\n\n const rawText = isNonEmptyString(event.text) ? event.text : \"\";\n return {\n shouldRoute: true,\n channelId: event.channel,\n senderId,\n ...(isNonEmptyString(event.user) ? { senderUserId: event.user } : {}),\n ...(isNonEmptyString(event.bot_id) ? { senderBotId: event.bot_id } : {}),\n messageId: event.ts,\n threadId: firstNonEmptyString(event.thread_ts, event.ts) ?? event.ts,\n chatType: \"channel\",\n text: normalizeSlackText(rawText),\n rawText,\n wasMentioned: true,\n effectiveMention: true,\n isAgentThread: false,\n };\n}\n\nexport function resolveSlackReactionIngressPolicy(\n params: ResolveSlackReactionIngressPolicyParams,\n): SlackReactionIngressPolicy {\n const item = hasRecordValue(params.event.item)\n ? (params.event.item as Record<string, unknown>)\n : null;\n if (item?.type !== \"message\") {\n return { shouldRoute: false, reason: \"invalid_reaction_item\" };\n }\n if (!isNonEmptyString(item.channel)) {\n return { shouldRoute: false, reason: \"missing_channel\" };\n }\n if (!isNonEmptyString(params.event.user)) {\n return { shouldRoute: false, reason: \"missing_sender\" };\n }\n if (!isNonEmptyString(item.ts)) {\n return { shouldRoute: false, reason: \"missing_timestamp\" };\n }\n if (!isNonEmptyString(params.event.reaction)) {\n return { shouldRoute: false, reason: \"missing_reaction\" };\n }\n if (params.event.user === params.botUserId) {\n return { shouldRoute: false, reason: \"own_bot_reaction\" };\n }\n\n const chatType = resolveSlackChatType(item.channel);\n if (\n chatType === \"channel\" &&\n isSlackMentionOnlyChannel(item.channel, params.mentionOnlyChannels)\n ) {\n return { shouldRoute: false, reason: \"mention_only_channel\" };\n }\n\n const targetMessageId = item.ts;\n const threadId =\n params.threadId !== undefined\n ? params.threadId\n : chatType === \"channel\"\n ? targetMessageId\n : null;\n const eventTimestamp =\n firstNonEmptyString(params.event.event_ts, targetMessageId) ??\n targetMessageId;\n const reaction = {\n action: params.action,\n emoji: params.event.reaction,\n targetMessageId,\n ...(isNonEmptyString(params.event.item_user)\n ? { targetSenderId: params.event.item_user }\n : {}),\n };\n return {\n shouldRoute: true,\n channelId: item.channel,\n senderId: params.event.user,\n messageId: eventTimestamp,\n threadId,\n chatType,\n text: `Slack reaction ${params.action}: :${params.event.reaction}:`,\n reaction,\n };\n}\n",
|
|
6
|
+
"import type {\n ChannelTurnSource,\n OutboundChannelMessage,\n} from \"@/channels/types\";\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function firstNonEmptyString(...values: unknown[]): string | undefined {\n return values.find(isNonEmptyString);\n}\n\nexport function resolveSlackChatType(chatId: string): \"direct\" | \"channel\" {\n return chatId.startsWith(\"D\") ? \"direct\" : \"channel\";\n}\n\nexport function resolveSlackSourceThreadTs(\n source: ChannelTurnSource,\n): string | undefined {\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n return firstNonEmptyString(source.threadId);\n }\n return firstNonEmptyString(source.threadId, source.messageId);\n}\n\nexport function resolveSlackProgressThreadTs(\n source: ChannelTurnSource,\n): string | undefined {\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n return firstNonEmptyString(source.threadId, source.messageId);\n }\n return resolveSlackSourceThreadTs(source);\n}\n\nexport function resolveSlackOutboundThreadTs(\n msg: Pick<OutboundChannelMessage, \"chatId\" | \"threadId\" | \"replyToMessageId\">,\n): string | undefined {\n if (resolveSlackChatType(msg.chatId) === \"direct\") {\n return firstNonEmptyString(msg.threadId);\n }\n return firstNonEmptyString(msg.threadId, msg.replyToMessageId);\n}\n\nexport function normalizeSlackReactionName(value: string): string {\n return value.trim().replace(/^:+|:+$/g, \"\");\n}\n\nexport function slackTimestampToMillis(value: string): number {\n return Math.round(Number.parseFloat(value) * 1000);\n}\n",
|
|
7
|
+
"import type { ChannelUserMention } from \"@/channels/message-references\";\nimport type {\n ChannelReplyContext,\n ChannelThreadContextEntry,\n InboundChannelMessage,\n} from \"@/channels/types\";\n\nconst SLACK_USER_MENTION_PATTERN = /<@([A-Z0-9]+)(?:\\|[^>]*)?>/g;\nconst MAX_SLACK_DISPLAY_NAME_LENGTH = 80;\n\ninterface SlackUserMentionToken {\n start: number;\n end: number;\n userId: string;\n}\n\ntype ResolveSlackUserName = (userId: string) => Promise<string | undefined>;\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function stripSlackBotMention(\n text: string,\n botUserId: string | null | undefined,\n): string {\n if (!botUserId) return text.trim();\n const botMentionPattern = new RegExp(\n `^\\\\s*<@${escapeRegExp(botUserId)}(?:\\\\|[^>]*)?>`,\n );\n return text.replace(botMentionPattern, \"\").trim();\n}\n\nexport function sanitizeSlackUserDisplayName(\n value: string | undefined,\n fallbackUserId: string,\n): string {\n const sanitized = (value ?? \"\")\n .replace(/[\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}]+/gu, \" \")\n .replace(/\\s+/gu, \" \")\n .trim()\n .slice(0, MAX_SLACK_DISPLAY_NAME_LENGTH)\n .trim();\n return sanitized || fallbackUserId;\n}\n\nfunction extractSlackUserMentionTokens(\n text: string | undefined,\n): SlackUserMentionToken[] {\n if (!text?.includes(\"<@\")) return [];\n return Array.from(text.matchAll(SLACK_USER_MENTION_PATTERN), (match) => ({\n start: match.index,\n end: match.index + match[0].length,\n userId: match[1] ?? \"\",\n })).filter((mention) => mention.userId.length > 0);\n}\n\nfunction buildChannelUserMentions(\n text: string | undefined,\n displayNames: ReadonlyMap<string, string>,\n): ChannelUserMention[] | undefined {\n const mentions = extractSlackUserMentionTokens(text).map((mention) => ({\n ...mention,\n displayName: displayNames.get(mention.userId) ?? mention.userId,\n }));\n return mentions.length > 0 ? mentions : undefined;\n}\n\nfunction collectMentionUserIds(msg: InboundChannelMessage): string[] {\n const ids = new Set<string>();\n const collect = (text: string | undefined): void => {\n for (const mention of extractSlackUserMentionTokens(text)) {\n ids.add(mention.userId);\n }\n };\n collect(msg.text);\n collect(msg.replyContext?.text);\n collect(msg.threadContext?.starter?.text);\n for (const entry of msg.threadContext?.history ?? []) collect(entry.text);\n return [...ids];\n}\n\nfunction withResolvedReplyMentions(\n replyContext: ChannelReplyContext | undefined,\n displayNames: ReadonlyMap<string, string>,\n): ChannelReplyContext | undefined {\n if (!replyContext) return undefined;\n const userMentions = buildChannelUserMentions(\n replyContext.text,\n displayNames,\n );\n return userMentions ? { ...replyContext, userMentions } : replyContext;\n}\n\nfunction withResolvedEntryMentions(\n entry: ChannelThreadContextEntry,\n displayNames: ReadonlyMap<string, string>,\n): ChannelThreadContextEntry {\n const userMentions = buildChannelUserMentions(entry.text, displayNames);\n return userMentions ? { ...entry, userMentions } : entry;\n}\n\nexport async function resolveSlackUserMentionsInMessage(params: {\n message: InboundChannelMessage;\n resolveUserName: ResolveSlackUserName;\n}): Promise<InboundChannelMessage> {\n const { message } = params;\n const userIds = collectMentionUserIds(message);\n if (userIds.length === 0) return message;\n\n const resolvedNames = await Promise.all(\n userIds.map(async (userId) => {\n try {\n const name = await params.resolveUserName(userId);\n return [userId, sanitizeSlackUserDisplayName(name, userId)] as const;\n } catch {\n return [userId, userId] as const;\n }\n }),\n );\n const displayNames = new Map(resolvedNames);\n const userMentions = buildChannelUserMentions(message.text, displayNames);\n const replyContext = withResolvedReplyMentions(\n message.replyContext,\n displayNames,\n );\n const starter = message.threadContext?.starter\n ? withResolvedEntryMentions(message.threadContext.starter, displayNames)\n : undefined;\n const history = message.threadContext?.history?.map((entry) =>\n withResolvedEntryMentions(entry, displayNames),\n );\n\n return {\n ...message,\n ...(userMentions ? { userMentions } : {}),\n ...(replyContext ? { replyContext } : {}),\n ...(message.threadContext\n ? {\n threadContext: {\n ...message.threadContext,\n ...(starter ? { starter } : {}),\n ...(history ? { history } : {}),\n },\n }\n : {}),\n };\n}\n",
|
|
8
|
+
"import {\n firstNonEmptyString,\n isNonEmptyString,\n resolveSlackChatType,\n} from \"./public-utils\";\nimport { stripSlackBotMention } from \"./user-mentions\";\n\nconst IGNORED_SLACK_MESSAGE_SUBTYPES = new Set([\n \"assistant_app_thread\",\n \"channel_archive\",\n \"channel_convert_to_private\",\n \"channel_convert_to_public\",\n \"channel_join\",\n \"channel_leave\",\n \"channel_name\",\n \"channel_posting_permissions\",\n \"channel_purpose\",\n \"channel_topic\",\n \"channel_unarchive\",\n \"document_mention\",\n \"ekm_access_denied\",\n \"file_comment\",\n \"group_archive\",\n \"group_join\",\n \"group_leave\",\n \"group_name\",\n \"group_purpose\",\n \"group_topic\",\n \"group_unarchive\",\n \"pinned_item\",\n \"reminder_add\",\n \"unpinned_item\",\n]);\n\nconst WRAPPER_SLACK_MESSAGE_SUBTYPES = new Set([\n \"message_changed\",\n \"message_deleted\",\n \"message_replied\",\n]);\n\nexport interface SlackInboundMessageEventLike {\n channel?: unknown;\n user?: unknown;\n bot_id?: unknown;\n ts?: unknown;\n text?: unknown;\n thread_ts?: unknown;\n subtype?: unknown;\n hidden?: boolean;\n message?: unknown;\n}\n\nexport interface SlackAppMentionEventLike {\n channel?: unknown;\n user?: unknown;\n bot_id?: unknown;\n ts?: unknown;\n text?: unknown;\n thread_ts?: unknown;\n}\n\nexport interface SlackReactionEventLike {\n user?: unknown;\n item_user?: unknown;\n reaction?: unknown;\n event_ts?: unknown;\n item?: unknown;\n}\n\nexport interface ResolveSlackMessageIngressPolicyParams {\n message: SlackInboundMessageEventLike;\n botUserId?: string | null;\n isAgentThread?: boolean;\n appMentionEventWillHandleMentions?: boolean;\n}\n\nexport interface ResolveSlackAppMentionIngressPolicyParams {\n event: SlackAppMentionEventLike;\n botUserId?: string | null;\n}\n\nexport interface ResolveSlackReactionIngressPolicyParams {\n event: SlackReactionEventLike;\n action: \"added\" | \"removed\";\n botUserId?: string | null;\n mentionOnlyChannels?: readonly string[];\n threadId?: string | null;\n}\n\nexport interface SlackMessageIngressAccepted {\n shouldRoute: true;\n channelId: string;\n senderId: string;\n senderUserId?: string;\n senderBotId?: string;\n messageId: string;\n threadId: string | null;\n chatType: \"direct\" | \"channel\";\n text: string;\n rawText: string;\n wasMentioned: boolean;\n effectiveMention: boolean;\n isAgentThread: boolean;\n routedBy: \"mention\" | \"dm\" | \"thread\";\n}\n\nexport interface SlackAppMentionIngressAccepted {\n shouldRoute: true;\n channelId: string;\n senderId: string;\n senderUserId?: string;\n senderBotId?: string;\n messageId: string;\n threadId: string;\n chatType: \"channel\";\n text: string;\n rawText: string;\n wasMentioned: true;\n effectiveMention: true;\n isAgentThread: false;\n routedBy: \"mention\";\n}\n\nexport interface SlackReactionIngressAccepted {\n shouldRoute: true;\n channelId: string;\n senderId: string;\n messageId: string;\n threadId: string | null;\n chatType: \"direct\" | \"channel\";\n text: string;\n reaction: {\n action: \"added\" | \"removed\";\n emoji: string;\n targetMessageId: string;\n targetSenderId?: string;\n };\n}\n\nexport type SlackIngressIgnoreReason =\n | \"missing_channel\"\n | \"missing_sender\"\n | \"missing_timestamp\"\n | \"hidden_message\"\n | \"ignored_subtype\"\n | \"wrapper_message\"\n | \"top_level_channel_message\"\n | \"handled_by_app_mention\"\n | \"invalid_reaction_item\"\n | \"missing_reaction\"\n | \"own_bot_reaction\"\n | \"mention_only_channel\";\n\nexport interface SlackIngressIgnored {\n shouldRoute: false;\n reason: SlackIngressIgnoreReason;\n}\n\nexport type SlackMessageIngressPolicy =\n | SlackMessageIngressAccepted\n | SlackIngressIgnored;\n\nexport type SlackAppMentionIngressPolicy =\n | SlackAppMentionIngressAccepted\n | SlackIngressIgnored;\n\nexport type SlackReactionIngressPolicy =\n | SlackReactionIngressAccepted\n | SlackIngressIgnored;\n\nexport function isSlackMentionOnlyChannel(\n channelId: string,\n mentionOnlyChannels: readonly string[] | undefined,\n): boolean {\n return mentionOnlyChannels?.includes(channelId) === true;\n}\n\nfunction hasRecordValue(value: unknown): boolean {\n return value !== null && typeof value === \"object\";\n}\n\nfunction hasSlackMention(\n text: string,\n userId: string | null | undefined,\n): boolean {\n return (\n isNonEmptyString(text) &&\n isNonEmptyString(userId) &&\n (text.includes(`<@${userId}>`) || text.includes(`<@${userId}|`))\n );\n}\n\nfunction isBotAuthoredMessage(message: SlackInboundMessageEventLike): boolean {\n return isNonEmptyString(message.bot_id) || message.subtype === \"bot_message\";\n}\n\nfunction resolveMessageSubtypeIgnoreReason(\n message: SlackInboundMessageEventLike,\n): SlackIngressIgnoreReason | null {\n const subtype = isNonEmptyString(message.subtype) ? message.subtype : null;\n if (!subtype) {\n return null;\n }\n if (IGNORED_SLACK_MESSAGE_SUBTYPES.has(subtype)) {\n return \"ignored_subtype\";\n }\n if (\n WRAPPER_SLACK_MESSAGE_SUBTYPES.has(subtype) &&\n hasRecordValue(message.message)\n ) {\n return \"wrapper_message\";\n }\n return null;\n}\n\nexport function isProcessableSlackInboundMessage(\n message: SlackInboundMessageEventLike,\n): boolean {\n return resolveSlackMessageIngressPolicy({ message }).shouldRoute;\n}\n\nexport function shouldSkipSlackMessageByLastSeen(params: {\n lastSeenMessageTs?: string | null;\n messageTs: string;\n}): boolean {\n return Boolean(\n params.lastSeenMessageTs && params.lastSeenMessageTs >= params.messageTs,\n );\n}\n\nexport function resolveSlackMessageIngressPolicy(\n params: ResolveSlackMessageIngressPolicyParams,\n): SlackMessageIngressPolicy {\n const { message } = params;\n if (!isNonEmptyString(message.channel)) {\n return { shouldRoute: false, reason: \"missing_channel\" };\n }\n const senderId = firstNonEmptyString(message.user, message.bot_id);\n if (!senderId) {\n return { shouldRoute: false, reason: \"missing_sender\" };\n }\n if (!isNonEmptyString(message.ts)) {\n return { shouldRoute: false, reason: \"missing_timestamp\" };\n }\n if (message.hidden === true) {\n return { shouldRoute: false, reason: \"hidden_message\" };\n }\n\n const subtypeIgnoreReason = resolveMessageSubtypeIgnoreReason(message);\n if (subtypeIgnoreReason) {\n return { shouldRoute: false, reason: subtypeIgnoreReason };\n }\n\n const chatType = resolveSlackChatType(message.channel);\n const threadId =\n chatType === \"direct\"\n ? (firstNonEmptyString(message.thread_ts) ?? null)\n : (firstNonEmptyString(message.thread_ts, message.ts) ?? null);\n\n if (chatType === \"channel\" && !isNonEmptyString(message.thread_ts)) {\n return { shouldRoute: false, reason: \"top_level_channel_message\" };\n }\n\n const rawText = isNonEmptyString(message.text) ? message.text : \"\";\n const wasMentioned = hasSlackMention(rawText, params.botUserId);\n if (\n chatType === \"channel\" &&\n wasMentioned &&\n params.appMentionEventWillHandleMentions === true\n ) {\n return { shouldRoute: false, reason: \"handled_by_app_mention\" };\n }\n const isAgentThread = params.isAgentThread === true;\n const effectiveMention = isBotAuthoredMessage(message)\n ? wasMentioned\n : wasMentioned || isAgentThread;\n\n return {\n shouldRoute: true,\n channelId: message.channel,\n senderId,\n ...(isNonEmptyString(message.user) ? { senderUserId: message.user } : {}),\n ...(isNonEmptyString(message.bot_id)\n ? { senderBotId: message.bot_id }\n : {}),\n messageId: message.ts,\n threadId,\n chatType,\n text: wasMentioned\n ? stripSlackBotMention(rawText, params.botUserId)\n : rawText,\n rawText,\n wasMentioned,\n effectiveMention,\n isAgentThread,\n routedBy: wasMentioned\n ? \"mention\"\n : chatType === \"direct\"\n ? \"dm\"\n : \"thread\",\n };\n}\n\nexport function resolveSlackAppMentionIngressPolicy(\n params: ResolveSlackAppMentionIngressPolicyParams,\n): SlackAppMentionIngressPolicy {\n const { event } = params;\n if (!isNonEmptyString(event.channel)) {\n return { shouldRoute: false, reason: \"missing_channel\" };\n }\n const senderId = firstNonEmptyString(event.user, event.bot_id);\n if (!senderId) {\n return { shouldRoute: false, reason: \"missing_sender\" };\n }\n if (!isNonEmptyString(event.ts)) {\n return { shouldRoute: false, reason: \"missing_timestamp\" };\n }\n\n const rawText = isNonEmptyString(event.text) ? event.text : \"\";\n return {\n shouldRoute: true,\n channelId: event.channel,\n senderId,\n ...(isNonEmptyString(event.user) ? { senderUserId: event.user } : {}),\n ...(isNonEmptyString(event.bot_id) ? { senderBotId: event.bot_id } : {}),\n messageId: event.ts,\n threadId: firstNonEmptyString(event.thread_ts, event.ts) ?? event.ts,\n chatType: \"channel\",\n text: stripSlackBotMention(rawText, params.botUserId),\n rawText,\n wasMentioned: true,\n effectiveMention: true,\n isAgentThread: false,\n routedBy: \"mention\",\n };\n}\n\nexport function resolveSlackReactionIngressPolicy(\n params: ResolveSlackReactionIngressPolicyParams,\n): SlackReactionIngressPolicy {\n const item = hasRecordValue(params.event.item)\n ? (params.event.item as Record<string, unknown>)\n : null;\n if (item?.type !== \"message\") {\n return { shouldRoute: false, reason: \"invalid_reaction_item\" };\n }\n if (!isNonEmptyString(item.channel)) {\n return { shouldRoute: false, reason: \"missing_channel\" };\n }\n if (!isNonEmptyString(params.event.user)) {\n return { shouldRoute: false, reason: \"missing_sender\" };\n }\n if (!isNonEmptyString(item.ts)) {\n return { shouldRoute: false, reason: \"missing_timestamp\" };\n }\n if (!isNonEmptyString(params.event.reaction)) {\n return { shouldRoute: false, reason: \"missing_reaction\" };\n }\n if (params.event.user === params.botUserId) {\n return { shouldRoute: false, reason: \"own_bot_reaction\" };\n }\n\n const chatType = resolveSlackChatType(item.channel);\n if (\n chatType === \"channel\" &&\n isSlackMentionOnlyChannel(item.channel, params.mentionOnlyChannels)\n ) {\n return { shouldRoute: false, reason: \"mention_only_channel\" };\n }\n\n const targetMessageId = item.ts;\n const threadId =\n params.threadId !== undefined\n ? params.threadId\n : chatType === \"channel\"\n ? targetMessageId\n : null;\n const eventTimestamp =\n firstNonEmptyString(params.event.event_ts, targetMessageId) ??\n targetMessageId;\n const reaction = {\n action: params.action,\n emoji: params.event.reaction,\n targetMessageId,\n ...(isNonEmptyString(params.event.item_user)\n ? { targetSenderId: params.event.item_user }\n : {}),\n };\n return {\n shouldRoute: true,\n channelId: item.channel,\n senderId: params.event.user,\n messageId: eventTimestamp,\n threadId,\n chatType,\n text: `Slack reaction ${params.action}: :${params.event.reaction}:`,\n reaction,\n };\n}\n",
|
|
8
9
|
"import type {\n ChannelMessageActionAdapter,\n ChannelMessageActionContext,\n} from \"@/channels/plugin-types\";\n\nexport interface CreateSlackMessageActionAdapterOptions {\n /** Expose reaction actions when the injected transport supports them. */\n react?: boolean;\n /** Expose local-path uploads when the injected transport can read them. */\n uploadFile?: boolean;\n /** Host-owned proactive target resolver, when proactive sends are supported. */\n resolveMessageTarget?: ChannelMessageActionAdapter[\"resolveMessageTarget\"];\n /** Host-owned attachment materialization, when download-file is supported. */\n downloadFile?: (context: ChannelMessageActionContext) => Promise<string>;\n}\n\nasync function sendSlackMessage(\n context: ChannelMessageActionContext,\n): Promise<string> {\n const { request, route, adapter, formatText } = context;\n const text = request.message ?? \"\";\n if (text.trim().length === 0 && !request.mediaPath) {\n return \"Error: Slack send requires message or media.\";\n }\n\n const isDirect =\n route.chatType === \"direct\" || request.chatId.startsWith(\"D\");\n const formatted = formatText(text);\n const result = await adapter.sendMessage({\n channel: \"slack\",\n accountId: route.accountId,\n chatId: request.chatId,\n text: formatted.text,\n replyToMessageId: isDirect ? undefined : request.replyToMessageId,\n threadId: isDirect\n ? (request.threadId ?? route.threadId ?? null)\n : request.replyToMessageId\n ? null\n : (request.threadId ?? route.threadId ?? null),\n mediaPath: request.mediaPath,\n fileName: request.filename,\n title: request.title,\n parseMode: formatted.parseMode,\n agentId: route.agentId,\n conversationId: route.conversationId,\n });\n return request.mediaPath\n ? `Attachment sent to slack (message_id: ${result.messageId})`\n : `Message sent to slack (message_id: ${result.messageId})`;\n}\n\nasync function reactInSlack(\n context: ChannelMessageActionContext,\n): Promise<string> {\n const { request, route, adapter } = context;\n if (!request.emoji?.trim()) return \"Error: Slack react requires emoji.\";\n if (!request.messageId?.trim()) {\n return \"Error: Slack react requires messageId.\";\n }\n\n const result = await adapter.sendMessage({\n channel: \"slack\",\n accountId: route.accountId,\n chatId: request.chatId,\n text: \"\",\n targetMessageId: request.messageId,\n reaction: request.emoji,\n removeReaction: request.remove,\n threadId: request.threadId ?? route.threadId ?? null,\n });\n return request.remove\n ? `Reaction removed on slack (message_id: ${result.messageId})`\n : `Reaction added on slack (message_id: ${result.messageId})`;\n}\n\n/**\n * Build canonical Slack MessageChannel actions around a host-owned transport.\n * Capabilities are explicit so remote gateways never advertise local-path or\n * attachment behavior they cannot execute.\n */\nexport function createSlackMessageActionAdapter(\n options: CreateSlackMessageActionAdapterOptions = {},\n): ChannelMessageActionAdapter {\n const actions = [\n \"send\",\n ...(options.react ? [\"react\"] : []),\n ...(options.uploadFile ? [\"upload-file\"] : []),\n ...(options.downloadFile ? [\"download-file\"] : []),\n ];\n return {\n describeMessageTool() {\n const properties: Record<string, unknown> = {};\n if (options.downloadFile) {\n properties.attachmentId = {\n type: \"string\",\n description:\n \"Slack attachment id for action='download-file'. Copy attachment_id from the channel notification.\",\n };\n }\n if (options.react || options.downloadFile) {\n properties.messageId = {\n type: \"string\",\n description: options.downloadFile\n ? \"Target Slack message id for action='react', or the source message id containing attachmentId for action='download-file'.\"\n : \"Target Slack message id for action='react'.\",\n };\n }\n return {\n actions: [...actions],\n ...(Object.keys(properties).length > 0\n ? { schema: { properties } }\n : {}),\n };\n },\n ...(options.resolveMessageTarget\n ? { resolveMessageTarget: options.resolveMessageTarget }\n : {}),\n async handleAction(context) {\n switch (context.request.action) {\n case \"send\":\n return await sendSlackMessage(context);\n case \"upload-file\":\n if (!options.uploadFile) {\n return 'Error: Action \"upload-file\" is not supported on slack.';\n }\n if (!context.request.mediaPath?.trim()) {\n return \"Error: Slack upload-file requires media.\";\n }\n return await sendSlackMessage(context);\n case \"react\":\n return options.react\n ? await reactInSlack(context)\n : 'Error: Action \"react\" is not supported on slack.';\n case \"download-file\":\n return options.downloadFile\n ? await options.downloadFile(context)\n : 'Error: Action \"download-file\" is not supported on slack.';\n default:\n return `Error: Action \"${context.request.action}\" is not supported on slack.`;\n }\n },\n };\n}\n",
|
|
9
10
|
"/**\n * Shared runtime-command executor for the channel slash commands whose\n * semantics are pure app-server protocol: `/model <handle>`, `/model list`,\n * `/cancel`, `/reflection`, and `/reload`.\n *\n * Every channel host — the local `letta server --channel` gateway and Letta\n * Cloud's Slack gateway — ends up sending the same protocol commands\n * (`update_model`, `list_models`, `abort_message`, `execute_command`) and\n * rendering a reply. Implementing that twice lets the two hosts drift, so the\n * protocol semantics and reply rendering live here once, parameterized by a\n * minimal injected {@link RuntimeCommandClient} that each host backs with its\n * own transport (in-process App Server client locally, the Redis listener\n * relay in Cloud).\n *\n * Like `command-surface.ts`, this module must stay free of host-local\n * dependencies (plugin registry, adapters, settings, websockets) so external\n * hosts can consume it from the public channels entrypoint.\n */\n\nimport type { ListModelsResponseModelEntry } from \"@/types/protocol_v2\";\nimport {\n type ChannelDisplayNameResolver,\n defaultChannelDisplayName,\n} from \"./command-surface\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Injected client\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Runtime identity the protocol commands target. */\nexport interface RuntimeCommandScope {\n agent_id: string;\n conversation_id: string;\n}\n\n/** App-server `execute_command` ids reachable from channel slash commands. */\nexport type RuntimeExecuteCommandId = \"reflect\" | \"reload\";\n\n/** Result of a `list_models` round trip. */\nexport interface RuntimeCommandListModelsResult {\n success: boolean;\n entries: ListModelsResponseModelEntry[];\n /**\n * Handles available to this user. Tri-state mirrors the wire format:\n * `null` = availability lookup failed; `undefined` = the server did not\n * report availability. Both cases render an explanatory note.\n */\n availableHandles?: string[] | null;\n error?: string;\n}\n\n/** Result of an `update_model` round trip. */\nexport interface RuntimeCommandUpdateModelResult {\n success: boolean;\n /** Canonical handle the server applied (may differ from the request). */\n modelHandle?: string;\n appliedTo?: \"agent\" | \"conversation\";\n error?: string;\n}\n\n/** Result of an `abort_message` round trip. */\nexport interface RuntimeCommandAbortResult {\n success: boolean;\n aborted: boolean;\n error?: string;\n}\n\n/** Result of an `execute_command` round trip. */\nexport interface RuntimeCommandExecuteResult {\n success: boolean;\n output: string;\n}\n\n/**\n * Minimal transport interface a channel host injects into the executor.\n *\n * Each method corresponds to exactly one app-server protocol command; the\n * host owns request-id generation, correlation, and timeouts. Transport-level\n * failures should be thrown — the executor intentionally does not catch them\n * so each host can apply its own failure copy and logging.\n */\nexport interface RuntimeCommandClient {\n listModels(): Promise<RuntimeCommandListModelsResult>;\n updateModel(params: {\n runtime: RuntimeCommandScope;\n /** User-provided handle or id; sent as both `model_id` and `model_handle`. */\n modelIdentifier: string;\n }): Promise<RuntimeCommandUpdateModelResult>;\n abortMessage(params: {\n runtime: RuntimeCommandScope;\n runId: string | null;\n }): Promise<RuntimeCommandAbortResult>;\n executeCommand(params: {\n runtime: RuntimeCommandScope;\n commandId: RuntimeExecuteCommandId;\n args?: string;\n }): Promise<RuntimeCommandExecuteResult>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Model entry helpers (pure)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ChannelModelListEntry = Pick<\n ListModelsResponseModelEntry,\n | \"id\"\n | \"handle\"\n | \"label\"\n | \"description\"\n | \"isDefault\"\n | \"isFeatured\"\n | \"updateArgs\"\n>;\n\nconst DEFAULT_CHANNEL_MODEL_LIST_LIMIT = 8;\n\nfunction getModelEntryRank(entry: ChannelModelListEntry): number {\n if (entry.isDefault) return 0;\n if (entry.isFeatured) return 1;\n const effort = (\n entry.updateArgs as { reasoning_effort?: unknown } | undefined\n )?.reasoning_effort;\n if (effort === \"medium\") return 2;\n if (effort === \"high\") return 3;\n return 4;\n}\n\nfunction preferModelEntry(\n current: ChannelModelListEntry,\n candidate: ChannelModelListEntry,\n): ChannelModelListEntry {\n return getModelEntryRank(candidate) < getModelEntryRank(current)\n ? candidate\n : current;\n}\n\nexport function buildModelEntriesByHandle(\n entries: ChannelModelListEntry[],\n): Map<string, ChannelModelListEntry> {\n const byHandle = new Map<string, ChannelModelListEntry>();\n for (const entry of entries) {\n const current = byHandle.get(entry.handle);\n byHandle.set(\n entry.handle,\n current ? preferModelEntry(current, entry) : entry,\n );\n }\n return byHandle;\n}\n\nfunction makeUnknownModelEntry(handle: string): ChannelModelListEntry {\n return {\n id: handle,\n handle,\n label: handle,\n description: \"\",\n };\n}\n\nexport function resolveModelHandles(params: {\n handles: string[];\n byHandle: Map<string, ChannelModelListEntry>;\n availableHandles?: Set<string> | null;\n}): ChannelModelListEntry[] {\n const { handles, byHandle, availableHandles } = params;\n const seen = new Set<string>();\n const resolved: ChannelModelListEntry[] = [];\n for (const handle of handles) {\n if (!handle || seen.has(handle)) continue;\n seen.add(handle);\n if (availableHandles && !availableHandles.has(handle)) continue;\n resolved.push(byHandle.get(handle) ?? makeUnknownModelEntry(handle));\n }\n return resolved;\n}\n\nexport function getFallbackModelEntries(\n byHandle: Map<string, ChannelModelListEntry>,\n): ChannelModelListEntry[] {\n const preferred = Array.from(byHandle.values()).filter(\n (entry) => entry.isDefault || entry.isFeatured,\n );\n return preferred.length > 0 ? preferred : Array.from(byHandle.values());\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Reply rendering (pure; display name injected)\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction modelCommandPrefix(channelId: string): \"/model\" | \"@agent /model\" {\n return channelId === \"slack\" ? \"@agent /model\" : \"/model\";\n}\n\nexport function buildChannelModelNotFoundText(channelId: string): string {\n return `Model not found. Use ${modelCommandPrefix(channelId)} list to see available models.`;\n}\n\nexport function buildChannelCurrentModelMessage(\n channelId: string,\n params: {\n modelLabel: string;\n modelHandle: string | null;\n scope?: \"agent\" | \"conversation\";\n },\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n const scope = params.scope === \"agent\" ? \"agent\" : \"conversation\";\n const handleText =\n params.modelHandle && params.modelHandle !== params.modelLabel\n ? ` (${params.modelHandle})`\n : \"\";\n const switchCommand = modelCommandPrefix(channelId);\n return [\n `${displayName} current ${scope} model: ${params.modelLabel}${handleText}.`,\n `Use ${switchCommand} list to see available models, or ${switchCommand} <handle-or-id> to switch.`,\n ].join(\"\\n\");\n}\n\nfunction formatChannelModelEntry(\n channelId: string,\n entry: ChannelModelListEntry,\n): string {\n const selector = entry.id || entry.handle;\n const handleText = entry.handle === entry.label ? \"\" : ` — ${entry.handle}`;\n return `• ${entry.label}${handleText} (${modelCommandPrefix(channelId)} ${selector})`;\n}\n\nfunction appendModelEntrySection(\n lines: string[],\n channelId: string,\n title: string,\n entries: ChannelModelListEntry[],\n limit: number,\n): void {\n if (entries.length === 0) return;\n lines.push(\"\", `${title}:`);\n for (const entry of entries.slice(0, limit)) {\n lines.push(formatChannelModelEntry(channelId, entry));\n }\n const remaining = entries.length - limit;\n if (remaining > 0) {\n lines.push(`…and ${remaining} more.`);\n }\n}\n\nexport function buildChannelModelListMessage(\n channelId: string,\n params: {\n entries: ListModelsResponseModelEntry[];\n availableHandles?: string[] | null;\n recentHandles?: string[];\n limit?: number;\n },\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n const limit = params.limit ?? DEFAULT_CHANNEL_MODEL_LIST_LIMIT;\n const entries = params.entries as ChannelModelListEntry[];\n const byHandle = buildModelEntriesByHandle(entries);\n const availableHandleList = Array.isArray(params.availableHandles)\n ? params.availableHandles\n : null;\n const availableSet = availableHandleList\n ? new Set(availableHandleList)\n : null;\n const recentEntries = resolveModelHandles({\n handles: params.recentHandles ?? [],\n byHandle,\n availableHandles: availableSet,\n });\n const availableEntries = availableHandleList\n ? resolveModelHandles({ handles: availableHandleList, byHandle })\n : getFallbackModelEntries(byHandle);\n\n const lines = [`${displayName} model selector`];\n if (params.availableHandles === null) {\n lines.push(\n \"Availability lookup failed; showing built-in recommended models.\",\n );\n } else if (params.availableHandles === undefined) {\n lines.push(\n \"Available model data was not returned; showing built-in recommended models.\",\n );\n }\n\n appendModelEntrySection(\n lines,\n channelId,\n \"Recent models\",\n recentEntries,\n limit,\n );\n appendModelEntrySection(\n lines,\n channelId,\n \"Available models\",\n availableEntries,\n limit,\n );\n\n if (availableEntries.length === 0) {\n lines.push(\n \"\",\n \"No available models were reported. Use /connect in Letta Code to configure a provider, then try again.\",\n );\n }\n\n lines.push(\"\");\n if (channelId === \"slack\") {\n lines.push(\n \"Mention the app with @agent /model <handle-or-id> to switch this thread's routed model. Use @agent /model to show the current model. Legacy !model still works after a mention.\",\n );\n } else {\n lines.push(\n \"Use /model <handle-or-id> to switch this chat's routed model, or /model to show the current model.\",\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport function buildChannelModelListUnavailableMessage(\n channelId: string,\n error: string,\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n return `${displayName} could not load the model list: ${error}`;\n}\n\nexport function buildChannelCurrentModelUnavailableMessage(\n channelId: string,\n error: string,\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n return `${displayName} could not load the current model: ${error}`;\n}\n\nexport function buildChannelModelUpdatedMessage(\n channelId: string,\n params: {\n modelLabel: string;\n modelHandle: string;\n appliedTo?: \"agent\" | \"conversation\";\n },\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n const scope = params.appliedTo === \"agent\" ? \"agent\" : \"conversation\";\n const handleText =\n params.modelHandle === params.modelLabel ? \"\" : ` (${params.modelHandle})`;\n return `${displayName} updated this ${scope}'s model to ${params.modelLabel}${handleText}.`;\n}\n\nexport function buildChannelModelUpdateFailedMessage(\n channelId: string,\n identifier: string,\n error: string,\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n return `${displayName} could not switch this chat's routed model to ${identifier}: ${error}`;\n}\n\nexport function buildChannelCancelAcceptedMessage(\n channelId: string,\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n return `${displayName} cancelled the in-progress agent turn for this chat.`;\n}\n\nexport function buildChannelCancelNoActiveTurnMessage(\n channelId: string,\n displayNameResolver: ChannelDisplayNameResolver = defaultChannelDisplayName,\n): string {\n const displayName = displayNameResolver(channelId);\n return `${displayName} received /cancel, but there is no in-progress agent turn to cancel for this chat.`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Command executors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Rendered reply from a shared runtime-command executor. */\nexport interface RuntimeCommandReply {\n handled: true;\n text: string;\n}\n\nexport type ParsedChannelModelCommand =\n | { kind: \"current\" }\n | { kind: \"list\" }\n | { kind: \"update\"; modelIdentifier: string };\n\n/**\n * Classify `/model` arguments: empty → show the current model (host-owned),\n * `list` (case-insensitive) → list models, anything else → switch to it.\n */\nexport function parseChannelModelCommand(\n args: string,\n): ParsedChannelModelCommand {\n const modelIdentifier = args.trim();\n if (!modelIdentifier) {\n return { kind: \"current\" };\n }\n if (modelIdentifier.toLowerCase() === \"list\") {\n return { kind: \"list\" };\n }\n return { kind: \"update\", modelIdentifier };\n}\n\n/** `/model list` — send `list_models` and render the selector reply. */\nexport async function runChannelModelListCommand(params: {\n channelId: string;\n client: RuntimeCommandClient;\n /** Host-tracked recently used handles (e.g. local settings). */\n recentHandles?: string[];\n channelDisplayName?: ChannelDisplayNameResolver;\n}): Promise<RuntimeCommandReply> {\n const displayNameResolver =\n params.channelDisplayName ?? defaultChannelDisplayName;\n const result = await params.client.listModels();\n return {\n handled: true,\n text: result.success\n ? buildChannelModelListMessage(\n params.channelId,\n {\n entries: result.entries,\n availableHandles: result.availableHandles,\n recentHandles: params.recentHandles,\n },\n displayNameResolver,\n )\n : buildChannelModelListUnavailableMessage(\n params.channelId,\n result.error ?? \"Failed to list models\",\n displayNameResolver,\n ),\n };\n}\n\n/** `/model <handle-or-id>` — send `update_model` and render the outcome. */\nexport async function runChannelModelUpdateCommand(params: {\n channelId: string;\n client: RuntimeCommandClient;\n runtime: RuntimeCommandScope;\n modelIdentifier: string;\n /** Optional handle → human label lookup (e.g. the local model catalog). */\n resolveModelLabel?: (modelHandle: string) => string | undefined;\n channelDisplayName?: ChannelDisplayNameResolver;\n}): Promise<RuntimeCommandReply & { success: boolean; modelHandle?: string }> {\n const displayNameResolver =\n params.channelDisplayName ?? defaultChannelDisplayName;\n const result = await params.client.updateModel({\n runtime: params.runtime,\n modelIdentifier: params.modelIdentifier,\n });\n if (!result.success) {\n return {\n handled: true,\n success: false,\n text: buildChannelModelUpdateFailedMessage(\n params.channelId,\n params.modelIdentifier,\n result.error ?? \"Failed to update model\",\n displayNameResolver,\n ),\n };\n }\n const appliedHandle = result.modelHandle ?? params.modelIdentifier;\n return {\n handled: true,\n success: true,\n modelHandle: appliedHandle,\n text: buildChannelModelUpdatedMessage(\n params.channelId,\n {\n modelLabel:\n params.resolveModelLabel?.(appliedHandle) ?? params.modelIdentifier,\n modelHandle: appliedHandle,\n appliedTo: result.appliedTo,\n },\n displayNameResolver,\n ),\n };\n}\n\n/**\n * `/cancel` — send `abort_message` for the routed runtime. `text` is only\n * rendered when `channelId` is provided; hosts that render cancel outcomes\n * themselves (e.g. via `ChannelSlashCommandHandlers` default text) can rely\n * on `cancelled` alone.\n */\nexport async function runChannelCancelCommand(params: {\n client: RuntimeCommandClient;\n runtime: RuntimeCommandScope;\n channelId?: string;\n channelDisplayName?: ChannelDisplayNameResolver;\n}): Promise<{ handled: true; cancelled: boolean; text?: string }> {\n const response = await params.client.abortMessage({\n runtime: params.runtime,\n runId: null,\n });\n const cancelled = response.success && response.aborted;\n if (params.channelId === undefined) {\n return { handled: true, cancelled };\n }\n const displayNameResolver =\n params.channelDisplayName ?? defaultChannelDisplayName;\n return {\n handled: true,\n cancelled,\n text: cancelled\n ? buildChannelCancelAcceptedMessage(params.channelId, displayNameResolver)\n : buildChannelCancelNoActiveTurnMessage(\n params.channelId,\n displayNameResolver,\n ),\n };\n}\n\nasync function runChannelExecuteCommand(params: {\n client: RuntimeCommandClient;\n runtime: RuntimeCommandScope;\n commandId: RuntimeExecuteCommandId;\n args?: string;\n}): Promise<RuntimeCommandReply> {\n const trimmedArgs = params.args?.trim();\n const response = await params.client.executeCommand({\n runtime: params.runtime,\n commandId: params.commandId,\n ...(trimmedArgs ? { args: trimmedArgs } : {}),\n });\n return { handled: true, text: response.output };\n}\n\n/** `/reflection` — send `execute_command` (`reflect`) and relay its output. */\nexport function runChannelReflectionCommand(params: {\n client: RuntimeCommandClient;\n runtime: RuntimeCommandScope;\n args?: string;\n}): Promise<RuntimeCommandReply> {\n return runChannelExecuteCommand({ ...params, commandId: \"reflect\" });\n}\n\n/** `/reload` — send `execute_command` (`reload`) and relay its output. */\nexport function runChannelReloadCommand(params: {\n client: RuntimeCommandClient;\n runtime: RuntimeCommandScope;\n args?: string;\n}): Promise<RuntimeCommandReply> {\n return runChannelExecuteCommand({ ...params, commandId: \"reload\" });\n}\n",
|
|
10
|
-
"import type { ChannelTurnSource } from \"@/channels/types\";\nimport type {\n SlackAppConstructor,\n SlackBlock,\n SlackBoltModule,\n} from \"./internal-types\";\n\ntype Constructor = abstract new (...args: never[]) => unknown;\n\nfunction isConstructorFunction<T extends Constructor>(\n value: unknown,\n): value is T {\n return typeof value === \"function\";\n}\n\nfunction resolveSlackAppModule(value: unknown): SlackAppConstructor | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const app = Reflect.get(value, \"App\");\n return isConstructorFunction<SlackAppConstructor>(app) ? app : null;\n}\n\nexport function resolveSlackAppConstructor(\n mod: SlackBoltModule,\n): SlackAppConstructor {\n const defaultExport =\n mod && typeof mod === \"object\" ? Reflect.get(mod, \"default\") : undefined;\n const nestedDefault =\n defaultExport && typeof defaultExport === \"object\"\n ? Reflect.get(defaultExport, \"default\")\n : undefined;\n const App =\n resolveSlackAppModule(mod) ??\n resolveSlackAppModule(defaultExport) ??\n resolveSlackAppModule(nestedDefault) ??\n (isConstructorFunction<SlackAppConstructor>(defaultExport)\n ? defaultExport\n : null);\n\n if (!App) {\n throw new Error(\n 'Installed Slack runtime did not export constructor \"App\".',\n );\n }\n return App;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function firstNonEmptyString(...values: unknown[]): string | undefined {\n return values.find(isNonEmptyString);\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function resolveSlackSenderTeamId(value: unknown): string | undefined {\n const record = asRecord(value);\n return record\n ? firstNonEmptyString(record.user_team, record.team_id, record.team)\n : undefined;\n}\n\
|
|
11
|
+
"import type { ChannelTurnSource } from \"@/channels/types\";\nimport type {\n SlackAppConstructor,\n SlackBlock,\n SlackBoltModule,\n} from \"./internal-types\";\n\ntype Constructor = abstract new (...args: never[]) => unknown;\n\nfunction isConstructorFunction<T extends Constructor>(\n value: unknown,\n): value is T {\n return typeof value === \"function\";\n}\n\nfunction resolveSlackAppModule(value: unknown): SlackAppConstructor | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const app = Reflect.get(value, \"App\");\n return isConstructorFunction<SlackAppConstructor>(app) ? app : null;\n}\n\nexport function resolveSlackAppConstructor(\n mod: SlackBoltModule,\n): SlackAppConstructor {\n const defaultExport =\n mod && typeof mod === \"object\" ? Reflect.get(mod, \"default\") : undefined;\n const nestedDefault =\n defaultExport && typeof defaultExport === \"object\"\n ? Reflect.get(defaultExport, \"default\")\n : undefined;\n const App =\n resolveSlackAppModule(mod) ??\n resolveSlackAppModule(defaultExport) ??\n resolveSlackAppModule(nestedDefault) ??\n (isConstructorFunction<SlackAppConstructor>(defaultExport)\n ? defaultExport\n : null);\n\n if (!App) {\n throw new Error(\n 'Installed Slack runtime did not export constructor \"App\".',\n );\n }\n return App;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function firstNonEmptyString(...values: unknown[]): string | undefined {\n return values.find(isNonEmptyString);\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function resolveSlackSenderTeamId(value: unknown): string | undefined {\n const record = asRecord(value);\n return record\n ? firstNonEmptyString(record.user_team, record.team_id, record.team)\n : undefined;\n}\n\nconst IGNORED_SLACK_MESSAGE_SUBTYPES = new Set([\n \"assistant_app_thread\",\n \"channel_archive\",\n \"channel_convert_to_private\",\n \"channel_convert_to_public\",\n \"channel_join\",\n \"channel_leave\",\n \"channel_name\",\n \"channel_posting_permissions\",\n \"channel_purpose\",\n \"channel_topic\",\n \"channel_unarchive\",\n \"document_mention\",\n \"ekm_access_denied\",\n \"file_comment\",\n \"group_archive\",\n \"group_join\",\n \"group_leave\",\n \"group_name\",\n \"group_purpose\",\n \"group_topic\",\n \"group_unarchive\",\n \"pinned_item\",\n \"reminder_add\",\n \"unpinned_item\",\n]);\n\nconst WRAPPER_SLACK_MESSAGE_SUBTYPES = new Set([\n \"message_changed\",\n \"message_deleted\",\n \"message_replied\",\n]);\n\nexport type SlackProcessableInboundMessage = Record<string, unknown> & {\n user?: string;\n bot_id?: string;\n ts: string;\n};\n\nexport function isProcessableSlackInboundMessage(\n rawMessage: Record<string, unknown>,\n): rawMessage is SlackProcessableInboundMessage {\n if (\n (!isNonEmptyString(rawMessage.user) &&\n !isNonEmptyString(rawMessage.bot_id)) ||\n !isNonEmptyString(rawMessage.ts) ||\n rawMessage.hidden === true\n ) {\n return false;\n }\n const subtype = isNonEmptyString(rawMessage.subtype)\n ? rawMessage.subtype\n : null;\n if (!subtype) {\n return true;\n }\n if (IGNORED_SLACK_MESSAGE_SUBTYPES.has(subtype)) {\n return false;\n }\n return !(\n WRAPPER_SLACK_MESSAGE_SUBTYPES.has(subtype) &&\n asRecord(rawMessage.message) !== null\n );\n}\n\nexport function slackTimestampToMillis(timestamp: string): number {\n return Math.round(Number.parseFloat(timestamp) * 1000);\n}\n\nexport function resolveSlackChatType(chatId: string): \"direct\" | \"channel\" {\n return chatId.startsWith(\"D\") ? \"direct\" : \"channel\";\n}\n\nexport function resolveSlackOutboundThreadTs(params: {\n chatId: string;\n threadId?: string | null;\n replyToMessageId?: string | null;\n}): string | undefined {\n if (resolveSlackChatType(params.chatId) === \"direct\") {\n return firstNonEmptyString(params.threadId);\n }\n return firstNonEmptyString(params.threadId, params.replyToMessageId);\n}\n\nexport function asSlackBlocks(\n blocks: unknown[] | undefined,\n): SlackBlock[] | undefined {\n return Array.isArray(blocks) ? (blocks as SlackBlock[]) : undefined;\n}\n\nexport function getSlackActionRecord(\n action: unknown,\n body: unknown,\n): Record<string, unknown> | null {\n const directAction = asRecord(action);\n if (directAction) {\n return directAction;\n }\n const actions = asRecord(body)?.actions;\n return Array.isArray(actions) ? asRecord(actions[0]) : null;\n}\n\nexport function resolveSlackActionChannelId(body: unknown): string | null {\n const bodyRecord = asRecord(body);\n const channel = asRecord(bodyRecord?.channel);\n const container = asRecord(bodyRecord?.container);\n return firstNonEmptyString(channel?.id, container?.channel_id) ?? null;\n}\n\nexport function resolveSlackActionThreadId(body: unknown): string | null {\n const bodyRecord = asRecord(body);\n const container = asRecord(bodyRecord?.container);\n const message = asRecord(bodyRecord?.message);\n return firstNonEmptyString(container?.thread_ts, message?.thread_ts) ?? null;\n}\n\nexport function resolveSlackActionMessageId(body: unknown): string | undefined {\n const bodyRecord = asRecord(body);\n const container = asRecord(bodyRecord?.container);\n const message = asRecord(bodyRecord?.message);\n return firstNonEmptyString(container?.message_ts, message?.ts);\n}\n\nexport function resolveSlackActionUser(body: unknown): {\n id: string | null;\n name?: string;\n teamId?: string;\n} {\n const user = asRecord(asRecord(body)?.user);\n return {\n id: firstNonEmptyString(user?.id) ?? null,\n name: firstNonEmptyString(user?.name, user?.username, user?.id),\n teamId: firstNonEmptyString(user?.team_id),\n };\n}\n\nexport function resolveSlackSourceThreadTs(\n source: ChannelTurnSource,\n): string | undefined {\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n return firstNonEmptyString(source.threadId);\n }\n return firstNonEmptyString(source.threadId, source.messageId);\n}\n\nexport function resolveSlackProgressThreadTs(\n source: ChannelTurnSource,\n): string | undefined {\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n return firstNonEmptyString(source.threadId, source.messageId);\n }\n return resolveSlackSourceThreadTs(source);\n}\n\nexport function normalizeSlackReactionName(value: string): string {\n return value.trim().replace(/^:+|:+$/g, \"\");\n}\n\nexport function resolveSlackUserDisplayName(\n userInfo: unknown,\n): string | undefined {\n const user = asRecord(asRecord(userInfo)?.user);\n const profile = asRecord(user?.profile);\n return firstNonEmptyString(\n profile?.display_name,\n profile?.real_name,\n user?.real_name,\n user?.name,\n );\n}\n\nexport function hasSlackMention(text: string, userId: string | null): boolean {\n return (\n isNonEmptyString(text) &&\n isNonEmptyString(userId) &&\n (text.includes(`<@${userId}>`) || text.includes(`<@${userId}|`))\n );\n}\n\nexport function isSlackFlatChannelThreadOpener(\n source: ChannelTurnSource,\n): boolean {\n return (\n source.chatType === \"channel\" &&\n isNonEmptyString(source.messageId) &&\n (!isNonEmptyString(source.threadId) || source.threadId === source.messageId)\n );\n}\n",
|
|
11
12
|
"import {\n buildModelEntriesByHandle,\n type ChannelModelListEntry,\n getFallbackModelEntries,\n resolveModelHandles,\n} from \"@/channels/command-runtime-executor\";\nimport type { ChannelModelPickerData } from \"@/channels/types\";\nimport { asRecord, firstNonEmptyString, getSlackActionRecord } from \"./utils\";\n\nconst SLACK_MODEL_PICKER_OPTION_LIMIT = 100;\nconst SLACK_MODEL_OPTION_TEXT_LIMIT = 75;\nconst SLACK_MODEL_OPTION_VALUE_LIMIT = 75;\n\nexport const SLACK_MODEL_SELECT_ACTION_ID = \"letta_channel_model_select\";\n\nexport function resolveSlackSelectedModel(\n action: unknown,\n body: unknown,\n): string | null {\n const actionRecord = getSlackActionRecord(action, body);\n const selectedOption = asRecord(actionRecord?.selected_option);\n return (\n firstNonEmptyString(selectedOption?.value, actionRecord?.value) ?? null\n );\n}\n\ntype SlackModelOption = {\n text: { type: \"plain_text\"; text: string; emoji?: boolean };\n value: string;\n description?: { type: \"plain_text\"; text: string; emoji?: boolean };\n};\n\nfunction escapeSlackMrkdwn(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction truncateSlackPlainText(text: string, limit: number): string {\n if (text.length <= limit) {\n return text;\n }\n return `${text.slice(0, Math.max(0, limit - 3)).trimEnd()}...`;\n}\n\nfunction getSlackModelOptionValue(entry: ChannelModelListEntry): string | null {\n const candidates = [entry.id, entry.handle].filter(\n (value): value is string => typeof value === \"string\" && value.length > 0,\n );\n return (\n candidates.find(\n (value) => value.length <= SLACK_MODEL_OPTION_VALUE_LIMIT,\n ) ?? null\n );\n}\n\nfunction buildSlackModelOption(\n entry: ChannelModelListEntry,\n): SlackModelOption | null {\n const value = getSlackModelOptionValue(entry);\n if (!value) {\n return null;\n }\n\n const labelText =\n entry.handle === entry.label\n ? entry.label\n : `${entry.label} - ${entry.handle}`;\n const option: SlackModelOption = {\n text: {\n type: \"plain_text\",\n text: truncateSlackPlainText(labelText, SLACK_MODEL_OPTION_TEXT_LIMIT),\n emoji: true,\n },\n value,\n };\n if (entry.description) {\n option.description = {\n type: \"plain_text\",\n text: truncateSlackPlainText(\n entry.description,\n SLACK_MODEL_OPTION_TEXT_LIMIT,\n ),\n emoji: true,\n };\n }\n return option;\n}\n\n/**\n * Renders generic channel model-picker data as Slack Block Kit blocks.\n * Slack-specific rendering lives here so the shared channel/listener layers\n * stay vendor-neutral.\n */\nexport function buildSlackModelPickerBlocks(\n params: ChannelModelPickerData,\n): unknown[] | undefined {\n const entries = params.entries as ChannelModelListEntry[];\n const byHandle = buildModelEntriesByHandle(entries);\n const availableHandleList = Array.isArray(params.availableHandles)\n ? params.availableHandles\n : null;\n const availableSet = availableHandleList\n ? new Set(availableHandleList)\n : null;\n const recentEntries = resolveModelHandles({\n handles: params.recentHandles ?? [],\n byHandle,\n availableHandles: availableSet,\n });\n const availableEntries = availableHandleList\n ? resolveModelHandles({ handles: availableHandleList, byHandle })\n : getFallbackModelEntries(byHandle);\n const optionEntries = [...recentEntries, ...availableEntries];\n const options: SlackModelOption[] = [];\n const seenValues = new Set<string>();\n for (const entry of optionEntries) {\n const option = buildSlackModelOption(entry);\n if (!option || seenValues.has(option.value)) {\n continue;\n }\n seenValues.add(option.value);\n options.push(option);\n if (options.length >= SLACK_MODEL_PICKER_OPTION_LIMIT) {\n break;\n }\n }\n\n if (options.length === 0) {\n return undefined;\n }\n\n const currentScope =\n params.current.scope === \"agent\" ? \"agent\" : \"conversation\";\n const currentHandleText = params.current.modelHandle\n ? `\\nHandle: ${escapeSlackMrkdwn(params.current.modelHandle)}`\n : \"\";\n const currentHandle = params.current.modelHandle;\n const initialOption = options.find((option) => {\n const entry = optionEntries.find(\n (candidate) =>\n candidate.id === option.value || candidate.handle === option.value,\n );\n return currentHandle\n ? entry?.handle === currentHandle || option.value === currentHandle\n : false;\n });\n\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*Current ${currentScope} model:* ${escapeSlackMrkdwn(params.current.modelLabel)}${currentHandleText}`,\n },\n },\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: \"Choose a model for this routed conversation:\",\n },\n },\n {\n type: \"actions\",\n elements: [\n {\n type: \"static_select\",\n action_id: SLACK_MODEL_SELECT_ACTION_ID,\n placeholder: {\n type: \"plain_text\",\n text: \"Select a model\",\n emoji: true,\n },\n options,\n ...(initialOption ? { initial_option: initialOption } : {}),\n },\n ],\n },\n {\n type: \"context\",\n elements: [\n {\n type: \"mrkdwn\",\n text: \"Need another handle? Mention the app with `@agent /model <handle-or-id>`.\",\n },\n ],\n },\n ];\n}\n",
|
|
12
13
|
"export type AgentBackendMode = \"local\" | \"api\";\n\nexport function isLocalAgentId(agentId: string): boolean {\n return agentId.startsWith(\"agent-local-\");\n}\n\nexport function isCloudAgentId(agentId: string): boolean {\n return !isLocalAgentId(agentId);\n}\n\nexport function isAgentIdCompatibleWithBackend(\n agentId: string,\n backendMode: AgentBackendMode,\n): boolean {\n return backendMode === \"local\"\n ? isLocalAgentId(agentId)\n : isCloudAgentId(agentId);\n}\n",
|
|
13
14
|
"const CONVERSATION_BUSY_ERROR_PATTERNS = [\n /another request is (?:currently )?(?:being )?processed/i,\n /currently being processed for this conversation/i,\n /busy with another active run/i,\n /already processing for this conversation/i,\n /turn still running/i,\n];\n\nexport const CONVERSATION_BUSY_TITLE = \"Turn still running\";\n\nexport function isConversationBusyErrorText(\n errorText: string | null | undefined,\n): boolean {\n if (!errorText) return false;\n return CONVERSATION_BUSY_ERROR_PATTERNS.some((pattern) =>\n pattern.test(errorText),\n );\n}\n\nexport function buildConversationBusyErrorBody(\n automaticRetry: boolean,\n): string {\n return automaticRetry\n ? \"Another request is already processing for this conversation. I’ll wait for it to finish and retry automatically.\"\n : \"Another request is already processing for this conversation. Please wait for it to finish, then try again.\";\n}\n\nexport function formatConversationBusyErrorMessage(options: {\n automaticRetry?: boolean;\n runId?: string;\n}): string {\n const lines = [\n CONVERSATION_BUSY_TITLE,\n buildConversationBusyErrorBody(options.automaticRetry ?? false),\n ];\n if (options.runId) {\n lines.push(\"\", `Run ID: ${options.runId}`);\n }\n return lines.join(\"\\n\");\n}\n",
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
"import type { OutboundChannelMessage } from \"@/channels/types\";\nimport {\n buildSlackChatFootnote,\n buildSlackReplyBlocksWithFootnote,\n} from \"./presentation\";\nimport {\n normalizeSlackReactionName,\n resolveSlackOutboundThreadTs,\n} from \"./public-utils\";\n\nexport interface SlackSenderPostMessageParams {\n channel: string;\n text: string;\n threadTs?: string;\n blocks?: unknown[];\n}\n\nexport interface SlackSenderPostMessageResult {\n messageId: string;\n}\n\nexport interface SlackSenderMessageResult {\n messageId: string;\n}\n\nexport interface SlackSenderReactionParams {\n channel: string;\n timestamp: string;\n name: string;\n}\n\nexport interface SlackSenderClient {\n postMessage(\n params: SlackSenderPostMessageParams,\n ): Promise<SlackSenderPostMessageResult>;\n addReaction?(params: SlackSenderReactionParams): Promise<void>;\n removeReaction?(params: SlackSenderReactionParams): Promise<void>;\n}\n\nexport interface SlackChannelSender {\n sendMessage(\n message: OutboundChannelMessage,\n ): Promise<SlackSenderMessageResult>;\n sendDirectReply(params: SlackDirectReplyParams): Promise<void>;\n}\n\nexport interface SlackDirectReplyParams {\n chatId: string;\n text: string;\n replyToMessageId?: string;\n threadId?: string | null;\n blocks?: unknown[];\n}\n\nexport interface CreateSlackChannelSenderParams {\n client: SlackSenderClient;\n}\n\nasync function sendSlackReaction(\n client: SlackSenderClient,\n message: OutboundChannelMessage,\n): Promise<SlackSenderMessageResult> {\n const targetMessageId = message.targetMessageId ?? message.replyToMessageId;\n if (!targetMessageId) {\n throw new Error(\n \"Slack reactions require message_id (or reply_to_message_id) to identify the target message.\",\n );\n }\n const name = normalizeSlackReactionName(message.reaction ?? \"\");\n if (!name) {\n throw new Error(\"Slack reaction emoji cannot be empty.\");\n }\n const params: SlackSenderReactionParams = {\n channel: message.chatId,\n timestamp: targetMessageId,\n name,\n };\n if (message.removeReaction) {\n if (!client.removeReaction) {\n throw new Error(\n \"Slack sender client does not support removing reactions.\",\n );\n }\n await client.removeReaction(params);\n } else {\n if (!client.addReaction) {\n throw new Error(\"Slack sender client does not support adding reactions.\");\n }\n await client.addReaction(params);\n }\n return { messageId: targetMessageId };\n}\n\nfunction buildSlackOutboundBlocks(\n message: OutboundChannelMessage,\n): unknown[] | undefined {\n if (!message.agentId || !message.conversationId) {\n return undefined;\n }\n\n const footnote = buildSlackChatFootnote({\n agentId: message.agentId,\n conversationId: message.conversationId,\n });\n if (!footnote) {\n return undefined;\n }\n\n return buildSlackReplyBlocksWithFootnote(message.text, footnote);\n}\n\nexport function createSlackChannelSender(\n params: CreateSlackChannelSenderParams,\n): SlackChannelSender {\n const { client } = params;\n return {\n async sendMessage(\n message: OutboundChannelMessage,\n ): Promise<SlackSenderMessageResult> {\n if (message.reaction) {\n return await sendSlackReaction(client, message);\n }\n const threadTs = resolveSlackOutboundThreadTs({\n chatId: message.chatId,\n threadId: message.threadId,\n replyToMessageId: message.replyToMessageId,\n });\n const blocks = buildSlackOutboundBlocks(message);\n return await client.postMessage({\n channel: message.chatId,\n text: message.text,\n ...(blocks ? { blocks } : {}),\n ...(threadTs ? { threadTs } : {}),\n });\n },\n\n async sendDirectReply(params: SlackDirectReplyParams): Promise<void> {\n const threadTs = resolveSlackOutboundThreadTs({\n chatId: params.chatId,\n threadId: params.threadId,\n replyToMessageId: params.replyToMessageId,\n });\n await client.postMessage({\n channel: params.chatId,\n text: params.text,\n ...(params.blocks ? { blocks: params.blocks } : {}),\n ...(threadTs ? { threadTs } : {}),\n });\n },\n };\n}\n",
|
|
19
20
|
"import type {\n ChannelTurnSource,\n OutboundChannelMessage,\n} from \"@/channels/types\";\nimport {\n firstNonEmptyString,\n isNonEmptyString,\n resolveSlackChatType,\n resolveSlackProgressThreadTs,\n resolveSlackSourceThreadTs,\n} from \"./public-utils\";\n\nconst SLACK_ASSISTANT_STATUS_KEEPALIVE_MS = 90_000;\n\nexport interface SlackStatusWriteClient {\n assistant?: {\n threads?: {\n setStatus?: (args: {\n channel_id: string;\n thread_ts: string;\n status: string;\n loading_messages?: string[];\n }) => Promise<unknown>;\n };\n };\n}\n\nexport type AgentConvSlackState = {\n isThinkingActive: boolean;\n thinkingText: string;\n typingFooterText: string;\n};\n\nexport type SlackStatusController = {\n getUniqueSources: (sources: ChannelTurnSource[]) => ChannelTurnSource[];\n getLifecycleErrorReplyKey: (source: ChannelTurnSource) => string | null;\n activate: (\n source: ChannelTurnSource,\n footerText: string,\n loadingText: string,\n ) => Promise<void>;\n deactivate: (source: ChannelTurnSource) => Promise<void>;\n clearStale: (source: ChannelTurnSource) => Promise<void>;\n markAutoCleared: (source: ChannelTurnSource) => void;\n markAutoClearedForMessage: (\n msg: Pick<\n OutboundChannelMessage,\n \"agentId\" | \"conversationId\" | \"chatId\" | \"threadId\" | \"replyToMessageId\"\n >,\n ) => void;\n activeSources: () => ChannelTurnSource[];\n clear: () => void;\n};\n\nexport function createSlackStatusController(params: {\n ensureApp: () => Promise<unknown>;\n ensureWriteClient: () => Promise<SlackStatusWriteClient>;\n resolveKnownThreadRoot: (messageId: string) => string;\n}): SlackStatusController {\n const stateByConversation = new Map<string, AgentConvSlackState>();\n const sourceByConversation = new Map<string, ChannelTurnSource>();\n const signatureByConversation = new Map<string, string>();\n const writePromiseByConversation = new Map<string, Promise<void>>();\n const keepaliveByConversation = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n const clearedStaleReplyKeys = new Set<string>();\n\n function getConversationKey(source: ChannelTurnSource): string | null {\n return source.channel === \"slack\" &&\n isNonEmptyString(source.agentId) &&\n isNonEmptyString(source.conversationId)\n ? `${source.agentId}:${source.conversationId}`\n : null;\n }\n\n function getLifecycleReplyKey(source: ChannelTurnSource): string | null {\n if (source.channel !== \"slack\" || !isNonEmptyString(source.chatId)) {\n return null;\n }\n const replyToMessageId = resolveSlackProgressThreadTs(source);\n return isNonEmptyString(replyToMessageId)\n ? `${source.chatId}:${replyToMessageId}`\n : null;\n }\n\n function getLifecycleErrorReplyKey(source: ChannelTurnSource): string | null {\n if (source.channel !== \"slack\" || !isNonEmptyString(source.chatId)) {\n return null;\n }\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n const replyToMessageId = resolveSlackSourceThreadTs(source);\n return isNonEmptyString(replyToMessageId)\n ? `${source.chatId}:${replyToMessageId}`\n : `${source.chatId}:direct`;\n }\n return getLifecycleReplyKey(source);\n }\n\n function getUniqueSources(sources: ChannelTurnSource[]): ChannelTurnSource[] {\n const seen = new Set<string>();\n const unique: ChannelTurnSource[] = [];\n for (const source of sources) {\n const key = getConversationKey(source);\n if (!key || seen.has(key) || !getLifecycleReplyKey(source)) continue;\n seen.add(key);\n unique.push(source);\n }\n return unique;\n }\n\n function clearKeepalive(key: string): void {\n const timer = keepaliveByConversation.get(key);\n if (timer) {\n clearTimeout(timer);\n keepaliveByConversation.delete(key);\n }\n }\n\n async function writeStatus(\n source: ChannelTurnSource,\n footerText: string,\n loadingText: string,\n options: { force?: boolean } = {},\n ): Promise<boolean> {\n const stateKey = getConversationKey(source);\n const replyKey = getLifecycleReplyKey(source);\n const threadTs = resolveSlackProgressThreadTs(source);\n if (!stateKey || !replyKey || !threadTs) return false;\n\n const signature = `${footerText}\\n${loadingText}`;\n if (!options.force && signatureByConversation.get(stateKey) === signature) {\n return true;\n }\n\n await params.ensureApp();\n const slackClient = await params.ensureWriteClient();\n const setStatus = slackClient.assistant?.threads?.setStatus;\n if (!setStatus) return false;\n\n signatureByConversation.set(stateKey, signature);\n const previous =\n writePromiseByConversation.get(stateKey) ?? Promise.resolve();\n const operation = previous.then(async () => {\n try {\n await setStatus.call(slackClient.assistant?.threads, {\n channel_id: source.chatId,\n thread_ts: threadTs,\n status: footerText,\n ...(footerText ? { loading_messages: [loadingText] } : {}),\n });\n if (footerText) clearedStaleReplyKeys.delete(replyKey);\n else clearedStaleReplyKeys.add(replyKey);\n return true;\n } catch (error) {\n if (signatureByConversation.get(stateKey) === signature) {\n signatureByConversation.delete(stateKey);\n }\n console.warn(\n \"[Slack] Failed to update assistant thread status:\",\n error instanceof Error ? error.message : error,\n );\n return false;\n }\n });\n const settled = operation.then(() => undefined);\n writePromiseByConversation.set(stateKey, settled);\n void settled.then(() => {\n if (writePromiseByConversation.get(stateKey) === settled) {\n writePromiseByConversation.delete(stateKey);\n }\n });\n return operation;\n }\n\n function scheduleKeepalive(key: string): void {\n clearKeepalive(key);\n const timer = setTimeout(() => {\n keepaliveByConversation.delete(key);\n void (async () => {\n const state = stateByConversation.get(key);\n const source = sourceByConversation.get(key);\n if (!state?.isThinkingActive || !source) return;\n await writeStatus(source, state.typingFooterText, state.thinkingText, {\n force: true,\n });\n if (state.isThinkingActive) scheduleKeepalive(key);\n })();\n }, SLACK_ASSISTANT_STATUS_KEEPALIVE_MS);\n timer.unref?.();\n keepaliveByConversation.set(key, timer);\n }\n\n async function activate(\n source: ChannelTurnSource,\n footerText: string,\n loadingText: string,\n ): Promise<void> {\n const key = getConversationKey(source);\n if (!key || !getLifecycleReplyKey(source)) return;\n const state = stateByConversation.get(key) ?? {\n isThinkingActive: false,\n thinkingText: \"\",\n typingFooterText: \"\",\n };\n if (\n state.isThinkingActive &&\n state.thinkingText === loadingText &&\n state.typingFooterText === footerText\n ) {\n sourceByConversation.set(key, source);\n return;\n }\n state.isThinkingActive = true;\n state.thinkingText = loadingText;\n state.typingFooterText = footerText;\n stateByConversation.set(key, state);\n sourceByConversation.set(key, source);\n const sent = await writeStatus(source, footerText, loadingText);\n if (sent && state.isThinkingActive) scheduleKeepalive(key);\n else if (!sent) state.isThinkingActive = false;\n }\n\n function markAutoClearedByKey(key: string): void {\n clearKeepalive(key);\n const state = stateByConversation.get(key);\n if (state) state.isThinkingActive = false;\n signatureByConversation.delete(key);\n sourceByConversation.delete(key);\n }\n\n async function deactivate(source: ChannelTurnSource): Promise<void> {\n const key = getConversationKey(source);\n if (!key) return;\n clearKeepalive(key);\n const state = stateByConversation.get(key);\n if (state) state.isThinkingActive = false;\n signatureByConversation.delete(key);\n sourceByConversation.delete(key);\n await writeStatus(source, \"\", \"\", { force: true });\n signatureByConversation.delete(key);\n stateByConversation.delete(key);\n }\n\n async function clearStale(source: ChannelTurnSource): Promise<void> {\n const key = getConversationKey(source);\n const replyKey = getLifecycleReplyKey(source);\n if (\n !key ||\n !replyKey ||\n stateByConversation.get(key)?.isThinkingActive ||\n clearedStaleReplyKeys.has(replyKey)\n ) {\n return;\n }\n await writeStatus(source, \"\", \"\", { force: true });\n signatureByConversation.delete(key);\n }\n\n return {\n getUniqueSources,\n getLifecycleErrorReplyKey,\n activate,\n deactivate,\n clearStale,\n markAutoCleared(source): void {\n const key = getConversationKey(source);\n if (key) markAutoClearedByKey(key);\n },\n markAutoClearedForMessage(msg): void {\n if (\n isNonEmptyString(msg.agentId) &&\n isNonEmptyString(msg.conversationId)\n ) {\n markAutoClearedByKey(`${msg.agentId}:${msg.conversationId}`);\n return;\n }\n const anchor = firstNonEmptyString(msg.threadId, msg.replyToMessageId);\n if (!anchor) return;\n const root = params.resolveKnownThreadRoot(anchor);\n for (const [key, source] of sourceByConversation) {\n if (\n source.chatId === msg.chatId &&\n resolveSlackProgressThreadTs(source) === root\n ) {\n markAutoClearedByKey(key);\n }\n }\n },\n activeSources: () => Array.from(sourceByConversation.values()),\n clear(): void {\n for (const timer of keepaliveByConversation.values()) clearTimeout(timer);\n stateByConversation.clear();\n sourceByConversation.clear();\n signatureByConversation.clear();\n writePromiseByConversation.clear();\n keepaliveByConversation.clear();\n clearedStaleReplyKeys.clear();\n },\n };\n}\n"
|
|
20
21
|
],
|
|
21
|
-
"mappings": "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",
|
|
22
|
-
"debugId": "
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "00F2BC6B76D5D4FA64756E2164756E21",
|
|
23
24
|
"names": []
|
|
24
25
|
}
|
package/dist/gateway-core.js
CHANGED
|
@@ -1514,6 +1514,38 @@ class ChannelGateway {
|
|
|
1514
1514
|
});
|
|
1515
1515
|
});
|
|
1516
1516
|
}
|
|
1517
|
+
async publishRuntimeTools(runtime, sources = []) {
|
|
1518
|
+
return await this.enqueueRegistration(async () => {
|
|
1519
|
+
if (this.states.has(runtimeKey(runtime)))
|
|
1520
|
+
return false;
|
|
1521
|
+
const tool = await this.hooks.buildExternalTool(runtime, sources);
|
|
1522
|
+
const response = await this.client.runtimeExternalToolsUpdate({
|
|
1523
|
+
updates: [
|
|
1524
|
+
{
|
|
1525
|
+
runtimes: [runtime],
|
|
1526
|
+
external_tools: tool ? [{ tools: [tool] }] : []
|
|
1527
|
+
}
|
|
1528
|
+
]
|
|
1529
|
+
});
|
|
1530
|
+
if (!response.success) {
|
|
1531
|
+
throw new Error(response.error ?? "Failed to publish channel runtime tools");
|
|
1532
|
+
}
|
|
1533
|
+
return tool !== null;
|
|
1534
|
+
});
|
|
1535
|
+
}
|
|
1536
|
+
async releaseRuntimeTools(runtime, routedSources = []) {
|
|
1537
|
+
await this.enqueueRegistration(async () => {
|
|
1538
|
+
if (routedSources.length > 0 || this.states.has(runtimeKey(runtime))) {
|
|
1539
|
+
return;
|
|
1540
|
+
}
|
|
1541
|
+
const response = await this.client.runtimeExternalToolsUpdate({
|
|
1542
|
+
updates: [{ runtimes: [runtime], external_tools: [] }]
|
|
1543
|
+
});
|
|
1544
|
+
if (!response.success) {
|
|
1545
|
+
throw new Error(response.error ?? "Failed to release channel runtime tools");
|
|
1546
|
+
}
|
|
1547
|
+
});
|
|
1548
|
+
}
|
|
1517
1549
|
async submitApprovalResponse(runtime, response) {
|
|
1518
1550
|
const result = await this.client.submitInput({
|
|
1519
1551
|
runtime,
|
|
@@ -2790,9 +2822,7 @@ No external channel adapters are currently running.`;
|
|
|
2790
2822
|
const channelList = discovery.displayNames.join(", ");
|
|
2791
2823
|
const actionList = discovery.actions.join(", ");
|
|
2792
2824
|
const hasAction = (action) => discovery.actions.includes(action);
|
|
2793
|
-
const scopedReplyContract = scoped ? `
|
|
2794
|
-
|
|
2795
|
-
This tool is currently scoped to a routed external channel turn. Plain assistant text is not delivered to that external user. If a user-visible reply is appropriate, your final action for the turn must be one MessageChannel call with action="send", channel from the notification, chat_id from the notification, and message containing the reply. If no user-visible response is appropriate, do not call MessageChannel and do not send an empty acknowledgement. For lightweight acknowledgement, prefer action="react" when supported. If the useful response belongs later, schedule the follow-up instead of sending a placeholder.` : "";
|
|
2825
|
+
const scopedReplyContract = scoped ? '\n\nThis tool is currently scoped to a routed external channel turn. Plain assistant text is not delivered to that external user. If a user-visible reply is appropriate, your final action for the turn must be one MessageChannel call with action="send", channel from the notification, chat_id from the notification, and message containing the reply. After that final send succeeds, do not repeat or paraphrase the sent message in assistant text; finish with only `Sent.` as the internal confirmation. This does not apply to a short acknowledgement sent before continuing substantive work. If no user-visible response is appropriate, do not call MessageChannel and do not send an empty acknowledgement. For lightweight acknowledgement, prefer action="react" when supported. If the useful response belongs later, schedule the follow-up instead of sending a placeholder.' : "";
|
|
2796
2826
|
const slackWorkAcknowledgement = discovery.activeChannels.includes("slack") ? `
|
|
2797
2827
|
|
|
2798
2828
|
For Slack requests that require nontrivial work or several tool calls, send one short MessageChannel call with action="send" before starting other tools. This gives the Slack user verbal acknowledgement and a View in web link. Do not do this for no-ops, reaction-only responses, or simple no-tool answers.` : "";
|
|
@@ -2859,4 +2889,4 @@ export {
|
|
|
2859
2889
|
ChannelControlRequestCoordinator
|
|
2860
2890
|
};
|
|
2861
2891
|
|
|
2862
|
-
//# debugId=
|
|
2892
|
+
//# debugId=FBABF69C753E1EA864756E2164756E21
|