diff --git a/internal/agent/core/agent.go b/internal/agent/core/agent.go index d1e9797..9aa659a 100644 --- a/internal/agent/core/agent.go +++ b/internal/agent/core/agent.go @@ -1027,6 +1027,22 @@ func (a *Agent) executeToolCall(tc agentAPI.ToolCall) (ret string) { ret = fmt.Sprintf("工具 %s 执行崩溃: %v", tc.Name, r) } }() + + done := make(chan string, 1) + go func() { + done <- a.executeToolCallInner(tc) + }() + + select { + case result := <-done: + return result + case <-time.After(60 * time.Second): + log.Printf("[agent] tool %s timed out after 60s", tc.Name) + return fmt.Sprintf("工具 %s 执行超时(60秒),已取消", tc.Name) + } +} + +func (a *Agent) executeToolCallInner(tc agentAPI.ToolCall) string { switch { case strings.HasPrefix(tc.Name, "memory_"): return a.executeMemoryTool(tc) diff --git a/internal/knowledge/knowledge.go b/internal/knowledge/knowledge.go index a90d60d..444b672 100644 --- a/internal/knowledge/knowledge.go +++ b/internal/knowledge/knowledge.go @@ -177,9 +177,11 @@ func (s *Store) Add(name, content string) error { }) s.summaries = append(s.summaries, name+" "+content) - if err := s.writeIndex(); err != nil { - log.Printf("[knowledge] write index error after adding %s: %v", name, err) - } + go func() { + if err := s.writeIndex(); err != nil { + log.Printf("[knowledge] write index error after adding %s: %v", name, err) + } + }() log.Printf("[knowledge] added: %s (%d bytes)", name, len(content)) return nil }