From 5e3945b7609c538540a3469466061530f064b840 Mon Sep 17 00:00:00 2001 From: DBT Date: Mon, 23 Feb 2026 12:53:00 +0000 Subject: [PATCH] add session kind classification and subagent trigger metadata --- pkg/session/manager.go | 26 ++++++++++++++++++++++++++ pkg/tools/subagent.go | 13 +++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/pkg/session/manager.go b/pkg/session/manager.go index 3276fe0..4afe264 100644 --- a/pkg/session/manager.go +++ b/pkg/session/manager.go @@ -14,6 +14,7 @@ import ( type Session struct { Key string `json:"key"` + Kind string `json:"kind,omitempty"` Messages []providers.Message `json:"messages"` Summary string `json:"summary,omitempty"` LastLanguage string `json:"last_language,omitempty"` @@ -62,6 +63,7 @@ func (sm *SessionManager) GetOrCreate(key string) *Session { session = &Session{ Key: key, + Kind: detectSessionKind(key), Messages: []providers.Message{}, Created: time.Now(), Updated: time.Now(), @@ -221,6 +223,7 @@ func (sm *SessionManager) Save(session *Session) error { metaPath := filepath.Join(sm.storage, session.Key+".meta") meta := map[string]interface{}{ + "kind": session.Kind, "summary": session.Summary, "last_language": session.LastLanguage, "preferred_language": session.PreferredLanguage, @@ -247,6 +250,24 @@ func (sm *SessionManager) Keys() []string { return keys } +func detectSessionKind(key string) string { + k := strings.TrimSpace(strings.ToLower(key)) + switch { + case strings.HasPrefix(k, "cron:"): + return "cron" + case strings.HasPrefix(k, "subagent:") || strings.Contains(k, ":subagent:"): + return "subagent" + case strings.HasPrefix(k, "hook:"): + return "hook" + case strings.HasPrefix(k, "node:"): + return "node" + case strings.Contains(k, ":"): + return "main" + default: + return "other" + } +} + func (sm *SessionManager) loadSessions() error { files, err := os.ReadDir(sm.storage) if err != nil { @@ -288,6 +309,7 @@ func (sm *SessionManager) loadSessions() error { data, err := os.ReadFile(filepath.Join(sm.storage, file.Name())) if err == nil { var meta struct { + Kind string `json:"kind"` Summary string `json:"summary"` LastLanguage string `json:"last_language"` PreferredLanguage string `json:"preferred_language"` @@ -295,6 +317,10 @@ func (sm *SessionManager) loadSessions() error { Created time.Time `json:"created"` } if err := json.Unmarshal(data, &meta); err == nil { + session.Kind = meta.Kind + if strings.TrimSpace(session.Kind) == "" { + session.Kind = detectSessionKind(session.Key) + } session.Summary = meta.Summary session.LastLanguage = meta.LastLanguage session.PreferredLanguage = meta.PreferredLanguage diff --git a/pkg/tools/subagent.go b/pkg/tools/subagent.go index e6a012a..4410658 100644 --- a/pkg/tools/subagent.go +++ b/pkg/tools/subagent.go @@ -156,10 +156,15 @@ func (sm *SubagentManager) runTask(ctx context.Context, task *SubagentTask) { announceContent += fmt.Sprintf("\n\nPipeline: %s\nPipeline Task: %s", task.PipelineID, task.PipelineTask) } sm.bus.PublishInbound(bus.InboundMessage{ - Channel: "system", - SenderID: fmt.Sprintf("subagent:%s", task.ID), - ChatID: fmt.Sprintf("%s:%s", task.OriginChannel, task.OriginChatID), - Content: announceContent, + Channel: "system", + SenderID: fmt.Sprintf("subagent:%s", task.ID), + ChatID: fmt.Sprintf("%s:%s", task.OriginChannel, task.OriginChatID), + SessionKey: fmt.Sprintf("subagent:%s", task.ID), + Content: announceContent, + Metadata: map[string]string{ + "trigger": "subagent", + "subagent_id": task.ID, + }, }) } }