fix(worker): постмортем получает транскрипт сессий dev/reviewer по session_id
Раньше постмортем-агенту передавался только session_id, без содержимого сессии — анализировать было нечего. Теперь Runner умеет читать сообщения сессии (Messages → renderTranscript) через SessionMessages, а postMortem подставляет реальные шаги агента (сообщения/tool-вызовы) в промпт. Пустая/недоступная сессия помечается явно. Сбои чтения не фатальны.
This commit is contained in:
@@ -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 — сколько подряд опросов должно подтвердить завершение ответа,
|
||||
// прежде чем считать вердикт финальным (устойчивость к гонке между удалением
|
||||
// сессии из активных дренажей и финализацией последнего сообщения).
|
||||
|
||||
Reference in New Issue
Block a user