Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
Functions ¶
func NewRequestID ¶
func NewRequestID() string
Types ¶
type Config ¶
type Config struct {
DatabaseURL string `yaml:"database_url" env:"AFI_DATABASE_URL"`
RedisURL string `yaml:"redis_url" env:"AFI_REDIS_URL"`
ControlPlane struct {
Addr string `yaml:"addr" env:"AFI_CONTROLPLANE_ADDR" env-default:":8081"`
} `yaml:"controlplane"`
Gateway struct {
Addr string `yaml:"addr" env:"AFI_GATEWAY_ADDR" env-default:":8080"`
SnapshotPollIntervalRaw string `yaml:"snapshot_poll_interval" env:"AFI_SNAPSHOT_POLL_INTERVAL" env-default:"2s"`
SnapshotPollInterval time.Duration `yaml:"-"`
// WasmBeforeCall is an optional path to a TinyGo .wasm exporting before_call.
WasmBeforeCall string `yaml:"wasm_before_call" env:"AFI_WASM_BEFORE_CALL"`
// WasmBeforeChat is an optional path to a TinyGo .wasm exporting before_chat.
WasmBeforeChat string `yaml:"wasm_before_chat" env:"AFI_WASM_BEFORE_CHAT"`
// WasmS3 is an optional S3-compatible store for module_uri values like s3://bucket/key.
WasmS3 struct {
Endpoint string `yaml:"endpoint" env:"AFI_WASM_S3_ENDPOINT"`
AccessKey string `yaml:"access_key" env:"AFI_WASM_S3_ACCESS_KEY"`
SecretKey string `yaml:"secret_key" env:"AFI_WASM_S3_SECRET_KEY"`
Region string `yaml:"region" env:"AFI_WASM_S3_REGION"`
UseSSL bool `yaml:"use_ssl" env:"AFI_WASM_S3_USE_SSL"`
PathStyle bool `yaml:"path_style" env:"AFI_WASM_S3_PATH_STYLE"`
} `yaml:"wasm_s3"`
// GrpcExtensions lists process-isolated gRPC plugins (YAML via AFI_CONFIG).
GrpcExtensions []GrpcExtension `yaml:"grpc_extensions"`
} `yaml:"gateway"`
Auth struct {
JWTSecret string `yaml:"jwt_secret" env:"AFI_JWT_SECRET"`
TokenTTLRaw string `yaml:"token_ttl" env:"AFI_TOKEN_TTL" env-default:"24h"`
TokenTTL time.Duration `yaml:"-"`
InternalToken string `yaml:"internal_token" env:"AFI_INTERNAL_TOKEN"`
// PublicBaseURL is the externally reachable control-plane URL (SSO callbacks).
PublicBaseURL string `yaml:"public_base_url" env:"AFI_AUTH_PUBLIC_BASE_URL"`
// SignupEnabled allows self-serve POST /auth/register (default off).
SignupEnabled bool `yaml:"signup_enabled" env:"AFI_SIGNUP_ENABLED"`
SSO struct {
Enabled bool `yaml:"enabled" env:"AFI_SSO_ENABLED"`
// StateStore is redis (shared, multi-node) or memory (single-node / tests).
// Default redis — control plane is expected to scale horizontally.
StateStore string `yaml:"state_store" env:"AFI_SSO_STATE_STORE" env-default:"redis"`
Providers []SSOProvider `yaml:"providers"`
} `yaml:"sso"`
} `yaml:"auth"`
// Credentials configures encryption for storage_kind=encrypted_db provider credentials.
// Any non-empty string is accepted (SHA-256 derived); or base64:/raw 32-byte base64.
Credentials struct {
MasterKey string `yaml:"master_key" env:"AFI_CREDENTIALS_MASTER_KEY"`
} `yaml:"credentials"`
// Secrets configures external vault backends for storage_kind=vault credentials.
Secrets struct {
AWSSM struct {
Enabled bool `yaml:"enabled" env:"AFI_SECRETS_AWS_SM_ENABLED"`
Region string `yaml:"region" env:"AFI_SECRETS_AWS_SM_REGION"`
} `yaml:"aws_sm"`
Vault struct {
Addr string `yaml:"addr" env:"AFI_SECRETS_VAULT_ADDR"`
Token string `yaml:"token" env:"AFI_SECRETS_VAULT_TOKEN"`
} `yaml:"vault"`
} `yaml:"secrets"`
Seed struct {
VirtualAPIKey string `yaml:"virtual_api_key"`
AdminEmail string `yaml:"admin_email"`
AdminPassword string `yaml:"admin_password"`
AdminName string `yaml:"admin_name"`
OpenAIBaseURL string `yaml:"openai_base_url"`
OpenAIAPIKeyEnv string `yaml:"openai_api_key_env"`
DefaultModel string `yaml:"default_model"`
} `yaml:"seed"`
// Events configures durable platform domain-event delivery.
Events struct {
// OutboxEnabled enqueues platform.Bus events into platform_event_outbox.
OutboxEnabled bool `yaml:"outbox_enabled" env:"AFI_EVENTS_OUTBOX_ENABLED"`
// Publisher is log | nats | kafka | noop (worker drain target).
Publisher string `yaml:"publisher" env:"AFI_EVENTS_PUBLISHER" env-default:"log"`
NATS struct {
URL string `yaml:"url" env:"AFI_EVENTS_NATS_URL"`
Stream string `yaml:"stream" env:"AFI_EVENTS_NATS_STREAM"`
SubjectPrefix string `yaml:"subject_prefix" env:"AFI_EVENTS_NATS_SUBJECT_PREFIX"`
} `yaml:"nats"`
Kafka struct {
Brokers string `yaml:"brokers" env:"AFI_EVENTS_KAFKA_BROKERS"`
Topic string `yaml:"topic" env:"AFI_EVENTS_KAFKA_TOPIC"`
} `yaml:"kafka"`
} `yaml:"events"`
// Telemetry configures OpenTelemetry metrics and traces (OTLP + optional Prometheus).
Telemetry struct {
Enabled bool `yaml:"enabled" env:"AFI_TELEMETRY_ENABLED"`
ServiceName string `yaml:"service_name" env:"AFI_TELEMETRY_SERVICE_NAME"`
Environment string `yaml:"environment" env:"AFI_TELEMETRY_ENVIRONMENT"`
OTLPEndpoint string `yaml:"otlp_endpoint" env:"AFI_TELEMETRY_OTLP_ENDPOINT"`
OTLPProtocol string `yaml:"otlp_protocol" env:"AFI_TELEMETRY_OTLP_PROTOCOL" env-default:"http"`
OTLPHeaders string `yaml:"otlp_headers" env:"AFI_TELEMETRY_OTLP_HEADERS"`
OTLPInsecure bool `yaml:"otlp_insecure" env:"AFI_TELEMETRY_OTLP_INSECURE"`
MetricsPrometheus bool `yaml:"metrics_prometheus" env:"AFI_TELEMETRY_METRICS_PROMETHEUS"`
TracesSampler string `yaml:"traces_sampler" env:"AFI_TELEMETRY_TRACES_SAMPLER" env-default:"parentbased_always_on"`
TracesSamplerArg float64 `yaml:"traces_sampler_arg" env:"AFI_TELEMETRY_TRACES_SAMPLER_ARG" env-default:"1.0"`
} `yaml:"telemetry"`
// Mail configures outbound email for org member invites.
Mail struct {
PublicAppURL string `yaml:"public_app_url" env:"AFI_MAIL_PUBLIC_APP_URL"`
From string `yaml:"from" env:"AFI_MAIL_FROM"`
DefaultProvider string `yaml:"default_provider" env:"AFI_MAIL_DEFAULT_PROVIDER"`
SMTP struct {
Enabled bool `yaml:"enabled" env:"AFI_MAIL_SMTP_ENABLED"`
Host string `yaml:"host" env:"AFI_MAIL_SMTP_HOST"`
Port int `yaml:"port" env:"AFI_MAIL_SMTP_PORT"`
Username string `yaml:"username" env:"AFI_MAIL_SMTP_USERNAME"`
Password string `yaml:"password" env:"AFI_MAIL_SMTP_PASSWORD"`
TLS bool `yaml:"tls" env:"AFI_MAIL_SMTP_TLS"`
} `yaml:"smtp"`
Resend struct {
Enabled bool `yaml:"enabled" env:"AFI_MAIL_RESEND_ENABLED"`
APIKey string `yaml:"api_key" env:"AFI_MAIL_RESEND_API_KEY"`
} `yaml:"resend"`
SES struct {
Enabled bool `yaml:"enabled" env:"AFI_MAIL_SES_ENABLED"`
Region string `yaml:"region" env:"AFI_MAIL_SES_REGION"`
AccessKeyID string `yaml:"access_key_id" env:"AFI_MAIL_SES_ACCESS_KEY_ID"`
SecretAccessKey string `yaml:"secret_access_key" env:"AFI_MAIL_SES_SECRET_ACCESS_KEY"`
} `yaml:"ses"`
} `yaml:"mail"`
}
func LoadConfig ¶
type GrpcExtension ¶
type GrpcExtension struct {
ID string `yaml:"id"`
Address string `yaml:"address"` // unix:///path or host:port
Command []string `yaml:"command"` // host spawns; sets AFI_PLUGIN_SOCK
ProviderType string `yaml:"provider_type"`
}
GrpcExtension is one process-isolated gRPC plugin (gateway discovery v1).
type SSOProvider ¶
type SSOProvider struct {
ID string `yaml:"id"`
Type string `yaml:"type"` // oidc | oauth2 | saml
DisplayName string `yaml:"display_name"`
Issuer string `yaml:"issuer"`
ClientID string `yaml:"client_id"`
ClientSecret string `yaml:"client_secret"`
Scopes []string `yaml:"scopes"`
AuthURL string `yaml:"auth_url"`
TokenURL string `yaml:"token_url"`
UserInfoURL string `yaml:"userinfo_url"`
RequireEmailVerified *bool `yaml:"require_email_verified"`
// SAML fields (type: saml).
EntityID string `yaml:"entity_id"`
IDPMetadataURL string `yaml:"idp_metadata_url"`
IDPMetadataXML string `yaml:"idp_metadata_xml"`
SPCertPEM string `yaml:"sp_cert_pem"`
SPKeyPEM string `yaml:"sp_key_pem"`
}
SSOProvider is a platform-wide federated IdP configuration entry.
Click to show internal directories.
Click to hide internal directories.