// agent_cli_api.go - Agent CLI 会话历史 REST 接口 // Logan.Li // 供前端展示历史任务列表与回放某次任务的完整推理过程。 package controller import ( "net/http" "strconv" "github.com/gin-gonic/gin" "ezops/middleware" "ezops/model" "ezops/pkg/agentcli" ) // ListSessions 会话列表(按当前用户隔离) // Logan.Li // GET /api/v1/aiops/agent-cli/sessions?mode=&server_id=&cluster_id=&namespace=&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 mode := c.Query("mode"); mode != "" { mode = agentcli.NormalizeRunMode(mode) if mode == agentcli.RunModeKubernetes { q = q.Where("mode IN ?", []string{agentcli.RunModeKubernetes, "k8s"}) } else { q = q.Where("mode = ?", mode) } } if sid := c.Query("server_id"); sid != "" { q = q.Where("server_id = ?", sid) } if cid := c.Query("cluster_id"); cid != "" { q = q.Where("cluster_id = ?", cid) } if ns := c.Query("namespace"); ns != "" { q = q.Where("namespace = ?", ns) } 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: "已删除"}) }