feat(slack): isolate session context per thread

Each Slack thread now gets its own conversation session instead of
sharing one session per channel. DM sessions are unchanged.

Added as a generic feature to also support if Feishu threads support
is added in the future.
This commit is contained in:
Paul
2026-02-23 10:15:12 +00:00
parent b2a1d1208e
commit 1f7a81e5ee
3 changed files with 10 additions and 3 deletions

View File

@@ -16,11 +16,12 @@ class InboundMessage:
timestamp: datetime = field(default_factory=datetime.now) timestamp: datetime = field(default_factory=datetime.now)
media: list[str] = field(default_factory=list) # Media URLs media: list[str] = field(default_factory=list) # Media URLs
metadata: dict[str, Any] = field(default_factory=dict) # Channel-specific data metadata: dict[str, Any] = field(default_factory=dict) # Channel-specific data
session_key_override: str | None = None # Optional override for thread-scoped sessions
@property @property
def session_key(self) -> str: def session_key(self) -> str:
"""Unique key for session identification.""" """Unique key for session identification."""
return f"{self.channel}:{self.chat_id}" return self.session_key_override or f"{self.channel}:{self.chat_id}"
@dataclass @dataclass

View File

@@ -111,13 +111,15 @@ class BaseChannel(ABC):
) )
return return
meta = metadata or {}
msg = InboundMessage( msg = InboundMessage(
channel=self.name, channel=self.name,
sender_id=str(sender_id), sender_id=str(sender_id),
chat_id=str(chat_id), chat_id=str(chat_id),
content=content, content=content,
media=media or [], media=media or [],
metadata=metadata or {} metadata=meta,
session_key_override=meta.get("session_key"),
) )
await self.bus.publish_inbound(msg) await self.bus.publish_inbound(msg)

View File

@@ -179,6 +179,9 @@ class SlackChannel(BaseChannel):
except Exception as e: except Exception as e:
logger.debug("Slack reactions_add failed: {}", e) logger.debug("Slack reactions_add failed: {}", e)
# Thread-scoped session key for channel/group messages
session_key = f"slack:{chat_id}:{thread_ts}" if thread_ts and channel_type != "im" else None
try: try:
await self._handle_message( await self._handle_message(
sender_id=sender_id, sender_id=sender_id,
@@ -189,7 +192,8 @@ class SlackChannel(BaseChannel):
"event": event, "event": event,
"thread_ts": thread_ts, "thread_ts": thread_ts,
"channel_type": channel_type, "channel_type": channel_type,
} },
"session_key": session_key,
}, },
) )
except Exception: except Exception: