11import type {
22 AnyBlock ,
3- AppMentionEvent ,
3+ // AppMentionEvent,
44 GenericMessageEvent ,
55 RichTextChannelMention ,
66 RichTextTeamMention ,
@@ -16,6 +16,7 @@ import type {
1616} from "@slack/web-api" ;
1717import type { AssistantAppThreadBlock } from "@slack/web-api/dist/types/response/ChatPostMessageResponse" ;
1818import 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 */
85100export 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
93105export interface CreateMessageFromEventResult {
@@ -105,7 +117,10 @@ export interface CreateMessageFromEventResult {
105117export 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