(taskID string)
| 778 | } |
| 779 | |
| 780 | func (rt *AgentTaskRuntime) scheduleIdleTTLLocked(taskID string) { |
| 781 | rt.cancelIdleTTLLocked(taskID) |
| 782 | record := rt.records[taskID] |
| 783 | if record == nil || record.Status != "idle" { |
| 784 | return |
| 785 | } |
| 786 | ctx, cancel := context.WithCancel(context.Background()) |
| 787 | rt.idleTTLCancels[taskID] = cancel |
| 788 | go func() { |
| 789 | select { |
| 790 | case <-ctx.Done(): |
| 791 | return |
| 792 | case <-time.After(IdleTTLDuration): |
| 793 | } |
| 794 | rt.mu.Lock() |
| 795 | defer rt.mu.Unlock() |
| 796 | delete(rt.idleTTLCancels, taskID) |
| 797 | record := rt.records[taskID] |
| 798 | if record == nil || record.Status != "idle" { |
| 799 | return |
| 800 | } |
| 801 | record.Status = "completed" |
| 802 | record.TerminationReason = "idle_ttl_expired" |
| 803 | record.UpdatedAt = nowSeconds() |
| 804 | rt.enqueueLocked(record, "Reusable worker expired after idling.", record.ResultText) |
| 805 | delete(rt.workers, taskID) |
| 806 | delete(rt.workerSpecs, taskID) |
| 807 | rt.scheduleTerminalRecordCleanupLocked(taskID) |
| 808 | }() |
| 809 | } |
| 810 | |
| 811 | func (rt *AgentTaskRuntime) cancelIdleTTLLocked(taskID string) { |
| 812 | if cancel := rt.idleTTLCancels[taskID]; cancel != nil { |
no test coverage detected