mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-05-06 11:49:45 +08:00
Recover running subagent tasks after restart
This commit is contained in:
@@ -51,6 +51,7 @@ type SubagentTask struct {
|
||||
type SubagentManager struct {
|
||||
tasks map[string]*SubagentTask
|
||||
cancelFuncs map[string]context.CancelFunc
|
||||
recoverableTaskIDs []string
|
||||
archiveAfterMinute int64
|
||||
mu sync.RWMutex
|
||||
provider providers.LLMProvider
|
||||
@@ -99,9 +100,13 @@ func NewSubagentManager(provider providers.LLMProvider, workspace string, bus *b
|
||||
if runStore != nil {
|
||||
for _, task := range runStore.List() {
|
||||
mgr.tasks[task.ID] = task
|
||||
if task.Status == "running" {
|
||||
mgr.recoverableTaskIDs = append(mgr.recoverableTaskIDs, task.ID)
|
||||
}
|
||||
}
|
||||
mgr.nextID = runStore.NextIDSeed()
|
||||
}
|
||||
go mgr.resumeRecoveredTasks()
|
||||
return mgr
|
||||
}
|
||||
|
||||
@@ -534,6 +539,7 @@ func (sm *SubagentManager) SetRunFunc(f SubagentRunFunc) {
|
||||
sm.mu.Lock()
|
||||
defer sm.mu.Unlock()
|
||||
sm.runFunc = f
|
||||
go sm.resumeRecoveredTasks()
|
||||
}
|
||||
|
||||
func (sm *SubagentManager) ProfileStore() *SubagentProfileStore {
|
||||
@@ -542,6 +548,38 @@ func (sm *SubagentManager) ProfileStore() *SubagentProfileStore {
|
||||
return sm.profileStore
|
||||
}
|
||||
|
||||
func (sm *SubagentManager) resumeRecoveredTasks() {
|
||||
if sm == nil {
|
||||
return
|
||||
}
|
||||
sm.mu.Lock()
|
||||
if sm.runFunc == nil && sm.provider == nil {
|
||||
sm.mu.Unlock()
|
||||
return
|
||||
}
|
||||
taskIDs := append([]string(nil), sm.recoverableTaskIDs...)
|
||||
sm.recoverableTaskIDs = nil
|
||||
toResume := make([]*SubagentTask, 0, len(taskIDs))
|
||||
for _, taskID := range taskIDs {
|
||||
task, ok := sm.tasks[taskID]
|
||||
if !ok || task == nil || task.Status != "running" {
|
||||
continue
|
||||
}
|
||||
task.Updated = time.Now().UnixMilli()
|
||||
sm.persistTaskLocked(task, "recovered", "auto-resumed after restart")
|
||||
toResume = append(toResume, task)
|
||||
}
|
||||
sm.mu.Unlock()
|
||||
|
||||
for _, task := range toResume {
|
||||
taskCtx, cancel := context.WithCancel(context.Background())
|
||||
sm.mu.Lock()
|
||||
sm.cancelFuncs[task.ID] = cancel
|
||||
sm.mu.Unlock()
|
||||
go sm.runTask(taskCtx, task)
|
||||
}
|
||||
}
|
||||
|
||||
func (sm *SubagentManager) NextTaskSequence() int {
|
||||
sm.mu.RLock()
|
||||
defer sm.mu.RUnlock()
|
||||
|
||||
Reference in New Issue
Block a user