Documentation
¶
Overview ¶
Package config defines Compa's configuration and loads and saves it. config.json holds the settings; .security.yml beside it holds the secrets (API keys, tokens and passwords), and COMPA_* environment variables override both.
Index ¶
- Constants
- Variables
- func DiagnosticSummary(err error) string
- func EffectiveGatewayLogLevel(cfg *Config) string
- func EffectiveMCPTransportType(server MCPServerConfig) string
- func ExpandHome(path string) string
- func FormatBuildInfo() (string, string)
- func FormatVersion() string
- func GetHome() string
- func GetVersion() string
- func InitChannelList(channels ChannelsConfig) error
- func IsSingletonChannel(channelType string) bool
- func MakeBackup(path string) error
- func NormalizeMCPTransportType(transport string) string
- func RegisterChannelSettings(channelType string, prototype any)
- func RegisterSensitiveValuesSource(values func() []string) (unregister func())
- func ResetToDefaults(configPath string) error
- func ResolveGatewayLogLevel(path string) string
- func SaveConfig(path string, cfg *Config) error
- func SupportedProviderInstanceAdapter(instance *ProviderInstanceConfig) error
- func ValidThinkingLevel(level string) bool
- func ValidateSelectionSyntax(s string) error
- func ValidateSourceRoot(name, path string) error
- func WithFileLock(path string, fn func() error) error
- type AgentConfig
- type AgentDefaults
- func (d *AgentDefaults) GetMaxMediaSize() int
- func (d *AgentDefaults) GetModelName() string
- func (d *AgentDefaults) GetToolFeedbackMaxArgsLength() int
- func (d *AgentDefaults) IsToolFeedbackEnabled() bool
- func (d *AgentDefaults) IsToolFeedbackSeparateMessagesEnabled() bool
- func (d *AgentDefaults) ResolveTurnProfile() (EffectiveTurnProfile, bool, error)
- type AgentsConfig
- type BaiduSearchConfig
- type BraveConfig
- type BuildInfo
- type BuiltinHookConfig
- type Channel
- func (b Channel) CollectSensitiveValues() []string
- func (b *Channel) Decode(target any) error
- func (b *Channel) GetDecoded() (any, error)
- func (b Channel) MarshalJSON() ([]byte, error)
- func (b Channel) MarshalYAML() (any, error)
- func (b *Channel) Name() string
- func (b *Channel) SetName(name string)
- func (b *Channel) SetSecretField(fieldName string, value SecureString)
- func (b *Channel) SettingsIsEmpty() bool
- func (b *Channel) UnmarshalYAML(value *yaml.Node) error
- type ChannelsConfig
- type CommandsConfig
- type Config
- func (c *Config) FilterSensitiveData(content string) string
- func (c *Config) InheritEnvOverrides(loaded *Config)
- func (c *Config) MarshalJSON() ([]byte, error)
- func (c *Config) SecurityCopyFrom(path string) error
- func (sec *Config) SensitiveDataReplacer() *strings.Replacer
- func (c *Config) ValidateModelSelections() error
- func (c *Config) ValidateModules() error
- func (c *Config) ValidateProviderInstances() error
- func (c *Config) ValidateSettings() error
- func (c *Config) ValidateTurnProfile() error
- func (c *Config) WorkspacePath() string
- type CronToolsConfig
- type DevicesConfig
- type DispatchConfig
- type DispatchRule
- type DispatchSelector
- type DuckDuckGoConfig
- type EffectiveTurnProfile
- type EventLoggingConfig
- type EventsConfig
- type EvolutionConfig
- func (c EvolutionConfig) AutoAppliesDrafts() bool
- func (c EvolutionConfig) ColdPathTriggerMode() string
- func (c EvolutionConfig) EffectiveColdPathTimes() []string
- func (c EvolutionConfig) EffectiveMinSuccessRatio() float64
- func (c EvolutionConfig) EffectiveMinTaskCount() int
- func (c EvolutionConfig) EffectiveMode() string
- func (c EvolutionConfig) MarshalJSON() ([]byte, error)
- func (c EvolutionConfig) RunsColdPathAfterTurn() bool
- func (c EvolutionConfig) RunsColdPathAutomatically() bool
- func (c EvolutionConfig) RunsColdPathScheduled() bool
- type ExactModelTarget
- type ExecConfig
- type ExposePath
- type ExtensionDaemonConfig
- type FlexibleStringSlice
- type GLMSearchConfig
- type GatewayConfig
- type GeminiSearchConfig
- type GroupTriggerConfig
- type HeartbeatConfig
- type HookDefaultsConfig
- type HooksConfig
- type IsolationConfig
- type KagiConfig
- type LoggingConfig
- type MCPConfig
- type MCPServerConfig
- type MediaCleanupConfig
- type MessageToolsConfig
- type ModelRouteConfig
- type ModelSelection
- type ModulesConfig
- type PerplexityConfig
- type PlaceholderConfig
- type ProcessHookConfig
- type ProviderInstanceConfig
- type ProviderInstanceRuntime
- type ProviderInstanceState
- type RawNode
- type ReadFileToolConfig
- type RestartSignature
- type RoutingConfig
- type SearXNGConfig
- type SearchCacheConfig
- type SecureString
- func (s SecureString) IsZero() bool
- func (s SecureString) MarshalJSON() ([]byte, error)
- func (s SecureString) MarshalYAML() (any, error)
- func (s *SecureString) Set(value string) *SecureString
- func (s *SecureString) String() string
- func (s *SecureString) UnmarshalJSON(value []byte) error
- func (s *SecureString) UnmarshalText(text []byte) error
- func (s *SecureString) UnmarshalYAML(value *yaml.Node) error
- type SecureStrings
- type SensitiveDataCache
- type SessionConfig
- type SkillRegistryConfig
- func (c *SkillRegistryConfig) DecodeParam(target any) error
- func (c SkillRegistryConfig) MarshalJSON() ([]byte, error)
- func (c SkillRegistryConfig) MarshalYAML() (any, error)
- func (c *SkillRegistryConfig) UnmarshalJSON(data []byte) error
- func (c *SkillRegistryConfig) UnmarshalYAML(value *yaml.Node) error
- type SkillsRegistriesConfig
- func (c *SkillsRegistriesConfig) Get(name string) (SkillRegistryConfig, bool)
- func (v SkillsRegistriesConfig) MarshalJSON() ([]byte, error)
- func (v SkillsRegistriesConfig) MarshalYAML() (any, error)
- func (c *SkillsRegistriesConfig) Set(name string, cfg SkillRegistryConfig)
- func (v *SkillsRegistriesConfig) UnmarshalJSON(data []byte) error
- func (v *SkillsRegistriesConfig) UnmarshalYAML(value *yaml.Node) error
- type SkillsToolsConfig
- type SlackSettings
- type SlackWebhookSettings
- type SlackWebhookTarget
- type SogouConfig
- type StreamingConfig
- type SubTurnConfig
- type SubagentsConfig
- type TavilyConfig
- type TeamsWebhookSettings
- type TeamsWebhookTarget
- type ToolConfig
- type ToolDiscoveryConfig
- type ToolFeedbackConfig
- type ToolsConfig
- type TurnProfileBlock
- type TurnProfileConfig
- type TurnProfileMode
- type TypingConfig
- type VoiceConfig
- type WebChatClientSettings
- type WebChatSettings
- type WebToolsConfig
- type WhatsAppSettings
Constants ¶
const ( ReadFileModeBytes = "bytes" ReadFileModeLines = "lines" )
const ( ChannelWeb = "web" ChannelWebClient = "web_client" ChannelSlack = "slack" ChannelWhatsApp = "whatsapp" ChannelWhatsAppNative = "whatsapp_native" ChannelTeamsWebHook = "teams_webhook" ChannelSlackWebHook = "slack_webhook" )
Channel type constants — single source of truth for all channel type names.
const ( // EnvHome overrides the base directory for all Compa data // (config, workspace, skills, auth store, …). // Default: ~/.compa EnvHome = "COMPA_HOME" // EnvConfig overrides the full path to the JSON config file. // Default: $COMPA_HOME/config.json EnvConfig = "COMPA_CONFIG" // EnvBuiltinSkills overrides the directory from which built-in // skills are loaded. // Default: a skills folder beside the executable, if there is one. EnvBuiltinSkills = "COMPA_BUILTIN_SKILLS" // EnvBinary overrides the path to the compa-kernel executable. // Used by the web shell when spawning the gateway subprocess. // Default: resolved from the same directory as the current executable. EnvBinary = "COMPA_BINARY" // EnvGatewayHost overrides the host address for the gateway server. // Default: "localhost" EnvGatewayHost = "COMPA_GATEWAY_HOST" )
Runtime environment variable keys for Compa processes. These control the location of files and binaries at runtime and are read directly via os.Getenv / os.LookupEnv. All Compa-specific keys use the COMPA_ prefix. Reference these constants instead of inline string literals to keep all supported knobs visible in one place and to prevent typos.
const ( ProviderAdapterOpenAICompatible = "openai-compatible" ProviderAdapterAnthropicCompatible = "anthropic-compatible" // ProviderAdapterNative runs the llmgw-core provider the core registry // records for the instance's provider kind, such as Google, Azure // OpenAI, Bedrock or Ollama. ProviderAdapterNative = "native" // ProviderAdapterExtension reaches one provider an extension daemon // serves. Endpoint is the daemon's URL, Protocol the provider's primary // llmgw-core surface (a chat surface when it serves one, else any surface // core defines, such as audio_speech), the setting ExtensionSurfacesSetting // every surface the daemon lists for it, and ExtensionProviderSetting the // daemon's id of the provider. ProviderAdapterExtension = "extension" )
Adapters of the provider instances Compa runs.
const ( // ExtensionProviderSetting is the daemon's id of the provider. ExtensionProviderSetting = "extension_provider" // ExtensionCredentialSetting is what the provider needs: "none", // "token" or "oauth". ExtensionCredentialSetting = "extension_credential" // ExtensionCredentialKeySetting is the auth store key of a signed-in // provider's credential. Such a credential refreshes, so it is read per // request rather than through auth_connection_ref, which resolves once. ExtensionCredentialKeySetting = "extension_credential_key" // ExtensionDisplayNameSetting is the daemon's display name of the provider. ExtensionDisplayNameSetting = "display_name" // ExtensionSurfacesSetting lists the llmgw-core surfaces the daemon // serves for the provider, such as ["audio_speech"]. The instance's // core provider serves exactly these. ExtensionSurfacesSetting = "extension_surfaces" )
Settings of an extension provider instance.
const ( ExtensionSurfaceChatCompletions = "chat_completions" ExtensionSurfaceMessages = "messages" )
Chat surfaces of an extension instance's protocol, as llmgw-core names them. An extension instance's protocol may be any surface core defines, such as audio_speech for a speech-only daemon provider.
const ( // MessageTargetsCurrentChat lets the message tool send only to the chat // the turn came from. MessageTargetsCurrentChat = "current_chat" // MessageTargetsAny lets the message tool send to any chat of any // connected channel. MessageTargetsAny = "any" )
Values of tools.message.targets.
const ( DefaultLogMaxSizeMB = 10 DefaultLogMaxFiles = 5 )
Defaults of the logging settings.
const DefaultGatewayLogLevel = "warn"
const DefaultMCPMaxInlineTextChars = 16 * 1024
const DefaultMaxMediaSize = 20 * 1024 * 1024 // 20 MB
const GatewayProtocol = 1
GatewayProtocol is the version of the interface docs/gateway.md describes: the gateway's HTTP routes, web chat frames and pid file. It goes up only when a change can break a program written against that page; additions, such as a new route, frame or field, leave it as it is.
const SecretPlaceholder = "[NOT_HERE]"
SecretPlaceholder stands, in config.json and any other JSON of the config, for a secret whose value is kept in .security.yml. Sent back in an edit, it keeps that value.
const (
SecurityConfigFile = ".security.yml"
)
Variables ¶
var ( Version = "dev" // Default value when not built with ldflags GitCommit string // Git commit SHA (short) BuildTime string // Build timestamp in RFC3339 format GoVersion string // Go version used for building )
Build-time variables injected via ldflags during build process. These are set by the Makefile or .goreleaser.yaml using the -X flag:
-X github.com/kayiik/compa/pkg/config.Version=<version> -X github.com/kayiik/compa/pkg/config.GitCommit=<commit> -X github.com/kayiik/compa/pkg/config.BuildTime=<timestamp> -X github.com/kayiik/compa/pkg/config.GoVersion=<go-version>
var DefaultEventLoggingInclude = []string{"agent.*"}
DefaultEventLoggingInclude keeps the pre-existing behavior where agent events are printed, while non-agent runtime events are published for subscribers only.
Functions ¶
func DiagnosticSummary ¶
func EffectiveGatewayLogLevel ¶
EffectiveGatewayLogLevel returns the normalized runtime log level from a loaded config. Invalid or empty values fall back to the package default.
func EffectiveMCPTransportType ¶
func EffectiveMCPTransportType(server MCPServerConfig) string
EffectiveMCPTransportType returns the normalized configured transport, or the inferred default when the config leaves Type empty.
func ExpandHome ¶
ExpandHome replaces a leading "~" with the user's home directory: "~" alone, "~/x" and "~\x" (the Windows form, accepted everywhere). Any other path, including "~user/x", is returned unchanged, as is every path when the home directory is unknown; a bare home directory is never substituted for a path it does not name.
func FormatBuildInfo ¶
FormatBuildInfo returns build time and go version info
func FormatVersion ¶
func FormatVersion() string
FormatVersion returns the version string with optional git commit
func GetHome ¶
func GetHome() string
GetHome returns the base directory for Compa's data: COMPA_HOME when set, otherwise ~/.compa. The launcher, gateway, agent and CLI all resolve it here, so they agree on where the data is.
func InitChannelList ¶
func InitChannelList(channels ChannelsConfig) error
InitChannelList validates and initializes all channels in the ChannelsConfig. It performs three steps:
- Validates that each channel has a non-empty Type
- Validates singleton constraints
- Decodes Settings into the correct typed struct based on Type, so that b.extend contains the actual settings (e.g., WebChatSettings)
After calling this method, callers can safely use b.extend via Decode() without re-parsing raw Settings.
func IsSingletonChannel ¶
IsSingletonChannel returns true if the channel type only allows one instance.
func MakeBackup ¶
func NormalizeMCPTransportType ¶
NormalizeMCPTransportType canonicalizes MCP transport names used in config. "http" is Compa's streamable HTTP request-response mode, and "streamable-http" is accepted as an explicit alias for the same transport.
func RegisterChannelSettings ¶
RegisterChannelSettings registers a settings struct prototype for a custom channel type. External packages (out-of-tree channels registered via channels.RegisterFactory) call this from an init() so their channel type passes config validation (isValidChannelType) and its settings block decodes into the right struct (newChannelSettings). The prototype must be a struct value, e.g. RegisterChannelSettings("my_channel", MyChannelSettings{}).
func RegisterSensitiveValuesSource ¶
func RegisterSensitiveValuesSource(values func() []string) (unregister func())
RegisterSensitiveValuesSource adds a source of secrets that live outside the config, such as the credentials in the auth store. FilterSensitiveData consults every source on each call, so a secret stored after the config was loaded is filtered too; a source should therefore be cheap. The returned function unregisters the source.
func ResetToDefaults ¶
ResetToDefaults backs up the current config, creates a default config, preserves security credentials from the existing config, and saves it.
func ResolveGatewayLogLevel ¶
ResolveGatewayLogLevel reads the configured gateway log level without triggering the full config loader, so startup code can apply logging before config load logs run. The COMPA_LOG_LEVEL environment variable overrides the file value.
func SaveConfig ¶
SaveConfig writes cfg to config.json at path and its secrets to .security.yml beside it, in the current format with every setting explicit. A setting the environment overrode when cfg was loaded keeps the value the files held, unless it was changed since. cfg itself is not modified.
Every process that saves the config (launcher, CLI, onboarding, kernel) takes the lock beside config.json, and the two files are replaced together: a save that fails leaves the previous pair (see writeFilePair).
func SupportedProviderInstanceAdapter ¶
func SupportedProviderInstanceAdapter(instance *ProviderInstanceConfig) error
SupportedProviderInstanceAdapter returns an error for an instance whose adapter Compa does not run. Compa reaches every provider through an llmgw-core provider: an OpenAI- or Anthropic-compatible endpoint, the native provider of its kind, or an extension daemon; an extension instance must name the daemon's provider, and its protocol and listed surfaces must be surfaces llmgw-core defines (chat or not, such as audio_speech).
func ValidThinkingLevel ¶
ValidThinkingLevel reports whether level is an extended-thinking level the agent understands, ignoring case and surrounding space. Empty is not a level.
func ValidateSelectionSyntax ¶
ValidateSelectionSyntax checks that s can name a model: empty, an exact target, or a model route name. It checks syntax only. Whether the target's instance, model or the route exists is checked when a selection is set and when it is resolved, so a dangling selection never makes a config unloadable.
func ValidateSourceRoot ¶
ValidateSourceRoot checks the shape of one source root: a usable name and an absolute path. It does not touch the filesystem. The error states only what is wrong; the caller says where the entry came from.
func WithFileLock ¶
WithFileLock runs fn while holding an exclusive OS lock tied to path, so the processes that write path (the launcher, the CLI, onboarding and the kernel) take turns. The lock is on a sidecar file, path+".flock", because path is replaced by rename, which would drop a lock held on it. The OS releases the lock if its holder dies. fn must not take the same lock again.
Types ¶
type AgentConfig ¶
type AgentConfig struct {
ID string `json:"id"`
Default bool `json:"default,omitempty"`
Name string `json:"name,omitempty"`
Workspace string `json:"workspace,omitempty"`
Model string `json:"model,omitempty"` // model selection: exact target "instance-id/model-id" or route name; empty uses the default
Skills []string `json:"skills,omitempty"`
Subagents *SubagentsConfig `json:"subagents,omitempty"`
}
type AgentDefaults ¶
type AgentDefaults struct {
Workspace string `json:"workspace" env:"COMPA_AGENTS_DEFAULTS_WORKSPACE"`
RestrictToWorkspace bool `json:"restrict_to_workspace" env:"COMPA_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE"`
AllowReadOutsideWorkspace bool `json:"allow_read_outside_workspace" env:"COMPA_AGENTS_DEFAULTS_ALLOW_READ_OUTSIDE_WORKSPACE"`
ModelName string `json:"model_name" env:"COMPA_AGENTS_DEFAULTS_MODEL_NAME"` // default model selection: exact target "instance-id/model-id" or route name; empty means none
ImageModel string `json:"image_model,omitempty" env:"COMPA_AGENTS_DEFAULTS_IMAGE_MODEL"` // model selection turns carrying images are rerouted to; empty keeps the agent's model
MaxTokens int `json:"max_tokens" env:"COMPA_AGENTS_DEFAULTS_MAX_TOKENS"`
ContextWindow int `json:"context_window,omitempty" env:"COMPA_AGENTS_DEFAULTS_CONTEXT_WINDOW"`
Temperature *float64 `json:"temperature,omitempty" env:"COMPA_AGENTS_DEFAULTS_TEMPERATURE"`
MaxToolIterations int `json:"max_tool_iterations" env:"COMPA_AGENTS_DEFAULTS_MAX_TOOL_ITERATIONS"`
SummarizeMessageThreshold int `json:"summarize_message_threshold" env:"COMPA_AGENTS_DEFAULTS_SUMMARIZE_MESSAGE_THRESHOLD"`
SummarizeTokenPercent int `json:"summarize_token_percent" env:"COMPA_AGENTS_DEFAULTS_SUMMARIZE_TOKEN_PERCENT"`
MaxMediaSize int `json:"max_media_size,omitempty" env:"COMPA_AGENTS_DEFAULTS_MAX_MEDIA_SIZE"`
Routing *RoutingConfig `json:"routing,omitempty"`
SteeringMode string `json:"steering_mode,omitempty" env:"COMPA_AGENTS_DEFAULTS_STEERING_MODE"` // "one-at-a-time" (default) or "all"
MaxParallelTurns int `json:"max_parallel_turns,omitempty" env:"COMPA_AGENTS_DEFAULTS_MAX_PARALLEL_TURNS"` // Max turns of different sessions at once (0 = default 4, 1 = sequential)
SubTurn SubTurnConfig `json:"subturn"`
ToolFeedback ToolFeedbackConfig `json:"tool_feedback,omitempty"`
SplitOnMarker bool `json:"split_on_marker" env:"COMPA_AGENTS_DEFAULTS_SPLIT_ON_MARKER"` // split messages on <|[SPLIT]|> marker
ContextManager string `json:"context_manager,omitempty" env:"COMPA_AGENTS_DEFAULTS_CONTEXT_MANAGER"`
ContextManagerConfig json.RawMessage `json:"context_manager_config,omitempty" env:"COMPA_AGENTS_DEFAULTS_CONTEXT_MANAGER_CONFIG"`
TurnProfile TurnProfileConfig `json:"turn_profile,omitempty"`
MaxLLMRetries int `json:"max_llm_retries,omitempty" env:"COMPA_AGENTS_DEFAULTS_MAX_LLM_RETRIES"`
LLMRetryBackoffSecs int `json:"llm_retry_backoff_secs,omitempty" env:"COMPA_AGENTS_DEFAULTS_LLM_RETRY_BACKOFF_SECS"`
}
func (*AgentDefaults) GetMaxMediaSize ¶
func (d *AgentDefaults) GetMaxMediaSize() int
func (*AgentDefaults) GetModelName ¶
func (d *AgentDefaults) GetModelName() string
GetModelName returns the default model selection: an exact target "instance-id/model-id", a model route name, or "" when there is none.
func (*AgentDefaults) GetToolFeedbackMaxArgsLength ¶
func (d *AgentDefaults) GetToolFeedbackMaxArgsLength() int
GetToolFeedbackMaxArgsLength returns the max visible text length for tool argument previews.
func (*AgentDefaults) IsToolFeedbackEnabled ¶
func (d *AgentDefaults) IsToolFeedbackEnabled() bool
IsToolFeedbackEnabled returns true when tool feedback messages should be sent to the chat.
func (*AgentDefaults) IsToolFeedbackSeparateMessagesEnabled ¶
func (d *AgentDefaults) IsToolFeedbackSeparateMessagesEnabled() bool
IsToolFeedbackSeparateMessagesEnabled returns true when each tool feedback update should be sent as its own chat message instead of editing a single in-place progress message.
func (*AgentDefaults) ResolveTurnProfile ¶
func (d *AgentDefaults) ResolveTurnProfile() (EffectiveTurnProfile, bool, error)
type AgentsConfig ¶
type AgentsConfig struct {
Defaults AgentDefaults `json:"defaults"`
List []AgentConfig `json:"list,omitempty"`
Dispatch *DispatchConfig `json:"dispatch,omitempty"`
}
type BaiduSearchConfig ¶
type BaiduSearchConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_BAIDU_ENABLED"`
APIKey SecureString `json:"api_key,omitzero" yaml:"api_key,omitempty" env:"COMPA_TOOLS_WEB_BAIDU_API_KEY"`
BaseURL string `json:"base_url" yaml:"-" env:"COMPA_TOOLS_WEB_BAIDU_BASE_URL"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_BAIDU_MAX_RESULTS"`
}
type BraveConfig ¶
type BraveConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_BRAVE_ENABLED"`
APIKeys SecureStrings `json:"api_keys,omitzero" yaml:"api_keys,omitempty" env:"COMPA_TOOLS_WEB_BRAVE_API_KEYS"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_BRAVE_MAX_RESULTS"`
}
func (*BraveConfig) SetAPIKey ¶
func (c *BraveConfig) SetAPIKey(key string)
SetAPIKey sets the Brave API key
func (*BraveConfig) SetAPIKeys ¶
func (c *BraveConfig) SetAPIKeys(keys []string)
type BuildInfo ¶
type BuildInfo struct {
Version string `json:"version"`
GitCommit string `json:"git_commit"`
BuildTime string `json:"build_time"`
GoVersion string `json:"go_version"`
}
BuildInfo contains build-time version information
type BuiltinHookConfig ¶
type BuiltinHookConfig struct {
Enabled bool `json:"enabled"`
Priority int `json:"priority,omitempty"`
Config json.RawMessage `json:"config,omitempty"`
}
type Channel ¶
type Channel struct {
Enabled bool `json:"enabled" yaml:"-"`
Type string `json:"type" yaml:"-"`
AllowFrom FlexibleStringSlice `json:"allow_from,omitempty" yaml:"-"`
// DMPolicy, GroupPolicy and GroupTrigger are no longer settings: a
// channel answers only its owner, in direct messages. A config.json an
// earlier version wrote still loads; decoding clears them, and they are
// not written.
DMPolicy string `json:"dm_policy,omitempty" yaml:"-"`
GroupPolicy string `json:"group_policy,omitempty" yaml:"-"`
ReasoningChannelID string `json:"reasoning_channel_id" yaml:"-"`
GroupTrigger GroupTriggerConfig `json:"group_trigger,omitzero" yaml:"-"`
Typing TypingConfig `json:"typing,omitempty" yaml:"-"`
Placeholder PlaceholderConfig `json:"placeholder,omitempty" yaml:"-"`
Settings RawNode `json:"settings,omitzero" yaml:"settings,omitempty"`
// contains filtered or unexported fields
}
Channel defines the common fields shared by all channel types. Channel-specific settings go into Settings (nested format only). The settings struct should use SecureString/SecureStrings for sensitive fields.
Decode stores the settings pointer internally; subsequent modifications to the decoded struct are automatically reflected in MarshalJSON/MarshalYAML.
MarshalJSON outputs nested format (common fields at top level, settings as sub-key). MarshalYAML outputs only secure fields (for .security.yml).
Standard Go JSON/YAML unmarshaling handles nested format correctly:
- JSON: {"enabled": true, "type": "slack", "settings": {...}}
- YAML: settings: {bot_token: xxx} (for .security.yml)
func (Channel) CollectSensitiveValues ¶
CollectSensitiveValues returns all sensitive string values from this Channel's decoded settings (extend). Used by the security filter system.
func (*Channel) Decode ¶
Decode decodes the Settings node into the given target struct and stores the pointer internally. Subsequent modifications to the target are automatically reflected in MarshalJSON/MarshalYAML (no explicit Encode needed).
func (*Channel) GetDecoded ¶
GetDecoded returns the previously decoded settings struct. If Decode hasn't been called yet, it lazily decodes using the channel Type prototype. Returns an error if decoding fails; the decoded value (possibly nil) is still returned so callers can distinguish between "not decoded" and "decode failed".
func (Channel) MarshalJSON ¶
MarshalJSON implements json.Marshaler for Channel. Outputs nested format: common fields at top level, channel-specific in "settings". Secure fields (SecureString/SecureStrings) are removed from settings output.
func (Channel) MarshalYAML ¶
MarshalYAML implements yaml.ValueMarshaler for Channel. Outputs only secure fields in the Settings YAML (for .security.yml). If Decode was called, it serializes from the stored extend (reflecting any modifications); otherwise falls back to decoding Settings via the channel Type to extract secure fields.
func (*Channel) SetSecretField ¶
func (b *Channel) SetSecretField(fieldName string, value SecureString)
SetSecretField sets a secure field value by field name in the Settings JSON. NOTE: This only operates on raw Settings. If Decode() has been called, prefer modifying the typed struct directly — MarshalJSON serializes from extend.
func (*Channel) SettingsIsEmpty ¶
SettingsIsEmpty returns true if Settings has not been populated.
type ChannelsConfig ¶
ChannelsConfig maps channel name to its Channel configuration. Each Channel stores the full channel config in Settings and handles JSON/YAML serialization (removing/keeping secure fields automatically).
func (ChannelsConfig) Get ¶
func (c ChannelsConfig) Get(name string) *Channel
Get returns the Channel for the given channel name (map key), or nil if not found.
func (ChannelsConfig) GetByType ¶
func (c ChannelsConfig) GetByType(t string) *Channel
GetByType returns the Channel for the given channel type, or nil if not found.
func (ChannelsConfig) SetEnabled ¶
func (c ChannelsConfig) SetEnabled(name string, enabled bool) bool
SetEnabled sets the Enabled field on the Channel with the given name. Returns false if no channel with that name exists.
func (*ChannelsConfig) UnmarshalJSON ¶
func (c *ChannelsConfig) UnmarshalJSON(data []byte) error
UnmarshalJSON implements json.Unmarshaler for ChannelsConfig. Sets the channel name from the map key after unmarshaling.
func (*ChannelsConfig) UnmarshalYAML ¶
func (c *ChannelsConfig) UnmarshalYAML(value *yaml.Node) error
UnmarshalYAML implements yaml.Unmarshaler for ChannelsConfig. This ensures that when loading security.yml, existing Channel instances are properly merged rather than replaced with new ones.
type CommandsConfig ¶
type CommandsConfig struct {
// OwnerOnly runs commands sent from chat apps only when the sender is the
// owner: a sender matching an explicit allow_from entry. The web UI and
// the terminal are always the owner.
OwnerOnly bool `json:"owner_only" env:"COMPA_COMMANDS_OWNER_ONLY"`
}
CommandsConfig configures the chat commands (/reload, /switch, ...).
type Config ¶
type Config struct {
Isolation IsolationConfig `json:"isolation,omitempty" yaml:"-"`
Agents AgentsConfig `json:"agents" yaml:"-"`
Session SessionConfig `json:"session,omitempty" yaml:"-"`
Evolution EvolutionConfig `json:"evolution,omitempty" yaml:"-"`
Channels ChannelsConfig `json:"channel_list" yaml:"channel_list"`
// ProviderInstances are the provider connections models run on; each
// owns its endpoint, credential reference, runtime settings and model
// catalog. ModelRoutes are named failover routes over their exact
// targets, and every model selection in the config names a target or a
// route. ActiveModels is the shortlist of targets offered for chat.
ProviderInstances []*ProviderInstanceConfig `json:"provider_instances,omitempty" yaml:"-"`
ModelRoutes []*ModelRouteConfig `json:"model_routes,omitempty" yaml:"-"`
ActiveModels []string `json:"active_models,omitempty" yaml:"-"`
Gateway GatewayConfig `json:"gateway" yaml:"-"`
Events EventsConfig `json:"events,omitempty" yaml:"-"`
Hooks HooksConfig `json:"hooks,omitempty" yaml:"-"`
Tools ToolsConfig `json:"tools" yaml:",inline"`
Heartbeat HeartbeatConfig `json:"heartbeat" yaml:"-"`
Devices DevicesConfig `json:"devices" yaml:"-"`
Voice VoiceConfig `json:"voice" yaml:"-"`
// Commands configures who may run the chat commands.
Commands CommandsConfig `json:"commands" yaml:"-"`
// Logging configures Compa's log files.
Logging LoggingConfig `json:"logging" yaml:"-"`
// Modules configures the detached-module host, including the named
// source roots a module may be granted read-only.
Modules ModulesConfig `json:"modules,omitzero" yaml:"-"`
// BuildInfo contains build-time version information
BuildInfo BuildInfo `json:"build_info,omitempty" yaml:"-"`
// Extension is the extension daemon Compa reaches providers through, if
// any. Its shared secret lives in the auth store.
Extension *ExtensionDaemonConfig `json:"extension,omitempty" yaml:"-"`
// contains filtered or unexported fields
}
Config is Compa's configuration, as stored in config.json and .security.yml.
func DefaultConfig ¶
func DefaultConfig() *Config
DefaultConfig returns the default configuration for Compa. It configures no provider instance and so selects no model; connecting a provider adds its instance and catalog.
func LoadConfig ¶
LoadConfig reads config.json at path, merges .security.yml beside it, applies the COMPA_* environment overrides and validates the result. A missing config.json, or one too short to hold a setting, yields the defaults, completed the same way. LoadConfig never writes either file.
func (*Config) FilterSensitiveData ¶
FilterSensitiveData filters sensitive values from content before sending to LLM. This prevents the LLM from seeing its own credentials: the config's own secrets and every value a source registered with RegisterSensitiveValuesSource returns, consulted on each call. Short content (below FilterMinLength) is returned unchanged for performance.
func (*Config) InheritEnvOverrides ¶
InheritEnvOverrides makes SaveConfig treat c's settings as overridden by the environment wherever loaded's were. A config rebuilt from a loaded one, for example decoded from its JSON, carries the environment's values but not the record of them; without this, saving it would write those values to the files.
func (*Config) MarshalJSON ¶
MarshalJSON implements custom JSON marshaling for Config to omit the session section when it is empty.
func (*Config) SecurityCopyFrom ¶
SecurityCopyFrom fills c's secrets from the .security.yml beside path, as a config decoded from JSON, which never holds them, needs.
func (*Config) SensitiveDataReplacer ¶
SensitiveDataReplacer returns the replacer FilterSensitiveData applies. It replaces the config's own secrets and the registered sources' current values; the replacer is rebuilt only when those values change.
func (*Config) ValidateModelSelections ¶
ValidateModelSelections checks the syntax of every model selection and of the voice targets, which are exact targets. It does not check that they exist.
func (*Config) ValidateModules ¶
ValidateModules checks the module host settings. Source roots are checked for shape only; see ModulesConfig.SourceRoots.
func (*Config) ValidateProviderInstances ¶
ValidateProviderInstances checks every provider instance, including that Compa runs its adapter, and every model route's targets.
func (*Config) ValidateSettings ¶
ValidateSettings checks the enumerated settings outside the channels.
func (*Config) ValidateTurnProfile ¶
func (*Config) WorkspacePath ¶
type CronToolsConfig ¶
type CronToolsConfig struct {
ToolConfig `envPrefix:"COMPA_TOOLS_CRON_"`
// 0 means no timeout.
ExecTimeoutMinutes int `json:"exec_timeout_minutes" env:"COMPA_TOOLS_CRON_EXEC_TIMEOUT_MINUTES"`
AllowCommand bool `json:"allow_command" env:"COMPA_TOOLS_CRON_ALLOW_COMMAND"`
CommandAllowedRemotes []string `json:"command_allowed_remotes" env:"COMPA_TOOLS_CRON_COMMAND_ALLOWED_REMOTES"`
}
type DevicesConfig ¶
type DispatchConfig ¶
type DispatchConfig struct {
Rules []DispatchRule `json:"rules,omitempty"`
}
type DispatchRule ¶
type DispatchRule struct {
Name string `json:"name,omitempty"`
Agent string `json:"agent"`
When DispatchSelector `json:"when"`
SessionDimensions []string `json:"session_dimensions,omitempty"`
}
type DispatchSelector ¶
type DispatchSelector struct {
Channel string `json:"channel,omitempty"`
Account string `json:"account,omitempty"`
Space string `json:"space,omitempty"`
Chat string `json:"chat,omitempty"`
Topic string `json:"topic,omitempty"`
Sender string `json:"sender,omitempty"`
Mentioned *bool `json:"mentioned,omitempty"`
}
type DuckDuckGoConfig ¶
type EffectiveTurnProfile ¶
type EffectiveTurnProfile struct {
Enabled bool
HistoryMode TurnProfileMode
SystemPromptMode TurnProfileMode
SkillsMode TurnProfileMode
ToolsMode TurnProfileMode
AllowedSkills []string
AllowedTools []string
}
type EventLoggingConfig ¶
type EventLoggingConfig struct {
// Enabled controls whether runtime events are printed by the built-in logger.
Enabled bool `json:"enabled" env:"ENABLED"`
// Include contains exact event kinds or glob patterns such as "agent.*" or "*".
Include []string `json:"include,omitempty" env:"INCLUDE"`
// Exclude contains exact event kinds or glob patterns to suppress after Include matches.
Exclude []string `json:"exclude,omitempty" env:"EXCLUDE"`
// MinSeverity filters out events below the configured severity: debug, info, warn, or error.
MinSeverity string `json:"min_severity,omitempty" env:"MIN_SEVERITY"`
// IncludePayload adds the raw payload to logs. Leave disabled unless detailed diagnostics are needed.
IncludePayload bool `json:"include_payload,omitempty" env:"INCLUDE_PAYLOAD"`
}
EventLoggingConfig controls centralized runtime event logging.
func EffectiveEventLoggingConfig ¶
func EffectiveEventLoggingConfig(cfg *Config) EventLoggingConfig
EffectiveEventLoggingConfig returns a logging config with stable defaults.
type EventsConfig ¶
type EventsConfig struct {
Logging EventLoggingConfig `json:"logging,omitempty" envPrefix:"COMPA_EVENTS_LOGGING_"`
}
EventsConfig groups runtime event configuration.
type EvolutionConfig ¶
type EvolutionConfig struct {
Enabled bool `json:"enabled,omitempty"`
Mode string `json:"mode,omitempty"`
StateDir string `json:"state_dir,omitempty"`
MinTaskCount int `json:"min_task_count,omitempty"`
MinSuccessRatio float64 `json:"min_success_ratio,omitempty"`
ColdPathTrigger string `json:"cold_path_trigger,omitempty"`
ColdPathTimes []string `json:"cold_path_times,omitempty"`
}
func (EvolutionConfig) AutoAppliesDrafts ¶
func (c EvolutionConfig) AutoAppliesDrafts() bool
func (EvolutionConfig) ColdPathTriggerMode ¶
func (c EvolutionConfig) ColdPathTriggerMode() string
func (EvolutionConfig) EffectiveColdPathTimes ¶
func (c EvolutionConfig) EffectiveColdPathTimes() []string
func (EvolutionConfig) EffectiveMinSuccessRatio ¶
func (c EvolutionConfig) EffectiveMinSuccessRatio() float64
func (EvolutionConfig) EffectiveMinTaskCount ¶
func (c EvolutionConfig) EffectiveMinTaskCount() int
func (EvolutionConfig) EffectiveMode ¶
func (c EvolutionConfig) EffectiveMode() string
func (EvolutionConfig) MarshalJSON ¶
func (c EvolutionConfig) MarshalJSON() ([]byte, error)
func (EvolutionConfig) RunsColdPathAfterTurn ¶
func (c EvolutionConfig) RunsColdPathAfterTurn() bool
func (EvolutionConfig) RunsColdPathAutomatically ¶
func (c EvolutionConfig) RunsColdPathAutomatically() bool
func (EvolutionConfig) RunsColdPathScheduled ¶
func (c EvolutionConfig) RunsColdPathScheduled() bool
type ExactModelTarget ¶
ExactModelTarget identifies one model owned by one configured provider instance. ModelID may contain additional slashes.
func ParseExactModelTarget ¶
func ParseExactModelTarget(raw string) (ExactModelTarget, error)
func (ExactModelTarget) String ¶
func (t ExactModelTarget) String() string
type ExecConfig ¶
type ExecConfig struct {
ToolConfig ` envPrefix:"COMPA_TOOLS_EXEC_"`
EnableDenyPatterns bool ` json:"enable_deny_patterns" env:"COMPA_TOOLS_EXEC_ENABLE_DENY_PATTERNS"`
AllowRemote bool ` json:"allow_remote" env:"COMPA_TOOLS_EXEC_ALLOW_REMOTE"`
CustomDenyPatterns []string ` json:"custom_deny_patterns" env:"COMPA_TOOLS_EXEC_CUSTOM_DENY_PATTERNS"`
CustomAllowPatterns []string ` json:"custom_allow_patterns" env:"COMPA_TOOLS_EXEC_CUSTOM_ALLOW_PATTERNS"`
TimeoutSeconds int ` json:"timeout_seconds" env:"COMPA_TOOLS_EXEC_TIMEOUT_SECONDS"` // 0 means use default (60s)
}
type ExposePath ¶
type ExposePath struct {
Source string `json:"source"`
Target string `json:"target,omitempty"`
Mode string `json:"mode"`
}
ExposePath describes a host path that should remain visible inside the isolated child-process environment. This is currently implemented on Linux only.
type ExtensionDaemonConfig ¶
type ExtensionDaemonConfig struct {
// URL is the daemon's origin, such as "http://127.0.0.1:18888".
URL string `json:"url"`
}
ExtensionDaemonConfig locates the extension daemon.
type FlexibleStringSlice ¶
type FlexibleStringSlice []string
FlexibleStringSlice is a []string that also accepts JSON numbers, so allow_from can contain both "123" and 123. It also supports parsing comma-separated strings from environment variables, including both English (,) and Chinese (,) commas.
func (*FlexibleStringSlice) UnmarshalJSON ¶
func (f *FlexibleStringSlice) UnmarshalJSON(data []byte) error
func (*FlexibleStringSlice) UnmarshalText ¶
func (f *FlexibleStringSlice) UnmarshalText(text []byte) error
UnmarshalText implements encoding.TextUnmarshaler to support env variable parsing. It handles comma-separated values with both English (,) and Chinese (,) commas.
type GLMSearchConfig ¶
type GLMSearchConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_GLM_ENABLED"`
APIKey SecureString `json:"api_key,omitzero" yaml:"api_key,omitempty" env:"COMPA_TOOLS_WEB_GLM_API_KEY"`
BaseURL string `json:"base_url" yaml:"-" env:"COMPA_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" yaml:"-" env:"COMPA_TOOLS_WEB_GLM_SEARCH_ENGINE"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_GLM_MAX_RESULTS"`
}
type GatewayConfig ¶
type GeminiSearchConfig ¶
type GeminiSearchConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_GEMINI_ENABLED"`
APIKey SecureString `json:"api_key,omitzero" yaml:"api_key,omitempty" env:"COMPA_TOOLS_WEB_GEMINI_API_KEY"`
Model string `json:"model" yaml:"-" env:"COMPA_TOOLS_WEB_GEMINI_MODEL"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_GEMINI_MAX_RESULTS"`
}
type GroupTriggerConfig ¶
type GroupTriggerConfig struct {
// MentionOnly answers in groups only when the bot is mentioned. A channel
// entry that leaves it out gets true (ChannelsConfig.UnmarshalJSON).
MentionOnly bool `json:"mention_only"`
Prefixes []string `json:"prefixes,omitempty"`
}
GroupTriggerConfig controls when the bot responds in group chats.
type HeartbeatConfig ¶
type HookDefaultsConfig ¶
type HooksConfig ¶
type HooksConfig struct {
Enabled bool `json:"enabled"`
Defaults HookDefaultsConfig `json:"defaults,omitempty"`
Builtins map[string]BuiltinHookConfig `json:"builtins,omitempty"`
Processes map[string]ProcessHookConfig `json:"processes,omitempty"`
}
type IsolationConfig ¶
type IsolationConfig struct {
Enabled bool `json:"enabled,omitempty"`
ExposePaths []ExposePath `json:"expose_paths,omitempty"`
}
IsolationConfig controls subprocess isolation for commands started by Compa. It is applied by the isolation package rather than by sandboxing the main process.
type KagiConfig ¶
type KagiConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_KAGI_ENABLED"`
APIKeys SecureStrings `json:"api_keys,omitzero" yaml:"api_keys,omitempty" env:"COMPA_TOOLS_WEB_KAGI_API_KEYS"`
BaseURL string `json:"base_url" yaml:"-" env:"COMPA_TOOLS_WEB_KAGI_BASE_URL"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_KAGI_MAX_RESULTS"`
}
func (*KagiConfig) SetAPIKey ¶
func (c *KagiConfig) SetAPIKey(key string)
SetAPIKey sets the Kagi API key
func (*KagiConfig) SetAPIKeys ¶
func (c *KagiConfig) SetAPIKeys(keys []string)
SetAPIKeys sets the Kagi API keys
type LoggingConfig ¶
type LoggingConfig struct {
// RedactSecrets replaces the secrets Compa stores, and tokens inside
// URLs, with [FILTERED] in log entries.
RedactSecrets bool `json:"redact_secrets" env:"COMPA_LOGGING_REDACT_SECRETS"`
// MaxSizeMB rotates a log file when it reaches this size.
MaxSizeMB int `json:"max_size_mb" env:"COMPA_LOGGING_MAX_SIZE_MB"`
// MaxFiles is how many rotated files are kept beside the current one.
MaxFiles int `json:"max_files" env:"COMPA_LOGGING_MAX_FILES"`
}
LoggingConfig configures Compa's log files.
func (LoggingConfig) EffectiveMaxFiles ¶
func (c LoggingConfig) EffectiveMaxFiles() int
EffectiveMaxFiles returns MaxFiles, or its default when unset.
func (LoggingConfig) EffectiveMaxSizeMB ¶
func (c LoggingConfig) EffectiveMaxSizeMB() int
EffectiveMaxSizeMB returns MaxSizeMB, or its default when unset.
type MCPConfig ¶
type MCPConfig struct {
ToolConfig ` envPrefix:"COMPA_TOOLS_MCP_"`
Discovery ToolDiscoveryConfig ` json:"discovery"`
// MaxInlineTextChars controls how much MCP text stays inline before it is saved as an artifact.
MaxInlineTextChars int `json:"max_inline_text_chars,omitempty" env:"COMPA_TOOLS_MCP_MAX_INLINE_TEXT_CHARS"`
// CallTimeoutSeconds bounds one tool call to a server without its own
// call_timeout_seconds; 0 means 300 (mcp.DefaultCallTimeout).
CallTimeoutSeconds int `json:"call_timeout_seconds,omitempty" env:"COMPA_TOOLS_MCP_CALL_TIMEOUT_SECONDS"`
// Servers is a map of server name to server configuration
Servers map[string]MCPServerConfig `json:"servers,omitempty"`
}
MCPConfig defines configuration for all MCP servers
func (*MCPConfig) GetMaxInlineTextChars ¶
type MCPServerConfig ¶
type MCPServerConfig struct {
// Enabled indicates whether this MCP server is active
Enabled bool `json:"enabled"`
// Deferred controls whether this server's tools are registered as hidden (deferred/discovery mode).
// When nil, the global Discovery.Enabled setting applies.
// When explicitly set to true or false, it overrides the global setting for this server only.
Deferred *bool `json:"deferred,omitempty"`
// 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", "http", or "streamable-http".
// "http" and "streamable-http" both select streamable HTTP request-response
// mode, while "sse" keeps the standalone SSE listener enabled for
// server-initiated notifications. Defaults: 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"`
// Trusted lets Compa act on what the server declares about its tools
// (annotations such as readOnlyHint): approval rules may match them, and a
// read-only or idempotent call is retried once after a lost session.
// Annotations from servers that are not trusted are ignored.
Trusted bool `json:"trusted,omitempty"`
// Cwd is the working folder of a stdio server; empty means the agent
// workspace.
Cwd string `json:"cwd,omitempty"`
// CallTimeoutSeconds bounds one tool call to this server; 0 means the
// MCP default (MCPConfig.CallTimeoutSeconds).
CallTimeoutSeconds int `json:"call_timeout_seconds,omitempty"`
}
MCPServerConfig defines configuration for a single MCP server
func (MCPServerConfig) MarshalJSON ¶
func (c MCPServerConfig) MarshalJSON() ([]byte, error)
MarshalJSON writes the server with its env and header values masked: they often hold tokens, which are kept in .security.yml.
type MediaCleanupConfig ¶
type MediaCleanupConfig struct {
ToolConfig ` envPrefix:"COMPA_MEDIA_CLEANUP_"`
MaxAge int ` json:"max_age_minutes" env:"COMPA_MEDIA_CLEANUP_MAX_AGE"`
Interval int ` json:"interval_minutes" env:"COMPA_MEDIA_CLEANUP_INTERVAL"`
}
type MessageToolsConfig ¶
type MessageToolsConfig struct {
ToolConfig `yaml:"-" envPrefix:"COMPA_TOOLS_MESSAGE_"`
MediaEnabled bool `json:"media_enabled" yaml:"-" env:"COMPA_TOOLS_MESSAGE_MEDIA_ENABLED"`
// Targets is where the message tool may send: "current_chat" or "any".
Targets string `json:"targets" yaml:"-" env:"COMPA_TOOLS_MESSAGE_TARGETS"`
}
func (MessageToolsConfig) EffectiveTargets ¶
func (c MessageToolsConfig) EffectiveTargets() string
EffectiveTargets returns the message tool's target policy: any chat, unless the config restricts it to the current one.
type ModelRouteConfig ¶
ModelRouteConfig is an ordered failover route of exact instance-owned targets. Ordering is significant and duplicates are invalid.
type ModelSelection ¶
type ModelSelection struct {
// Key names the setting across edits: an agent's model is keyed by the
// agent's ID, which a reordered agent list keeps.
Key string
// Path is the setting's config path.
Path string
Value string
}
ModelSelection is one model selection a config holds.
func ModelSelections ¶
func ModelSelections(cfg *Config) []ModelSelection
ModelSelections returns the model selections cfg holds: the default, image and light models and each agent's model, trimmed.
type ModulesConfig ¶
type ModulesConfig struct {
// SourceRoots are the named locations the host may lend a module to read:
// root name -> absolute path of an existing directory or file.
//
// A module asks for a root by NAME in the filesystem_read list of its
// descriptor, and the host grants it read-only only when that name is
// configured here (or supplied for one invocation with
// `module-invoke --source-root name=path`). Compa itself defines no names
// and no default paths. Roots the host supplies on its own -- the
// workspace, a module's bundle and its writable state -- are never taken
// from here.
//
// Loading checks the SHAPE of each entry only. Whether a path exists is
// checked each time a module is granted it, so a detached drive never
// makes the whole config unloadable.
SourceRoots map[string]string `json:"source_roots,omitempty"`
}
ModulesConfig configures the host for detached modules.
type PerplexityConfig ¶
type PerplexityConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_PERPLEXITY_ENABLED"`
APIKeys SecureStrings `json:"api_keys,omitzero" yaml:"api_keys,omitempty" env:"COMPA_TOOLS_WEB_PERPLEXITY_API_KEYS"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_PERPLEXITY_MAX_RESULTS"`
}
func (*PerplexityConfig) APIKey ¶
func (c *PerplexityConfig) APIKey() string
APIKey returns the Perplexity API key
func (*PerplexityConfig) SetAPIKey ¶
func (c *PerplexityConfig) SetAPIKey(key string)
SetAPIKey sets the Perplexity API key
type PlaceholderConfig ¶
type PlaceholderConfig struct {
Enabled bool `json:"enabled"`
Text FlexibleStringSlice `json:"text,omitempty"`
}
PlaceholderConfig controls placeholder message behavior (Phase 10).
func (*PlaceholderConfig) GetRandomText ¶
func (p *PlaceholderConfig) GetRandomText() string
GetRandomText returns a random placeholder text, or default if none set.
type ProcessHookConfig ¶
type ProcessHookConfig struct {
Enabled bool `json:"enabled"`
Priority int `json:"priority,omitempty"`
Transport string `json:"transport,omitempty"`
Command []string `json:"command,omitempty"`
Dir string `json:"dir,omitempty"`
Env map[string]string `json:"env,omitempty"`
Observe []string `json:"observe,omitempty"`
Intercept []string `json:"intercept,omitempty"`
}
func (ProcessHookConfig) MarshalJSON ¶
func (c ProcessHookConfig) MarshalJSON() ([]byte, error)
MarshalJSON writes the hook with its env values masked; they are kept in .security.yml.
type ProviderInstanceConfig ¶
type ProviderInstanceConfig struct {
ID string `json:"id"`
ProviderKind string `json:"provider_kind"`
Adapter string `json:"adapter"`
Protocol string `json:"protocol"`
Endpoint string `json:"endpoint,omitempty"`
AuthConnectionRef string `json:"auth_connection_ref,omitempty"`
Headers map[string]string `json:"headers,omitempty"`
// Settings configure the adapter: display_name, project and location for
// Vertex AI and, for an extension instance, the extension_* settings.
Settings map[string]any `json:"settings,omitempty"`
// Runtime holds the request settings every model of the instance runs
// with; nil uses the provider defaults.
Runtime *ProviderInstanceRuntime `json:"runtime,omitempty"`
State ProviderInstanceState `json:"state"`
}
ProviderInstanceConfig owns one provider adapter connection independently of any model selected from its catalog.
func (*ProviderInstanceConfig) ExtensionProvider ¶
func (c *ProviderInstanceConfig) ExtensionProvider() string
ExtensionProvider returns the daemon's id of an extension instance's provider, or "" for any other instance.
func (*ProviderInstanceConfig) ExtensionSurfaces ¶
func (c *ProviderInstanceConfig) ExtensionSurfaces() []string
ExtensionSurfaces returns the surfaces the daemon lists for an extension instance's provider (the ExtensionSurfacesSetting), or just its protocol when the setting is absent. Other instances have none.
func (ProviderInstanceConfig) MarshalJSON ¶
func (c ProviderInstanceConfig) MarshalJSON() ([]byte, error)
MarshalJSON writes the instance with its header values masked; they often hold credentials, which are kept in .security.yml.
func (*ProviderInstanceConfig) Validate ¶
func (c *ProviderInstanceConfig) Validate() error
type ProviderInstanceRuntime ¶
type ProviderInstanceRuntime struct {
// Proxy is the http, https, socks5 or socks5h proxy URL requests go
// through; empty uses none.
Proxy string `json:"proxy,omitempty"`
// RequestTimeout bounds a request, in seconds; 0 uses the provider
// default.
RequestTimeout int `json:"request_timeout,omitempty"`
// RPM caps requests per minute; 0 is unlimited.
RPM int `json:"rpm,omitempty"`
// Streaming turns provider streaming on or off; nil leaves it on, so
// answers show as they arrive.
Streaming *bool `json:"streaming,omitempty"`
// ThinkingLevel is the extended-thinking level: off, low, medium, high,
// xhigh or adaptive; empty leaves it to the agent.
ThinkingLevel string `json:"thinking_level,omitempty"`
// MaxTokensField names the request's max-tokens field, such as
// "max_completion_tokens"; empty uses the provider's choice.
MaxTokensField string `json:"max_tokens_field,omitempty"`
// ToolSchemaTransform adapts tool schemas for providers that reject
// complex JSON Schema: "off" (or empty) or "simple".
ToolSchemaTransform string `json:"tool_schema_transform,omitempty"`
// ExtraBody holds fields merged into every request body.
ExtraBody map[string]any `json:"extra_body,omitempty"`
}
ProviderInstanceRuntime holds the typed request settings of a provider instance, applied to every model call on it.
func (*ProviderInstanceRuntime) Validate ¶
func (r *ProviderInstanceRuntime) Validate() error
Validate checks the runtime settings' values.
type ProviderInstanceState ¶
type ProviderInstanceState string
const ( ProviderInstanceStateEnabled ProviderInstanceState = "enabled" ProviderInstanceStateDisabled ProviderInstanceState = "disabled" )
type RawNode ¶
type RawNode json.RawMessage
RawNode stores raw configuration data as JSON bytes, supporting both JSON and YAML. Internally uses json.RawMessage, so Decode always uses json.Unmarshal which correctly respects json struct tags.
func (*RawNode) Decode ¶
Decode unmarshals the stored data into the given target struct using json.Unmarshal.
func (RawNode) MarshalJSON ¶
MarshalJSON implements json.Marshaler: outputs stored JSON bytes.
func (RawNode) MarshalYAML ¶
MarshalYAML implements yaml.ValueMarshaler: converts stored JSON back to a YAML-compatible value.
func (*RawNode) UnmarshalJSON ¶
UnmarshalJSON implements json.Unmarshaler: stores raw JSON bytes. NOTE: yaml.Unmarshal may call this when unmarshaling into RawNode fields. We detect if the input looks like YAML (not JSON) and handle it.
type ReadFileToolConfig ¶
type ReadFileToolConfig struct {
Enabled bool `json:"enabled"`
Mode string `json:"mode"`
MaxReadFileSize int `json:"max_read_file_size"`
}
func (ReadFileToolConfig) EffectiveMode ¶
func (c ReadFileToolConfig) EffectiveMode() string
type RestartSignature ¶
RestartSignature is the part of a config the gateway applies only when it starts or reloads, which the web UI's restart indicator compares, keyed by what it covers: the model selections, the approval policy, every tool setting, the guards around the tools, and per channel its access and the rest of its config, secrets included. Other settings, such as model parameters, apply the next time the gateway starts without asking for it.
func NewRestartSignature ¶
func NewRestartSignature(cfg *Config) RestartSignature
NewRestartSignature returns cfg's RestartSignature, nil for a nil cfg.
func (RestartSignature) Digest ¶
func (s RestartSignature) Digest() string
Digest identifies s: signatures are Equal exactly when their digests are, but the digest shows none of the settings, which the gateway's /ready reports for the config it applied. It is "" for an empty signature.
func (RestartSignature) Equal ¶
func (s RestartSignature) Equal(other RestartSignature) bool
Equal reports whether s and other cover the same config.
func (RestartSignature) EqualBesidesLive ¶
func (s RestartSignature) EqualBesidesLive(other RestartSignature) bool
EqualBesidesLive reports whether s and other agree on all but their live parts.
func (RestartSignature) LiveEqual ¶
func (s RestartSignature) LiveEqual(other RestartSignature) bool
LiveEqual reports whether s and other agree on their live parts (see isLiveSignatureKey).
type RoutingConfig ¶
type RoutingConfig struct {
Enabled bool `json:"enabled"`
LightModel string `json:"light_model"` // model selection (exact target or model route name) for simple tasks
Threshold float64 `json:"threshold"` // complexity score in [0,1]; score >= threshold → primary model
}
RoutingConfig controls the intelligent model routing feature. When enabled, each incoming message is scored against structural features (message length, code blocks, tool call history, conversation depth, attachments). Messages scoring below Threshold are sent to LightModel; all others use the agent's primary model. This reduces cost and latency for simple tasks without requiring any keyword matching — all scoring is language-agnostic.
type SearXNGConfig ¶
type SearchCacheConfig ¶
type SecureString ¶
type SecureString struct {
// contains filtered or unexported fields
}
SecureString is a secret setting. JSON shows a placeholder instead of a value that is set; the value is kept in .security.yml, as written or as a file:// reference to a file beside it.
func NewSecureString ¶
func NewSecureString(value string) *SecureString
func (SecureString) IsZero ¶
func (s SecureString) IsZero() bool
IsZero reports whether the value is empty.
func (SecureString) MarshalJSON ¶
func (s SecureString) MarshalJSON() ([]byte, error)
func (SecureString) MarshalYAML ¶
func (s SecureString) MarshalYAML() (any, error)
MarshalYAML writes the value for .security.yml: a file:// reference as the reference, any other value as it is.
func (*SecureString) Set ¶
func (s *SecureString) Set(value string) *SecureString
func (*SecureString) String ¶
func (s *SecureString) String() string
func (*SecureString) UnmarshalJSON ¶
func (s *SecureString) UnmarshalJSON(value []byte) error
UnmarshalJSON reads a plain value or a file:// reference. The placeholder reads as unset: the value is in .security.yml.
func (*SecureString) UnmarshalText ¶
func (s *SecureString) UnmarshalText(text []byte) error
func (*SecureString) UnmarshalYAML ¶
func (s *SecureString) UnmarshalYAML(value *yaml.Node) error
type SecureStrings ¶
type SecureStrings []*SecureString
SecureStrings is a slice of SecureString
func SimpleSecureStrings ¶
func SimpleSecureStrings(val ...string) SecureStrings
func (SecureStrings) IsZero ¶
func (s SecureStrings) IsZero() bool
IsZero reports whether the list is empty.
func (SecureStrings) MarshalJSON ¶
func (s SecureStrings) MarshalJSON() ([]byte, error)
func (*SecureStrings) UnmarshalJSON ¶
func (s *SecureStrings) UnmarshalJSON(value []byte) error
UnmarshalJSON reads a list of values. The placeholder, for the whole list or an entry, reads as unset: the values are in .security.yml.
func (*SecureStrings) Values ¶
func (s *SecureStrings) Values() []string
Values returns the decrypted/resolved values
type SensitiveDataCache ¶
type SensitiveDataCache struct {
// contains filtered or unexported fields
}
SensitiveDataCache holds the config's own secrets, collected once, and the replacer last built from them and the registered sources' values.
type SessionConfig ¶
type SessionConfig struct {
Dimensions []string `json:"dimensions,omitempty"`
IdentityLinks map[string][]string `json:"identity_links,omitempty"`
DmScope string `json:"dm_scope,omitempty"`
}
func (*SessionConfig) ApplyDmScope ¶
func (s *SessionConfig) ApplyDmScope()
ApplyDmScope translates the user-facing dm_scope value into the internal dimensions array that the routing layer consumes. It is a no-op when DmScope is empty or when Dimensions is already set (explicit Dimensions take precedence over the derived value).
func (*SessionConfig) DeriveDmScope ¶
func (s *SessionConfig) DeriveDmScope()
DeriveDmScope sets DmScope based on Dimensions when DmScope is empty. This handles configs, including the defaults, that set Dimensions without a corresponding DmScope value, ensuring the API response always includes a dm_scope that matches the actual runtime dimensions.
type SkillRegistryConfig ¶
type SkillRegistryConfig struct {
Name string `json:"name,omitempty" yaml:"-" env:"-"`
Enabled bool `json:"enabled" yaml:"-" env:"-"`
BaseURL string `json:"base_url" yaml:"-" env:"-"`
AuthToken SecureString `json:"auth_token,omitzero" yaml:"auth_token,omitempty" env:"-"`
Param map[string]any `json:"-" yaml:"-" env:"-"`
}
func (*SkillRegistryConfig) DecodeParam ¶
func (c *SkillRegistryConfig) DecodeParam(target any) error
func (SkillRegistryConfig) MarshalJSON ¶
func (c SkillRegistryConfig) MarshalJSON() ([]byte, error)
func (SkillRegistryConfig) MarshalYAML ¶
func (c SkillRegistryConfig) MarshalYAML() (any, error)
func (*SkillRegistryConfig) UnmarshalJSON ¶
func (c *SkillRegistryConfig) UnmarshalJSON(data []byte) error
func (*SkillRegistryConfig) UnmarshalYAML ¶
func (c *SkillRegistryConfig) UnmarshalYAML(value *yaml.Node) error
type SkillsRegistriesConfig ¶
type SkillsRegistriesConfig []*SkillRegistryConfig
func (*SkillsRegistriesConfig) Get ¶
func (c *SkillsRegistriesConfig) Get(name string) (SkillRegistryConfig, bool)
func (SkillsRegistriesConfig) MarshalJSON ¶
func (v SkillsRegistriesConfig) MarshalJSON() ([]byte, error)
func (SkillsRegistriesConfig) MarshalYAML ¶
func (v SkillsRegistriesConfig) MarshalYAML() (any, error)
func (*SkillsRegistriesConfig) Set ¶
func (c *SkillsRegistriesConfig) Set(name string, cfg SkillRegistryConfig)
func (*SkillsRegistriesConfig) UnmarshalJSON ¶
func (v *SkillsRegistriesConfig) UnmarshalJSON(data []byte) error
func (*SkillsRegistriesConfig) UnmarshalYAML ¶
func (v *SkillsRegistriesConfig) UnmarshalYAML(value *yaml.Node) error
type SkillsToolsConfig ¶
type SkillsToolsConfig struct {
ToolConfig ` yaml:"-" envPrefix:"COMPA_TOOLS_SKILLS_"`
Registries SkillsRegistriesConfig `yaml:"registries,omitempty" json:"registries"`
MaxConcurrentSearches int `yaml:"-" json:"max_concurrent_searches" env:"COMPA_TOOLS_SKILLS_MAX_CONCURRENT_SEARCHES"`
SearchCache SearchCacheConfig `yaml:"-" json:"search_cache"`
}
type SlackSettings ¶
type SlackSettings struct {
BotToken SecureString `json:"bot_token,omitzero" yaml:"bot_token,omitempty" env:"COMPA_CHANNELS_SLACK_BOT_TOKEN"`
AppToken SecureString `json:"app_token,omitzero" yaml:"app_token,omitempty" env:"COMPA_CHANNELS_SLACK_APP_TOKEN"`
}
type SlackWebhookSettings ¶
type SlackWebhookSettings struct {
Webhooks map[string]SlackWebhookTarget `json:"webhooks" yaml:"webhooks,omitempty"`
}
SlackWebhookSettings configures the output-only Slack webhook channel.
type SlackWebhookTarget ¶
type SlackWebhookTarget struct {
WebhookURL SecureString `json:"webhook_url,omitzero" yaml:"webhook_url,omitempty"`
Username string `json:"username,omitempty" yaml:"-"`
IconEmoji string `json:"icon_emoji,omitempty" yaml:"-"`
}
SlackWebhookTarget represents a single Slack Incoming Webhook destination.
type SogouConfig ¶
type StreamingConfig ¶
type StreamingConfig struct {
Enabled bool `json:"enabled,omitempty"`
ThrottleSeconds int `json:"throttle_seconds,omitempty"`
MinGrowthChars int `json:"min_growth_chars,omitempty"`
}
func (StreamingConfig) IsZero ¶
func (c StreamingConfig) IsZero() bool
func (StreamingConfig) WithDefaults ¶
func (c StreamingConfig) WithDefaults(throttleSeconds, minGrowthChars int) StreamingConfig
type SubTurnConfig ¶
type SubTurnConfig struct {
MaxDepth int `json:"max_depth" env:"COMPA_AGENTS_DEFAULTS_SUBTURN_MAX_DEPTH"`
MaxConcurrent int `json:"max_concurrent" env:"COMPA_AGENTS_DEFAULTS_SUBTURN_MAX_CONCURRENT"`
DefaultTimeoutMinutes int `json:"default_timeout_minutes" env:"COMPA_AGENTS_DEFAULTS_SUBTURN_DEFAULT_TIMEOUT_MINUTES"`
ConcurrencyTimeoutSec int `json:"concurrency_timeout_sec" env:"COMPA_AGENTS_DEFAULTS_SUBTURN_CONCURRENCY_TIMEOUT_SEC"`
}
SubTurnConfig configures the SubTurn execution system. Its env tags are the full COMPA_AGENTS_DEFAULTS_SUBTURN_* names, so the field that holds it carries no envPrefix, which would double them.
type SubagentsConfig ¶
type SubagentsConfig struct {
AllowAgents []string `json:"allow_agents,omitempty"`
}
type TavilyConfig ¶
type TavilyConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"COMPA_TOOLS_WEB_TAVILY_ENABLED"`
APIKeys SecureStrings `json:"api_keys,omitzero" yaml:"api_keys,omitempty" env:"COMPA_TOOLS_WEB_TAVILY_API_KEYS"`
BaseURL string `json:"base_url" yaml:"-" env:"COMPA_TOOLS_WEB_TAVILY_BASE_URL"`
MaxResults int `json:"max_results" yaml:"-" env:"COMPA_TOOLS_WEB_TAVILY_MAX_RESULTS"`
}
func (*TavilyConfig) APIKey ¶
func (c *TavilyConfig) APIKey() string
APIKey returns the Tavily API key
func (*TavilyConfig) SetAPIKey ¶
func (c *TavilyConfig) SetAPIKey(key string)
SetAPIKey sets the Tavily API key
func (*TavilyConfig) SetAPIKeys ¶
func (c *TavilyConfig) SetAPIKeys(keys []string)
SetAPIKeys sets the Tavily API keys
type TeamsWebhookSettings ¶
type TeamsWebhookSettings struct {
Webhooks map[string]TeamsWebhookTarget `json:"webhooks" yaml:"webhooks,omitempty"`
}
TeamsWebhookSettings configures the output-only Microsoft Teams webhook channel. Multiple webhook targets can be configured and selected via ChatID at send time.
type TeamsWebhookTarget ¶
type TeamsWebhookTarget struct {
WebhookURL SecureString `json:"webhook_url,omitzero" yaml:"webhook_url,omitempty"`
Title string `json:"title,omitempty" yaml:"-"`
}
TeamsWebhookTarget represents a single Teams webhook destination.
type ToolConfig ¶
type ToolConfig struct {
Enabled bool `json:"enabled" yaml:"-" env:"ENABLED"`
}
type ToolDiscoveryConfig ¶
type ToolDiscoveryConfig struct {
Enabled bool `json:"enabled" env:"COMPA_TOOLS_DISCOVERY_ENABLED"`
TTL int `json:"ttl" env:"COMPA_TOOLS_DISCOVERY_TTL"`
MaxSearchResults int `json:"max_search_results" env:"COMPA_MAX_SEARCH_RESULTS"`
UseBM25 bool `json:"use_bm25" env:"COMPA_TOOLS_DISCOVERY_USE_BM25"`
UseRegex bool `json:"use_regex" env:"COMPA_TOOLS_DISCOVERY_USE_REGEX"`
}
type ToolFeedbackConfig ¶
type ToolFeedbackConfig struct {
Enabled bool `json:"enabled" env:"COMPA_AGENTS_DEFAULTS_TOOL_FEEDBACK_ENABLED"`
MaxArgsLength int `json:"max_args_length" env:"COMPA_AGENTS_DEFAULTS_TOOL_FEEDBACK_MAX_ARGS_LENGTH"`
SeparateMessages bool `json:"separate_messages" env:"COMPA_AGENTS_DEFAULTS_TOOL_FEEDBACK_SEPARATE_MESSAGES"`
}
type ToolsConfig ¶
type ToolsConfig struct {
AllowReadPaths []string `json:"allow_read_paths" yaml:"-" env:"COMPA_TOOLS_ALLOW_READ_PATHS"`
AllowWritePaths []string `json:"allow_write_paths" yaml:"-" env:"COMPA_TOOLS_ALLOW_WRITE_PATHS"`
// FilterSensitiveData controls whether to filter sensitive values (API keys,
// tokens, secrets) from tool results before sending to the LLM.
// Default: true (enabled)
FilterSensitiveData bool `json:"filter_sensitive_data" yaml:"-" env:"COMPA_TOOLS_FILTER_SENSITIVE_DATA"`
// FilterMinLength is the minimum content length required for filtering.
// Content shorter than this will be returned unchanged for performance.
// Default: 8
FilterMinLength int `json:"filter_min_length" yaml:"-" env:"COMPA_TOOLS_FILTER_MIN_LENGTH"`
Approval approval.Policy `json:"approval" yaml:"-"`
Web WebToolsConfig `json:"web" yaml:"web,omitempty"`
Cron CronToolsConfig `json:"cron" yaml:"-"`
Exec ExecConfig `json:"exec" yaml:"-"`
Skills SkillsToolsConfig `json:"skills" yaml:"skills,omitempty"`
MediaCleanup MediaCleanupConfig `json:"media_cleanup" yaml:"-"`
MCP MCPConfig `json:"mcp" yaml:"-"`
AppendFile ToolConfig `json:"append_file" yaml:"-" envPrefix:"COMPA_TOOLS_APPEND_FILE_"`
EditFile ToolConfig `json:"edit_file" yaml:"-" envPrefix:"COMPA_TOOLS_EDIT_FILE_"`
FindSkills ToolConfig `json:"find_skills" yaml:"-" envPrefix:"COMPA_TOOLS_FIND_SKILLS_"`
I2C ToolConfig `json:"i2c" yaml:"-" envPrefix:"COMPA_TOOLS_I2C_"`
InstallSkill ToolConfig `` /* 126-byte string literal not displayed */
ListDir ToolConfig `json:"list_dir" yaml:"-" envPrefix:"COMPA_TOOLS_LIST_DIR_"`
LoadImage ToolConfig `json:"load_image" yaml:"-" envPrefix:"COMPA_TOOLS_LOAD_IMAGE_"`
Message MessageToolsConfig `json:"message" yaml:"-"`
ReadFile ReadFileToolConfig `json:"read_file" yaml:"-" envPrefix:"COMPA_TOOLS_READ_FILE_"`
Serial ToolConfig `json:"serial" yaml:"-" envPrefix:"COMPA_TOOLS_SERIAL_"`
SendFile ToolConfig `json:"send_file" yaml:"-" envPrefix:"COMPA_TOOLS_SEND_FILE_"`
SendTTS ToolConfig `json:"send_tts" yaml:"-" envPrefix:"COMPA_TOOLS_SEND_TTS_"`
Spawn ToolConfig `json:"spawn" yaml:"-" envPrefix:"COMPA_TOOLS_SPAWN_"`
SpawnStatus ToolConfig `json:"spawn_status" yaml:"-" envPrefix:"COMPA_TOOLS_SPAWN_STATUS_"`
SPI ToolConfig `json:"spi" yaml:"-" envPrefix:"COMPA_TOOLS_SPI_"`
Subagent ToolConfig `json:"subagent" yaml:"-" envPrefix:"COMPA_TOOLS_SUBAGENT_"`
WebFetch ToolConfig `json:"web_fetch" yaml:"-" envPrefix:"COMPA_TOOLS_WEB_FETCH_"`
WriteFile ToolConfig `json:"write_file" yaml:"-" envPrefix:"COMPA_TOOLS_WRITE_FILE_"`
}
func (*ToolsConfig) GetFilterMinLength ¶
func (c *ToolsConfig) GetFilterMinLength() int
GetFilterMinLength returns the minimum content length for filtering (default: 8)
func (*ToolsConfig) IsFilterSensitiveDataEnabled ¶
func (c *ToolsConfig) IsFilterSensitiveDataEnabled() bool
IsFilterSensitiveDataEnabled returns true if sensitive data filtering is enabled
func (*ToolsConfig) IsToolEnabled ¶
func (t *ToolsConfig) IsToolEnabled(name string) bool
type TurnProfileBlock ¶
type TurnProfileBlock struct {
Mode TurnProfileMode `json:"mode,omitempty"`
Allow []string `json:"allow,omitempty"`
}
type TurnProfileConfig ¶
type TurnProfileConfig struct {
Enabled bool `json:"enabled"`
History TurnProfileBlock `json:"history,omitempty"`
SystemPrompt TurnProfileBlock `json:"system_prompt,omitempty"`
Skills TurnProfileBlock `json:"skills,omitempty"`
Tools TurnProfileBlock `json:"tools,omitempty"`
}
type TurnProfileMode ¶
type TurnProfileMode string
const ( TurnProfileModeDefault TurnProfileMode = "default" TurnProfileModeOff TurnProfileMode = "off" TurnProfileModeCustom TurnProfileMode = "custom" )
func (TurnProfileMode) Effective ¶
func (m TurnProfileMode) Effective() TurnProfileMode
type TypingConfig ¶
type TypingConfig struct {
Enabled bool `json:"enabled,omitempty"`
}
TypingConfig controls typing indicator behavior (Phase 10).
type VoiceConfig ¶
type VoiceConfig struct {
Enabled bool `json:"enabled"`
// Mode is "cascade" (push-to-talk) or "live" (hands-free).
Mode string `json:"mode,omitempty"`
// STTTarget is the exact target "instance-id/model-id" that transcribes
// speech.
STTTarget string `json:"stt_target,omitempty"`
// STTViaChat opts STTTarget in as a chat model that transcribes the audio
// it is sent (llmgw-core's chat transcription adapter) instead of a model
// serving audio_transcriptions. It is never inferred, and holds only for
// a model whose catalog declares audio input.
STTViaChat bool `json:"stt_via_chat,omitempty"`
// TTSTarget is the exact target "instance-id/model-id" that synthesizes
// speech.
TTSTarget string `json:"tts_target,omitempty"`
// TTSVoice is the synthesis voice; empty uses the provider's default.
TTSVoice string `json:"tts_voice,omitempty"`
EchoTranscription bool `json:"echo_transcription" env:"COMPA_VOICE_ECHO_TRANSCRIPTION"`
}
VoiceConfig configures voice conversation. Speech-to-text and text-to-speech each run on an exact provider instance target; voice runs with either or both: speech-to-text alone dictates, text-to-speech alone speaks the replies.
type WebChatClientSettings ¶
type WebChatClientSettings struct {
URL string `json:"url" yaml:"-" env:"COMPA_CHANNELS_WEB_CLIENT_URL"`
Token SecureString `json:"token,omitzero" yaml:"token,omitempty" env:"COMPA_CHANNELS_WEB_CLIENT_TOKEN"`
SessionID string `json:"session_id,omitempty" yaml:"-"`
PingInterval int `json:"ping_interval,omitempty" yaml:"-"`
ReadTimeout int `json:"read_timeout,omitempty" yaml:"-"`
}
type WebChatSettings ¶
type WebChatSettings struct {
Token SecureString `json:"token,omitzero" yaml:"token,omitempty" env:"COMPA_CHANNELS_WEB_TOKEN"`
AllowTokenQuery bool `json:"allow_token_query,omitempty" yaml:"-"`
AllowOrigins []string `json:"allow_origins,omitempty" yaml:"-"`
Streaming StreamingConfig `json:"streaming,omitzero" yaml:"-"`
PingInterval int `json:"ping_interval,omitempty" yaml:"-"`
ReadTimeout int `json:"read_timeout,omitempty" yaml:"-"`
WriteTimeout int `json:"write_timeout,omitempty" yaml:"-"`
MaxConnections int `json:"max_connections,omitempty" yaml:"-"`
}
func (*WebChatSettings) SetToken ¶
func (c *WebChatSettings) SetToken(token string)
SetToken sets the web chat token and marks it as dirty for security saving
type WebToolsConfig ¶
type WebToolsConfig struct {
ToolConfig ` yaml:"-" envPrefix:"COMPA_TOOLS_WEB_"`
Brave BraveConfig `yaml:"brave,omitempty" json:"brave"`
Tavily TavilyConfig `yaml:"tavily,omitempty" json:"tavily"`
Kagi KagiConfig `yaml:"kagi,omitempty" json:"kagi"`
Sogou SogouConfig `yaml:"-" json:"sogou"`
DuckDuckGo DuckDuckGoConfig `yaml:"-" json:"duckduckgo"`
Gemini GeminiSearchConfig `yaml:"gemini,omitempty" json:"gemini"`
Perplexity PerplexityConfig `yaml:"perplexity,omitempty" json:"perplexity"`
SearXNG SearXNGConfig `yaml:"-" json:"searxng"`
GLMSearch GLMSearchConfig `yaml:"glm_search,omitempty" json:"glm_search"`
BaiduSearch BaiduSearchConfig `yaml:"baidu_search,omitempty" json:"baidu_search"`
Provider string `yaml:"-" json:"provider,omitempty" env:"COMPA_TOOLS_WEB_PROVIDER"`
// PreferNative controls whether to use provider-native web search when
// the active LLM supports it (e.g. OpenAI web_search_preview). When true,
// the client-side web_search tool is hidden to avoid duplicate search surfaces,
// and the provider's built-in search is used instead. Falls back to client-side
// search when the provider does not support native search.
PreferNative bool `yaml:"-" json:"prefer_native" env:"COMPA_TOOLS_WEB_PREFER_NATIVE"`
// 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 `yaml:"-" json:"proxy,omitempty" env:"COMPA_TOOLS_WEB_PROXY"`
FetchLimitBytes int64 `yaml:"-" json:"fetch_limit_bytes,omitempty" env:"COMPA_TOOLS_WEB_FETCH_LIMIT_BYTES"`
Format string `yaml:"-" json:"format,omitempty" env:"COMPA_TOOLS_WEB_FORMAT"`
PrivateHostWhitelist FlexibleStringSlice `yaml:"-" json:"private_host_whitelist,omitempty" env:"COMPA_TOOLS_WEB_PRIVATE_HOST_WHITELIST"`
}
type WhatsAppSettings ¶
type WhatsAppSettings struct {
SessionStorePath string `json:"session_store_path,omitempty" yaml:"-" env:"COMPA_CHANNELS_WHATSAPP_SESSION_STORE_PATH"`
}
WhatsAppSettings are the WhatsApp channel's settings. SessionStorePath is where the linked account's session is kept; empty means whatsapp/ in the workspace.
Source Files
¶
- config.go
- config_channel.go
- config_struct.go
- deepcopy.go
- defaults.go
- diagnostics.go
- env_overrides.go
- envkeys.go
- events.go
- filelock.go
- filelock_unix.go
- gateway.go
- mcp_transport.go
- model_selection.go
- modules.go
- provider_instances.go
- restart_signature.go
- secret_settings.go
- security.go
- settings.go
- testhome.go
- turn_profile.go
- version.go