From 8e31a75263798b6030c843d80fe36bd8fc0f67e0 Mon Sep 17 00:00:00 2001 From: Autumn-27 <53844290+Autumn-27@users.noreply.github.com> Date: Wed, 12 Aug 2026 11:41:43 -0400 Subject: [PATCH] =?UTF-8?q?fix(server):=20=E5=88=A0=E6=8E=89=20seed()=20?= =?UTF-8?q?=E7=9A=84=20t.Notify()=E2=80=94=E2=80=94=E7=A7=8D=E5=AD=90?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=AF=AF=E8=A7=A6=E5=8F=91=E9=A6=96=E8=BD=AE?= =?UTF-8?q?=20planner=20=E7=9A=84=E7=9C=9F=E5=87=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一修复(HasActiveIntent)只堵了 Run 里的首轮 Notify,但 s.seed() 在建任务时(早于 Run)也调 t.Notify(),它 buffered 进 notify 通道存着,plannerLoop 一启动就消费掉→跑首轮, 完全绕过 Run 的门控。所以种子任务部署后仍会「目标拆解后立马 edge 触发」。 改法:删掉 seed() 全部三处 t.Notify()(正常路径 + 两个早退)。首轮是否触发统一收敛到 engine.Run 的 HasActiveIntent 一个决策点:种子意图(open/running)存在则跳过首轮。 已确认 createGoals/seedFirstIntent 均不 Notify、不建带 notify 的 ToolSet,路径无其它 buffered 源。 --- server/server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/server.go b/server/server.go index 521a749..705bd8c 100644 --- a/server/server.go +++ b/server/server.go @@ -1148,13 +1148,11 @@ func (s *Server) seed(t *Task, text string) { scheme, host, port, ok := parseTarget(text) if !ok { log.Printf("[seed] task %s: 未能从 %q 解析出目标 host/IP,不创建站点(请手动配置 scope)", t.ID, text) - t.Notify() return } // P0-1 guard: never treat the configured LLM gateway as a target. if gw := s.llmHost(); gw != "" && host == gw { log.Printf("[seed] task %s: 目标 %q 是 LLM 网关,拒绝作为渗透目标", t.ID, host) - t.Notify() return } @@ -1180,7 +1178,9 @@ func (s *Server) seed(t *Task, text string) { } } log.Printf("[seed] task %s: 目标站点 %s", t.ID, u) - t.Notify() + // 不在这里 Notify:首轮是否触发统一由 engine.Run 的 HasActiveIntent 决定(种子意图任务 + // 跳过首轮)。seed 早于 Run 执行,若在此 Notify 会 buffered 到通道、被 plannerLoop 启动时 + // 消费掉而绕过 Run 的门控 → 种子任务仍误触发首轮。 } // seedFirstIntent writes ONE open intent (summary = 描述+目标) into the task's