2026-06-13 15:24:07 +08:00
|
|
|
|
// Package session 提供会话生命周期管理能力。
|
|
|
|
|
|
package session
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"errors"
|
2026-06-14 17:35:20 +08:00
|
|
|
|
"time"
|
2026-06-13 15:24:07 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/hhs/camtalk/internal/models"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// ErrSessionNotFound 会话不存在或已过期。
|
|
|
|
|
|
var ErrSessionNotFound = errors.New("session not found")
|
|
|
|
|
|
|
2026-06-14 17:35:20 +08:00
|
|
|
|
// 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"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-13 15:24:07 +08:00
|
|
|
|
// Manager 会话管理器接口。
|
|
|
|
|
|
// WebSocket Handler 通过此接口操作会话,不直接接触存储层。
|
|
|
|
|
|
type Manager interface {
|
2026-06-14 17:35:20 +08:00
|
|
|
|
// Create 创建新会话,返回 session ID。userID 为空表示匿名会话。
|
|
|
|
|
|
Create(ctx context.Context, userID string, config models.SessionConfig) (string, error)
|
2026-06-13 15:24:07 +08:00
|
|
|
|
|
|
|
|
|
|
// Get 获取会话(含 config)。不存在返回 ErrSessionNotFound。
|
|
|
|
|
|
Get(ctx context.Context, sessionID string) (*models.Session, error)
|
|
|
|
|
|
|
|
|
|
|
|
// UpdateConfig 更新会话配置(config 消息触发)。
|
|
|
|
|
|
UpdateConfig(ctx context.Context, sessionID string, patch models.SessionConfigPatch) error
|
|
|
|
|
|
|
2026-06-14 17:35:20 +08:00
|
|
|
|
// UpdateTitle 更新会话标题。
|
|
|
|
|
|
UpdateTitle(ctx context.Context, sessionID string, title string) error
|
|
|
|
|
|
|
|
|
|
|
|
// ListByUser 获取用户的对话列表(分页,按 UpdatedAt 降序)。
|
|
|
|
|
|
ListByUser(ctx context.Context, userID string, page, size int) ([]ConversationSummary, int, error)
|
|
|
|
|
|
|
2026-06-13 15:24:07 +08:00
|
|
|
|
// 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
|
|
|
|
|
|
}
|