X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/d8f3785bb69288663f4cc46bf4d609c6770452d5..9346d20fe4297dce1aa16171749a7ef3e41ce7bd:/turn.go?ds=sidebyside diff --git a/turn.go b/turn.go index c08e94a..4652321 100644 --- a/turn.go +++ b/turn.go @@ -16,7 +16,9 @@ import ( // run. ID is the ID of a logged message. Source names the client that sent a // user message, such as terminal or telegram, so that each client can show the // messages of the others, or the subagent of a report. Status tells how the run -// of a report ended: finished, stopped, or failed. +// of a report ended: finished, stopped, or failed. A private notify receipt +// uses ID for its queue sequence and Status for accepted or duplicate, not +// processed. type Event struct { Kind string `json:"kind"` ID int `json:"id,omitempty"` @@ -283,10 +285,11 @@ func (l *TurnLoop) Flush(ctx context.Context) error { return l.memory.Flush(ctx) } -// 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 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. +// Run starts a turn when user messages, reports, or queued external events +// wait, until ctx ends. It returns the error of a failed log write, which stops +// the agent. External events enter memory only between chains. 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() @@ -296,12 +299,23 @@ func (l *TurnLoop) Run(ctx context.Context) error { } for { - for ctx.Err() == nil && l.waiting() { + for ctx.Err() == nil { err := l.failed() if err != nil { return fmt.Errorf("check turn loop failure: %w", err) } + if l.messages != nil { + err = l.messages.Notifications(l) + if err != nil { + return fmt.Errorf("prepare external events: %w", err) + } + } + + if !l.waiting() { + break + } + err = l.turn(ctx) if err != nil { return fmt.Errorf("run turn: %w", err)