feat(opencode): рабочий serve для dev стартует из папки репозитория; пул покрывает внешним сервером подкаталоги
This commit is contained in:
@@ -142,13 +142,25 @@ func (w *Worker) hasPostMortemTrace(ctx context.Context, taskID int64) bool {
|
||||
//
|
||||
// Статус задачи НЕ меняется (failed/timeout остаётся достигнутым); собственные
|
||||
// сбои постмортема не влияют на исход задачи — только логируются.
|
||||
func (w *Worker) postMortem(ctx context.Context, task *storage.Task) {
|
||||
// postMortem запускает постмортем-агент для задачи, завершившейся failed/timeout:
|
||||
// собирает сессии dev/reviewer из трасс, даёт агенту анализ, сохраняет результат
|
||||
// как trace agent=postmortem и уведомляет владельца задачи резюме.
|
||||
//
|
||||
// projectDir — каталог основного репозитория (тот же serve, где жили сессии
|
||||
// dev/reviewer); fallback на w.Worktree, если папка репо недоступна.
|
||||
//
|
||||
// Статус задачи НЕ меняется (failed/timeout остаётся достигнутым); собственные
|
||||
// сбои постмортема не влияют на исход задачи — только логируются.
|
||||
func (w *Worker) postMortem(ctx context.Context, task *storage.Task, projectDir string) {
|
||||
if w.Store == nil || w.Runner == nil {
|
||||
return
|
||||
}
|
||||
if w.hasPostMortemTrace(ctx, task.ID) {
|
||||
return
|
||||
}
|
||||
if projectDir == "" {
|
||||
projectDir = w.Worktree
|
||||
}
|
||||
|
||||
traces, err := w.Store.GetTraces(ctx, task.ID)
|
||||
if err != nil {
|
||||
@@ -172,7 +184,7 @@ func (w *Worker) postMortem(ctx context.Context, task *storage.Task) {
|
||||
if tr.SessionID == "" {
|
||||
continue
|
||||
}
|
||||
tx, tErr := w.Runner.SessionMessages(w.runCtx(ctx, task.ID), w.Worktree, tr.SessionID)
|
||||
tx, tErr := w.Runner.SessionMessages(w.runCtx(ctx, task.ID), projectDir, tr.SessionID)
|
||||
if tErr != nil {
|
||||
log.Printf("worker: task %d: постмортем: транскрипт %s (%s): %v", task.ID, tr.Agent, tr.SessionID, tErr)
|
||||
continue
|
||||
@@ -204,7 +216,7 @@ func (w *Worker) postMortem(ctx context.Context, task *storage.Task) {
|
||||
return
|
||||
}
|
||||
|
||||
res, rErr := w.Runner.Run(w.runCtx(ctx, task.ID), prompt, w.Worktree, postMortemAgent, "")
|
||||
res, rErr := w.Runner.Run(w.runCtx(ctx, task.ID), prompt, projectDir, postMortemAgent, "")
|
||||
if rErr != nil {
|
||||
log.Printf("worker: task %d: постмортем: запуск: %v", task.ID, rErr)
|
||||
w.finalizeTrace(ctx, traceID, storage.TraceFailed, rErr.Error())
|
||||
@@ -234,9 +246,9 @@ func (w *Worker) postMortem(ctx context.Context, task *storage.Task) {
|
||||
// postMortemAfter — defer-хук из runTask: запускает постмортем, если задача
|
||||
// завершилась failed/timeout. Собственные ошибки постмортема не мешают
|
||||
// исходному результату задачи (возвращаемый *error только читается).
|
||||
func (w *Worker) postMortemAfter(ctx context.Context, task *storage.Task, _ *error) {
|
||||
func (w *Worker) postMortemAfter(ctx context.Context, task *storage.Task, projectDir string, _ *error) {
|
||||
if task.Status != storage.StatusFailed && task.Status != storage.StatusTimeout {
|
||||
return
|
||||
}
|
||||
w.postMortem(ctx, task)
|
||||
w.postMortem(ctx, task, projectDir)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user