import AIModel import Foundation public protocol UserDefaultPreferenceKey { associatedtype Value var defaultValue: Value { get } var key: String { get } } public struct PreferenceKey: UserDefaultPreferenceKey { public let defaultValue: T public let key: String public init(defaultValue: T, key: String) { self.defaultValue = defaultValue self.key = key } } public struct DeprecatedPreferenceKey { public let defaultValue: T public let key: String public init(defaultValue: T, key: String) { self.defaultValue = defaultValue self.key = key } } public struct FeatureFlag: UserDefaultPreferenceKey { public let defaultValue: Bool public let key: String public init(defaultValue: Bool, key: String) { self.defaultValue = defaultValue self.key = key } } public struct UserDefaultPreferenceKeys { public init() {} // MARK: Quit XPC Service On Xcode And App Quit public let quitXPCServiceOnXcodeAndAppQuit = PreferenceKey( defaultValue: true, key: "QuitXPCServiceOnXcodeAndAppQuit" ) // MARK: Automatically Check For Update public let automaticallyCheckForUpdate = PreferenceKey( defaultValue: false, key: "AutomaticallyCheckForUpdate" ) // MARK: Suggestion Widget Position Mode public let suggestionWidgetPositionMode = PreferenceKey( defaultValue: SuggestionWidgetPositionMode.fixedToBottom, key: "SuggestionWidgetPositionMode" ) // MARK: Widget Color Scheme public let widgetColorScheme = PreferenceKey( defaultValue: WidgetColorScheme.dark, key: "WidgetColorScheme" ) // MARK: Force Order Widget to Front public let forceOrderWidgetToFront = PreferenceKey( defaultValue: true, key: "ForceOrderWidgetToFront" ) // MARK: Prefer Widget to Stay Inside Editor When Width Greater Than public let preferWidgetToStayInsideEditorWhenWidthGreaterThan = PreferenceKey( defaultValue: 1400 as Double, key: "PreferWidgetToStayInsideEditorWhenWidthGreaterThan" ) // MARK: Hide Circular Widget public let hideCircularWidget = PreferenceKey( defaultValue: false, key: "HideCircularWidget" ) public let showHideWidgetShortcutGlobally = PreferenceKey( defaultValue: false, key: "ShowHideWidgetShortcutGlobally" ) } // MARK: - OpenAI Account Settings public extension UserDefaultPreferenceKeys { var openAIAPIKey: DeprecatedPreferenceKey { .init(defaultValue: "", key: "OpenAIAPIKey") } var openAIBaseURL: DeprecatedPreferenceKey { .init(defaultValue: "", key: "OpenAIBaseURL") } var chatGPTModel: DeprecatedPreferenceKey { .init(defaultValue: ChatGPTModel.gpt35Turbo.rawValue, key: "ChatGPTModel") } var chatGPTMaxToken: DeprecatedPreferenceKey { .init(defaultValue: 4000, key: "ChatGPTMaxToken") } var embeddingModel: DeprecatedPreferenceKey { .init( defaultValue: OpenAIEmbeddingModel.textEmbeddingAda002.rawValue, key: "OpenAIEmbeddingModel" ) } } // MARK: - Azure OpenAI Settings public extension UserDefaultPreferenceKeys { var azureOpenAIAPIKey: DeprecatedPreferenceKey { .init(defaultValue: "", key: "AzureOpenAIAPIKey") } var azureOpenAIBaseURL: DeprecatedPreferenceKey { .init(defaultValue: "", key: "AzureOpenAIBaseURL") } var azureChatGPTDeployment: DeprecatedPreferenceKey { .init(defaultValue: "", key: "AzureChatGPTDeployment") } var azureEmbeddingDeployment: DeprecatedPreferenceKey { .init(defaultValue: "", key: "AzureEmbeddingDeployment") } } // MARK: - GitHub Copilot Settings public extension UserDefaultPreferenceKeys { var gitHubCopilotVerboseLog: PreferenceKey { .init(defaultValue: false, key: "GitHubCopilotVerboseLog") } var gitHubCopilotProxyHost: PreferenceKey { .init(defaultValue: "", key: "GitHubCopilotProxyHost") } var gitHubCopilotProxyPort: PreferenceKey { .init(defaultValue: "", key: "GitHubCopilotProxyPort") } var gitHubCopilotUseStrictSSL: PreferenceKey { .init(defaultValue: true, key: "GitHubCopilotUseStrictSSL") } var gitHubCopilotProxyUsername: PreferenceKey { .init(defaultValue: "", key: "GitHubCopilotProxyUsername") } var gitHubCopilotProxyPassword: PreferenceKey { .init(defaultValue: "", key: "GitHubCopilotProxyPassword") } var nodePath: PreferenceKey { .init(defaultValue: "", key: "NodePath") } var runNodeWith: PreferenceKey { .init(defaultValue: .env, key: "RunNodeWith") } var gitHubCopilotIgnoreTrailingNewLines: PreferenceKey { .init(defaultValue: true, key: "GitHubCopilotIgnoreTrailingNewLines") } } // MARK: - Codeium Settings public extension UserDefaultPreferenceKeys { var codeiumVerboseLog: PreferenceKey { .init(defaultValue: false, key: "CodeiumVerboseLog") } var codeiumEnterpriseMode: PreferenceKey { .init(defaultValue: false, key: "CodeiumEnterpriseMode") } var codeiumPortalUrl: PreferenceKey { .init(defaultValue: "", key: "CodeiumPortalUrl") } var codeiumApiUrl: PreferenceKey { .init(defaultValue: "", key: "CodeiumApiUrl") } } // MARK: - Chat Models public extension UserDefaultPreferenceKeys { var chatModels: PreferenceKey<[ChatModel]> { .init(defaultValue: [ .init( id: UUID().uuidString, name: "OpenAI", format: .openAI, info: .init( apiKeyName: "", baseURL: "", maxTokens: ChatGPTModel.gpt35Turbo.maxToken, supportsFunctionCalling: true, modelName: ChatGPTModel.gpt35Turbo.rawValue ) ), ], key: "ChatModels") } var chatGPTLanguage: PreferenceKey { .init(defaultValue: "", key: "ChatGPTLanguage") } var chatGPTMaxMessageCount: PreferenceKey { .init(defaultValue: 5, key: "ChatGPTMaxMessageCount") } var chatGPTTemperature: PreferenceKey { .init(defaultValue: 0.7, key: "ChatGPTTemperature") } } // MARK: - Embedding Models public extension UserDefaultPreferenceKeys { var embeddingModels: PreferenceKey<[EmbeddingModel]> { .init(defaultValue: [ .init( id: UUID().uuidString, name: "OpenAI", format: .openAI, info: .init( apiKeyName: "", baseURL: "", maxTokens: OpenAIEmbeddingModel.textEmbeddingAda002.maxToken, modelName: OpenAIEmbeddingModel.textEmbeddingAda002.rawValue ) ), ], key: "EmbeddingModels") } } // MARK: - Prompt to Code public extension UserDefaultPreferenceKeys { var promptToCodeFeatureProvider: PreferenceKey { .init(defaultValue: .openAI, key: "PromptToCodeFeatureProvider") } var promptToCodeGenerateDescription: PreferenceKey { .init(defaultValue: true, key: "PromptToCodeGenerateDescription") } var promptToCodeGenerateDescriptionInUserPreferredLanguage: PreferenceKey { .init(defaultValue: true, key: "PromptToCodeGenerateDescriptionInUserPreferredLanguage") } var promptToCodeChatModelId: PreferenceKey { .init(defaultValue: "", key: "PromptToCodeChatModelId") } var promptToCodeEmbeddingModelId: PreferenceKey { .init(defaultValue: "", key: "PromptToCodeEmbeddingModelId") } } // MARK: - Suggestion public extension UserDefaultPreferenceKeys { var suggestionFeatureProvider: PreferenceKey { .init(defaultValue: .gitHubCopilot, key: "SuggestionFeatureProvider") } var realtimeSuggestionToggle: PreferenceKey { .init(defaultValue: true, key: "RealtimeSuggestionToggle") } var suggestionDisplayCompactMode: PreferenceKey { .init(defaultValue: false, key: "SuggestionDisplayCompactMode") } var suggestionCodeFontSize: PreferenceKey { .init(defaultValue: 13, key: "SuggestionCodeFontSize") } var disableSuggestionFeatureGlobally: PreferenceKey { .init(defaultValue: false, key: "DisableSuggestionFeatureGlobally") } var suggestionFeatureEnabledProjectList: PreferenceKey<[String]> { .init(defaultValue: [], key: "SuggestionFeatureEnabledProjectList") } var suggestionFeatureDisabledLanguageList: PreferenceKey<[String]> { .init(defaultValue: [], key: "SuggestionFeatureDisabledLanguageList") } var hideCommonPrecedingSpacesInSuggestion: PreferenceKey { .init(defaultValue: true, key: "HideCommonPrecedingSpacesInSuggestion") } var suggestionPresentationMode: PreferenceKey { .init(defaultValue: .nearbyTextCursor, key: "SuggestionPresentationMode") } var realtimeSuggestionDebounce: PreferenceKey { .init(defaultValue: 0, key: "RealtimeSuggestionDebounce") } var acceptSuggestionWithTab: PreferenceKey { .init(defaultValue: true, key: "AcceptSuggestionWithTab") } var isSuggestionSenseEnabled: PreferenceKey { .init(defaultValue: false, key: "IsSuggestionSenseEnabled") } } // MARK: - Chat public extension UserDefaultPreferenceKeys { var chatFeatureProvider: DeprecatedPreferenceKey { .init(defaultValue: .openAI, key: "ChatFeatureProvider") } var defaultChatFeatureChatModelId: PreferenceKey { .init(defaultValue: "", key: "DefaultChatFeatureChatModelId") } var embeddingFeatureProvider: DeprecatedPreferenceKey { .init(defaultValue: .openAI, key: "EmbeddingFeatureProvider") } var defaultChatFeatureEmbeddingModelId: PreferenceKey { .init(defaultValue: "", key: "DefaultChatFeatureEmbeddingModelId") } var chatFontSize: PreferenceKey { .init(defaultValue: 12, key: "ChatFontSize") } var chatCodeFontSize: PreferenceKey { .init(defaultValue: 12, key: "ChatCodeFontSize") } var useGlobalChat: PreferenceKey { .init(defaultValue: true, key: "UseGlobalChat") } var embedFileContentInChatContextIfNoSelection: PreferenceKey { .init(defaultValue: false, key: "EmbedFileContentInChatContextIfNoSelection") } var maxFocusedCodeLineCount: PreferenceKey { .init(defaultValue: 100, key: "MaxEmbeddableFileInChatContextLineCount") } var useCodeScopeByDefaultInChatContext: DeprecatedPreferenceKey { .init(defaultValue: true, key: "UseSelectionScopeByDefaultInChatContext") } var defaultChatSystemPrompt: PreferenceKey { .init( defaultValue: """ You are an AI programming assistant. Your reply should be concise, clear, informative and logical. Your reply should be formatted in Markdown. If you are asked to help perform a task, you MUST think step-by-step, then describe each step concisely. If you are asked to explain code, you MUST explain it step-by-step in a ordered list concisely. Make your answer short and structured. """, key: "DefaultChatSystemPrompt" ) } var chatSearchPluginMaxIterations: PreferenceKey { .init(defaultValue: 3, key: "ChatSearchPluginMaxIterations") } var wrapCodeInChatCodeBlock: PreferenceKey { .init(defaultValue: true, key: "WrapCodeInChatCodeBlock") } var enableFileScopeByDefaultInChatContext: PreferenceKey { .init(defaultValue: true, key: "EnableFileScopeByDefaultInChatContext") } var enableCodeScopeByDefaultInChatContext: PreferenceKey { .init(defaultValue: true, key: "UseSelectionScopeByDefaultInChatContext") } var enableSenseScopeByDefaultInChatContext: PreferenceKey { .init(defaultValue: false, key: "EnableSenseScopeByDefaultInChatContext") } var enableProjectScopeByDefaultInChatContext: PreferenceKey { .init(defaultValue: false, key: "EnableProjectScopeByDefaultInChatContext") } var enableWebScopeByDefaultInChatContext: PreferenceKey { .init(defaultValue: false, key: "EnableWebScopeByDefaultInChatContext") } var preferredChatModelIdForSenseScope: PreferenceKey { .init(defaultValue: "", key: "PreferredChatModelIdForSenseScope") } var preferredChatModelIdForProjectScope: PreferenceKey { .init(defaultValue: "", key: "PreferredChatModelIdForProjectScope") } var preferredChatModelIdForWebScope: PreferenceKey { .init(defaultValue: "", key: "PreferredChatModelIdForWebScope") } } // MARK: - Bing Search public extension UserDefaultPreferenceKeys { var bingSearchSubscriptionKey: PreferenceKey { .init(defaultValue: "", key: "BingSearchSubscriptionKey") } var bingSearchEndpoint: PreferenceKey { .init( defaultValue: "https://api.bing.microsoft.com/v7.0/search/", key: "BingSearchEndpoint" ) } } // MARK: - Custom Commands public extension UserDefaultPreferenceKeys { var customCommands: PreferenceKey<[CustomCommand]> { .init(defaultValue: [ .init( commandId: "BuiltInCustomCommandExplainSelection", name: "Explain Selection", feature: .chatWithSelection( extraSystemPrompt: "", prompt: "Explain the selected code concisely, step-by-step.", useExtraSystemPrompt: true ) ), .init( commandId: "BuiltInCustomCommandAddDocumentationToSelection", name: "Add Documentation to Selection", feature: .promptToCode( extraSystemPrompt: "", prompt: "Add documentation on top of the code. Use triple slash if the language supports it.", continuousMode: false, generateDescription: true ) ), .init( commandId: "BuiltInCustomCommandSendCodeToChat", name: "Send Selected Code to Chat", feature: .chatWithSelection( extraSystemPrompt: "", prompt: """ ```{{active_editor_language}} {{selected_code}} ``` """, useExtraSystemPrompt: true ) ), ], key: "CustomCommands") } } // MARK: - Feature Flags public extension UserDefaultPreferenceKeys { var disableLazyVStack: FeatureFlag { .init(defaultValue: false, key: "FeatureFlag-DisableLazyVStack") } var preCacheOnFileOpen: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-PreCacheOnFileOpen") } var runNodeWithInteractiveLoggedInShell: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-RunNodeWithInteractiveLoggedInShell") } var useCustomScrollViewWorkaround: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-UseCustomScrollViewWorkaround") } var triggerActionWithAccessibilityAPI: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-TriggerActionWithAccessibilityAPI") } var alwaysAcceptSuggestionWithAccessibilityAPI: FeatureFlag { .init(defaultValue: false, key: "FeatureFlag-AlwaysAcceptSuggestionWithAccessibilityAPI") } var animationACrashSuggestion: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-AnimationACrashSuggestion") } var animationBCrashSuggestion: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-AnimationBCrashSuggestion") } var animationCCrashSuggestion: FeatureFlag { .init(defaultValue: true, key: "FeatureFlag-AnimationCCrashSuggestion") } var enableXcodeInspectorDebugMenu: FeatureFlag { .init(defaultValue: false, key: "FeatureFlag-EnableXcodeInspectorDebugMenu") } var disableFunctionCalling: FeatureFlag { .init(defaultValue: false, key: "FeatureFlag-DisableFunctionCalling") } var useUserDefaultsBaseAPIKeychain: FeatureFlag { .init(defaultValue: false, key: "FeatureFlag-UseUserDefaultsBaseAPIKeychain") } var disableGitHubCopilotSettingsAutoRefreshOnAppear: FeatureFlag { .init( defaultValue: false, key: "FeatureFlag-DisableGitHubCopilotSettingsAutoRefreshOnAppear" ) } var disableEnhancedWorkspace: FeatureFlag { .init( defaultValue: false, key: "FeatureFlag-DisableEnhancedWorkspace" ) } }