From 168b0042c721e83001ee302d20415c84ac8706a0 Mon Sep 17 00:00:00 2001 From: Hermes Date: Mon, 17 Aug 2026 11:53:24 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=20bufio.Scanner=20?= =?UTF-8?q?=D0=B4=D0=BE=2064=D0=9C=D0=91=20=E2=80=94=20NDJSON-=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B0=20=D1=81=20text-=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=20=D0=B2=D0=B5=D1=80=D0=B4=D0=B8=D0=BA=D1=82?= =?UTF-8?q?=D0=B0=20>64=D0=9A=D0=91=20=D1=80=D0=BE=D0=BD=D1=8F=D0=BB=D0=B0?= =?UTF-8?q?=20=D1=81=D0=BA=D0=B0=D0=BD=D0=B5=D1=80=20(ErrTooLong),=20?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=8F=D0=BB=D1=81=D1=8F=20=D0=B2=D0=B5=D1=81?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F=20(step=5Fstart);=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D0=B4=D0=B8?= =?UTF-8?q?=D0=B0=D0=B3.=20=D0=BB=D0=BE=D0=B3=20lines/bytes/scanerr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/opencode/runner.go | 10 ++++++++++ 1 file changed, 10 insertions(+) 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