package handler import ( "strings" "cyberstrike-ai/internal/project" "go.uber.org/zap" ) // agentSessionContextBlock 注入会话工作目录、项目黑板与用户原文锚点(用于 system prompt 追加块)。 func (h *AgentHandler) agentSessionContextBlock(conversationID string) string { var parts []string if ws := h.buildWorkspaceBlock(conversationID); ws != "" { parts = append(parts, ws) } if bb := h.projectBlackboardBlock(conversationID); bb != "" { parts = append(parts, bb) } if uv := h.userVerbatimAnchorBlock(conversationID); uv != "" { parts = append(parts, uv) } return strings.Join(parts, "\n\n") } func (h *AgentHandler) buildWorkspaceBlock(conversationID string) string { if h == nil || h.config == nil { return "" } conversationID = strings.TrimSpace(conversationID) if conversationID == "" { return "" } projectID := h.conversationProjectID(conversationID) rel := project.WorkspaceRootDir(h.config.Agent.WorkspaceRootDir, projectID, conversationID) abs, err := project.EnsureWorkspace(rel) if err != nil { if h.logger != nil { h.logger.Warn("创建会话工作目录失败", zap.String("conversationId", conversationID), zap.String("projectId", projectID), zap.String("path", rel), zap.Error(err)) } return "" } return project.BuildWorkspaceBlock(abs) } // projectBlackboardBlock 根据对话 ID 构建项目事实索引块(用于注入 system prompt)。 func (h *AgentHandler) projectBlackboardBlock(conversationID string) string { if h == nil || h.db == nil || h.config == nil { return "" } if !h.config.Project.Enabled { return "" } conversationID = strings.TrimSpace(conversationID) if conversationID == "" { return "" } projectID, err := h.db.GetConversationProjectID(conversationID) if err != nil || projectID == "" { return "" } block, err := project.BuildProjectBlackboardBlock(h.db, projectID, h.config.Project) if err != nil { h.logger.Warn("构建项目黑板索引失败", zap.String("conversationId", conversationID), zap.Error(err)) return "" } return strings.TrimSpace(block) } // userVerbatimAnchorBlock 从 messages 表构建用户各轮原文锚点(压缩后仍由 summarization Finalize 刷新)。 func (h *AgentHandler) userVerbatimAnchorBlock(conversationID string) string { if h == nil || h.db == nil || h.config == nil { return "" } conversationID = strings.TrimSpace(conversationID) if conversationID == "" { return "" } maxRunes := h.config.MultiAgent.UserVerbatimAnchorMaxRunesEffective() if maxRunes < 0 { return "" } msgs, err := h.db.GetMessages(conversationID) if err != nil { if h.logger != nil { h.logger.Warn("构建用户原文锚点失败", zap.String("conversationId", conversationID), zap.Error(err)) } return "" } return project.BuildUserVerbatimAnchorBlockFromMessages(msgs, maxRunes) } // conversationProjectID 返回对话绑定的项目 ID;未绑定或查询失败时返回空字符串。 func (h *AgentHandler) conversationProjectID(conversationID string) string { if h == nil || h.db == nil { return "" } conversationID = strings.TrimSpace(conversationID) if conversationID == "" { return "" } projectID, err := h.db.GetConversationProjectID(conversationID) if err != nil { return "" } return strings.TrimSpace(projectID) }