]> git.giacomolli.uk - onechat/blobdiff - tools.go
Keep the README for the user
[onechat] / tools.go
index b4fb075b40a5cc7b6a6086417e1bce375a4bfc79..a75514f984964224f0e1075d06281cda3be79cb0 100644 (file)
--- 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"`