// errTerminalDaemonClosed tells that the daemon closed the connection.
var errTerminalDaemonClosed = errors.New("the daemon closed the connection")
-// terminal runs "onechat chat": the terminal client of the daemon. Each line of
-// input is a user message, the line /stop interrupts the running turn, the line
-// /stop NAME stops the subagent NAME, and a line that starts with /whatsapp is
-// a WhatsApp command. The client shows the replies, the
-// tool calls, and their results as they happen. It ends at the end of the input
-// or when the daemon closes the connection.
+// terminal runs "onechat" and "onechat chat": the terminal client of the
+// daemon. Each line of input is a user message, the line /stop interrupts the
+// running turn, the line /stop NAME stops the subagent NAME, and a line that
+// starts with /whatsapp is a WhatsApp command. The client shows the replies,
+// the tool calls, and their results as they happen. It ends at the end of the
+// input or when the daemon closes the connection.
func terminal(ctx context.Context, in io.Reader, out io.Writer) error {
dir, err := dataDir()
if err != nil {
<-shown
}
- return err
+ if err != nil {
+ return fmt.Errorf("run terminal client: %w", err)
+ }
+
+ return nil
}
// terminalSendLines sends each line of in as a request until the input ends.
}
}
- return scanner.Err()
+ err := scanner.Err()
+ if err != nil {
+ return fmt.Errorf("read terminal input: %w", err)
+ }
+
+ return nil
}
// terminalShowEvents writes each event from the daemon to out until the
_, err = io.WriteString(out, text+"\n")
if err != nil {
- return err
+ return fmt.Errorf("write terminal event: %w", err)
}
}
- return scanner.Err()
+ err := scanner.Err()
+ if err != nil {
+ return fmt.Errorf("read daemon events: %w", err)
+ }
+
+ return nil
}
// terminalCmpError returns err, or fallback when err is nil.