fix: открыть буфер bufio.Scanner до 64МБ — NDJSON-строка с text-партом вердикта >64КБ роняла сканер (ErrTooLong), терялся весь поток после первого события (step_start); добавить диаг. лог lines/bytes/scanerr
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user