Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
package tools
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/Tencent/WeKnora/internal/modelcontext"
|
|
)
|
|
|
|
// Every built-in tool must declare a model-handle policy. Without an entry,
|
|
// modelcontext treats the tool's output like dynamic MCP output: durable chunk
|
|
// IDs, knowledge IDs and KB IDs are passed through to the model verbatim,
|
|
// which the source protocol prompt explicitly forbids. An empty policy is a
|
|
// valid answer ("compact known IDs, render nothing structured"); silence is
|
|
// not, because a newly added tool would opt out by accident.
|
|
func TestEveryBuiltInToolDeclaresAModelHandlePolicy(t *testing.T) {
|
|
builtIns := []string{
|
|
ToolThinking,
|
|
ToolTodoWrite,
|
|
ToolGrepChunks,
|
|
ToolKnowledgeSearch,
|
|
ToolListKnowledgeChunks,
|
|
ToolQueryKnowledgeGraph,
|
|
ToolGetDocumentInfo,
|
|
ToolSearchConversations,
|
|
ToolSearchMemory,
|
|
ToolDatabaseQuery,
|
|
ToolDataAnalysis,
|
|
ToolDataSchema,
|
|
ToolWebSearch,
|
|
ToolWebFetch,
|
|
ToolExecuteSkillScript,
|
|
ToolReadSkill,
|
|
ToolListSandboxFiles,
|
|
ToolReadSandboxFile,
|
|
ToolWriteSandboxFile,
|
|
ToolEditSandboxFile,
|
|
ToolWriteSkillFile,
|
|
ToolEditSkillFile,
|
|
ToolShellExec,
|
|
ToolWikiReadPage,
|
|
ToolWikiWritePage,
|
|
ToolWikiReplaceText,
|
|
ToolWikiRenamePage,
|
|
ToolWikiDeletePage,
|
|
ToolWikiSearch,
|
|
ToolWikiReadSourceDoc,
|
|
ToolWikiFlagIssue,
|
|
ToolWikiReadIssue,
|
|
ToolWikiUpdateIssue,
|
|
}
|
|
for _, name := range builtIns {
|
|
if !modelcontext.HasToolPolicy(name) {
|
|
t.Errorf("built-in tool %q has no entry in modelcontext.toolHandlePolicies", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
// AvailableToolDefinitions drives the settings UI, so anything listed there is
|
|
// a built-in the Agent can register and must also carry a policy.
|
|
func TestAvailableToolDefinitionsDeclareModelHandlePolicies(t *testing.T) {
|
|
for _, definition := range AvailableToolDefinitions() {
|
|
if !modelcontext.HasToolPolicy(definition.Name) {
|
|
t.Errorf("tool %q is exposed to the UI but has no model-handle policy", definition.Name)
|
|
}
|
|
}
|
|
}
|