mirror of
https://github.com/Twigpine/zero.git
synced 2026-11-11 13:11:30 -10:00
- Remove unused safeRequestedPrefix, safeShellCommandTokens (internal/agent/command_prefix.go), and truncateHeadTail (internal/tools/bash.go): each was a thin wrapper with no remaining callers. - Drop an ineffectual assignment in stringListArgWebSearch: every return path after it already sets the named return explicitly. - Simplify a negated-and condition in partition_cache_stable_test.go via De Morgan's law. - Use strings.Contains instead of strings.Index(...) < 0 in edit_replacers.go. - Fix error string style (ST1005): lowercase "unsafe redirect URL" and drop the trailing period from webFetchPublicOnlyHint. Skipped the errcheck findings on this pass (unchecked defer Close()/Write() errors): those are stylistic, not correctness bugs, and this repo's CI only runs go vet, not golangci-lint.
45 lines
1.7 KiB
Go
45 lines
1.7 KiB
Go
package agent
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/Gitlawb/zero/internal/tools"
|
|
)
|
|
|
|
func TestPartitionToolsActiveAppendsLoadedToolAfterEagerBlock(t *testing.T) {
|
|
// Cache-stability property: loading a deferred tool must APPEND it after the
|
|
// always-eager tools, not sort it into the middle of them — otherwise the tool
|
|
// definitions (the provider's cacheable prefix) shift on every load. The old
|
|
// behaviour alpha-sorted the whole array, so "mcp__srv__alpha" jumped ahead of
|
|
// "read_file".
|
|
root := t.TempDir()
|
|
registry := tools.NewRegistry()
|
|
registry.Register(tools.NewReadFileTool(root)) // non-deferred, "read_file"
|
|
registry.Register(fakeToolSearchTool{})
|
|
registry.Register(fakeDeferredTool{name: "mcp__srv__alpha", desc: "alpha"})
|
|
registry.Register(fakeDeferredTool{name: "mcp__srv__beta", desc: "beta"})
|
|
|
|
exposed, _ := partitionTools(registry, PermissionModeAuto, Options{DeferThreshold: 2}, map[string]bool{"mcp__srv__alpha": true})
|
|
|
|
pos := func(name string) int {
|
|
for i := range exposed {
|
|
if exposed[i].Name == name {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
readPos, searchPos, alphaPos := pos("read_file"), pos("tool_search"), pos("mcp__srv__alpha")
|
|
if readPos < 0 || searchPos < 0 || alphaPos < 0 {
|
|
t.Fatalf("expected read_file, tool_search and loaded alpha all exposed, got %#v", exposed)
|
|
}
|
|
// The eager tools must precede the loaded deferred tool (appended, not inserted).
|
|
if readPos >= alphaPos || searchPos >= alphaPos {
|
|
t.Fatalf("loaded deferred tool must be appended after the eager block; got read=%d search=%d alpha=%d", readPos, searchPos, alphaPos)
|
|
}
|
|
// beta was never loaded — it stays hidden.
|
|
if pos("mcp__srv__beta") != -1 {
|
|
t.Fatalf("unloaded deferred tool must stay hidden, got %#v", exposed)
|
|
}
|
|
}
|