// directory, with no sandbox. Zoom with a name reads the log of a subagent. 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. The toolbox of a subagent has none of them, so these are unknown tools
-// there.
+// tools. A child has no WhatsApp link. The toolbox of a subagent has none of
+// them, so these are unknown tools there.
type Toolbox struct {
log ToolLog
chat ToolChat
// run runs one tool and returns its output, or its error as text.
func (b *Toolbox) run(ctx context.Context, name, arguments string) string {
- var output string
- var err error
+ var (
+ output string
+ err error
+ )
+
switch name {
case "zoom":
var args ToolZoomArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case err != nil:
}
case "date":
var args ToolDateArguments
+
err = toolDecodeArguments(arguments, &args)
if err == nil {
output, err = b.date(args.ID)
}
case "shell":
var args ToolShellArguments
+
err = toolDecodeArguments(arguments, &args)
if err == nil {
output = b.shell(ctx, args.Command)
}
case "read":
var args ToolPathArguments
+
err = toolDecodeArguments(arguments, &args)
if err == nil {
output, err = b.read(args.Path)
}
case "write":
var args ToolWriteArguments
+
err = toolDecodeArguments(arguments, &args)
if err == nil {
output, err = b.write(args.Path, args.Text)
}
case "edit":
var args ToolEditArguments
+
err = toolDecodeArguments(arguments, &args)
if err == nil {
output, err = b.edit(args.Path, args.Old, args.New)
}
case "spawn":
var args ToolSpawnArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case b.runs == nil:
}
case "tell":
var args ToolTellArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case b.runs == nil:
}
case "whatsapp_find":
var args ToolWhatsAppFindArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case b.whatsapp == nil:
}
case "whatsapp_send":
var args ToolWhatsAppSendArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case b.whatsapp == nil:
}
case "schedule_set":
var args ToolScheduleSetArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case b.schedules == nil:
}
case "schedule_remove":
var args ToolScheduleRemoveArguments
+
err = toolDecodeArguments(arguments, &args)
switch {
case b.schedules == nil:
}
level := bits.TrailingZeros(uint(n)) - 1
+
var lines []string
+
for _, index := range []int{2 * id / n, 2*id/n + 1} {
node, built, err := b.chat.Node(level, index)
if err != nil {
err := cmd.Run()
text := output.String()
+
var exit *exec.ExitError
+
switch {
case ctx.Err() != nil:
text += "\n[interrupted]"
func toolDecodeArguments(arguments string, args any) error {
decoder := json.NewDecoder(strings.NewReader(arguments))
decoder.DisallowUnknownFields()
+
err := decoder.Decode(args)
if err != nil {
return fmt.Errorf("arguments: %w", err)