From 2438fde6d9ba2fff5b874a6999212f3d3846f0f0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 2 Mar 2026 21:29:21 +0000 Subject: [PATCH] fix: trim repeated slack thread context payloads (#32133) (thanks @sourman) --- CHANGELOG.md | 1 + src/slack/monitor/message-handler/prepare.test.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83ccc23fd61..d102118ad78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ Docs: https://docs.openclaw.ai - WhatsApp/inbound self-message context: propagate inbound `fromMe` through the web inbox pipeline and annotate direct self messages as `(self)` in envelopes so agents can distinguish owner-authored turns from contact turns. (#32167) Thanks @scoootscooob. - Exec approvals/allowlist matching: escape regex metacharacters in path-pattern literals (while preserving glob wildcards), preventing crashes on allowlisted executables like `/usr/bin/g++` and correctly matching mixed wildcard/literal token paths. (#32162) Thanks @stakeswky. - Agents/tool-result guard: always clear pending tool-call state on interruptions even when synthetic tool results are disabled, preventing orphaned tool-use transcripts that cause follow-up provider request failures. (#32120) Thanks @jnMetaCode. +- Slack/thread context payloads: only inject thread starter/history text on first thread turn for new sessions while preserving thread metadata, reducing repeated context-token bloat on long-lived thread sessions. (#32133) Thanks @sourman. - Webchat/stream finalization: persist streamed assistant text when final events omit `message`, while keeping final payload precedence and skipping empty stream buffers to prevent disappearing replies after tool turns. (#31920) Thanks @Sid-Qin. - Cron/store migration: normalize legacy cron jobs with string `schedule` and top-level `command`/`timeout` fields into canonical schedule/payload/session-target shape on load, preventing schedule-error loops on old persisted stores. (#31926) Thanks @bmendonca3. - Gateway/Heartbeat model reload: treat `models.*` and `agents.defaults.model` config updates as heartbeat hot-reload triggers so heartbeat picks up model changes without a full gateway restart. (#32046) Thanks @stakeswky. diff --git a/src/slack/monitor/message-handler/prepare.test.ts b/src/slack/monitor/message-handler/prepare.test.ts index 3c16609a1a2..4092750b97b 100644 --- a/src/slack/monitor/message-handler/prepare.test.ts +++ b/src/slack/monitor/message-handler/prepare.test.ts @@ -510,6 +510,7 @@ describe("slack prepareSlackMessage inbound contract", () => { expect(prepared).toBeTruthy(); expect(prepared!.ctxPayload.IsFirstThreadTurn).toBe(true); + expect(prepared!.ctxPayload.ThreadStarterBody).toBe("starter"); expect(prepared!.ctxPayload.ThreadHistoryBody).toContain("assistant reply"); expect(prepared!.ctxPayload.ThreadHistoryBody).toContain("follow-up question"); expect(prepared!.ctxPayload.ThreadHistoryBody).not.toContain("current message"); @@ -558,6 +559,7 @@ describe("slack prepareSlackMessage inbound contract", () => { expect(prepared!.ctxPayload.ThreadHistoryBody).toBeUndefined(); // Thread starter should also be skipped for existing sessions expect(prepared!.ctxPayload.ThreadStarterBody).toBeUndefined(); + expect(prepared!.ctxPayload.ThreadLabel).toContain("Slack thread"); // Replies API should only be called once (for thread starter lookup, not history) expect(replies).toHaveBeenCalledTimes(1); });