X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/d8f3785bb69288663f4cc46bf4d609c6770452d5..03ef9525ba0e62037b55606b851ee746967a003f:/subagent_run.go?ds=sidebyside diff --git a/subagent_run.go b/subagent_run.go index 24e4f82..ca45976 100644 --- a/subagent_run.go +++ b/subagent_run.go @@ -132,7 +132,7 @@ func (r *SubagentRuns) Spawn(ctx context.Context, tasks []string, effort *string 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)) @@ -143,7 +143,7 @@ func (r *SubagentRuns) Spawn(ctx context.Context, tasks []string, effort *string } if err != nil { - return "", err + return "", fmt.Errorf("create worker: %w", err) } names = append(names, name) @@ -157,19 +157,19 @@ func (r *SubagentRuns) Spawn(ctx context.Context, tasks []string, effort *string 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) @@ -177,11 +177,16 @@ func (r *SubagentRuns) create(ctx context.Context, note, task string, view []str return "", fmt.Errorf("create work directory: %w", err) } - return subagent.name, r.start(ctx, &SubagentRun{ + err = r.start(ctx, &SubagentRun{ subagent: subagent, view: view, effort: effort, }) + if err != nil { + return subagent.name, fmt.Errorf("start created worker: %w", err) + } + + return subagent.name, nil } // start runs run in the background and logs its start. Its context keeps the @@ -210,7 +215,7 @@ func (r *SubagentRuns) start(ctx context.Context, run *SubagentRun) error { r.mutex.Unlock() run.cancel() - return err + return fmt.Errorf("save running workers: %w", err) } r.workers.Add(1) @@ -329,12 +334,12 @@ func (r *SubagentRuns) workPath() string { 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) @@ -365,7 +370,12 @@ func (r *SubagentRuns) chain(ctx context.Context, run *SubagentRun) (string, err }, } - return chain.Run(ctx, input) + text, err := chain.Run(ctx, input) + if err != nil { + return text, fmt.Errorf("run worker chain: %w", err) + } + + return text, nil } // take returns the messages of Tell that wait for a request of run, and removes @@ -410,13 +420,17 @@ func (r *SubagentRuns) Stop(name string) (bool, error) { 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 { @@ -432,7 +446,12 @@ func (r *SubagentRuns) Resume(ctx context.Context) error { r.mutex.Lock() defer r.mutex.Unlock() - return r.save() + err = r.save() + if err != nil { + return fmt.Errorf("save resumed workers: %w", err) + } + + return nil } // load reads the names of work.json. A missing file names none. @@ -468,7 +487,7 @@ func (r *SubagentRuns) Tell(ctx context.Context, name, message string) (string, 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) @@ -485,12 +504,12 @@ func (r *SubagentRuns) Tell(ctx context.Context, name, message string) (string, 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) @@ -500,7 +519,7 @@ func (r *SubagentRuns) Tell(ctx context.Context, name, message string) (string, 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) @@ -509,7 +528,7 @@ func (r *SubagentRuns) Tell(ctx context.Context, name, message string) (string, } if err != nil { - return "", err + return "", fmt.Errorf("save worker message: %w", err) } err = r.start(ctx, &SubagentRun{ @@ -518,7 +537,7 @@ func (r *SubagentRuns) Tell(ctx context.Context, name, message string) (string, 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 @@ -529,7 +548,7 @@ func (r *SubagentRuns) Tell(ctx context.Context, name, message string) (string, 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)