2026-02-04 11:06:13 +00:00
package tools
import (
"context"
"fmt"
)
type SpawnTool struct {
manager * SubagentManager
originChannel string
originChatID string
2026-02-12 17:59:50 +00:00
callback AsyncCallback // For async completion notification
2026-02-04 11:06:13 +00:00
}
func NewSpawnTool ( manager * SubagentManager ) * SpawnTool {
return & SpawnTool {
manager : manager ,
originChannel : "cli" ,
originChatID : "direct" ,
}
}
2026-02-12 17:59:50 +00:00
// SetCallback implements AsyncTool interface for async completion notification
func ( t * SpawnTool ) SetCallback ( cb AsyncCallback ) {
t . callback = cb
}
2026-02-04 11:06:13 +00:00
func ( t * SpawnTool ) Name ( ) string {
return "spawn"
}
func ( t * SpawnTool ) Description ( ) string {
return "Spawn a subagent to handle a task in the background. Use this for complex or time-consuming tasks that can run independently. The subagent will complete the task and report back when done."
}
func ( t * SpawnTool ) Parameters ( ) map [ string ] interface { } {
return map [ string ] interface { } {
"type" : "object" ,
"properties" : map [ string ] interface { } {
"task" : map [ string ] interface { } {
"type" : "string" ,
"description" : "The task for subagent to complete" ,
} ,
"label" : map [ string ] interface { } {
"type" : "string" ,
"description" : "Optional short label for the task (for display)" ,
} ,
} ,
"required" : [ ] string { "task" } ,
}
}
func ( t * SpawnTool ) SetContext ( channel , chatID string ) {
t . originChannel = channel
t . originChatID = chatID
}
2026-02-12 11:28:56 +00:00
func ( t * SpawnTool ) Execute ( ctx context . Context , args map [ string ] interface { } ) * ToolResult {
2026-02-04 11:06:13 +00:00
task , ok := args [ "task" ] . ( string )
if ! ok {
2026-02-12 11:28:56 +00:00
return ErrorResult ( "task is required" )
2026-02-04 11:06:13 +00:00
}
label , _ := args [ "label" ] . ( string )
if t . manager == nil {
2026-02-12 11:28:56 +00:00
return ErrorResult ( "Subagent manager not configured" )
2026-02-04 11:06:13 +00:00
}
2026-02-12 17:59:50 +00:00
// Pass callback to manager for async completion notification
result , err := t . manager . Spawn ( ctx , task , label , t . originChannel , t . originChatID , t . callback )
2026-02-04 11:06:13 +00:00
if err != nil {
2026-02-12 11:28:56 +00:00
return ErrorResult ( fmt . Sprintf ( "failed to spawn subagent: %v" , err ) )
2026-02-04 11:06:13 +00:00
}
2026-02-12 17:59:50 +00:00
// Return AsyncResult since the task runs in background
return AsyncResult ( result )
2026-02-04 11:06:13 +00:00
}