fix: открыть буфер bufio.Scanner до 64МБ — NDJSON-строка с text-партом вердикта >64КБ роняла сканер (ErrTooLong), терялся весь поток после первого события (step_start); добавить диаг. лог lines/bytes/scanerr
All checks were successful
CI / test (push) Successful in 44s
CI / build-and-package (amd64, linux) (push) Successful in 40s
CI / build-and-package (amd64, windows) (push) Successful in 37s

This commit is contained in:
Hermes
2026-08-17 11:53:24 +05:00
parent e9f7017571
commit 168b0042c7

View File

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