state: l.state,
report: l.Report,
note: l.note,
+ fail: l.fail,
notify: notify,
running: make(map[string]*SubagentRun),
}
}
// Run runs a turn each time user messages or reports wait, until ctx ends. It
-// returns the error of a failed log write, which stops the agent. At its end
-// it ends the runs of the subagents and waits for them.
+// returns the error of a failed log write, which stops the agent. At its start
+// it resumes the subagents that a stop of the daemon cut, and at its end it
+// ends the runs of the subagents and waits for them.
func (l *TurnLoop) Run(ctx context.Context) error {
defer l.runs.Close()
+ err := l.runs.Resume(ctx)
+ if err != nil {
+ return fmt.Errorf("resume subagents: %w", err)
+ }
+
for {
for l.waiting() {
err := l.turn(ctx)
return len(l.pending) > 0
}
+// fail stops the loop with err.
+func (l *TurnLoop) fail(err error) {
+ l.mutex.Lock()
+ l.failure = errors.Join(l.failure, err)
+ l.mutex.Unlock()
+
+ select {
+ case l.wake <- struct{}{}:
+ default:
+ }
+}
+
// failed returns the error of a failed write of a report.
func (l *TurnLoop) failed() error {
l.mutex.Lock()