From ed579bf29c82b9630f706643caefcce381d87f0b Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 30 Sep 2026 19:07:06 +0000 Subject: [PATCH] Extract project channel key helpers (CF3 review fix) Why: project channel convention (pseudo-key project:) was duplicated across runmgr/server/store; centralize so replay envelopes match live stamping. Evidence: go test green. Impact: no behavior change; enables store replay stamping. --- events.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/events.go b/events.go index 0519673..73c9f19 100644 --- a/events.go +++ b/events.go @@ -1,6 +1,9 @@ package core -import "encoding/json" +import ( + "encoding/json" + "strings" +) // 事件信封:后端 → 前端的唯一增量通道(SSE),持久化后转发,Seq 在会话内单调。 // 消费方对未知 Type 静默忽略(原则 6 前向兼容)。 @@ -19,6 +22,19 @@ type StreamEvent struct { type StreamEventType string +// 项目流频道约定(D50):项目频道以伪会话键 "project:" 复用会话 +// 事件的持久化/seq/重放机制;信封 ProjectID 由该键派生(发布与重放同源)。 +const projectChannelPrefix = "project:" + +// ProjectChannelKey 返回项目流的事件频道键。 +func ProjectChannelKey(projectID ID) ID { return ID(projectChannelPrefix + string(projectID)) } + +// ProjectFromChannel 反解项目流频道键;非项目流频道返回 false。 +func ProjectFromChannel(key ID) (ID, bool) { + pid, ok := strings.CutPrefix(string(key), projectChannelPrefix) + return ID(pid), ok && pid != "" +} + const ( EvMessageDelta StreamEventType = "message.delta" EvThinkingDelta StreamEventType = "thinking.delta" -- 2.54.0