add session kind classification and subagent trigger metadata

This commit is contained in:
DBT
2026-02-23 12:53:00 +00:00
parent 73531d36f6
commit 5e3945b760
2 changed files with 35 additions and 4 deletions

View File

@@ -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

View File

@@ -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,
},
})
}
}