Co-authored-by: hobbyistlabs-coder <267281733+hobbyistlabs-coder@users.noreply.github.com>
244 lines
12 KiB
Go
244 lines
12 KiB
Go
package config
|
|
|
|
type ToolDiscoveryConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_DISCOVERY_ENABLED"`
|
|
TTL int `json:"ttl" env:"PICOCLAW_TOOLS_DISCOVERY_TTL"`
|
|
MaxSearchResults int `json:"max_search_results" env:"PICOCLAW_MAX_SEARCH_RESULTS"`
|
|
UseBM25 bool `json:"use_bm25" env:"PICOCLAW_TOOLS_DISCOVERY_USE_BM25"`
|
|
UseRegex bool `json:"use_regex" env:"PICOCLAW_TOOLS_DISCOVERY_USE_REGEX"`
|
|
}
|
|
|
|
type ToolConfig struct {
|
|
Enabled bool `json:"enabled" env:"ENABLED"`
|
|
}
|
|
|
|
type BraveConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_BRAVE_ENABLED"`
|
|
APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_BRAVE_API_KEY"`
|
|
APIKeys []string `json:"api_keys" env:"PICOCLAW_TOOLS_WEB_BRAVE_API_KEYS"`
|
|
MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_BRAVE_MAX_RESULTS"`
|
|
}
|
|
|
|
type TavilyConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_TAVILY_ENABLED"`
|
|
APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_TAVILY_API_KEY"`
|
|
APIKeys []string `json:"api_keys" env:"PICOCLAW_TOOLS_WEB_TAVILY_API_KEYS"`
|
|
BaseURL string `json:"base_url" env:"PICOCLAW_TOOLS_WEB_TAVILY_BASE_URL"`
|
|
MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_TAVILY_MAX_RESULTS"`
|
|
}
|
|
|
|
type DuckDuckGoConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_ENABLED"`
|
|
MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_MAX_RESULTS"`
|
|
}
|
|
|
|
type PerplexityConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_PERPLEXITY_ENABLED"`
|
|
APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_PERPLEXITY_API_KEY"`
|
|
APIKeys []string `json:"api_keys" env:"PICOCLAW_TOOLS_WEB_PERPLEXITY_API_KEYS"`
|
|
MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_PERPLEXITY_MAX_RESULTS"`
|
|
}
|
|
|
|
type SearXNGConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_SEARXNG_ENABLED"`
|
|
BaseURL string `json:"base_url" env:"PICOCLAW_TOOLS_WEB_SEARXNG_BASE_URL"`
|
|
MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_SEARXNG_MAX_RESULTS"`
|
|
}
|
|
|
|
type GLMSearchConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_GLM_ENABLED"`
|
|
APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_GLM_API_KEY"`
|
|
BaseURL string `json:"base_url" env:"PICOCLAW_TOOLS_WEB_GLM_BASE_URL"`
|
|
// SearchEngine specifies the search backend: "search_std" (default),
|
|
// "search_pro", "search_pro_sogou", or "search_pro_quark".
|
|
SearchEngine string `json:"search_engine" env:"PICOCLAW_TOOLS_WEB_GLM_SEARCH_ENGINE"`
|
|
MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_GLM_MAX_RESULTS"`
|
|
}
|
|
|
|
type WebToolsConfig struct {
|
|
ToolConfig ` envPrefix:"PICOCLAW_TOOLS_WEB_"`
|
|
Brave BraveConfig ` json:"brave"`
|
|
Tavily TavilyConfig ` json:"tavily"`
|
|
DuckDuckGo DuckDuckGoConfig ` json:"duckduckgo"`
|
|
Perplexity PerplexityConfig ` json:"perplexity"`
|
|
SearXNG SearXNGConfig ` json:"searxng"`
|
|
GLMSearch GLMSearchConfig ` json:"glm_search"`
|
|
// Proxy is an optional proxy URL for web tools (http/https/socks5/socks5h).
|
|
// For authenticated proxies, prefer HTTP_PROXY/HTTPS_PROXY env vars instead of embedding credentials in config.
|
|
Proxy string `json:"proxy,omitempty" env:"PICOCLAW_TOOLS_WEB_PROXY"`
|
|
FetchLimitBytes int64 `json:"fetch_limit_bytes,omitempty" env:"PICOCLAW_TOOLS_WEB_FETCH_LIMIT_BYTES"`
|
|
}
|
|
|
|
type CronToolsConfig struct {
|
|
ToolConfig ` envPrefix:"PICOCLAW_TOOLS_CRON_"`
|
|
ExecTimeoutMinutes int ` env:"PICOCLAW_TOOLS_CRON_EXEC_TIMEOUT_MINUTES" json:"exec_timeout_minutes"` // 0 means no timeout
|
|
}
|
|
|
|
type ExecConfig struct {
|
|
ToolConfig ` envPrefix:"PICOCLAW_TOOLS_EXEC_"`
|
|
EnableDenyPatterns bool ` env:"PICOCLAW_TOOLS_EXEC_ENABLE_DENY_PATTERNS" json:"enable_deny_patterns"`
|
|
AllowRemote bool ` env:"PICOCLAW_TOOLS_EXEC_ALLOW_REMOTE" json:"allow_remote"`
|
|
CustomDenyPatterns []string ` env:"PICOCLAW_TOOLS_EXEC_CUSTOM_DENY_PATTERNS" json:"custom_deny_patterns"`
|
|
CustomAllowPatterns []string ` env:"PICOCLAW_TOOLS_EXEC_CUSTOM_ALLOW_PATTERNS" json:"custom_allow_patterns"`
|
|
TimeoutSeconds int ` env:"PICOCLAW_TOOLS_EXEC_TIMEOUT_SECONDS" json:"timeout_seconds"` // 0 means use default (60s)
|
|
}
|
|
|
|
type SkillsToolsConfig struct {
|
|
ToolConfig ` envPrefix:"PICOCLAW_TOOLS_SKILLS_"`
|
|
Registries SkillsRegistriesConfig ` json:"registries"`
|
|
MaxConcurrentSearches int ` json:"max_concurrent_searches" env:"PICOCLAW_TOOLS_SKILLS_MAX_CONCURRENT_SEARCHES"`
|
|
SearchCache SearchCacheConfig ` json:"search_cache"`
|
|
}
|
|
|
|
type MediaCleanupConfig struct {
|
|
ToolConfig ` envPrefix:"PICOCLAW_MEDIA_CLEANUP_"`
|
|
MaxAge int ` env:"PICOCLAW_MEDIA_CLEANUP_MAX_AGE" json:"max_age_minutes"`
|
|
Interval int ` env:"PICOCLAW_MEDIA_CLEANUP_INTERVAL" json:"interval_minutes"`
|
|
}
|
|
|
|
type JulesConfig struct {
|
|
ToolConfig `envPrefix:"PICOCLAW_TOOLS_JULES_"`
|
|
APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_JULES_API_KEY"`
|
|
}
|
|
|
|
type ReadFileToolConfig struct {
|
|
Enabled bool `json:"enabled"`
|
|
MaxReadFileSize int `json:"max_read_file_size"`
|
|
}
|
|
|
|
type ToolsConfig struct {
|
|
Alpaca AlpacaConfig `json:"alpaca,omitempty"`
|
|
AllowReadPaths []string `json:"allow_read_paths" env:"PICOCLAW_TOOLS_ALLOW_READ_PATHS"`
|
|
AllowWritePaths []string `json:"allow_write_paths" env:"PICOCLAW_TOOLS_ALLOW_WRITE_PATHS"`
|
|
Web WebToolsConfig `json:"web"`
|
|
Jules JulesConfig `json:"jules"`
|
|
Cron CronToolsConfig `json:"cron"`
|
|
Exec ExecConfig `json:"exec"`
|
|
Skills SkillsToolsConfig `json:"skills"`
|
|
MediaCleanup MediaCleanupConfig `json:"media_cleanup"`
|
|
MCP MCPConfig `json:"mcp"`
|
|
AppendFile ToolConfig `json:"append_file" envPrefix:"PICOCLAW_TOOLS_APPEND_FILE_"`
|
|
EditFile ToolConfig `json:"edit_file" envPrefix:"PICOCLAW_TOOLS_EDIT_FILE_"`
|
|
FindSkills ToolConfig `json:"find_skills" envPrefix:"PICOCLAW_TOOLS_FIND_SKILLS_"`
|
|
I2C ToolConfig `json:"i2c" envPrefix:"PICOCLAW_TOOLS_I2C_"`
|
|
InstallSkill ToolConfig `json:"install_skill" envPrefix:"PICOCLAW_TOOLS_INSTALL_SKILL_"`
|
|
ListDir ToolConfig `json:"list_dir" envPrefix:"PICOCLAW_TOOLS_LIST_DIR_"`
|
|
Message ToolConfig `json:"message" envPrefix:"PICOCLAW_TOOLS_MESSAGE_"`
|
|
ReadFile ReadFileToolConfig `json:"read_file" envPrefix:"PICOCLAW_TOOLS_READ_FILE_"`
|
|
SendFile ToolConfig `json:"send_file" envPrefix:"PICOCLAW_TOOLS_SEND_FILE_"`
|
|
Spawn ToolConfig `json:"spawn" envPrefix:"PICOCLAW_TOOLS_SPAWN_"`
|
|
SPI ToolConfig `json:"spi" envPrefix:"PICOCLAW_TOOLS_SPI_"`
|
|
Subagent ToolConfig `json:"subagent" envPrefix:"PICOCLAW_TOOLS_SUBAGENT_"`
|
|
WebFetch ToolConfig `json:"web_fetch" envPrefix:"PICOCLAW_TOOLS_WEB_FETCH_"`
|
|
WriteFile ToolConfig `json:"write_file" envPrefix:"PICOCLAW_TOOLS_WRITE_FILE_"`
|
|
BrowserAction ToolConfig `json:"browser_action" envPrefix:"PICOCLAW_TOOLS_BROWSER_ACTION_"`
|
|
GoEval ToolConfig `json:"go_eval" envPrefix:"PICOCLAW_TOOLS_GO_EVAL_"`
|
|
}
|
|
|
|
type SearchCacheConfig struct {
|
|
MaxSize int `json:"max_size" env:"PICOCLAW_SKILLS_SEARCH_CACHE_MAX_SIZE"`
|
|
TTLSeconds int `json:"ttl_seconds" env:"PICOCLAW_SKILLS_SEARCH_CACHE_TTL_SECONDS"`
|
|
}
|
|
|
|
type SkillsRegistriesConfig struct {
|
|
ClawHub ClawHubRegistryConfig `json:"clawhub"`
|
|
}
|
|
|
|
type ClawHubRegistryConfig struct {
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_ENABLED"`
|
|
BaseURL string `json:"base_url" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_BASE_URL"`
|
|
AuthToken string `json:"auth_token" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_AUTH_TOKEN"`
|
|
SearchPath string `json:"search_path" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_SEARCH_PATH"`
|
|
SkillsPath string `json:"skills_path" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_SKILLS_PATH"`
|
|
DownloadPath string `json:"download_path" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_DOWNLOAD_PATH"`
|
|
Timeout int `json:"timeout" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_TIMEOUT"`
|
|
MaxZipSize int `json:"max_zip_size" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_MAX_ZIP_SIZE"`
|
|
MaxResponseSize int `json:"max_response_size" env:"PICOCLAW_SKILLS_REGISTRIES_CLAWHUB_MAX_RESPONSE_SIZE"`
|
|
}
|
|
|
|
// MCPServerConfig defines configuration for a single MCP server
|
|
type MCPServerConfig struct {
|
|
// Enabled indicates whether this MCP server is active
|
|
Enabled bool `json:"enabled"`
|
|
// Command is the executable to run (e.g., "npx", "python", "/path/to/server")
|
|
Command string `json:"command"`
|
|
// Args are the arguments to pass to the command
|
|
Args []string `json:"args,omitempty"`
|
|
// Env are environment variables to set for the server process (stdio only)
|
|
Env map[string]string `json:"env,omitempty"`
|
|
// EnvFile is the path to a file containing environment variables (stdio only)
|
|
EnvFile string `json:"env_file,omitempty"`
|
|
// Type is "stdio", "sse", or "http" (default: stdio if command is set, sse if url is set)
|
|
Type string `json:"type,omitempty"`
|
|
// URL is used for SSE/HTTP transport
|
|
URL string `json:"url,omitempty"`
|
|
// Headers are HTTP headers to send with requests (sse/http only)
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
}
|
|
|
|
// MCPConfig defines configuration for all MCP servers
|
|
type MCPConfig struct {
|
|
ToolConfig ` envPrefix:"PICOCLAW_TOOLS_MCP_"`
|
|
Discovery ToolDiscoveryConfig ` json:"discovery"`
|
|
// Servers is a map of server name to server configuration
|
|
Servers map[string]MCPServerConfig `json:"servers,omitempty"`
|
|
}
|
|
|
|
func (t *ToolsConfig) IsToolEnabled(name string) bool {
|
|
switch name {
|
|
case "web":
|
|
return t.Web.Enabled
|
|
case "jules":
|
|
return t.Jules.Enabled
|
|
case "cron":
|
|
return t.Cron.Enabled
|
|
case "exec":
|
|
return t.Exec.Enabled
|
|
case "skills":
|
|
return t.Skills.Enabled
|
|
case "media_cleanup":
|
|
return t.MediaCleanup.Enabled
|
|
case "append_file":
|
|
return t.AppendFile.Enabled
|
|
case "edit_file":
|
|
return t.EditFile.Enabled
|
|
case "find_skills":
|
|
return t.FindSkills.Enabled
|
|
case "i2c":
|
|
return t.I2C.Enabled
|
|
case "install_skill":
|
|
return t.InstallSkill.Enabled
|
|
case "list_dir":
|
|
return t.ListDir.Enabled
|
|
case "message":
|
|
return t.Message.Enabled
|
|
case "read_file":
|
|
return t.ReadFile.Enabled
|
|
case "spawn":
|
|
return t.Spawn.Enabled
|
|
case "spi":
|
|
return t.SPI.Enabled
|
|
case "subagent":
|
|
return t.Subagent.Enabled
|
|
case "web_fetch":
|
|
return t.WebFetch.Enabled
|
|
case "browser_action":
|
|
return t.BrowserAction.Enabled
|
|
case "go_eval":
|
|
return t.GoEval.Enabled
|
|
case "send_file":
|
|
return t.SendFile.Enabled
|
|
case "write_file":
|
|
return t.WriteFile.Enabled
|
|
case "mcp":
|
|
return t.MCP.Enabled
|
|
default:
|
|
return true
|
|
}
|
|
}
|
|
|
|
type AlpacaConfig struct {
|
|
KeyID string `json:"key_id,omitempty"`
|
|
SecretKey string `json:"secret_key,omitempty"`
|
|
BaseURL string `json:"base_url,omitempty"`
|
|
}
|