fix(worker): постмортем получает транскрипт сессий dev/reviewer по session_id
Some checks failed
CI / test (push) Failing after 1m52s
CI / build-and-package (amd64, linux) (push) Failing after 1m1s
CI / build-and-package (amd64, windows) (push) Successful in 29s

Раньше постмортем-агенту передавался только session_id, без содержимого
сессии — анализировать было нечего. Теперь Runner умеет читать сообщения
сессии (Messages → renderTranscript) через SessionMessages, а postMortem
подставляет реальные шаги агента (сообщения/tool-вызовы) в промпт.
Пустая/недоступная сессия помечается явно. Сбои чтения не фатальны.
This commit is contained in:
ki.sagidullin
2026-08-24 16:48:43 +05:00
parent 89d571b483
commit 6546f18348
5 changed files with 221 additions and 16 deletions

View File

@@ -90,6 +90,30 @@ func (r *Runner) Run(ctx context.Context, prompt, cwd, agent, sessionID string)
return r.awaitVerdict(ctx, c, sid, agent, prompt)
}
// SessionMessages возвращает транскрипт сессии (шаги агента: сообщения,
// тексты, tool-вызовы) в хронологическом порядке для постмортем-анализа.
// sessionID пустой → пустая строка без ошибки. Ошибки чтения возвращаются
// как есть — вызывающий (постмортем) решает, логировать и продолжить.
func (r *Runner) SessionMessages(ctx context.Context, cwd, sessionID string) (string, error) {
r.defaults()
if r.Pool == nil {
return "", fmt.Errorf("opencode: Pool не задан (API-режим обязателен)")
}
if sessionID == "" {
return "", nil
}
srv, err := r.Pool.Ensure(ctx, cwd)
if err != nil {
return "", err
}
c := &Client{BaseURL: srv.Addr(), Password: srv.Password, Directory: srv.Dir, Debug: r.Debug}
msgs, err := c.Messages(ctx, sessionID)
if err != nil {
return "", err
}
return renderTranscript(msgs), nil
}
// settlePolls — сколько подряд опросов должно подтвердить завершение ответа,
// прежде чем считать вердикт финальным (устойчивость к гонке между удалением
// сессии из активных дренажей и финализацией последнего сообщения).