90 lines
2.1 KiB
Go
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)
|
|
}
|