- Agent CLI: 多轮对话、SSH 长连接、流式推理、Evolver 按用户隔离、历史侧栏 - 终端审计: 回放播放器、命令书签、筛选分页导出、命令输出统计、录制落盘修复 - 修复 session_commands 表迁移、Kill 竞态导致录制丢失、无录制会话回放提示 - 审计历史页只读(移除删除),移除回放弹框录制搜索
78 lines
2.7 KiB
Go
78 lines
2.7 KiB
Go
// agent_cli_api.go - Agent CLI 会话历史 REST 接口 // Logan.Li
|
|
// 供前端展示历史任务列表与回放某次任务的完整推理过程。
|
|
package controller
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"ezops/middleware"
|
|
"ezops/model"
|
|
)
|
|
|
|
// ListSessions 会话列表(按当前用户隔离) // Logan.Li
|
|
// GET /api/v1/aiops/agent-cli/sessions?server_id=&page=&page_size=
|
|
func (h *AgentCLIHandler) ListSessions(c *gin.Context) {
|
|
uid := middleware.GetUserID(c)
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
if page < 1 {
|
|
page = 1
|
|
}
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
if pageSize <= 0 || pageSize > 100 {
|
|
pageSize = 20
|
|
}
|
|
|
|
q := h.db.Model(&model.AgentCLISession{}).Where("user_id = ?", uid)
|
|
if sid := c.Query("server_id"); sid != "" {
|
|
q = q.Where("server_id = ?", sid)
|
|
}
|
|
|
|
var total int64
|
|
q.Count(&total)
|
|
var sessions []model.AgentCLISession
|
|
if err := q.Order("created_at DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&sessions).Error; err != nil {
|
|
c.JSON(http.StatusOK, model.Response{Code: 500, Message: "查询失败: " + err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, model.Response{Code: 200, Data: gin.H{"list": sessions, "total": total}})
|
|
}
|
|
|
|
// GetSession 会话详情(含完整推理消息,供回放) // Logan.Li
|
|
// GET /api/v1/aiops/agent-cli/sessions/:id
|
|
func (h *AgentCLIHandler) GetSession(c *gin.Context) {
|
|
uid := middleware.GetUserID(c)
|
|
id := c.Param("id")
|
|
var sess model.AgentCLISession
|
|
if err := h.db.Where("user_id = ?", uid).First(&sess, id).Error; err != nil {
|
|
c.JSON(http.StatusOK, model.Response{Code: 404, Message: "会话不存在"})
|
|
return
|
|
}
|
|
var msgs []model.AgentCLIMessage
|
|
h.db.Where("session_id = ?", id).Order("id ASC").Find(&msgs)
|
|
c.JSON(http.StatusOK, model.Response{Code: 200, Data: gin.H{"session": sess, "messages": msgs}})
|
|
}
|
|
|
|
// DeleteSession 删除会话及其消息 // Logan.Li
|
|
// DELETE /api/v1/aiops/agent-cli/sessions/:id
|
|
func (h *AgentCLIHandler) DeleteSession(c *gin.Context) {
|
|
uid := middleware.GetUserID(c)
|
|
id := c.Param("id")
|
|
var sess model.AgentCLISession
|
|
if err := h.db.Where("user_id = ?", uid).First(&sess, id).Error; err != nil {
|
|
c.JSON(http.StatusOK, model.Response{Code: 404, Message: "会话不存在"})
|
|
return
|
|
}
|
|
if err := h.db.Where("session_id = ?", id).Delete(&model.AgentCLIMessage{}).Error; err != nil {
|
|
c.JSON(http.StatusOK, model.Response{Code: 500, Message: "删除消息失败: " + err.Error()})
|
|
return
|
|
}
|
|
if err := h.db.Delete(&model.AgentCLISession{}, id).Error; err != nil {
|
|
c.JSON(http.StatusOK, model.Response{Code: 500, Message: "删除会话失败: " + err.Error()})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "已删除"})
|
|
}
|