]> git.giacomolli.uk - onechat/blobdiff - subagent_run.go
Check forced-disconnect test setup failures
[onechat] / subagent_run.go
index 24e4f8229c975a3f9fca2e7e3002530e7da76a99..54fa4304fe9312b55506ea58aa28b9a8fa867acb 100644 (file)
@@ -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,11 @@ func (r *SubagentRuns) start(ctx context.Context, run *SubagentRun) error {
                r.mutex.Unlock()
                run.cancel()
 
-               return err
+               if err != nil {
+                       return fmt.Errorf("save running workers: %w", err)
+               }
+
+               return nil
        }
 
        r.workers.Add(1)
@@ -329,12 +338,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 +374,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 +424,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 +450,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 +491,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 +508,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 +523,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 +532,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 +541,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 +552,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)