아웃바운드 세션 미러링 리팩토링 (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=falseresolveThreadSessionKeys (스레드 채널 ID가 이미 세션을 범위 지정).
  • Telegram: 토픽 ID가 buildTelegramGroupPeerId를 통해 chatId:topic:<id>로 매핑.

결정

  • Gateway send 세션 파생: sessionKey가 제공되면 사용. 생략되면 대상 + 기본 에이전트에서 sessionKey를 파생하고 거기에 미러링.
  • 세션 항목 생성: 항상 인바운드 형식에 맞춰 recordSessionMetaFromInbound 사용.
  • 세션 키 대소문자: 쓰기 및 마이그레이션 시 세션 키를 소문자로 정규화.