From c56bf36df0fc11ce34976e5c72989e7a2c7e4d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Tue, 26 May 2026 18:54:18 +0800 Subject: [PATCH] Add files via upload --- internal/handler/multi_agent_prepare.go | 1 + internal/handler/project.go | 23 ++++++++++++++++++++++- internal/handler/webshell_context.go | 2 +- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/internal/handler/multi_agent_prepare.go b/internal/handler/multi_agent_prepare.go index 5111319a..8f45919d 100644 --- a/internal/handler/multi_agent_prepare.go +++ b/internal/handler/multi_agent_prepare.go @@ -98,6 +98,7 @@ func (h *AgentHandler) prepareMultiAgentSession(req *ChatRequest, c *gin.Context builtin.ToolListProjectFacts, builtin.ToolSearchProjectFacts, builtin.ToolDeprecateProjectFact, + builtin.ToolRestoreProjectFact, builtin.ToolListKnowledgeRiskTypes, builtin.ToolSearchKnowledgeBase, } diff --git a/internal/handler/project.go b/internal/handler/project.go index ddf9bc15..228efb59 100644 --- a/internal/handler/project.go +++ b/internal/handler/project.go @@ -215,7 +215,9 @@ func (h *ProjectHandler) UpdateFact(c *gin.Context) { if req.Summary != "" { existing.Summary = req.Summary } - existing.Body = req.Body + if strings.TrimSpace(req.Body) != "" { + existing.Body = req.Body + } if req.Confidence != "" { existing.Confidence = req.Confidence } @@ -260,3 +262,22 @@ func (h *ProjectHandler) DeprecateFact(c *gin.Context) { } c.JSON(http.StatusOK, gin.H{"success": true}) } + +type restoreFactRequest struct { + FactKey string `json:"fact_key" binding:"required"` + Confidence string `json:"confidence"` // 可选:confirmed | tentative,默认 tentative +} + +// RestoreFact POST /api/projects/:id/facts/restore +func (h *ProjectHandler) RestoreFact(c *gin.Context) { + var req restoreFactRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + if err := h.db.RestoreProjectFact(c.Param("id"), req.FactKey, req.Confidence); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"success": true}) +} diff --git a/internal/handler/webshell_context.go b/internal/handler/webshell_context.go index 15cdc0f7..06419cc9 100644 --- a/internal/handler/webshell_context.go +++ b/internal/handler/webshell_context.go @@ -15,7 +15,7 @@ const WebshellSkillHintMultiAgent = "Skills 包请使用 Eino 多代理内置 `s // webshellAssistantToolList AI 助手在 WebShell 上下文下允许使用的工具清单(展示给模型用)。 // 注意:此处只是展示字符串,真正的权限限制是在调用方设置的 roleTools 切片里。 -const webshellAssistantToolList = "webshell_exec、webshell_file_list、webshell_file_read、webshell_file_write、record_vulnerability、list_vulnerabilities、get_vulnerability、upsert_project_fact、get_project_fact、list_project_facts、search_project_facts、deprecate_project_fact、list_knowledge_risk_types、search_knowledge_base" +const webshellAssistantToolList = "webshell_exec、webshell_file_list、webshell_file_read、webshell_file_write、record_vulnerability、list_vulnerabilities、get_vulnerability、upsert_project_fact、get_project_fact、list_project_facts、search_project_facts、deprecate_project_fact、restore_project_fact、list_knowledge_risk_types、search_knowledge_base" // BuildWebshellAssistantContext 根据连接信息与用户原始消息组装 AI 助手的上下文提示词。 // 上下文包含:连接 ID、备注、目标系统(及对应命令集建议)、响应编码、可用工具清单、Skills 加载入口、