mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-07-25 10:21:47 +00:00
58 lines
2.0 KiB
Go
58 lines
2.0 KiB
Go
package tools
|
|
|
|
import "slices"
|
|
|
|
// ToolCapability describes what a tool can do.
|
|
type ToolCapability string
|
|
|
|
const (
|
|
CapReadOnly ToolCapability = "read-only" // no side effects
|
|
CapMutating ToolCapability = "mutating" // modifies state
|
|
CapAsync ToolCapability = "async" // returns immediately
|
|
CapMCPBridged ToolCapability = "mcp-bridged" // proxied to external MCP server
|
|
)
|
|
|
|
// ToolMetadata describes a tool's capabilities and requirements.
|
|
type ToolMetadata struct {
|
|
Name string
|
|
Capabilities []ToolCapability
|
|
Group string // "fs", "web", "runtime", "memory", "team", etc.
|
|
RequiresWorkspace bool
|
|
ProviderHints map[string]any
|
|
}
|
|
|
|
// HasCapability checks if metadata includes a specific capability.
|
|
func (m ToolMetadata) HasCapability(cap ToolCapability) bool {
|
|
return slices.Contains(m.Capabilities, cap)
|
|
}
|
|
|
|
// IsMutating returns true if the tool modifies state.
|
|
func (m ToolMetadata) IsMutating() bool {
|
|
return m.HasCapability(CapMutating)
|
|
}
|
|
|
|
// IsReadOnly returns true if the tool has no side effects.
|
|
func (m ToolMetadata) IsReadOnly() bool {
|
|
return m.HasCapability(CapReadOnly)
|
|
}
|
|
|
|
// inferMetadata returns default metadata for a tool based on name conventions.
|
|
// Used when no explicit metadata was registered.
|
|
func inferMetadata(name string) ToolMetadata {
|
|
meta := ToolMetadata{Name: name}
|
|
switch {
|
|
case name == "read_file" || name == "list_files" || name == "read_image" ||
|
|
name == "read_audio" || name == "read_video" || name == "read_document" ||
|
|
name == "memory_search" || name == "memory_get" || name == "memory_expand" ||
|
|
name == "skill_search" || name == "knowledge_graph_search" ||
|
|
name == "sessions_list" || name == "session_status" || name == "sessions_history" ||
|
|
name == "datetime" || name == "wait" || name == "web_search" || name == "web_fetch":
|
|
meta.Capabilities = []ToolCapability{CapReadOnly}
|
|
case name == "spawn":
|
|
meta.Capabilities = []ToolCapability{CapAsync}
|
|
default:
|
|
meta.Capabilities = []ToolCapability{CapMutating}
|
|
}
|
|
return meta
|
|
}
|