Skip to content

Commit 733afb6

Browse files
committed
feat(slack): add channel reaction feedback
1 parent 49ddd02 commit 733afb6

15 files changed

Lines changed: 1203 additions & 8 deletions

api/channel_installation_config.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
openclawConfigEnvName = "OPENCLAW_CONFIG_JSON"
1919
openclawConfigB64EnvName = "OPENCLAW_CONFIG_B64"
2020
openclawConfigFileEnvName = "OPENCLAW_CONFIG_FILE"
21+
openclawEyesReaction = "\U0001F440"
2122
)
2223

2324
type channelInstallationConfigPayload struct {
@@ -148,6 +149,45 @@ func defaultOpenClawConfig() map[string]any {
148149
"headless": true,
149150
"executablePath": "/usr/bin/chromium",
150151
},
152+
"messages": defaultOpenClawMessagesConfig(),
153+
"mcp": map[string]any{
154+
"servers": map[string]any{
155+
"spritz-channel-actions": map[string]any{
156+
"command": "node",
157+
"args": []any{"/usr/local/bin/spritz-channel-actions-mcp.js"},
158+
"env": map[string]any{
159+
"SPRITZ_CHANNEL_ACTIONS_BASE_URL": "${SPRITZ_CHANNEL_ACTIONS_BASE_URL}",
160+
"SPRITZ_CHANNEL_ACTIONS_TOKEN": "${SPRITZ_CHANNEL_ACTIONS_TOKEN}",
161+
},
162+
},
163+
},
164+
},
165+
}
166+
}
167+
168+
func defaultOpenClawMessagesConfig() map[string]any {
169+
statusEmojiConfig := map[string]any{}
170+
for _, state := range []string{
171+
"thinking",
172+
"tool",
173+
"coding",
174+
"web",
175+
"done",
176+
"error",
177+
"stallSoft",
178+
"stallHard",
179+
"compacting",
180+
} {
181+
statusEmojiConfig[state] = openclawEyesReaction
182+
}
183+
return map[string]any{
184+
"ackReaction": openclawEyesReaction,
185+
"ackReactionScope": "group-all",
186+
"removeAckAfterReply": true,
187+
"statusReactions": map[string]any{
188+
"enabled": true,
189+
"emojis": statusEmojiConfig,
190+
},
151191
}
152192
}
153193

api/internal_bindings_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,21 @@ func TestInternalUpsertBindingProjectsInstallationConfigWithoutDroppingOpenClawD
360360
if browser["enabled"] != true || browser["executablePath"] != "/usr/bin/chromium" {
361361
t.Fatalf("expected OpenClaw browser defaults to be preserved, got %s", openClawConfig)
362362
}
363+
messages, _ := projected["messages"].(map[string]any)
364+
if messages["ackReaction"] != "\U0001F440" || messages["ackReactionScope"] != "group-all" || messages["removeAckAfterReply"] != true {
365+
t.Fatalf("expected OpenClaw message feedback defaults to be preserved, got %s", openClawConfig)
366+
}
367+
statusReactions, _ := messages["statusReactions"].(map[string]any)
368+
statusEmojis, _ := statusReactions["emojis"].(map[string]any)
369+
if statusReactions["enabled"] != true || statusEmojis["thinking"] != "\U0001F440" || statusEmojis["done"] != "\U0001F440" {
370+
t.Fatalf("expected OpenClaw status reaction defaults to be preserved, got %s", openClawConfig)
371+
}
372+
mcp, _ := projected["mcp"].(map[string]any)
373+
mcpServers, _ := mcp["servers"].(map[string]any)
374+
channelActions, _ := mcpServers["spritz-channel-actions"].(map[string]any)
375+
if channelActions["command"] != "node" {
376+
t.Fatalf("expected OpenClaw channel action MCP defaults to be preserved, got %s", openClawConfig)
377+
}
363378
channelsConfig, _ := projected["channels"].(map[string]any)
364379
slackConfig, _ := channelsConfig["slack"].(map[string]any)
365380
channels, _ := slackConfig["channels"].(map[string]any)

0 commit comments

Comments
 (0)