// Package config provides configuration management for the CLI Proxy API server. // It handles loading and parsing YAML configuration files, and provides structured // access to application settings including server port, authentication directory, // debug settings, proxy configuration, and API keys. package config // SDKConfig represents the application's configuration, loaded from a YAML file. type SDKConfig struct { // ProxyURL is the URL of an optional proxy server to use for outbound requests. ProxyURL string `yaml:"proxy-url" json:"proxy-url"` // RequestLog enables or disables detailed request logging functionality. RequestLog bool `yaml:"request-log" json:"request-log"` // APIKeys is a list of keys for authenticating clients to this proxy server. APIKeys []string `yaml:"api-keys" json:"api-keys"` // Access holds request authentication provider configuration. Access AccessConfig `yaml:"auth" json:"auth"` } // AccessConfig groups request authentication providers. type AccessConfig struct { // Providers lists configured authentication providers. Providers []AccessProvider `yaml:"providers" json:"providers"` } // AccessProvider describes a request authentication provider entry. type AccessProvider struct { // Name is the instance identifier for the provider. Name string `yaml:"name" json:"name"` // Type selects the provider implementation registered via the SDK. Type string `yaml:"type" json:"type"` // SDK optionally names a third-party SDK module providing this provider. SDK string `yaml:"sdk,omitempty" json:"sdk,omitempty"` // APIKeys lists inline keys for providers that require them. APIKeys []string `yaml:"api-keys,omitempty" json:"api-keys,omitempty"` // Config passes provider-specific options to the implementation. Config map[string]any `yaml:"config,omitempty" json:"config,omitempty"` } const ( // AccessProviderTypeConfigAPIKey is the built-in provider validating inline API keys. AccessProviderTypeConfigAPIKey = "config-api-key" // DefaultAccessProviderName is applied when no provider name is supplied. DefaultAccessProviderName = "config-inline" ) // SyncInlineAPIKeys updates the inline API key provider and top-level APIKeys field. func SyncInlineAPIKeys(cfg *SDKConfig, keys []string) { if cfg == nil { return } cloned := append([]string(nil), keys...) cfg.APIKeys = cloned if provider := cfg.ConfigAPIKeyProvider(); provider != nil { if provider.Name == "" { provider.Name = DefaultAccessProviderName } provider.APIKeys = cloned return } cfg.Access.Providers = append(cfg.Access.Providers, AccessProvider{ Name: DefaultAccessProviderName, Type: AccessProviderTypeConfigAPIKey, APIKeys: cloned, }) } // ConfigAPIKeyProvider returns the first inline API key provider if present. func (c *SDKConfig) ConfigAPIKeyProvider() *AccessProvider { if c == nil { return nil } for i := range c.Access.Providers { if c.Access.Providers[i].Type == AccessProviderTypeConfigAPIKey { if c.Access.Providers[i].Name == "" { c.Access.Providers[i].Name = DefaultAccessProviderName } return &c.Access.Providers[i] } } return nil }