아웃바운드 세션 미러링 리팩토링 (Issue #1520)
상태
- 진행 중.
- 코어 + 플러그인 채널 라우팅이 아웃바운드 미러링용으로 업데이트됨.
- Gateway send가 sessionKey가 생략되었을 때 대상 세션을 파생함.
배경
아웃바운드 전송이 대상 채널 세션이 아닌 현재 에이전트 세션(도구 세션 키)에 미러링되고 있었습니다. 인바운드 라우팅은 채널/피어 세션 키를 사용하므로, 아웃바운드 응답이 잘못된 세션에 도착했고 최초 연락 대상에 세션 항목이 없는 경우가 많았습니다.
목표
- 아웃바운드 메시지를 대상 채널 세션 키에 미러링.
- 없는 경우 아웃바운드 시 세션 항목 생성.
- 인바운드 세션 키와 스레드/토픽 범위 지정 정렬.
- 코어 채널 + 번들 확장 커버.
구현 요약
- 새로운 아웃바운드 세션 라우팅 헬퍼:
src/infra/outbound/outbound-session.ts runMessageAction(send)이 대상 sessionKey를 파생하고 미러링을 위해executeSendAction에 전달.- 플러그인 send 경로가 파생된 sessionKey를 사용하여 미러링.
- Gateway send가 sessionKey가 없으면 대상 세션 키를 파생하고 세션 항목을 보장.
스레드/토픽 처리
- Slack: replyTo/threadId ->
resolveThreadSessionKeys(접미사). - Discord: threadId/replyTo ->
useSuffix=false로resolveThreadSessionKeys(스레드 채널 ID가 이미 세션을 범위 지정). - Telegram: 토픽 ID가
buildTelegramGroupPeerId를 통해chatId:topic:<id>로 매핑.
결정
- Gateway send 세션 파생:
sessionKey가 제공되면 사용. 생략되면 대상 + 기본 에이전트에서 sessionKey를 파생하고 거기에 미러링. - 세션 항목 생성: 항상 인바운드 형식에 맞춰
recordSessionMetaFromInbound사용. - 세션 키 대소문자: 쓰기 및 마이그레이션 시 세션 키를 소문자로 정규화.