74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// Tool represents an executable tool
|
|
type Tool interface {
|
|
Name() string
|
|
Description() string
|
|
Execute(ctx context.Context, params map[string]interface{}) (*ToolResult, error)
|
|
}
|
|
|
|
// ToolResult represents the result of tool execution
|
|
type ToolResult struct {
|
|
Success bool
|
|
Data interface{}
|
|
Error string
|
|
RequiresConfirmation bool
|
|
}
|
|
|
|
// Registry manages available tools
|
|
type Registry struct {
|
|
tools map[string]Tool
|
|
}
|
|
|
|
// NewRegistry creates a new tool registry
|
|
func NewRegistry() *Registry {
|
|
return &Registry{
|
|
tools: make(map[string]Tool),
|
|
}
|
|
}
|
|
|
|
// Register registers a tool
|
|
func (r *Registry) Register(tool Tool) {
|
|
r.tools[tool.Name()] = tool
|
|
}
|
|
|
|
// Get gets a tool by name
|
|
func (r *Registry) Get(name string) (Tool, error) {
|
|
tool, ok := r.tools[name]
|
|
if !ok {
|
|
return nil, fmt.Errorf("tool not found: %s", name)
|
|
}
|
|
return tool, nil
|
|
}
|
|
|
|
// List returns all registered tools
|
|
func (r *Registry) List() []Tool {
|
|
tools := make([]Tool, 0, len(r.tools))
|
|
for _, tool := range r.tools {
|
|
tools = append(tools, tool)
|
|
}
|
|
return tools
|
|
}
|
|
|
|
// GetAllowedTools returns tools allowed for a tenant
|
|
func (r *Registry) GetAllowedTools(allowedNames []string) []Tool {
|
|
allowedSet := make(map[string]bool)
|
|
for _, name := range allowedNames {
|
|
allowedSet[name] = true
|
|
}
|
|
|
|
var tools []Tool
|
|
for _, tool := range r.tools {
|
|
if allowedSet[tool.Name()] {
|
|
tools = append(tools, tool)
|
|
}
|
|
}
|
|
return tools
|
|
}
|
|
|