diff --git a/agent/planner_runtime.go b/agent/planner_runtime.go index 36e34377..bc4dfbcb 100644 --- a/agent/planner_runtime.go +++ b/agent/planner_runtime.go @@ -2628,6 +2628,12 @@ func (a *Agent) runPostResponseMaintenanceAsync(userID int64) { }() ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() + // Respect agent shutdown: abort early if stopCh is closed. + select { + case <-a.stopCh: + return + default: + } a.maybeUpdateTaskStateIncrementally(ctx, userID) a.maybeCompressHistory(ctx, userID) }() diff --git a/agent/skill_execution_handlers.go b/agent/skill_execution_handlers.go index 44357506..f1fdda68 100644 --- a/agent/skill_execution_handlers.go +++ b/agent/skill_execution_handlers.go @@ -7,6 +7,7 @@ import ( "regexp" "strconv" "strings" + "time" "nofx/mcp" "nofx/store" @@ -2757,7 +2758,9 @@ func (a *Agent) handleTraderDiagnosisSkill(storeUserID, lang, text string) strin } evidence := a.collectTraderDiagnosisEvidence(storeUserID, target.ID, target.Name) - if answer, ok := a.generateTraderDiagnosisAnswerWithLLM(context.Background(), lang, text, evidence); ok { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + if answer, ok := a.generateTraderDiagnosisAnswerWithLLM(ctx, lang, text, evidence); ok { return answer } return formatTraderDiagnosisEvidence(lang, evidence)