Skip to content

Commit 6e58ee3

Browse files
waleedlatif1claude
andcommitted
fix(connectors/slack): include oldestTs in hash to catch window-shift edits
Audit caught that the metadata hash slack:{channel}:{latestTs}:{count} misses edits to the oldest message in the rolling window — count and latestTs both stay constant. Adding oldestTs catches window-shift when a new message arrives and pushes the oldest out without changing the newest. Also drop residual error instanceof Error pattern in validateConfig. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent d9d3b56 commit 6e58ee3

1 file changed

Lines changed: 7 additions & 5 deletions

File tree

apps/sim/connectors/slack/slack.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ async function fetchChannelMessages(
130130
accessToken: string,
131131
channelId: string,
132132
maxMessages: number
133-
): Promise<{ messages: SlackMessage[]; lastActivityTs?: string }> {
133+
): Promise<{ messages: SlackMessage[]; lastActivityTs?: string; oldestTs?: string }> {
134134
const allMessages: SlackMessage[] = []
135135
let cursor: string | undefined
136136
let lastActivityTs: string | undefined
@@ -162,7 +162,9 @@ async function fetchChannelMessages(
162162
cursor = nextCursor
163163
}
164164

165-
return { messages: allMessages.slice(0, maxMessages), lastActivityTs }
165+
const trimmed = allMessages.slice(0, maxMessages)
166+
const oldestTs = trimmed.length > 0 ? trimmed[trimmed.length - 1].ts : undefined
167+
return { messages: trimmed, lastActivityTs, oldestTs }
166168
}
167169

168170
/**
@@ -291,15 +293,15 @@ async function buildSlackChannelDocument(
291293
messageCount: number
292294
lastActivityTs?: string
293295
}> {
294-
const { messages, lastActivityTs } = await fetchChannelMessages(
296+
const { messages, lastActivityTs, oldestTs } = await fetchChannelMessages(
295297
accessToken,
296298
channel.id,
297299
maxMessages
298300
)
299301

300302
const content = await formatMessages(accessToken, messages, syncContext)
301303
const messageCount = messages.length
302-
const contentHash = `slack:${channel.id}:${lastActivityTs ?? 'empty'}:${messageCount}`
304+
const contentHash = `slack:${channel.id}:${oldestTs ?? 'empty'}:${lastActivityTs ?? 'empty'}:${messageCount}`
303305

304306
return { content, contentHash, messageCount, lastActivityTs }
305307
}
@@ -520,7 +522,7 @@ export const slackConnector: ConnectorConfig = {
520522

521523
return { valid: false, error: `Channel not found: ${channelInput}` }
522524
} catch (error) {
523-
const message = error instanceof Error ? error.message : 'Failed to validate configuration'
525+
const message = toError(error).message || 'Failed to validate configuration'
524526
return { valid: false, error: message }
525527
}
526528
},

0 commit comments

Comments
 (0)