diff --git a/internal/handler/batch_queue_executor.go b/internal/handler/batch_queue_executor.go index 4daaa0a2..14456126 100644 --- a/internal/handler/batch_queue_executor.go +++ b/internal/handler/batch_queue_executor.go @@ -13,6 +13,7 @@ import ( "cyberstrike-ai/internal/audit" "cyberstrike-ai/internal/authctx" "cyberstrike-ai/internal/config" + "cyberstrike-ai/internal/database" "cyberstrike-ai/internal/mcp" "cyberstrike-ai/internal/multiagent" @@ -118,8 +119,7 @@ func (h *AgentHandler) executeOneBatchSubTask(queueID string, queue *BatchTaskQu } principal := authctx.NewPrincipalWithScopes(access.User.ID, access.User.Username, access.Scope, access.Permissions, access.PermissionScopes) title := safeTruncateString(task.Message, 50) - batchMeta := audit.ConversationCreateMeta("batch_task") - batchMeta.ProjectID = effectiveProjectID(h.config, queue.ProjectID) + batchMeta := batchSubTaskConversationMeta(h.config, queue) conv, err := h.db.CreateConversation(title, batchMeta) if err != nil { h.logger.Error("创建对话失败", zap.String("queueId", queueID), zap.String("taskId", task.ID), zap.Error(err)) @@ -321,6 +321,17 @@ func (h *AgentHandler) executeOneBatchSubTask(queueID string, queue *BatchTaskQu h.batchTaskManager.UpdateTaskStatusWithConversationID(queueID, task.ID, BatchTaskStatusCompleted, resText, "", conversationID) } +func batchSubTaskConversationMeta(cfg *config.Config, queue *BatchTaskQueue) database.ConversationCreateMeta { + meta := audit.ConversationCreateMeta("batch_task") + if queue == nil { + meta.ProjectID = effectiveProjectID(cfg, "") + return meta + } + meta.ProjectID = effectiveProjectID(cfg, queue.ProjectID) + meta.RoleName = strings.TrimSpace(queue.Role) + return meta +} + func (h *AgentHandler) handleBatchSubTaskRunError( queueID string, task *BatchTask, diff --git a/internal/handler/batch_task_manager_test.go b/internal/handler/batch_task_manager_test.go index 998d18f1..1c41c333 100644 --- a/internal/handler/batch_task_manager_test.go +++ b/internal/handler/batch_task_manager_test.go @@ -61,6 +61,18 @@ func TestBatchQueueExecutionShouldStop(t *testing.T) { } } +func TestBatchSubTaskConversationMetaKeepsQueueRole(t *testing.T) { + t.Parallel() + + meta := batchSubTaskConversationMeta(nil, &BatchTaskQueue{Role: " 渗透测试 "}) + if meta.Source != "batch_task" { + t.Fatalf("expected batch_task source, got %q", meta.Source) + } + if meta.RoleName != "渗透测试" { + t.Fatalf("expected queue role to be stored on child conversation, got %q", meta.RoleName) + } +} + func TestDeleteQueueBlockedWhileExecutorActive(t *testing.T) { t.Parallel() m := NewBatchTaskManager(zap.NewNop())