@@ -27,7 +27,7 @@ type Stdio struct {
2727 cmd * exec.Cmd
2828 cmdFunc CommandFunc
2929 stdin io.WriteCloser
30- stdout * bufio.Reader
30+ stdout * bufio.Scanner
3131 stderr io.ReadCloser
3232 responses map [string ]chan * JSONRPCResponse
3333 mu sync.RWMutex
@@ -72,7 +72,7 @@ func WithCommandLogger(logger util.Logger) StdioOption {
7272func NewIO (input io.Reader , output io.WriteCloser , logging io.ReadCloser ) * Stdio {
7373 return & Stdio {
7474 stdin : output ,
75- stdout : bufio .NewReader (input ),
75+ stdout : bufio .NewScanner (input ),
7676 stderr : logging ,
7777
7878 responses : make (map [string ]chan * JSONRPCResponse ),
@@ -180,7 +180,7 @@ func (c *Stdio) spawnCommand(ctx context.Context) error {
180180 c .cmd = cmd
181181 c .stdin = stdin
182182 c .stderr = stderr
183- c .stdout = bufio .NewReader (stdout )
183+ c .stdout = bufio .NewScanner (stdout )
184184
185185 if err := cmd .Start (); err != nil {
186186 return fmt .Errorf ("failed to start command: %w" , err )
@@ -247,14 +247,15 @@ func (c *Stdio) readResponses() {
247247 case <- c .done :
248248 return
249249 default :
250- line , err := c .stdout .ReadString ( '\n' )
251- if err != nil {
252- if err != io . EOF && ! errors .Is (err , context .Canceled ) {
250+ if ! c .stdout .Scan () {
251+ err := c . stdout . Err ()
252+ if err != nil && ! errors .Is (err , context .Canceled ) {
253253 c .logger .Errorf ("Error reading from stdout: %v" , err )
254254 }
255255 return
256256 }
257257
258+ line := c .stdout .Text ()
258259 // First try to parse as a generic message to check for ID field
259260 var baseMessage struct {
260261 JSONRPC string `json:"jsonrpc"`
0 commit comments