diff --git a/agent/worker.go b/agent/worker.go index b8d861d..2b6725d 100644 --- a/agent/worker.go +++ b/agent/worker.go @@ -14,7 +14,6 @@ import ( "github.com/Autumn-27/norma/agentcore" "github.com/Autumn-27/norma/harness" "github.com/Autumn-27/norma/llm" - "github.com/Autumn-27/norma/memory" "github.com/Autumn-27/norma/permission" actool "github.com/Autumn-27/norma/tool" "github.com/Autumn-27/norma/transcript" @@ -48,7 +47,6 @@ type Worker struct { proxyAddr string proxyCACert string // recording proxy's CA cert path (for WebFetch HTTPS verify) webSearch WebSearchOpts // web_search tool backend selection (off by default) - mem *memory.Store // cross-engagement tradecraft memory (G4) tx *transcript.Store // raw LLM conversation persistence (nil = off) window int // context window in tokens (for compaction) windowFn func() int // optional dynamic task-chain minimum @@ -134,14 +132,27 @@ func (w *Worker) SetRunTimeout(run time.Duration) { // plain-text one-liner (which becomes this run's displayed result). const settleWrapUpPrompt = "你即将因预算耗尽被终止。不要再运行任何命令/探测。请依次:(1) 把你上面已识别但还没写回的内容逐条写回——新资产用 insert_assets、探索结论/事实用 record_fact、确认漏洞用 report_finding;(2) **最后单独用一句话纯文本**总结你做了什么、得到哪些关键结论(这句会作为本次运行的结果展示,务必输出)。" -// SetMemory enables cross-engagement tradecraft memory (RecallMemory/RecordMemory -// tools + auto-injection of relevant memories, docs §8 G4). -func (w *Worker) SetMemory(m *memory.Store) { w.mem = m } - func NewWorker(prov llm.Provider, model, workDir string, tx *transcript.Store, window, maxTurns int, extra ...actool.CoreTool) *Worker { return &Worker{prov: prov, model: model, workDir: workDir, tx: tx, window: window, maxTurns: maxTurns, extraTools: extra} } +// defaultToolsExcept returns actool.DefaultTools() minus the named tools (by +// CoreTool.Name()). Used to trim SDK default tools an agent shouldn't have. +func defaultToolsExcept(exclude ...string) []actool.CoreTool { + drop := make(map[string]bool, len(exclude)) + for _, n := range exclude { + drop[n] = true + } + all := actool.DefaultTools() + out := make([]actool.CoreTool, 0, len(all)) + for _, t := range all { + if !drop[t.Name()] { + out = append(out, t) + } + } + return out +} + func (w *Worker) SetCompactionWindowResolver(fn func() int) { w.windowFn = fn } func (w *Worker) compactionWindow() int { @@ -343,7 +354,9 @@ func (w *Worker) execute(ctx context.Context, name string, taskID int64, as *db. // then augment with the agent's visible skills/MCP. During the SDK settlement // phase, Bash is hidden via Settlement.DisabledTools (no local gating needed). base := append(tsx.WorkerTools(), w.extraTools...) - base = append(base, actool.DefaultTools()...) + // worker 刻意不给 MultiEdit/Glob/Grep:文件精改用 Edit、检索走 Bash(grep/find), + // 收敛工具面、减少低价值调用。其余 SDK 默认工具(Read/Write/Edit/LS/Bash/Sleep)照常。 + base = append(base, defaultToolsExcept("MultiEdit", "Glob", "Grep")...) ctx = WithRunInfo(ctx, RunInfo{TaskID: taskID, ExplorationID: explorationID(ts), IntentID: intent.ID}) tools, def, cleanup := AugmentTools(ctx, "worker", base) tools = tsx.StripCoverageParams(tools) // 覆盖度关闭时隐藏 insert_assets 的 related 入参 @@ -433,9 +446,6 @@ func (w *Worker) execute(ctx context.Context, name string, taskID int64, as *db. if hooks != nil { // typed-nil guard: only set when concrete (avoids harness panic) opts.Hooks = hooks } - if w.mem != nil { - opts.Memory = &agentcore.MemoryOptions{Store: w.mem, AutoInject: true, MaxInject: 3} - } if w.tx != nil { // persist raw LLM conversation; one file per worked intent opts.Transcript = w.tx opts.SessionID = WorkerSessionID(ts.ID(), intent.ID) diff --git a/server/server.go b/server/server.go index 3aff826..6e0f2bf 100644 --- a/server/server.go +++ b/server/server.go @@ -25,7 +25,6 @@ import ( "github.com/Autumn-27/artex/llmrec" "github.com/Autumn-27/artex/report" "github.com/Autumn-27/norma/llm" - "github.com/Autumn-27/norma/memory" actool "github.com/Autumn-27/norma/tool" "github.com/Autumn-27/norma/transcript" ) @@ -412,7 +411,6 @@ func (s *Server) buildPlannerWorker(pinID *int64, gProv llm.Provider, gCfg agent wk.SetFindingRecorder(s.evidenceStore()) wk.SetRunTimeout(time.Duration(s.agentRunSeconds("worker")) * time.Second) wk.SetProxy(s.m.ProxyAddr(), s.m.ProxyCACert()) - wk.SetMemory(memory.NewStore(filepath.Join(s.m.dir, "memory"))) wk.SetWebSearch(s.webSearchFor("worker")) wk.SetConstraintInject(s.constraintInjectWorker) // 操作约束注入 worker(可配置,默认开;每轮读) wk.SetNonStreaming(nonStreamingResolver(wCfg)) // 该 profile 选非流式时走 Provider.Complete diff --git a/server/task_llm.go b/server/task_llm.go index 42c59b4..6e79935 100644 --- a/server/task_llm.go +++ b/server/task_llm.go @@ -16,7 +16,6 @@ import ( "github.com/Autumn-27/artex/db" "github.com/Autumn-27/artex/llmrec" "github.com/Autumn-27/norma/llm" - "github.com/Autumn-27/norma/memory" "github.com/Autumn-27/norma/transcript" ) @@ -569,7 +568,6 @@ func (s *Server) agentsForTask(t *Task) *taskAgentBundle { wk.SetMaxTokens(workerRuntime.maxTokens) // 同上,输出上限也跟随当前激活 profile wk.SetRunTimeout(time.Duration(s.agentRunSeconds("worker")) * time.Second) wk.SetProxy(s.m.ProxyAddr(), s.m.ProxyCACert()) - wk.SetMemory(memory.NewStore(filepath.Join(s.m.dir, "memory"))) wk.SetWebSearch(s.webSearchFor("worker")) wk.SetConstraintInject(s.constraintInjectWorker) // 操作约束注入 worker(可配置,默认开) pl := agent.NewPlanner(plannerRuntime, "task-router", s.m.dir, tx, plannerRuntime.CompactionWindow(), s.agentMaxTurns("planner"))