X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/5a93b6124068c2a8748fc0bfbb2a2d151815bcf0..277a37a79b51910074a29ca6d70fae75c73619b7:/tools.go?ds=sidebyside diff --git a/tools.go b/tools.go index b4fb075..a75514f 100644 --- a/tools.go +++ b/tools.go @@ -53,8 +53,9 @@ type ToolChat interface { // subagent's log. The toolbox of the agent has the runs of its subagents for // spawn and tell, the WhatsApp link for the WhatsApp tools, and the schedules // for the schedule tools. Each permanent agent has the parent-child queue. Only -// the root has child creation. A child has no WhatsApp link or child creation. -// The toolbox of a subagent has none of them, so these are unknown tools there. +// the root has child creation and source routes. A child has neither of them +// nor a WhatsApp link. The toolbox of a subagent has none of them, so these are +// unknown tools there. type Toolbox struct { log ToolLog chat ToolChat @@ -66,6 +67,7 @@ type Toolbox struct { agentName string messages *DaemonMessages children *DaemonChildren + routes *Routes } // Call logs the call of the tool name with its JSON arguments, makes the log @@ -170,6 +172,36 @@ func (b *Toolbox) run(ctx context.Context, name, arguments string) string { case err == nil: output, err = b.children.Create(args.Name, args.Responsibility) } + case "route", "unroute", "routes": + var args ToolRouteArguments + + switch name { + case "routes": + err = toolDecodeArguments(arguments, &struct{}{}) + case "unroute": + var source ToolRouteSourceArguments + + err = toolDecodeArguments(arguments, &source) + args.Source = source.Source + default: + err = toolDecodeArguments(arguments, &args) + } + + switch { + case b.routes == nil: + err = fmt.Errorf("unknown tool %q", name) + case err != nil: + case name == "routes": + output = b.routes.List() + case name == "route" && (b.messages == nil || b.messages.Child(b.agentName, args.Agent) == nil): + err = errors.New("the agent must be a child of the root") + default: + err = b.routes.Set(args.Source, args.Agent) + output = "Route removed." + if name == "route" { + output = "Route set." + } + } case "tell": var args ToolTellArguments @@ -484,6 +516,17 @@ type ToolAgentCreateArguments struct { Responsibility string `json:"responsibility"` } +// ToolRouteArguments are the arguments of route. +type ToolRouteArguments struct { + Source string `json:"source"` + Agent string `json:"agent"` +} + +// ToolRouteSourceArguments are the arguments of unroute. +type ToolRouteSourceArguments struct { + Source string `json:"source"` +} + // ToolTellArguments are the arguments of tell. type ToolTellArguments struct { Name string `json:"name"`