- return l, nil
-}
-
-// Event tells the clients what the agent does as it happens. Kind is the kind
-// of a logged message (user, reply, tool, echo, note, work), or one of ready,
-// busy, idle, error, and subagent, which tells that the subagent Text starts a
-// 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.
-type Event struct {
- Kind string `json:"kind"`
- ID int `json:"id,omitempty"`
- Text string `json:"text,omitempty"`
- Source string `json:"source,omitempty"`
- Status string `json:"status,omitempty"`
-}
-
-// TurnLoop runs the turns of one agent. A user message goes to the log when it
-// comes, and it wakes the loop. A turn waits until every message before it is
-// summarized. Then the turn runs a Chain whose first request holds the prompt,
-// the tools, and the input of turnInput.
-//
-// The view goes out as the messages of a ViewLayout, so the first request of a
-// turn reads the view of the turn before from the prompt cache. User messages
-// that come during a turn join the next request of its chain after the tool
-// results, and so do the reports of the subagents. The subagents run until the
-// loop ends.
-type TurnLoop struct {
- agent *Agent
- memory *Memory
- client ChainClient
- tools *Toolbox
- runs *SubagentRuns
- layout *ViewLayout
- clock func() time.Time
- notify func(Event)
- wake chan struct{}
-
- mutex sync.Mutex
- pending []Message
- cancel context.CancelFunc
- failure error
-}
-
-// Submit logs a user message from the client source and wakes the loop. The
-// message joins the next request: the first one of a new turn, or the next one
-// of a running turn.
-func (l *TurnLoop) Submit(source, text string) (Message, error) {
- message, err := l.record("user", source, text)
- if err != nil {
- return Message{}, err