// Package session 提供会话生命周期管理能力。 package session import ( "context" "errors" "time" "github.com/hhs/camtalk/internal/models" ) // ErrSessionNotFound 会话不存在或已过期。 var ErrSessionNotFound = errors.New("session not found") // ConversationSummary 对话摘要(列表展示用)。 type ConversationSummary struct { ID string `json:"id"` Title string `json:"title"` LastMessage string `json:"last_message"` MessageCount int `json:"message_count"` UpdatedAt time.Time `json:"updated_at"` } // Manager 会话管理器接口。 // WebSocket Handler 通过此接口操作会话,不直接接触存储层。 type Manager interface { // Create 创建新会话,返回 session ID。userID 为空表示匿名会话。 Create(ctx context.Context, userID string, config models.SessionConfig) (string, error) // Get 获取会话(含 config)。不存在返回 ErrSessionNotFound。 Get(ctx context.Context, sessionID string) (*models.Session, error) // UpdateConfig 更新会话配置(config 消息触发)。 UpdateConfig(ctx context.Context, sessionID string, patch models.SessionConfigPatch) error // UpdateTitle 更新会话标题。 UpdateTitle(ctx context.Context, sessionID string, title string) error // ListByUser 获取用户的对话列表(分页,按 UpdatedAt 降序)。 ListByUser(ctx context.Context, userID string, page, size int) ([]ConversationSummary, int, error) // GetHistory 获取最近 N 轮对话历史(供 Orchestrator 构建 LLM 上下文)。 GetHistory(ctx context.Context, sessionID string, limit int) ([]models.Message, error) // AppendMessage 追加一条对话消息,同时刷新 TTL。 AppendMessage(ctx context.Context, sessionID string, msg models.Message) error // SetActiveRequest 标记当前正在处理的请求 ID(interrupt 用)。 SetActiveRequest(ctx context.Context, sessionID string, requestID string) error // GetActiveRequestID 获取当前活跃请求 ID。 GetActiveRequestID(ctx context.Context, sessionID string) (string, error) // ClearActiveRequest 清除活跃请求标记(请求完成或中断后)。 ClearActiveRequest(ctx context.Context, sessionID string) error // Touch 刷新 TTL(心跳时调用)。 Touch(ctx context.Context, sessionID string) error // Destroy 显式销毁会话(REST API DELETE 或连接断开清理)。 Destroy(ctx context.Context, sessionID string) error // ActiveCount 返回当前活跃会话数(健康检查用)。 ActiveCount() int }