Add Away mode and an agent fork tool

This commit is contained in:
Ian Gulliver
2026-10-19 21:40:24 -07:00
parent bb60b685ba
commit f6f2440635
22 changed files with 617 additions and 317 deletions
+16 -10
View File
@@ -145,7 +145,7 @@ func (m *Manager) takeSnapshot(ctx context.Context, t snapTarget, trigger api.Sn
if err != nil && !errors.Is(err, store.ErrNotFound) {
return nil, err
}
reviewed, err := m.store.LastSnapshotNot(ctx, t.taskID, api.SnapshotTriggerAnswer)
reviewed, err := m.store.LastReviewable(ctx, t.taskID)
if err != nil && !errors.Is(err, store.ErrNotFound) {
return nil, err
}
@@ -229,6 +229,19 @@ func (m *Manager) sessionTarget(ctx context.Context, sess api.AgentSession, task
}
func (m *Manager) snapshotForAnswer(ctx context.Context, t snapTarget, held bool) int {
snap, err := m.cutSnapshot(ctx, t, held, api.SnapshotTriggerAnswer)
if err != nil {
slog.Error("take snapshot", "task", t.taskID, "trigger", api.SnapshotTriggerAnswer, "err", err)
m.recordError(&live{id: t.sessionID, taskID: t.taskID, projectID: t.projectID}, fmt.Sprintf("byre couldn't snapshot the worktree before handing over an answer, so the answer went to the agent without one: %v", err))
return 0
}
if snap == nil {
return 0
}
return snap.N
}
func (m *Manager) cutSnapshot(ctx context.Context, t snapTarget, held bool, trigger api.SnapshotTrigger) (*api.Snapshot, error) {
if !held {
unlock := m.lockTask(t.taskID)
defer unlock()
@@ -242,16 +255,9 @@ func (m *Manager) snapshotForAnswer(ctx context.Context, t snapTarget, held bool
closed := st.closed
m.snapMu.Unlock()
if closed {
return 0
return nil, nil
}
snap, err := m.takeSnapshot(ctx, t, api.SnapshotTriggerAnswer, 0, true)
if err != nil {
slog.Error("take snapshot", "task", t.taskID, "trigger", api.SnapshotTriggerAnswer, "err", err)
m.recordError(&live{id: t.sessionID, taskID: t.taskID, projectID: t.projectID}, fmt.Sprintf("byre couldn't snapshot the worktree before handing over an answer, so the answer went to the agent without one: %v", err))
return 0
}
return snap.N
return m.takeSnapshot(ctx, t, trigger, 0, true)
}
func (m *Manager) takeSnapshotTool(l *live) mcp.Tool {