Make task state store-owned and signal its changes to the lead
This commit is contained in:
+14
-15
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user