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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user