feat(chatflow): add ChatLog and ContextAssembler ports

Keep ctxmgr as table owner and filter the authorized visible set in-process so window, stats, restore, digest, and prompt assembly share one Principal-scoped collection without a package move.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-15 04:11:16 +00:00
co-authored by Cursor
parent 3944856b0a
commit 18d40fa8a9
8 changed files with 827 additions and 13 deletions
+20 -13
View File
@@ -17,10 +17,7 @@ func (m *ContextManager) GenerateDailyDigest(ctx context.Context, sessionID, day
return nil, fmt.Errorf("sessionID and dayKey are required")
}
// 1. 获取当日全部消息
var msgs []ChatMessageRecord
var projectID int64
if m.pool != nil {
rows, err := m.pool.Query(ctx, `
SELECT id, session_id, user_id, role, content, intent, branch, metadata, day_key::text, category, created_at
@@ -53,21 +50,33 @@ func (m *ContextManager) GenerateDailyDigest(ctx context.Context, sessionID, day
rec.CreatedAt = createdAt
msgs = append(msgs, rec)
}
// 获取 project_id
var pid *int64
_ = m.pool.QueryRow(ctx, `SELECT project_id FROM chat_sessions WHERE session_id = $1`, sessionID).Scan(&pid)
if pid != nil {
projectID = *pid
}
} else {
// 内存模式
m.mu.RLock()
for _, r := range m.messages[sessionID] {
if r.DayKey == dayKey {
msgs = append(msgs, r)
}
}
m.mu.RUnlock()
}
return m.GenerateDailyDigestFromMessages(ctx, sessionID, dayKey, msgs)
}
// GenerateDailyDigestFromMessages 仅使用调用方已授权的消息集合生成摘要,避免把不可见正文写入 Prompt/缓存。
func (m *ContextManager) GenerateDailyDigestFromMessages(ctx context.Context, sessionID, dayKey string, msgs []ChatMessageRecord) (*DailyDigest, error) {
if sessionID == "" || dayKey == "" {
return nil, fmt.Errorf("sessionID and dayKey are required")
}
var projectID int64
if m.pool != nil {
var pid *int64
_ = m.pool.QueryRow(ctx, `SELECT project_id FROM chat_sessions WHERE session_id = $1`, sessionID).Scan(&pid)
if pid != nil {
projectID = *pid
}
} else {
m.mu.RLock()
if s, ok := m.sessions[sessionID]; ok {
projectID = s.ProjectID
}
@@ -89,10 +98,8 @@ func (m *ContextManager) GenerateDailyDigest(ctx context.Context, sessionID, day
}, nil
}
// 2. 规则/启发式提取摘要 (作为可靠保障)
digest := m.extractRuleDigest(sessionID, projectID, dayKey, msgs)
// 3. 持久化存储 (Postgres 或内存)
if m.pool != nil {
keyPointsJSON, _ := json.Marshal(digest.KeyPoints)
deliverablesJSON, _ := json.Marshal(digest.Deliverables)