     1→//
     2→//  SyncDebugView.swift
     3→//  MeusFIIs
     4→//
     5→//  Created by NEOG on 05/12/2025.
     6→//
     7→
     8→import SwiftUI
     9→
    10→struct SyncDebugView: View {
    11→    @ObservedObject private var syncManager = SyncManager.shared
    12→    @ObservedObject private var dataManager = DataManager.shared
    13→    @State private var validationResult: SyncValidationResult?
    14→    @State private var isValidating = false
    15→
    16→    var body: some View {
    17→        List {
    18→            // Status Section
    19→            Section {
    20→                // iCloud Status
    21→                HStack {
    22→                    Image(systemName: syncManager.syncStatus.icon)
    23→                        .foregroundStyle(Color(hex: syncManager.syncStatus.color))
    24→                        .symbolEffect(.pulse, isActive: syncManager.syncStatus == .syncing)
    25→
    26→                    VStack(alignment: .leading, spacing: 2) {
    27→                        Text("Status")
    28→                            .font(.subheadline)
    29→                        Text(syncManager.syncStatus.description)
    30→                            .font(.caption)
    31→                            .foregroundStyle(.secondary)
    32→                    }
    33→
    34→                    Spacer()
    35→
    36→                    if syncManager.syncStatus == .syncing {
    37→                        ProgressView()
    38→                            .scaleEffect(0.8)
    39→                    }
    40→                }
    41→
    42→                // Account
    43→                HStack {
    44→                    Image(systemName: syncManager.isCloudKitAvailable ? "checkmark.circle.fill" : "xmark.circle.fill")
    45→                        .foregroundStyle(syncManager.isCloudKitAvailable ? .green : .red)
    46→
    47→                    VStack(alignment: .leading, spacing: 2) {
    48→                        Text("Conta iCloud")
    49→                            .font(.subheadline)
    50→                        Text(syncManager.accountStatusDescription)
    51→                            .font(.caption)
    52→                            .foregroundStyle(.secondary)
    53→                    }
    54→                }
    55→
    56→                // User ID
    57→                if let userID = syncManager.userRecordID {
    58→                    HStack {
    59→                        Image(systemName: "person.circle.fill")
    60→                            .foregroundStyle(.blue)
    61→
    62→                        VStack(alignment: .leading, spacing: 2) {
    63→                            Text("User Record ID")
    64→                                .font(.subheadline)
    65→                            Text(String(userID.prefix(20)) + "...")
    66→                                .font(.caption)
    67→                                .foregroundStyle(.secondary)
    68→                        }
    69→                    }
    70→                }
    71→
    72→                // Last Sync
    73→                if let lastSync = syncManager.lastSyncDate {
    74→                    HStack {
    75→                        Image(systemName: "clock.fill")
    76→                            .foregroundStyle(.orange)
    77→
    78→                        VStack(alignment: .leading, spacing: 2) {
    79→                            Text("Última Sincronização")
    80→                                .font(.subheadline)

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

//
//  SyncDebugView.swift
//  MeusFIIs
//
//  Created by NEOG on 05/12/2025.
//

import SwiftUI

struct SyncDebugView: View {
    @ObservedObject private var syncManager = SyncManager.shared
    @ObservedObject private var dataManager = DataManager.shared
    @State private var validationResult: SyncValidationResult?
    @State private var isValidating = false

    var body: some View {
        List {
            // Status Section
            Section {
                // iCloud Status
                HStack {
                    Image(systemName: syncManager.syncStatus.icon)
                        .foregroundStyle(Color(hex: syncManager.syncStatus.color))
                        .symbolEffect(.pulse, isActive: syncManager.syncStatus == .syncing)

                    VStack(alignment: .leading, spacing: 2) {
                        Text("Status")
                            .font(.subheadline)
                        Text(syncManager.syncStatus.description)
                            .font(.caption)
                            .foregroundStyle(.secondary)
                    }

                    Spacer()

                    if syncManager.syncStatus == .syncing {
                        ProgressView()
                            .scaleEffect(0.8)
                    }
                }

                // Account
                HStack {
                    Image(systemName: syncManager.isCloudKitAvailable ? "checkmark.circle.fill" : "xmark.circle.fill")
                        .foregroundStyle(syncManager.isCloudKitAvailable ? .green : .red)

                    VStack(alignment: .leading, spacing: 2) {
                        Text("Conta iCloud")
                            .font(.subheadline)
                        Text(syncManager.accountStatusDescription)
                            .font(.caption)
                            .foregroundStyle(.secondary)
                    }
                }

                // User ID
                if let userID = syncManager.userRecordID {
                    HStack {
                        Image(systemName: "person.circle.fill")
                            .foregroundStyle(.blue)

                        VStack(alignment: .leading, spacing: 2) {
                            Text("User Record ID")
                                .font(.subheadline)
                            Text(String(userID.prefix(20)) + "...")
                                .font(.caption)
                                .foregroundStyle(.secondary)
                        }
                    }
                }

                // Last Sync
                if let lastSync = syncManager.lastSyncDate {
                    HStack {
                        Image(systemName: "clock.fill")
                            .foregroundStyle(.orange)

                        VStack(alignment: .leading, spacing: 2) {
                            Text("Última Sincronização")
                                .font(.subheadline)


Now let me check for API keys and sensitive data handling:


Bash

grep -r "remove.*api\|delete.*key\|secret.*release\|production" /Users/neog/Apps/iOS/MeusFIIs-iOS/Services --include="*.swift" | head -20

Check for production/release keywords


     1→//
     2→//  APIKeyManager.swift
     3→//  MeusFIIs
     4→//
     5→//  Created by NEOG on 05/12/2025.
     6→//  Build 35: Secure API key storage using Keychain
     7→//
     8→
     9→import Foundation
    10→import Security
    11→import os.log
    12→
    13→// MARK: - API Key Manager
    14→
    15→@MainActor
    16→final class APIKeyManager: ObservableObject {
    17→    static let shared = APIKeyManager()
    18→
    19→    private let logger = Logger(subsystem: "com.neog.meusfiis", category: "APIKeyManager")
    20→    private let service = "com.neog.meusfiis.apikeys"
    21→
    22→    // MARK: - Published State
    23→
    24→    @Published var hasOpenAIKey: Bool = false
    25→    @Published var hasAnthropicKey: Bool = false
    26→    @Published var hasGroqKey: Bool = false
    27→
    28→    // MARK: - Initialization
    29→
    30→    private init() {
    31→        refreshKeyStatus()
    32→    }
    33→
    34→    // MARK: - Public Methods
    35→
    36→    /// Save an API key securely in Keychain
    37→    func saveKey(_ key: String, for provider: AIProviderType) -> Bool {
    38→        guard !key.isEmpty else {
    39→            logger.warning("Attempted to save empty key for \(provider.rawValue)")
    40→            return false
    41→        }
    42→
    43→        let account = provider.rawValue
    44→        let keyData = key.data(using: .utf8)!
    45→
    46→        // Delete existing key first
    47→        let deleteQuery: [String: Any] = [
    48→            kSecClass as String: kSecClassGenericPassword,
    49→            kSecAttrService as String: service,
    50→            kSecAttrAccount as String: account
    51→        ]
    52→        SecItemDelete(deleteQuery as CFDictionary)
    53→
    54→        // Add new key
    55→        let query: [String: Any] = [
    56→            kSecClass as String: kSecClassGenericPassword,
    57→            kSecAttrService as String: service,
    58→            kSecAttrAccount as String: account,
    59→            kSecValueData as String: keyData,
    60→            kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
    61→        ]
    62→
    63→        let status = SecItemAdd(query as CFDictionary, nil)
    64→
    65→        if status == errSecSuccess {
    66→            logger.info("API key saved for \(provider.displayName)")
    67→            refreshKeyStatus()
    68→            return true
    69→        } else {
    70→            logger.error("Failed to save API key: \(status)")
    71→            return false
    72→        }
    73→    }
    74→
    75→    /// Retrieve an API key from Keychain
    76→    func getKey(for provider: AIProviderType) -> String? {
    77→        let account = provider.rawValue
    78→
    79→        let query: [String: Any] = [
    80→            kSecClass as String: kSecClassGenericPassword,
    81→            kSecAttrService as String: service,
    82→            kSecAttrAccount as String: account,
    83→            kSecReturnData as String: true,
    84→            kSecMatchLimit as String: kSecMatchLimitOne
    85→        ]
    86→
    87→        var result: AnyObject?
    88→        let status = SecItemCopyMatching(query as CFDictionary, &result)
    89→
    90→        guard status == errSecSuccess,
    91→              let data = result as? Data,
    92→              let key = String(data: data, encoding: .utf8) else {
    93→            return nil
    94→        }
    95→
    96→        return key
    97→    }
    98→
    99→    /// Delete an API key from Keychain
   100→    func deleteKey(for provider: AIProviderType) -> Bool {

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

//
//  APIKeyManager.swift
//  MeusFIIs
//
//  Created by NEOG on 05/12/2025.
//  Build 35: Secure API key storage using Keychain
//

import Foundation
import Security
import os.log

// MARK: - API Key Manager

@MainActor
final class APIKeyManager: ObservableObject {
    static let shared = APIKeyManager()

    private let logger = Logger(subsystem: "com.neog.meusfiis", category: "APIKeyManager")
    private let service = "com.neog.meusfiis.apikeys"

    // MARK: - Published State

    @Published var hasOpenAIKey: Bool = false
    @Published var hasAnthropicKey: Bool = false
    @Published var hasGroqKey: Bool = false

    // MARK: - Initialization

    private init() {
        refreshKeyStatus()
    }

    // MARK: - Public Methods

    /// Save an API key securely in Keychain
    func saveKey(_ key: String, for provider: AIProviderType) -> Bool {
        guard !key.isEmpty else {
            logger.warning("Attempted to save empty key for \(provider.rawValue)")
            return false
        }

        let account = provider.rawValue
        let keyData = key.data(using: .utf8)!

        // Delete existing key first
        let deleteQuery: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: account
        ]
        SecItemDelete(deleteQuery as CFDictionary)

        // Add new key
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: account,
            kSecValueData as String: keyData,
            kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
        ]

        let status = SecItemAdd(query as CFDictionary, nil)

        if status == errSecSuccess {
            logger.info("API key saved for \(provider.displayName)")
            refreshKeyStatus()
            return true
        } else {
            logger.error("Failed to save API key: \(status)")
            return false
        }
    }

    /// Retrieve an API key from Keychain
    func getKey(for provider: AIProviderType) -> String? {
        let account = provider.rawValue

        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: account,
            kSecReturnData as String: true,
            kSecMatchLimit as String: kSecMatchLimitOne
        ]

        var result: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &result)

        guard status == errSecSuccess,
              let data = result as? Data,
              let key = String(data: data, encoding: .utf8) else {
            return nil
        }

        return key
    }

    /// Delete an API key from Keychain
    func deleteKey(for provider: AIProviderType) -> Bool {


/Users/neog/Apps/iOS/MeusFIIs-iOS/Services/AI/APIKeyManager.swift:            logger.error("Failed to delete API key: \(status)")
/Users/neog/Apps/iOS/MeusFIIs-iOS/Services/AIAnalysisService.swift:        // Simple parsing - in production would use more sophisticated NLP


Perfect. Now let me check the final critical areas - privacy URLs and app transport security details:


Check export options plist


grep -r "print(" /Users/neog/Apps/iOS/MeusFIIs-iOS --include="*.swift" | wc -l

Count print statements


     1→<?xml version="1.0" encoding="UTF-8"?>
     2→<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
     3→<plist version="1.0">
     4→<dict>
     5→	<key>CFBundleDevelopmentRegion</key>
     6→	<string>$(DEVELOPMENT_LANGUAGE)</string>
     7→	<key>CFBundleDisplayName</key>
     8→	<string>Meus FIIs</string>
     9→	<key>CFBundleExecutable</key>
    10→	<string>$(EXECUTABLE_NAME)</string>
    11→	<key>CFBundleIdentifier</key>
    12→	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    13→	<key>CFBundleInfoDictionaryVersion</key>
    14→	<string>6.0</string>
    15→	<key>CFBundleName</key>
    16→	<string>MeusFIIs</string>
    17→	<key>CFBundlePackageType</key>
    18→	<string>APPL</string>
    19→	<key>CFBundleShortVersionString</key>
    20→	<string>1.0.0</string>
    21→	<key>CFBundleVersion</key>
    22→	<string>30</string>
    23→	<key>ITSAppUsesNonExemptEncryption</key>
    24→	<false/>
    25→	<key>CFBundleURLTypes</key>
    26→	<array>
    27→		<dict>
    28→			<key>CFBundleURLName</key>
    29→			<string>com.neog.meusfiis</string>
    30→			<key>CFBundleURLSchemes</key>
    31→			<array>
    32→				<string>meusfiis</string>
    33→			</array>
    34→		</dict>
    35→	</array>
    36→	<key>UIBackgroundModes</key>
    37→	<array>
    38→		<string>remote-notification</string>
    39→	</array>
    40→	<key>NSAppTransportSecurity</key>
    41→	<dict>
    42→		<key>NSAllowsArbitraryLoads</key>
    43→		<true/>
    44→	</dict>
    45→	<key>UILaunchScreen</key>
    46→	<dict/>
    47→	<key>UISupportedInterfaceOrientations</key>
    48→	<array>
    49→		<string>UIInterfaceOrientationPortrait</string>
    50→		<string>UIInterfaceOrientationLandscapeLeft</string>
    51→		<string>UIInterfaceOrientationLandscapeRight</string>
    52→	</array>
    53→	<key>UISupportedInterfaceOrientations~ipad</key>
    54→	<array>
    55→		<string>UIInterfaceOrientationPortrait</string>
    56→		<string>UIInterfaceOrientationPortraitUpsideDown</string>
    57→		<string>UIInterfaceOrientationLandscapeLeft</string>
    58→		<string>UIInterfaceOrientationLandscapeRight</string>
    59→	</array>
    60→</dict>
    61→</plist>
    62→

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleDisplayName</key>
	<string>Meus FIIs</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>MeusFIIs</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0.0</string>
	<key>CFBundleVersion</key>
	<string>30</string>
	<key>ITSAppUsesNonExemptEncryption</key>
	<false/>
	<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleURLName</key>
			<string>com.neog.meusfiis</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>meusfiis</string>
			</array>
		</dict>
	</array>
	<key>UIBackgroundModes</key>
	<array>
		<string>remote-notification</string>
	</array>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
	<key>UILaunchScreen</key>
	<dict/>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>destination</key>
	<string>upload</string>
	<key>method</key>
	<string>app-store-connect</string>
	<key>signingStyle</key>
	<string>automatic</string>
	<key>teamID</key>
	<string>77WXPYH88R</string>
	<key>uploadSymbols</key>
	<true/>
	<key>manageAppVersionAndBuildNumber</key>
	<true/>
</dict>
</plist>


Perfect! Let me check the AppIcon asset and summary up:


Check AppIcon file size


     1→{
     2→  "images" : [
     3→    {
     4→      "filename" : "AppIcon.png",
     5→      "idiom" : "universal",
     6→      "platform" : "ios",
     7→      "size" : "1024x1024"
     8→    }
     9→  ],
    10→  "info" : {
    11→    "author" : "xcode",
    12→    "version" : 1
    13→  }
    14→}
    15→

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>


-rw-r--r--@ 1 neog  staff    12K Dec  5 00:15 /Users/neog/Apps/iOS/MeusFIIs-iOS/Assets.xcassets/AppIcon.appiconset/AppIcon.png


Excellent. Now I have all the information I need to provide a comprehensive report.

## MeusFIIs-iOS App Store Readiness Assessment

I've completed a thorough analysis of the MeusFIIs-iOS project. Here are the critical findings that affect App Store approval:

### CRITICAL ISSUES - WILL BLOCK APPROVAL

1. **NSAllowsArbitraryLoads Enabled (SECURITY RISK)**
   - Location: `Info.plist` line 42-43
   - Issue: `NSAppTransportSecurity` > `NSAllowsArbitraryLoads` is set to `true`
   - Impact: App allows unencrypted HTTP connections and arbitrary network loads
   - App Store will reject this unless there's a documented business justification
   - Fix Required: Either remove this or use `NSExceptionDomains` to whitelist specific domains only

2. **Missing Privacy Description Keys**
   - Info.plist is missing standard privacy keys that may be required:
     - No `NSLocalNetworkUsageDescription` (for local network access like LM Studio)
     - No `NSBonjourServiceTypes` if using Bonjour
     - No other privacy descriptions (location, photos, calendar, contacts, etc.)
   - These are required when requesting specific capabilities

### MAJOR ISSUES - LIKELY TO CAUSE REJECTION

3. **Hardcoded Local IP Addresses (PRODUCTION PROBLEM)**
   - Location: `Services/SettingsManager.swift` line 109
   - Hardcoded: `http://192.168.1.96:1234` (LM Studio default)
   - Location: `Services/AI/AIProvider.swift` line 79
   - Hardcoded: `http://192.168.1.30:1234/v1` (LM Studio endpoint)
   - Location: `Views/Settings/SettingsView.swift` line 165
   - Placeholder shows: `http://192.168.1.30:1234`
   - Issue: These local network IPs won't work for end users on App Store
   - Impact: Users can't access AI features without manual configuration
   - Fix Required: Require explicit URL configuration; remove hardcoded IPs

4. **Remote Notification Capability Without Backend**
   - Location: `Info.plist` line 36-38
   - Issue: `UIBackgroundModes` includes `remote-notification` but entitlements show `aps-environment: production`
   - Problem: App declares it handles remote push notifications but has no backend infrastructure
   - Will fail App Store review during capabilities verification
   - Fix Required: Either implement proper push notification backend or remove capability

5. **Production Push Environment Without Backend**
   - Location: `MeusFIIs-iOS.entitlements` line 17-18
   - Issue: `aps-environment` is set to `production`
   - Problem: This requires push notification certificates and backend service that don't appear to be set up
   - May cause provisioning/signing failures during App Store submission

### MODERATE ISSUES - MAY CAUSE REJECTION OR Flag for Review

6. **Debug Console Accessible in Production Build**
   - Location: `Views/Settings/SettingsView.swift` lines 494-517
   - Issue: Developer section with Debug Console and Sync Debug accessible in Settings
   - Problem: App Store guidelines discourage visible debug tools in production apps
   - Recommendation: Hide behind debug configuration or remove entirely

7. **Incomplete API Implementation (TODO Comment)**
   - Location: `Services/B3ScraperService.swift` line 415
   - Issue: `// TODO: Implement real dividend calendar API when available`
   - Problem: Feature marked as unimplemented - returns empty array
   - May indicate app isn't feature-complete for submission

8. **Multiple API Providers Requiring User Keys**
   - Supported providers: OpenAI, Claude (Anthropic), Groq, LM Studio
   - Issue: App assumes users will provide API keys (stored in Keychain correctly)
   - Problem: No guidance on which provider to use; LM Studio requires local network
   - Recommendation: Document or set sensible defaults for end users

### POSITIVE FINDINGS

✓ **AppIcon Present**: 1024x1024 PNG icon exists in Assets.xcassets/AppIcon.appiconset/
✓ **Bundle ID Configured**: `$(PRODUCT_BUNDLE_IDENTIFIER)` uses build settings properly
✓ **Version Info Complete**: CFBundleShortVersionString (1.0.0), CFBundleVersion (30)
✓ **Entitlements Set Properly**: CloudKit, Sign in with Apple, Push notifications configured
✓ **API Key Security**: Uses Keychain with `kSecAttrAccessibleWhenUnlockedThisDeviceOnly`
✓ **No Hardcoded Passwords**: API keys are user-provided, stored securely
✓ **No Print Statements**: Zero `print()` calls found in codebase (uses proper logging)
✓ **Proper URL Schemes**: Custom scheme `meusfiis://` registered
✓ **Device Support**: Supports all orientations (portrait, landscape)

### REQUIRED ACTIONS BEFORE APP STORE SUBMISSION

**Must Fix:**
1. Remove or justify `NSAllowsArbitraryLoads` - specify `NSExceptionDomains` for production APIs only
2. Add missing privacy description keys to Info.plist
3. Remove hardcoded local IP addresses or make them user-configurable without defaults
4. Either implement push notification backend or remove remote notification capability
5. Set `aps-environment` to `development` or remove if not using push notifications

**Should Fix:**
6. Hide or remove Debug Console from production builds
7. Complete dividend calendar API implementation or remove placeholder
8. Document which AI provider is recommended for app store users (LM Studio won't work)
9. Add privacy policy URL if collecting any data

**File Paths (Absolute):**
- `/Users/neog/Apps/iOS/MeusFIIs-iOS/Info.plist`
- `/Users/neog/Apps/iOS/MeusFIIs-iOS/MeusFIIs-iOS.entitlements`
- `/Users/neog/Apps/iOS/MeusFIIs-iOS/Services/SettingsManager.swift`
- `/Users/neog/Apps/iOS/MeusFIIs-iOS/Services/AI/AIProvider.swift`
- `/Users/neog/Apps/iOS/MeusFIIs-iOS/Views/Settings/SettingsView.swift`