Files
BlackBean/internal/server/handlers_sessions.go
T
2026-08-14 23:41:57 +08:00

90 lines
2.1 KiB
Go

package server
import (
"net/http"
"strings"
"agent/internal/agent"
"github.com/gin-gonic/gin"
)
// listSessions 会话列表,支持 ?q=<关键词> 搜索、?limit=&offset= 分页。
func (s *Server) listSessions(c *gin.Context) {
query := strings.TrimSpace(c.Query("q"))
var sessions []agent.SessionSummary
if query != "" {
sessions = s.store.Search(query)
} else {
sessions = s.store.List()
}
limit, offset := parsePagination(c)
if offset > 0 || limit > 0 {
start := offset
if start > len(sessions) {
start = len(sessions)
}
end := len(sessions)
if limit > 0 && start+limit < end {
end = start + limit
}
sessions = sessions[start:end]
}
ok(c, gin.H{"sessions": sessions})
}
func (s *Server) createSession(c *gin.Context) {
session := s.store.Create()
c.JSON(http.StatusCreated, session)
}
func (s *Server) getSession(c *gin.Context) {
session, found := s.store.Get(c.Param("id"))
if !found {
fail(c, http.StatusNotFound, "会话不存在")
return
}
ok(c, gin.H{"session": session})
}
// sessionMessages 分页返回会话消息(offset 从最新一条往前数),
// 响应含 has_more 与 total 供前端"加载更早"。
func (s *Server) sessionMessages(c *gin.Context) {
id := c.Param("id")
total, exists := s.store.TotalMessages(id)
if !exists {
fail(c, http.StatusNotFound, "会话不存在")
return
}
limit, offset := parsePagination(c)
if limit <= 0 || limit > 200 {
limit = 50
}
messages, _, hasMore := s.store.Messages(id, limit, offset)
ok(c, gin.H{
"messages": messages,
"has_more": hasMore,
"total": total,
})
}
func (s *Server) deleteSession(c *gin.Context) {
id := c.Param("id")
if !s.store.Delete(id) {
fail(c, http.StatusNotFound, "会话不存在")
return
}
// 释放会话持有的运行时资源(会话锁与 live 注册),避免内存泄漏
s.agent.ForgetSession(id)
c.Status(http.StatusNoContent)
}
// clearSession 清空会话历史消息(保留会话)。
func (s *Server) clearSession(c *gin.Context) {
if !s.store.Clear(c.Param("id")) {
fail(c, http.StatusNotFound, "会话不存在")
return
}
c.Status(http.StatusNoContent)
}