Make task state store-owned and signal its changes to the lead

This commit is contained in:
Ian Gulliver
2026-10-16 11:15:32 -07:00
parent 34db128afe
commit d26c81ceb1
15 changed files with 451 additions and 199 deletions
+14 -15
View File
@@ -51,7 +51,7 @@ type Manager struct {
deliverMu sync.Mutex
leadMu sync.Mutex
signals chan api.Event
signals chan []api.Event
snapMu sync.Mutex
snaps map[string]*snapState
@@ -114,7 +114,7 @@ func New(st *store.Store, worktreeRoot, leadRoot, codexHome string) *Manager {
paneMoved: map[string]time.Time{},
startedTodo: map[string]time.Time{},
finishing: map[string]bool{},
signals: make(chan api.Event, 1024),
signals: make(chan []api.Event, 1024),
snaps: map[string]*snapState{},
mergeHolders: map[string]string{},
bad: newBadLines(),
@@ -310,7 +310,7 @@ func (m *Manager) Recover(ctx context.Context) error {
if derr != nil {
return derr
}
next, serr := m.store.EndTurn(ctx, sess.Id, "byre", map[string]any{"error": err.Error()})
next, serr := m.store.EndTurn(ctx, sess.Id, "byre", map[string]any{"error": err.Error()}, nil, false)
if serr != nil {
return serr
}
@@ -660,7 +660,7 @@ func (m *Manager) pump(l *live) {
slog.Error("drop stage output", "session", l.id, "err", err)
}
}
next, err := m.store.EndTurn(ctx, l.id, agentActor, map[string]any{"error": "agent process exited mid-turn"})
next, err := m.store.EndTurn(ctx, l.id, agentActor, map[string]any{"error": "agent process exited mid-turn"}, nil, false)
if err != nil {
slog.Error("record session exit", "session", l.id, "err", err)
}
@@ -848,18 +848,10 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
case finished && !compacting && !asked:
payload["summary"] = true
}
err = m.emit(ctx, l, agentActor, "turn.ended", payload)
if err != nil {
return err
}
discard, err := m.store.GetDiscard(ctx, l.taskID)
if err != nil {
return err
}
go m.closeMergedSubtasks(l.taskID, l.dir)
if payload["summary"] == true && discard.State == store.DiscardNone {
go m.reportToParent(l.taskID, res.result)
}
mergingBy := ""
if finished && !handoff {
mergingBy, err = m.store.MergingBy(ctx, l.taskID)
@@ -867,8 +859,11 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
return err
}
}
if discard.State == store.DiscardNone {
m.snapshotSoon(l, api.SnapshotTriggerTurnEnd, 0, mergingBy == "")
snapshot := discard.State == store.DiscardNone
review := snapshot && mergingBy == ""
go m.closeMergedSubtasks(l.taskID, l.dir)
if payload["summary"] == true && snapshot {
go m.reportToParent(l.taskID, res.result)
}
if res.window > 0 {
@@ -900,10 +895,14 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error {
}
}
next, err := m.store.EndTurn(ctx, l.id, agentActor, nil)
turn := m.event(l, agentActor, "turn.ended", payload)
next, err := m.store.EndTurn(ctx, l.id, agentActor, nil, &turn, review)
if err != nil {
return err
}
if snapshot {
m.snapshotSoon(l, api.SnapshotTriggerTurnEnd, 0, review)
}
switch next {
case store.DiscardClosing: