Skip to content

Commit f674bec

Browse files
authored
fix: Slack createMessageFromEvent event types (#66)
1 parent a11dba5 commit f674bec

File tree

2 files changed

+59
-10
lines changed

2 files changed

+59
-10
lines changed

packages/blink/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "blink",
3-
"version": "1.1.25",
3+
"version": "1.1.26",
44
"description": "Blink is a tool for building and deploying AI agents.",
55
"type": "module",
66
"bin": {

packages/slack/src/message.ts

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type {
22
AnyBlock,
3-
AppMentionEvent,
3+
// AppMentionEvent,
44
GenericMessageEvent,
55
RichTextChannelMention,
66
RichTextTeamMention,
@@ -16,6 +16,7 @@ import type {
1616
} from "@slack/web-api";
1717
import type { AssistantAppThreadBlock } from "@slack/web-api/dist/types/response/ChatPostMessageResponse";
1818
import type { UIMessage } from "ai";
19+
import type { KnownEventFromType } from "@slack/bolt";
1920

2021
/**
2122
* Helps LLMs format messages for Slack.
@@ -76,18 +77,29 @@ NEVER USE:
7677
- Double asterisks (**text**) - Slack doesn't support this
7778
- Standard markdown bold/italic conventions`;
7879

80+
/**
81+
* These are the Slack event types that we currently support for automatically creating messages from events.
82+
* The list is not exhaustive - we may want to add more in the future.
83+
*/
84+
type SlackEventType =
85+
| "app_mention"
86+
| "assistant_thread_started"
87+
| "file_shared"
88+
| "link_shared"
89+
| "member_joined_channel"
90+
| "message"
91+
| "reaction_added"
92+
| "reaction_removed";
93+
7994
/**
8095
* CreateMessageFromEventOptions extends ExtractMessageDetailsFromEventOptions.
8196
*
8297
* It exists so we can add options in the future.
8398
* Feel free to use `extractMessageDetailsFromEvent` to construct your own message.
8499
*/
85100
export interface CreateMessageFromEventOptions
86-
extends Omit<
87-
ExtractMessagesMetadataOptions<GenericMessageEvent | AppMentionEvent>,
88-
"messages"
89-
> {
90-
event: GenericMessageEvent | AppMentionEvent;
101+
extends Omit<ExtractMessagesMetadataOptions<SlackEventType>, "messages"> {
102+
event: KnownEventFromType<SlackEventType>;
91103
}
92104

93105
export interface CreateMessageFromEventResult {
@@ -105,7 +117,10 @@ export interface CreateMessageFromEventResult {
105117
export const createMessageFromEvent = async (
106118
options: CreateMessageFromEventOptions
107119
): Promise<CreateMessageFromEventResult> => {
108-
const id = options.event.client_msg_id ?? crypto.randomUUID();
120+
const id =
121+
("client_msg_id" in options.event
122+
? options.event.client_msg_id
123+
: undefined) ?? crypto.randomUUID();
109124

110125
const [botInfo, [response]] = await Promise.all([
111126
options.client.auth
@@ -122,7 +137,10 @@ export const createMessageFromEvent = async (
122137
messages: [
123138
{
124139
...options.event,
125-
files: options.event.files as GenericMessageEvent["files"],
140+
files:
141+
"files" in options.event
142+
? (options.event.files as GenericMessageEvent["files"])
143+
: undefined,
126144
},
127145
],
128146
supportedFileTypes: options.supportedFileTypes,
@@ -132,10 +150,41 @@ export const createMessageFromEvent = async (
132150
if (!response) {
133151
throw new Error("Failed to extract message metadata");
134152
}
153+
let message: CreatePartsFromMessageMetadataOptions["message"];
154+
switch (options.event.type) {
155+
case "assistant_thread_started":
156+
message = {
157+
channel: options.event.assistant_thread.channel_id,
158+
thread_ts: options.event.assistant_thread.thread_ts,
159+
ts: options.event.event_ts,
160+
};
161+
break;
162+
case "file_shared":
163+
message = {
164+
channel: options.event.channel_id,
165+
ts: options.event.event_ts,
166+
};
167+
break;
168+
case "reaction_added":
169+
message = {
170+
channel: options.event.item.channel,
171+
ts: options.event.event_ts,
172+
};
173+
break;
174+
case "reaction_removed":
175+
message = {
176+
channel: options.event.item.channel,
177+
ts: options.event.event_ts,
178+
};
179+
break;
180+
default:
181+
message = options.event;
182+
break;
183+
}
135184
const parts = createPartsFromMessageMetadata({
136185
metadata: response.metadata,
137186
botUserId: botInfo?.user_id,
138-
message: options.event,
187+
message,
139188
});
140189

141190
return {

0 commit comments

Comments
 (0)