From fb20bbe5bf96e239cd854dd6b36e6d6d4f1f654f Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Tue, 25 Mar 2025 22:58:59 +0100 Subject: [PATCH] Allow slack bots to initiate conversations Signed-off-by: Ettore Di Giacinto --- core/agent/agent.go | 12 +++++++++++- services/connectors/slack.go | 25 ++++++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/agent/agent.go b/core/agent/agent.go index 45c010e..5780bf9 100644 --- a/core/agent/agent.go +++ b/core/agent/agent.go @@ -41,6 +41,7 @@ type Agent struct { mcpActions types.Actions + subscriberMutex sync.Mutex newMessagesSubscribers []func(openai.ChatCompletionMessage) } @@ -118,7 +119,10 @@ func (a *Agent) startNewConversationsConsumer() { return case msg := <-a.newConversations: - for _, s := range a.newMessagesSubscribers { + a.subscriberMutex.Lock() + subs := a.newMessagesSubscribers + a.subscriberMutex.Unlock() + for _, s := range subs { s(msg) } } @@ -126,6 +130,12 @@ func (a *Agent) startNewConversationsConsumer() { }() } +func (a *Agent) AddSubscriber(f func(openai.ChatCompletionMessage)) { + a.subscriberMutex.Lock() + defer a.subscriberMutex.Unlock() + a.newMessagesSubscribers = append(a.newMessagesSubscribers, f) +} + // StopAction stops the current action // if any. Can be called before adding a new job. func (a *Agent) StopAction() { diff --git a/services/connectors/slack.go b/services/connectors/slack.go index fd0f436..ab6e683 100644 --- a/services/connectors/slack.go +++ b/services/connectors/slack.go @@ -642,6 +642,11 @@ func (t *Slack) handleMention( } func (t *Slack) Start(a *agent.Agent) { + postMessageParams := slack.PostMessageParameters{ + LinkNames: 1, + Markdown: true, + } + api := slack.New( t.botToken, // slack.OptionDebug(true), @@ -649,13 +654,23 @@ func (t *Slack) Start(a *agent.Agent) { slack.OptionAppLevelToken(t.appToken), ) - t.apiClient = api - - postMessageParams := slack.PostMessageParameters{ - LinkNames: 1, - Markdown: true, + if t.channelID != "" { + // handle new conversations + a.AddSubscriber(func(ccm openai.ChatCompletionMessage) { + _, _, err := api.PostMessage(t.channelID, + slack.MsgOptionLinkNames(true), + slack.MsgOptionEnableLinkUnfurl(), + slack.MsgOptionText(ccm.Content, true), + slack.MsgOptionPostMessageParameters(postMessageParams), + ) + if err != nil { + xlog.Error(fmt.Sprintf("Error posting message: %v", err)) + } + }) } + t.apiClient = api + client := socketmode.New( api, //socketmode.OptionDebug(true),