出站会话镜像重构(Issue #1520)

状态

进行中。核心 + 插件频道路由已更新用于出站镜像。Gateway send 现在在 sessionKey 省略时派生目标会话。

背景

出站发送之前镜像到_当前_ agent 会话(工具 session key),而非目标频道会话。入站路由使用频道/peer session key,所以出站响应落到了错误的会话中,首次联系的目标经常缺少会话条目。

目标

  • 将出站消息镜像到目标频道 session key
  • 缺失时在出站时创建会话条目
  • 保持线程/话题作用域与入站 session key 对齐
  • 覆盖核心频道和捆绑扩展

实现摘要

  • 新的出站会话路由辅助:src/infra/outbound/outbound-session.ts
  • runMessageAction(send)派生目标 sessionKey 并传给 executeSendAction 做镜像
  • message-tool 不再直接镜像;只从当前 session key 解析 agentId
  • 插件发送路径通过 appendAssistantMessageToSessionTranscript 使用派生的 sessionKey 镜像
  • Gateway send 在未提供 sessionKey 时派生目标会话 key 并确保会话条目

线程/话题处理

  • Slack:replyTo/threadId -> resolveThreadSessionKeys(后缀)
  • Discord:threadId/replyTo -> resolveThreadSessionKeysuseSuffix=false
  • Telegram:话题 ID 通过 buildTelegramGroupPeerId 映射为 chatId:topic:<id>

覆盖的扩展

Matrix、MS Teams、Mattermost、BlueBubbles、Nextcloud Talk、Zalo、Zalo Personal、Nostr、Tlon。

决策

  • Gateway send 会话派生:提供 sessionKey 则使用,省略则派生。
  • 会话条目创建:总是使用 recordSessionMetaFromInbound,对齐入站格式。
  • Session key 大小写:写入和迁移时规范化为小写。

已添加/更新的测试

  • src/infra/outbound/outbound.test.ts
  • src/agents/tools/message-tool.test.ts
  • src/gateway/server-methods/send.test.ts