From 1e7fe8550e9ac043137f85c30b6963f90641fc74 Mon Sep 17 00:00:00 2001 From: Autumn-27 <53844290+Autumn-27@users.noreply.github.com> Date: Mon, 7 Sep 2026 11:35:07 -0400 Subject: [PATCH] =?UTF-8?q?feat(tools):=20add=5Fcompany=5Fscope=20?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=BB=91=E5=AE=9A=E7=94=B1=20worker=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=20planner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WorkerTools 移除 add_company_scope,PlannerTools 新增 - 新库 seed 默认绑定变为 mainagent/planner/auto - 老库加一次性迁移 seedCompanyScopeRebind:加 planner、去 worker --- agent/tools.go | 2 ++ agent/tools_insert.go | 5 +++-- server/orchestration.go | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/agent/tools.go b/agent/tools.go index ebed6d8..12c9dc8 100644 --- a/agent/tools.go +++ b/agent/tools.go @@ -1947,6 +1947,8 @@ func (t *ToolSet) PlannerTools() []actool.CoreTool { t.addFinding(), // list_companies:查看企业列表 + scope + 资产数(拿 company_id / 理解归属范围)。 t.listCompanies(), + // add_company_scope:规划时可把域名/IP/CIDR/ICP/关键词纳入某公司的资产范围(自动认领命中资产)。 + t.addCompanyScope(), // add_task_scope:主动把整根域/整公司/某子域/IP 纳入本任务测试范围(覆盖度分母)。 t.addTaskScope(), // list_untested_assets:按需查本任务范围内未测资产(类型+分页),自行决定补测。 diff --git a/agent/tools_insert.go b/agent/tools_insert.go index 8c6fb5b..66d0238 100644 --- a/agent/tools_insert.go +++ b/agent/tools_insert.go @@ -614,8 +614,9 @@ func (t *ToolSet) WorkerTools() []actool.CoreTool { t.addFinding(), t.recordFact(), // cross-work retrieval t.searchAllWorkerTraces(), t.listWorkerTraces(), t.getWorkerTrace(), - // asset management (handlers guard nil store internally) - t.insertAssets(), t.addCompanyScope(), t.listAssets(), t.listCompanies(), + // asset management (handlers guard nil store internally)。 + // add_company_scope 不给 worker:定义企业资产范围属规划/主控/Auto 的职责,worker 只执行探索。 + t.insertAssets(), t.listAssets(), t.listCompanies(), } } diff --git a/server/orchestration.go b/server/orchestration.go index 191bde2..cfd1c87 100644 --- a/server/orchestration.go +++ b/server/orchestration.go @@ -448,6 +448,7 @@ func (s *Server) seedOrchestrationTools() { s.refreshBuiltinToolSchemas() s.seedAutoDefaultBindings() s.seedPlannerDefaultBindings() + s.seedCompanyScopeRebind() s.seedAutoReportFindingBinding() s.unbindGoalMetDefault() s.reseedGoalsPrompt() // goals 提示词加入「抽操作约束」步 → 旧库追加一版新默认(一次性) @@ -718,6 +719,28 @@ func (s *Server) seedPlannerDefaultBindings() { _ = s.m.pg.SetSetting(flag, "true") } +// seedCompanyScopeRebind changes add_company_scope's default binding ONCE on +// existing DBs (guarded by a settings flag): the tool moves off worker and onto +// planner — defining a company's asset scope is a planning/main/auto concern, not +// something a worker does mid-exploration. Fresh DBs already get planner via +// PlannerTools() and lack worker via WorkerTools(); this only backfills old rows. +// One-shot + flag-guarded so a user who later re-binds worker isn't overridden. +func (s *Server) seedCompanyScopeRebind() { + const flag = "company_scope_rebind_v1" // worker→planner 默认绑定切换 + if v, _, _ := s.m.pg.GetSetting(flag); v == "true" { + return + } + if err := s.m.pg.AddAgentToToolBinding("planner", []string{"add_company_scope"}); err != nil { + log.Printf("[planner] add_company_scope 默认绑定失败: %v", err) + return + } + if err := s.m.pg.RemoveAgentFromTool("worker", "add_company_scope"); err != nil { + log.Printf("[worker] add_company_scope 解绑失败: %v", err) + return + } + _ = s.m.pg.SetSetting(flag, "true") +} + // seedAutoDefaultBindings adds "auto" to the task-op + platform tools' bindings // ONCE (guarded by a settings flag), so existing DBs whose tool rows were seeded // before Auto existed still give Auto its default toolset — without re-adding it