{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(local);Database=SmartStack;Integrated Security=true;TrustServerCertificate=true;Connection Timeout=60;Pooling=true;Min Pool Size=0;Max Pool Size=50;Load Balance Timeout=30"
  },
  "SmartStack": {
    "FrontendUrl": "http://localhost:7074",
    "CorsOrigins": [],
    "EnableDevSeeding": false,
    "FrenchRegistry": {
      "BaseUrl": "https://recherche-entreprises.api.gouv.fr"
    },
    "Impersonation": {
      "MaxDurationMinutes": 30,
      "RequestTtlSeconds": 60,
      "ExpirySweepSeconds": 60,
      "MaxActivityEventsPerSecond": 10
    },
    "Security": {
      "MfaBreakGlass": {
        "Enabled": false,
        "Email": "",
        "Reason": ""
      }
    },
    "Sms": {
      "Enabled": false,
      "Provider": "None",
      "FromNumber": "",
      "AcsConnectionString": "",
      "TwilioAccountSid": "",
      "TwilioAuthToken": "",
      "AllowedCountryPrefixes": [],
      "LogRetentionDays": 365
    },
    "WebAuthn": {
      "Enabled": false,
      "RelyingPartyId": "",
      "RelyingPartyName": "",
      "AllowedOrigins": []
    },
    "Network": {
      "ForwardedHeaders": {
        "Enabled": true,
        "TrustPrivateNetworks": true,
        "TrustAllProxies": false,
        "ForwardLimit": null,
        "KnownProxies": [],
        "KnownNetworks": [],
        "ClientIpHeader": "",
        "RequiredHeader": "",
        "RequiredHeaderValue": ""
      }
    },
    "Geolocation": {
      "Enabled": true,
      "Provider": "auto",
      "ApiToken": "",
      "BaseUrl": "",
      "FallbackBaseUrl": "",
      "CacheTtlDays": 30
    }
  },
  "Jwt": {
    "RsaPrivateKeyPem": "",
    "Secret": "",
    "Issuer": "SmartStack",
    "Audience": "SmartStack",
    "AccessTokenExpirationMinutes": 60
  },
  "DataProtection": {
    "Storage": "None",
    "ApplicationName": "",
    "KeysPath": "",
    "RequireEncryptedKeyRing": null,
    "Certificate": {
      "Pfx": "",
      "Password": ""
    },
    "AdditionalCertificates": []
  },
  "Authentication": {
    "Microsoft": {
      "Enabled": true,
      "ClientId": "",
      "ClientSecret": "",
      "SecretExpiresAt": "",
      "CallbackPath": "/api/auth/microsoft/callback",
      "AllowedTenants": ["common"]
    },
    "EntraSso": {
      "Enabled": false,
      "ClientId": "",
      "Authority": "",
      "MetadataAddress": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
      "AllowedIssuers": [],
      "ClockSkewSeconds": 60
    },
    "LocalPassword": {
      "AllowForFederatedAccounts": true
    },
    "Google": {
      "Enabled": true,
      "ClientId": "",
      "ClientSecret": "",
      "SecretExpiresAt": "",
      "CallbackPath": "/api/auth/google/callback"
    }
  },
  "Session": {
    "IdleTimeoutMinutes": 20,
    "AbsoluteTimeoutHours": 8,
    "WarningThresholdMinutes": 5,
    "EnableValidation": true,
    "RefreshTokenExpirationDays": 7,
    "RefreshTokenMobileExpirationDays": 30,
    "MaxConcurrentSessions": 1,
    "CleanupIntervalMinutes": 5
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.EntityFrameworkCore": "Warning",
        "Microsoft.AspNetCore": "Warning",
        "System": "Warning"
      }
    },
    "Properties": {
      "Application": "SmartStack"
    }
  },
  "Logging": {
    "Sinks": {
      "Console": {
        "Enabled": true
      },
      "File": {
        "Enabled": true,
        "Path": "logs/smartstack-.log",
        "RollingInterval": "Day",
        "RetainedFileCountLimit": 21
      },
      "Seq": {
        "Enabled": false,
        "ServerUrl": "http://localhost:5341"
      },
      "ApplicationInsights": {
        "Enabled": false,
        "ConnectionString": ""
      }
    }
  },
  "OpenTelemetry": {
    "SamplingRatio": 1.0,
    "OtlpExporter": {
      "Enabled": false
    }
  },
  "Redis": {
    "Enabled": false,
    "ConnectionString": "localhost:6379"
  },
  "//Hangfire": "EnableDashboardInProduction governs EXPOSURE of the /hangfire dashboard only (it stays hidden in Production by default, and is always behind the admin claim). It has no bearing on whether the job storage is initialised — InitializeSmartStackAsync does that, in every environment.",
  "Hangfire": {
    "EnableDashboardInProduction": false
  },
  "AzureStorage": {
    "UseAzure": false,
    "Normal": {
      "ConnectionString": "",
      "ContainerName": "files",
      "MaxFileSizeMB": 50,
      "AllowedExtensions": []
    },
    "Legal": {
      "ConnectionString": "",
      "ContainerName": "legal-files",
      "MaxFileSizeMB": 50,
      "RetentionDays": 3653,
      "EnableLegalHold": true,
      "EnableRetentionPolicy": true,
      "AllowedExtensions": []
    }
  },
  "FileStorage": {
    "BasePath": "",
    "Normal": {
      "FolderName": "normal",
      "MaxFileSizeMB": 50,
      "AllowedExtensions": []
    },
    "Legal": {
      "FolderName": "legal",
      "MaxFileSizeMB": 50,
      "RetentionDays": 3653,
      "AllowedExtensions": []
    }
  },
  "Email": {
    "Enabled": true,
    "Provider": "Development",
    "FromEmail": "noreply@smartstack.app",
    "FromName": "SmartStack",
    "TokenExpiration": {
      "EmailConfirmation": "24:00:00",
      "PasswordReset": "01:00:00"
    },
    "Development": {
      "SmtpHost": "localhost",
      "SmtpPort": 1025,
      "UseSsl": false,
      "WebInterfaceUrl": "http://localhost:8025"
    },
    "Smtp": {
      "Host": "",
      "Port": 587,
      "Username": "",
      "Password": "",
      "UseSsl": true,
      "SenderAddress": ""
    },
    "AzureAcs": {
      "ConnectionString": "",
      "SenderAddress": ""
    },
    "SendGrid": {
      "ApiKey": ""
    },
    "Logging": {
      "PurgeBatchSize": 5000,
      "StuckSendingTimeoutMinutes": 60,
      "PurgeCron": "0 3 * * *"
    },
    "RecipientGuard": {
      "Mode": "Off",
      "Allowlist": [],
      "RedirectTo": "",
      "SubjectPrefix": "",
      "PartialPolicy": "SendToAllowed",
      "AllowRuntimeOverride": true,
      "FailOpenWhenPolicyUnavailable": false
    }
  },
  "Entra": {
    "BackgroundSyncEnabled": false,
    "BackgroundSyncIntervalMinutes": 60,
    "MaxGraphQueryPageSize": 999
  },
  "Glpi": {
    "BackgroundSyncEnabled": false,
    "BackgroundSyncIntervalMinutes": 60
  },
  "Integrations": {
    "SchedulerEnabled": true,
    "MaxRunDurationMinutes": 360,
    "CallRetentionDays": 30,
    "RunRetentionDays": 90,
    "HealthMonitorEnabled": true,
    "HealthEvaluationIntervalSeconds": 60,
    "HealthWindowMinutes": 15,
    "HealthMinimumSampleSize": 5,
    "HighFailureRatePercent": 50,
    "CriticalFailureRatePercent": 90,
    "HighLatencyMs": 5000,
    "DashboardMaxSeriesSamples": 10000
  },
  "Presidio": {
    "Enabled": false,
    "AnalyzerUrl": "",
    "TimeoutSeconds": 5,
    "MinScore": 0.5
  },
  "Ai": {
    "TraceEnabled": true,
    "TraceRetentionDays": 30,
    "UsageRetentionDays": 730,
    "TraceMaxChars": 32768,
    "PseudonymizationMode": "Enforce"
  },
  "SlaMonitoring": {
    "Enabled": true,
    "IntervalMinutes": 5
  },
  "SolutionAutoClose": {
    "Enabled": true,
    "AutoCloseDays": 5,
    "WarningDaysBeforeClose": 1,
    "IntervalMinutes": 15
  },
  "AutoAssignment": {
    "Enabled": true,
    "ReassignmentCheckIntervalMinutes": 10,
    "UnassignedTicketTimeoutMinutes": 30
  },
  "Security": {
    "LockoutWindowMinutes": 15,
    "MaxFailedAttempts": 5,
    "EnforceHttps": false,
    "InitialAdmin": {
      "Email": "",
      "Password": "",
      "RequirePasswordChange": false
    }
  },
  "LicenseServer": {
    "ServerDowntimeGracePeriodDays": 14,
    "StartupDelaySeconds": 30,
    "TimeoutSeconds": 30,
    "PermissionCheckIntervalMinutes": 240,
    "EnforceAppScopes": false,
    "EnforceFeatureGating": false,
    "AllowedSigningKeyThumbprints": []
  },
  "Localization": {
    "DefaultLanguage": "fr",
    "FallbackLanguage": "fr"
  }
}
