From 16f37b077ffe665e76418da4ff5ca2258baf2830 Mon Sep 17 00:00:00 2001 From: Danieldd28 Date: Wed, 11 Feb 2026 02:44:08 +0700 Subject: [PATCH] fix: ensure swarm final result is relayed to user and update swarm status --- pkg/swarm/runtime/orchestrator.go | 7 +++++++ pkg/swarm/service.go | 28 +++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/pkg/swarm/runtime/orchestrator.go b/pkg/swarm/runtime/orchestrator.go index 29866790f..6d36c863b 100644 --- a/pkg/swarm/runtime/orchestrator.go +++ b/pkg/swarm/runtime/orchestrator.go @@ -56,6 +56,13 @@ func (o *Orchestrator) SpawnSwarm(ctx context.Context, goal, channel, chatID str go func() { defer o.StopSwarm(id) o.RunSubTask(sCtx, id, "", "Manager", goal) + + // Update swarm status to completed + sw, err := o.store.GetSwarm(context.Background(), id) + if err == nil { + sw.Status = core.SwarmStatusCompleted + o.store.UpdateSwarm(context.Background(), sw) + } }() return id, nil } diff --git a/pkg/swarm/service.go b/pkg/swarm/service.go index 2fbcbc6d6..624621988 100644 --- a/pkg/swarm/service.go +++ b/pkg/swarm/service.go @@ -42,11 +42,33 @@ func NewService(dbPath string, provider providers.LLMProvider, registry *tools.T func (s *Service) listen() { if _, err := s.Bus.Subscribe("node.events", func(e core.Event) { + // --- Terminal Log (Lokal Only) --- + color := "\033[36m" // Cyan + if e.Type == "node.failed" { color = "\033[31m" } // Red + if e.Type == "node.completed" { color = "\033[32m" } // Green + + content := e.Payload["content"] + if content == nil { content = e.Payload["output"] } + if content == nil { content = e.Payload["error"] } + + fmt.Printf("\n%s[SWARM LOG]\033[0m Node: %s | Type: %s | Content: %v\n", color, e.NodeID[:4], e.Type, content) + // --------------------------------- + msg := "" switch e.Type { - case core.EventNodeThinking: msg = fmt.Sprintf("🤖 [%s]: %s", e.NodeID[:4], e.Payload["content"]) - case core.EventNodeCompleted: msg = fmt.Sprintf("✅ [%s] Done.", e.NodeID[:4]) - case core.EventNodeFailed: msg = fmt.Sprintf("❌ [%s] Failed: %v", e.NodeID[:4], e.Payload["error"]) + case core.EventNodeThinking: + msg = fmt.Sprintf("🤖 [%s]: %s", e.NodeID[:4], e.Payload["content"]) + case core.EventNodeCompleted: + // Cek apakah ini Manager (Root Node) + node, err := s.Store.GetNode(context.Background(), e.NodeID) + if err == nil && node.ParentID == "" { + // Ini Manager! Kirim hasil akhirnya. + msg = fmt.Sprintf("🏁 **FINAL RESULT FROM SWARM** 🏁\n\n%s", e.Payload["output"]) + } else { + msg = fmt.Sprintf("✅ [%s] Done.", e.NodeID[:4]) + } + case core.EventNodeFailed: + msg = fmt.Sprintf("❌ [%s] Failed: %v", e.NodeID[:4], e.Payload["error"]) } if msg != "" { // Get swarm origin