view, err := r.layout.Split(r.memory.ViewLines(nil))
if err != nil {
- return "", err
+ return "", fmt.Errorf("split worker view: %w", err)
}
names := make([]string, 0, len(tasks))
}
if err != nil {
- return "", err
+ return "", fmt.Errorf("create worker: %w", err)
}
names = append(names, name)
func (r *SubagentRuns) create(ctx context.Context, note, task string, view []string, effort string) (string, error) {
subagent, err := r.subagents.Create(ctx)
if err != nil {
- return "", err
+ return "", fmt.Errorf("create worker log: %w", err)
}
for _, message := range [][2]string{{"note", note}, {"user", task}} {
_, err = subagent.Append(message[0], message[1])
if err != nil {
- return "", err
+ return "", fmt.Errorf("append worker message: %w", err)
}
}
err = subagent.Flush(ctx)
if err != nil {
- return "", err
+ return "", fmt.Errorf("flush worker log: %w", err)
}
err = os.MkdirAll(subagent.WorkDir(), 0o700)
r.mutex.Unlock()
run.cancel()
- return err
+ if err != nil {
+ return fmt.Errorf("save running workers: %w", err)
+ }
+
+ return nil
}
r.workers.Add(1)
func (r *SubagentRuns) chain(ctx context.Context, run *SubagentRun) (string, error) {
instructions, err := r.agent.SubagentPrompt()
if err != nil {
- return "", err
+ return "", fmt.Errorf("read worker instructions: %w", err)
}
log, err := run.subagent.Show()
if err != nil {
- return "", err
+ return "", fmt.Errorf("read worker log: %w", err)
}
input := make([]any, 0, len(run.view)+2)
func (r *SubagentRuns) Resume(ctx context.Context) error {
names, err := r.load()
if err != nil || len(names) == 0 {
- return err
+ if err != nil {
+ return fmt.Errorf("load interrupted workers: %w", err)
+ }
+
+ return nil
}
text := "The daemon restarted, cutting " + strings.Join(names, ", ") + "; nothing was lost: go on."
err = r.note(text)
if err != nil {
- return err
+ return fmt.Errorf("record interrupted workers: %w", err)
}
for _, name := range names {
told, err := run.subagent.Append("user", message)
if err != nil {
- return "", err
+ return "", fmt.Errorf("append running worker message: %w", err)
}
run.pending = append(run.pending, told)
subagent, err := r.subagents.Get(ctx, name)
if err != nil {
- return "", err
+ return "", fmt.Errorf("open worker log: %w", err)
}
effort, err := r.effort(subagent)
if err != nil {
- return "", err
+ return "", fmt.Errorf("read worker effort: %w", err)
}
err = r.memory.Settle(ctx)
view, err := r.layout.Split(r.memory.ViewLines(nil))
if err != nil {
- return "", err
+ return "", fmt.Errorf("split worker view: %w", err)
}
_, err = subagent.Append("user", message)
}
if err != nil {
- return "", err
+ return "", fmt.Errorf("save worker message: %w", err)
}
err = r.start(ctx, &SubagentRun{
effort: effort,
})
if err != nil {
- return "", err
+ return "", fmt.Errorf("start told worker: %w", err)
}
return "Sent. " + name + "'s reply will reach you as a message.", nil
func (r *SubagentRuns) effort(subagent *Subagent) (string, error) {
note, err := subagent.First()
if err != nil {
- return "", err
+ return "", fmt.Errorf("read worker note: %w", err)
}
effort, own := strings.CutPrefix(note.Text, subagentNote+subagentNoteEffort)