diff --git a/internal/opencode/runner.go b/internal/opencode/runner.go index db8eac6..a99b390 100644 --- a/internal/opencode/runner.go +++ b/internal/opencode/runner.go @@ -158,6 +158,10 @@ func (r *Runner) Run(ctx context.Context, prompt, cwd, agent, sessionID string) go func() { defer close(done) sc := bufio.NewScanner(stdout) + // NDJSON opencode пишет каждый объект одной строкой; большой text-парт с + // вердиктом легко превышает дефолтный лимит Scanner в 64КБ → ErrTooLong и + // потеря всего потока после первой строки. Поднимаем до 64МБ. + sc.Buffer(make([]byte, 64*1024), 64*1024*1024) for sc.Scan() { line := sc.Text() mu.Lock() @@ -171,6 +175,10 @@ func (r *Runner) Run(ctx context.Context, prompt, cwd, agent, sessionID string) } } } + scanErr := sc.Err() + if scanErr != nil { + r.logf("opencode(%s) scan err: %v", agent, scanErr) + } }() baseline, _ := r.maxDirMsgTS(ctx, cwd) @@ -234,6 +242,8 @@ pollLoop: out := strings.Join(buf, "\n") mu.Unlock() + r.logf("opencode(%s) lines=%d bytes=%d", agent, len(buf), len(out)) + sid := sessionID if s, ok := SessionIDFromOutput(out); ok { sid = s