// the log as it happens: the call as a tool message, the result as an echo
// message. The call is durable before its tool runs, so the log never misses an
// action outside the agent. Commands and files run as the user in the working
-// directory, with no sandbox.
+// directory, with no sandbox. Zoom with a name reads the log of a subagent.
type Toolbox struct {
- log ToolLog
- chat ToolChat
- workdir string
+ log ToolLog
+ chat ToolChat
+ subagents *Subagents
+ workdir string
}
// Call logs the call of the tool name with its JSON arguments, makes the log
case "zoom":
var args ToolZoomArguments
err = toolDecodeArguments(arguments, &args)
- if err == nil {
+ switch {
+ case err != nil:
+ case args.Name != nil:
+ output, err = b.zoomAgent(ctx, *args.Name)
+ default:
output, err = b.zoom(args.ID, args.N)
}
case "date":
return output
}
+// zoomAgent returns the whole log of the subagent name.
+func (b *Toolbox) zoomAgent(ctx context.Context, name string) (string, error) {
+ subagent, err := b.subagents.Get(ctx, name)
+ if err != nil {
+ return "", err
+ }
+
+ return subagent.Show()
+}
+
// zoom returns message id whole for n = 1, or else the two lines under the line
// id+n.
func (b *Toolbox) zoom(id, n int) (string, error) {
return filepath.Join(b.workdir, path)
}
-// ToolZoomArguments are the arguments of zoom.
+// ToolZoomArguments are the arguments of zoom. A Name that is not nil names
+// the subagent whose whole log zoom gives, and then ID and N are not used.
type ToolZoomArguments struct {
- ID int `json:"id"`
- N int `json:"n"`
+ ID int `json:"id"`
+ N int `json:"n"`
+ Name *string `json:"name"`
}
// ToolDateArguments are the arguments of date.