会话绑定频道无关计划

概述

本文档定义了长期的频道无关会话绑定模型,以及下一次实现迭代的具体范围。

目标:

  • 让 subagent 绑定的会话路由成为核心能力
  • 将频道专属行为保持在适配器中
  • 避免正常 Discord 行为的回归

为什么要做

当前行为混合了:完成内容策略、目标路由策略、Discord 专属细节。

这导致了诸如:并发运行时主频道和线程的重复投递、复用绑定管理器时的过期 token 使用、webhook 发送缺少活跃度计数等边缘情况。

第一轮迭代范围

本次迭代有意限制范围。

1. 添加频道无关的核心接口

添加绑定和路由的核心类型和服务接口。

核心类型包括 BindingTargetKindBindingStatusConversationRefSessionBindingRecord

核心服务契约包括 SessionBindingService(bind、listBySession、resolveByConversation、touch、unbind)。

2. 添加一个核心投递路由器

添加单一的完成事件目标解析路径。本迭代只路由 task_completion,其他事件类型的现有路径保持不变。

3. Discord 保持为适配器

Discord 仍是第一个适配器实现,负责创建/复用线程会话、通过 webhook 或频道发送发送绑定消息、验证线程状态、映射适配器元数据。

4. 修复已知正确性问题

  • 复用线程绑定管理器时刷新 token 用量
  • 为基于 webhook 的 Discord 发送记录出站活跃度
  • 停止在会话模式完成中为绑定线程目标做隐式主频道回退

5. 保持当前运行时安全默认值

禁用线程绑定 spawn 的用户没有行为变更。默认:channels.discord.threadBindings.spawnSubagentSessions = false

不在第一轮迭代中

显式延后:ACP 绑定目标、Discord 之外的新频道适配器、所有投递路径的全局替换、协议级变更、绑定持久化的存储迁移/版本重设计。

路由不变量

本迭代的强制不变量:

  • 目标选择和内容生成是独立步骤
  • 如果会话模式完成解析到活跃的绑定目标,投递必须瞄准该目标
  • 不允许从绑定目标到主频道的隐藏重路由
  • 回退行为必须显式且可观测

兼容性和上线

  • 关闭线程绑定 spawn 的用户无回归
  • 本迭代不改变非 Discord 频道

上线步骤:着陆接口和路由器(在当前功能门控后),路由 Discord 完成模式绑定投递通过路由器,保留非绑定流的遗留路径,用定向测试和金丝雀运行时日志验证。

第一轮迭代所需测试

  • 管理器 token 轮换使用复用后的最新 token
  • webhook 发送更新频道活跃度时间戳
  • 同一请求方频道中两个活跃绑定会话不重复到主频道
  • 绑定会话模式运行的完成仅解析到线程目标
  • 禁用 spawn 标志保持遗留行为不变

提案实现文件

核心:src/infra/outbound/session-binding-service.ts(新)、src/infra/outbound/bound-delivery-router.ts(新)、src/agents/subagent-announce.ts

Discord 适配器和运行时:src/discord/monitor/thread-bindings.manager.tssrc/discord/monitor/reply-delivery.tssrc/discord/send.outbound.ts

第一轮完成标准

  • 核心接口存在并已接入完成路由
  • 上述正确性修复已合并并有测试
  • 绑定会话模式运行无主频道和线程重复完成投递
  • 禁用绑定 spawn 部署无行为变更
  • ACP 保持显式延后