feat(channels): IM 车道生成并写入真实 turn_id(user/assistant 成对 + 同源 WithTurnID;群聊隔离与静默语义不变)
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

This commit is contained in:
AskaEth committed 2026-10-05 12:22:44 +08:00
1 parent ba1974038a
commit 8f6a75b7d7
9 files changed
+215 -21

No files matched your search

+4 -1
View File
@@ -22,7 +22,10 @@ import (
// SetMessagesTurnID。
//
// 空串(列的默认值)意味着「这一行不属于任何已知的回合」:加入该列之前的历史行、
// 未经编排器的写入路径(IM 镜像)都是这种情形,读起来与以往逐字相同。
// 以及**本就不属于任何回合**的写入路径(被静默登记的非主人消息、无入站回合的主动
// 推送)都是这种情形,读起来与以往逐字相同。IM 车道不在其列 —— 它没有编排器,但
// 渠道桥自己就是那条车道的回合权威,在落库前生成并写入这一列
// (internal/services/channelbridge/turnid.go)。
// SetMessagesTurnID 把 ids 所指的消息行的 turn_id 落定为 turnID —— 两段式写入的
// 第二段(起跑 / 被 steer 消费时补写)。
+7 -5
View File
@@ -63,13 +63,15 @@ type Message struct {
// 逐字相同。
ClientMsgID string
// TurnID 是这条消息所属的那一**路**回合的权威标识(design/15 §2.5.9):
// 编排器生成,与该路全部流帧 / `turn_begin` 帧壳上的 turnId **同值**。因此
// 同一路的 user 行与 assistant 行带同一个值 —— 客户端据此精确配对「回复 ↔
// 提问」,并在重连 / 回放时从历史行恢复回复侧的分组小标(真并行下同一会话
// 有两个交错的回答,只按顺序渲染会配错)。
// 由驱动该回合的那一方生成(Web 由编排器、IM 由渠道桥,见
// internal/services/channelbridge/turnid.go),与该路全部流帧 / `turn_begin`
// 帧壳上的 turnId **同值**。因此同一路的 user 行与 assistant 行带同一个值 ——
// 客户端据此精确配对「回复 ↔ 提问」,并在重连 / 回放时从历史行恢复回复侧的
// 分组小标(真并行下同一会话有两个交错的回答,只按顺序渲染会配错)。
//
// 它可选:空串意味着「这一行不属于任何已知的回合」—— 加入该列之前的行、以及
// 未经编排器的写入路径(IM 镜像等)都是这种情形。
// **本就不属于任何回合**的写入路径(被静默登记的非主人消息、主动推送)都是
// 这种情形。
//
// 两个写入时点(与 Document 同一手法,见 turn_id.go):① 消息落库时它所属的
// 路已经存在(新起的一路、以及助手回复)⇒ 随 INSERT 写入;② 排队 / 被转向