From 00055c515e00691f3e4a52f2a0c461fd17d0a990 Mon Sep 17 00:00:00 2001 From: Garfie Date: Tue, 7 Apr 2026 21:49:15 -0500 Subject: [PATCH] refactor: extract supporting types to own files and organize into sub-packages --- .../core/data/datastore/ChatFontSize.kt | 19 +++ .../data/datastore/ConfigCacheDataStore.kt | 2 +- .../core/data/datastore/LatexRenderer.kt | 17 +++ .../core/data/datastore/SettingsDataStore.kt | 34 ----- .../core/data/datastore/ThemeDataStore.kt | 4 - .../core/data/datastore/ThemeMode.kt | 5 + .../core/data/mapper/MessageMapper.kt | 2 +- .../core/data/repository/ConfigRepository.kt | 2 +- .../data/repository/ConfigRepositoryImpl.kt | 2 +- .../librechat/core/model/ContentType.kt | 37 +++++ .../librechat/core/model/EModelEndpoint.kt | 34 +++++ .../garfiec/librechat/core/model/Endpoint.kt | 142 ------------------ .../librechat/core/model/FeedbackRating.kt | 13 ++ .../garfiec/librechat/core/model/Message.kt | 1 + .../core/model/MessageContentPart.kt | 76 ---------- .../garfiec/librechat/core/model/Provider.kt | 43 ++++++ .../librechat/core/model/SseContentEvent.kt | 1 + .../garfiec/librechat/core/model/StepType.kt | 13 ++ .../librechat/core/model/StreamEvent.kt | 2 + .../librechat/core/model/ToolCallType.kt | 22 +++ .../core/model/config/BalanceConfig.kt | 13 ++ .../core/model/config/InterfaceConfig.kt | 27 ++++ .../librechat/core/model/config/LdapConfig.kt | 9 ++ .../librechat/core/model/config/ModelSpec.kt | 13 ++ .../librechat/core/model/config/ModelSpecs.kt | 8 + .../core/model/config/PrivacyPolicyConfig.kt | 9 ++ .../core/model/{ => config}/StartupConfig.kt | 80 +--------- .../core/model/config/TermsOfServiceConfig.kt | 8 + .../core/model/config/TurnstileConfig.kt | 9 ++ .../core/model/config/TurnstileOptions.kt | 9 ++ .../core/model/content/AgentToolCall.kt | 18 +++ .../core/model/content/AgentUpdateContent.kt | 10 ++ .../core/model/content/FunctionCall.kt | 10 ++ .../core/model/content/ImageFileContent.kt | 13 ++ .../core/model/content/ImageUrlContent.kt | 9 ++ .../core/model/content/InputAudioContent.kt | 9 ++ .../core/model/content/MessageContentPart.kt | 24 +++ .../core/model/content/VideoUrlContent.kt | 8 + .../librechat/core/model/mcp/McpAuthConfig.kt | 44 ++++++ .../librechat/core/model/mcp/McpAuthMode.kt | 4 + .../librechat/core/model/mcp/McpServer.kt | 64 -------- .../librechat/core/model/mcp/McpServerType.kt | 22 +++ .../core/model/MessageSerializationTest.kt | 1 + .../model/SseContentEventSerializationTest.kt | 2 + .../librechat/core/network/api/AuthApi.kt | 21 +-- .../librechat/core/network/api/ConfigApi.kt | 2 +- .../librechat/core/network/api/UserApi.kt | 20 +-- .../core/network/api/dto/LoginResult.kt | 8 + .../core/network/api/dto/RefreshResult.kt | 9 ++ .../api/dto/TwoFactorConfirmRequest.kt | 8 + .../network/api/dto/UpdateFavoritesRequest.kt | 9 ++ .../network/api/dto/UpdatePluginsRequest.kt | 8 + .../core/network/api/dto/UserUpdateRequest.kt | 9 ++ .../core/network/sse/SseEventMapper.kt | 2 +- .../core/network/sse/SseLineParser.kt | 3 - .../core/network/sse/SseStreamException.kt | 4 + .../agents/components/AgentAdvancedPanel.kt | 7 +- .../components/AgentCapabilitiesSection.kt | 8 +- .../agents/components/AgentSharingSection.kt | 14 +- .../components/AgentSupportContactSection.kt | 7 +- .../agents/components/AgentVersionHistory.kt | 7 +- .../components/model/AgentAdvancedSettings.kt | 7 + .../components/model/AgentCapabilities.kt | 8 + .../components/model/AgentSharingState.kt | 7 + .../agents/components/model/AgentVersion.kt | 7 + .../components/model/AgentVisibility.kt | 7 + .../components/model/SupportContactState.kt | 7 + .../feature/agents/util/OpenApiParseResult.kt | 12 ++ .../feature/agents/util/OpenApiSpecParser.kt | 19 --- .../feature/agents/util/ParsedFunctionInfo.kt | 11 ++ .../agents/viewmodel/AgentEditorViewModel.kt | 12 +- .../auth/viewmodel/LoginViewModelTest.kt | 2 +- .../auth/viewmodel/RegisterViewModelTest.kt | 2 +- .../feature/chat/components/ChatInput.kt | 4 +- .../chat/components/ContentPartRenderer.kt | 2 +- .../feature/chat/screen/ChatScreen.kt | 2 +- .../librechat/feature/chat/ChatDisplayData.kt | 26 ---- .../chat/components/AttachmentChipsRow.kt | 2 +- .../chat/components/ChatInputParsing.kt | 2 +- .../chat/components/ChatInputToolbar.kt | 2 +- .../chat/components/ChatToolsBottomSheet.kt | 2 +- .../chat/components/CommonChatInputCore.kt | 2 +- .../chat/components/McpServerSelector.kt | 2 +- .../chat/components/PlatformChatComponents.kt | 2 +- .../feature/chat/components/PresetPicker.kt | 2 +- .../chat/components/SharedContentParts.kt | 2 +- .../chat/components/SlashCommandMenu.kt | 2 +- .../chat/components/ToolCallParsing.kt | 2 +- .../chat/components/artifact/Artifact.kt | 26 ++++ .../components/artifact/ArtifactDetector.kt | 33 ---- .../components/artifact/ArtifactSegment.kt | 9 ++ .../chat/model/McpServerDisplayData.kt | 11 ++ .../feature/chat/model/PresetDisplayData.kt | 11 ++ .../chat/model/PromptMentionDisplayData.kt | 10 ++ .../feature/chat/viewmodel/ChatUiState.kt | 6 +- .../feature/chat/viewmodel/ChatViewModel.kt | 4 +- .../delegate/EModelEndpointExtensions.kt | 15 ++ .../delegate/ModelSelectionDelegate.kt | 14 +- .../delegate/PresetPromptDelegate.kt | 4 +- .../feature/chat/components/IosChatInput.kt | 2 +- .../components/PlatformChatComponents.ios.kt | 2 +- .../{ => model}/PresetManagerDisplayData.kt | 2 +- .../SharedLinkDisplayData.kt} | 10 +- .../feature/settings/model/UserDisplayData.kt | 11 ++ .../settings/screen/PresetManagerScreen.kt | 2 +- .../settings/screen/SharedLinksScreen.kt | 2 +- .../viewmodel/PresetManagerViewModel.kt | 2 +- .../settings/viewmodel/ResultExtensions.kt | 11 ++ .../settings/viewmodel/SettingsViewModel.kt | 5 +- .../delegate/DataManagementDelegate.kt | 2 +- .../delegate/TwoFactorSecurityDelegate.kt | 9 +- .../garfiec/librechat/shared/LibreChatSDK.kt | 2 +- .../shared/navigation/LibreChatNavHost.kt | 13 -- .../navigation/SettingsCategoryExtensions.kt | 15 ++ 114 files changed, 789 insertions(+), 641 deletions(-) create mode 100644 core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ChatFontSize.kt create mode 100644 core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/LatexRenderer.kt create mode 100644 core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeMode.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ContentType.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/EModelEndpoint.kt delete mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Endpoint.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/FeedbackRating.kt delete mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/MessageContentPart.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Provider.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StepType.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ToolCallType.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/BalanceConfig.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/InterfaceConfig.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/LdapConfig.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpec.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpecs.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/PrivacyPolicyConfig.kt rename core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/{ => config}/StartupConfig.kt (52%) create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TermsOfServiceConfig.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileConfig.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileOptions.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentToolCall.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentUpdateContent.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/FunctionCall.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageFileContent.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageUrlContent.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/InputAudioContent.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/MessageContentPart.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/VideoUrlContent.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthConfig.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthMode.kt create mode 100644 core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServerType.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/LoginResult.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/RefreshResult.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/TwoFactorConfirmRequest.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdateFavoritesRequest.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdatePluginsRequest.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UserUpdateRequest.kt create mode 100644 core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseStreamException.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentAdvancedSettings.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentCapabilities.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentSharingState.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVersion.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVisibility.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/SupportContactState.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiParseResult.kt create mode 100644 feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/ParsedFunctionInfo.kt delete mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/ChatDisplayData.kt create mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/Artifact.kt create mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactSegment.kt create mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/McpServerDisplayData.kt create mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PresetDisplayData.kt create mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PromptMentionDisplayData.kt create mode 100644 feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/EModelEndpointExtensions.kt rename feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/{ => model}/PresetManagerDisplayData.kt (78%) rename feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/{SettingsDisplayData.kt => model/SharedLinkDisplayData.kt} (51%) create mode 100644 feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/UserDisplayData.kt create mode 100644 feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/ResultExtensions.kt create mode 100644 shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/SettingsCategoryExtensions.kt diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ChatFontSize.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ChatFontSize.kt new file mode 100644 index 0000000..22c7402 --- /dev/null +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ChatFontSize.kt @@ -0,0 +1,19 @@ +package com.garfiec.librechat.core.data.datastore + +enum class ChatFontSize { + SMALL, MEDIUM, LARGE; + + companion object { + fun fromString(value: String?): ChatFontSize = when (value) { + "small" -> SMALL + "large" -> LARGE + else -> MEDIUM + } + } + + fun toStorageString(): String = when (this) { + SMALL -> "small" + MEDIUM -> "medium" + LARGE -> "large" + } +} diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ConfigCacheDataStore.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ConfigCacheDataStore.kt index ac296a5..ea82214 100644 --- a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ConfigCacheDataStore.kt +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ConfigCacheDataStore.kt @@ -5,7 +5,7 @@ import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import com.garfiec.librechat.core.model.EndpointConfig -import com.garfiec.librechat.core.model.StartupConfig +import com.garfiec.librechat.core.model.config.StartupConfig import kotlinx.coroutines.flow.first import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.MapSerializer diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/LatexRenderer.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/LatexRenderer.kt new file mode 100644 index 0000000..bca993d --- /dev/null +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/LatexRenderer.kt @@ -0,0 +1,17 @@ +package com.garfiec.librechat.core.data.datastore + +enum class LatexRenderer { + NATIVE, KATEX; + + companion object { + fun fromString(value: String?): LatexRenderer = when (value) { + "native" -> NATIVE + else -> KATEX + } + } + + fun toStorageString(): String = when (this) { + NATIVE -> "native" + KATEX -> "katex" + } +} diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/SettingsDataStore.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/SettingsDataStore.kt index df482ea..d46c12c 100644 --- a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/SettingsDataStore.kt +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/SettingsDataStore.kt @@ -10,40 +10,6 @@ import androidx.datastore.preferences.core.stringSetPreferencesKey import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -enum class LatexRenderer { - NATIVE, KATEX; - - companion object { - fun fromString(value: String?): LatexRenderer = when (value) { - "native" -> NATIVE - else -> KATEX - } - } - - fun toStorageString(): String = when (this) { - NATIVE -> "native" - KATEX -> "katex" - } -} - -enum class ChatFontSize { - SMALL, MEDIUM, LARGE; - - companion object { - fun fromString(value: String?): ChatFontSize = when (value) { - "small" -> SMALL - "large" -> LARGE - else -> MEDIUM - } - } - - fun toStorageString(): String = when (this) { - SMALL -> "small" - MEDIUM -> "medium" - LARGE -> "large" - } -} - class SettingsDataStore( private val dataStore: DataStore, ) { diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeDataStore.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeDataStore.kt index 9cc6ca5..08aa45b 100644 --- a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeDataStore.kt +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeDataStore.kt @@ -11,10 +11,6 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking -enum class ThemeMode { - SYSTEM, LIGHT, DARK -} - class ThemeDataStore( private val dataStore: DataStore, ) { diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeMode.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeMode.kt new file mode 100644 index 0000000..e27de59 --- /dev/null +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/datastore/ThemeMode.kt @@ -0,0 +1,5 @@ +package com.garfiec.librechat.core.data.datastore + +enum class ThemeMode { + SYSTEM, LIGHT, DARK +} diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/mapper/MessageMapper.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/mapper/MessageMapper.kt index 1e72e22..9f08618 100644 --- a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/mapper/MessageMapper.kt +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/mapper/MessageMapper.kt @@ -5,7 +5,7 @@ import com.garfiec.librechat.core.model.Attachment import com.garfiec.librechat.core.model.Feedback import com.garfiec.librechat.core.model.FileReference import com.garfiec.librechat.core.model.Message -import com.garfiec.librechat.core.model.MessageContentPart +import com.garfiec.librechat.core.model.content.MessageContentPart import kotlin.time.Clock import kotlin.time.Instant import kotlinx.serialization.builtins.ListSerializer diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepository.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepository.kt index 58a3eb2..822ecc2 100644 --- a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepository.kt +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepository.kt @@ -2,7 +2,7 @@ package com.garfiec.librechat.core.data.repository import com.garfiec.librechat.core.common.result.Result import com.garfiec.librechat.core.model.EndpointConfig -import com.garfiec.librechat.core.model.StartupConfig +import com.garfiec.librechat.core.model.config.StartupConfig import kotlinx.coroutines.flow.StateFlow /** diff --git a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepositoryImpl.kt b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepositoryImpl.kt index 971cd4e..9214d10 100644 --- a/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepositoryImpl.kt +++ b/core/data/src/commonMain/kotlin/com/garfiec/librechat/core/data/repository/ConfigRepositoryImpl.kt @@ -6,7 +6,7 @@ import com.garfiec.librechat.core.common.result.Result import com.garfiec.librechat.core.common.result.safeApiCall import com.garfiec.librechat.core.data.datastore.ConfigCacheDataStore import com.garfiec.librechat.core.model.EndpointConfig -import com.garfiec.librechat.core.model.StartupConfig +import com.garfiec.librechat.core.model.config.StartupConfig import com.garfiec.librechat.core.network.api.ConfigApi import io.ktor.client.plugins.HttpRequestTimeoutException import kotlinx.coroutines.flow.MutableStateFlow diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ContentType.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ContentType.kt new file mode 100644 index 0000000..ca90070 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ContentType.kt @@ -0,0 +1,37 @@ +package com.garfiec.librechat.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class ContentType { + @SerialName("text") + TEXT, + + @SerialName("think") + THINK, + + @SerialName("text_delta") + TEXT_DELTA, + + @SerialName("tool_call") + TOOL_CALL, + + @SerialName("image_file") + IMAGE_FILE, + + @SerialName("image_url") + IMAGE_URL, + + @SerialName("video_url") + VIDEO_URL, + + @SerialName("input_audio") + INPUT_AUDIO, + + @SerialName("agent_update") + AGENT_UPDATE, + + @SerialName("error") + ERROR, +} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/EModelEndpoint.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/EModelEndpoint.kt new file mode 100644 index 0000000..01a2d18 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/EModelEndpoint.kt @@ -0,0 +1,34 @@ +package com.garfiec.librechat.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class EModelEndpoint { + @SerialName("azureOpenAI") + AZURE_OPENAI, + + @SerialName("openAI") + OPENAI, + + @SerialName("google") + GOOGLE, + + @SerialName("anthropic") + ANTHROPIC, + + @SerialName("assistants") + ASSISTANTS, + + @SerialName("azureAssistants") + AZURE_ASSISTANTS, + + @SerialName("agents") + AGENTS, + + @SerialName("custom") + CUSTOM, + + @SerialName("bedrock") + BEDROCK, +} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Endpoint.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Endpoint.kt deleted file mode 100644 index 393c525..0000000 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Endpoint.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.garfiec.librechat.core.model - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -enum class EModelEndpoint { - @SerialName("azureOpenAI") - AZURE_OPENAI, - - @SerialName("openAI") - OPENAI, - - @SerialName("google") - GOOGLE, - - @SerialName("anthropic") - ANTHROPIC, - - @SerialName("assistants") - ASSISTANTS, - - @SerialName("azureAssistants") - AZURE_ASSISTANTS, - - @SerialName("agents") - AGENTS, - - @SerialName("custom") - CUSTOM, - - @SerialName("bedrock") - BEDROCK, -} - -@Serializable -enum class ContentType { - @SerialName("text") - TEXT, - - @SerialName("think") - THINK, - - @SerialName("text_delta") - TEXT_DELTA, - - @SerialName("tool_call") - TOOL_CALL, - - @SerialName("image_file") - IMAGE_FILE, - - @SerialName("image_url") - IMAGE_URL, - - @SerialName("video_url") - VIDEO_URL, - - @SerialName("input_audio") - INPUT_AUDIO, - - @SerialName("agent_update") - AGENT_UPDATE, - - @SerialName("error") - ERROR, -} - -@Serializable -enum class StepType { - @SerialName("tool_calls") - TOOL_CALLS, - - @SerialName("message_creation") - MESSAGE_CREATION, -} - -@Serializable -enum class ToolCallType { - @SerialName("function") - FUNCTION, - - @SerialName("retrieval") - RETRIEVAL, - - @SerialName("file_search") - FILE_SEARCH, - - @SerialName("code_interpreter") - CODE_INTERPRETER, - - @SerialName("tool_call") - TOOL_CALL, -} - -@Serializable -enum class FeedbackRating { - @SerialName("thumbsUp") - THUMBS_UP, - - @SerialName("thumbsDown") - THUMBS_DOWN, -} - -@Serializable -enum class Provider { - @SerialName("openAI") - OPENAI, - - @SerialName("anthropic") - ANTHROPIC, - - @SerialName("azureOpenAI") - AZURE, - - @SerialName("google") - GOOGLE, - - @SerialName("vertexai") - VERTEXAI, - - @SerialName("bedrock") - BEDROCK, - - @SerialName("mistralai") - MISTRALAI, - - @SerialName("mistral") - MISTRAL, - - @SerialName("deepseek") - DEEPSEEK, - - @SerialName("moonshot") - MOONSHOT, - - @SerialName("openrouter") - OPENROUTER, - - @SerialName("xai") - XAI, -} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/FeedbackRating.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/FeedbackRating.kt new file mode 100644 index 0000000..4ed7dd8 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/FeedbackRating.kt @@ -0,0 +1,13 @@ +package com.garfiec.librechat.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class FeedbackRating { + @SerialName("thumbsUp") + THUMBS_UP, + + @SerialName("thumbsDown") + THUMBS_DOWN, +} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Message.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Message.kt index a90a644..2ab527f 100644 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Message.kt +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Message.kt @@ -1,5 +1,6 @@ package com.garfiec.librechat.core.model +import com.garfiec.librechat.core.model.content.MessageContentPart import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/MessageContentPart.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/MessageContentPart.kt deleted file mode 100644 index 274919a..0000000 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/MessageContentPart.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.garfiec.librechat.core.model - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonElement - -@Serializable -data class MessageContentPart( - val type: ContentType, - val text: String? = null, - val think: String? = null, - val error: String? = null, - @SerialName("tool_call_ids") val toolCallIds: List? = null, - @SerialName("tool_call") val toolCall: AgentToolCall? = null, - @SerialName("image_file") val imageFile: ImageFileContent? = null, - @SerialName("image_url") val imageUrl: ImageUrlContent? = null, - @SerialName("video_url") val videoUrl: VideoUrlContent? = null, - @SerialName("input_audio") val inputAudio: InputAudioContent? = null, - @SerialName("agent_update") val agentUpdate: AgentUpdateContent? = null, - val agentId: String? = null, - val groupId: Int? = null, - val stepIndex: Int? = null, - val siblingIndex: Int? = null, -) - -@Serializable -data class AgentToolCall( - val type: ToolCallType? = null, - val name: String? = null, - val args: JsonElement? = null, - val id: String? = null, - val output: String? = null, - val auth: String? = null, - @SerialName("expires_at") val expiresAt: Long? = null, - val function: FunctionCall? = null, -) - -@Serializable -data class FunctionCall( - val name: String? = null, - val arguments: String? = null, - val output: String? = null, -) - -@Serializable -data class ImageFileContent( - @SerialName("file_id") val fileId: String? = null, - val filepath: String? = null, - val filename: String? = null, - val width: Int? = null, - val height: Int? = null, -) - -@Serializable -data class ImageUrlContent( - val url: String? = null, - val detail: String? = null, -) - -@Serializable -data class VideoUrlContent( - val url: String? = null, -) - -@Serializable -data class InputAudioContent( - val data: String? = null, - val format: String? = null, -) - -@Serializable -data class AgentUpdateContent( - val index: Int? = null, - val runId: String? = null, - val agentId: String? = null, -) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Provider.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Provider.kt new file mode 100644 index 0000000..2682401 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/Provider.kt @@ -0,0 +1,43 @@ +package com.garfiec.librechat.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class Provider { + @SerialName("openAI") + OPENAI, + + @SerialName("anthropic") + ANTHROPIC, + + @SerialName("azureOpenAI") + AZURE, + + @SerialName("google") + GOOGLE, + + @SerialName("vertexai") + VERTEXAI, + + @SerialName("bedrock") + BEDROCK, + + @SerialName("mistralai") + MISTRALAI, + + @SerialName("mistral") + MISTRAL, + + @SerialName("deepseek") + DEEPSEEK, + + @SerialName("moonshot") + MOONSHOT, + + @SerialName("openrouter") + OPENROUTER, + + @SerialName("xai") + XAI, +} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/SseContentEvent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/SseContentEvent.kt index c0daab6..e290bc7 100644 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/SseContentEvent.kt +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/SseContentEvent.kt @@ -1,5 +1,6 @@ package com.garfiec.librechat.core.model +import com.garfiec.librechat.core.model.content.MessageContentPart import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StepType.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StepType.kt new file mode 100644 index 0000000..1472782 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StepType.kt @@ -0,0 +1,13 @@ +package com.garfiec.librechat.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class StepType { + @SerialName("tool_calls") + TOOL_CALLS, + + @SerialName("message_creation") + MESSAGE_CREATION, +} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StreamEvent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StreamEvent.kt index b328ac3..acb8781 100644 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StreamEvent.kt +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StreamEvent.kt @@ -1,5 +1,7 @@ package com.garfiec.librechat.core.model +import com.garfiec.librechat.core.model.content.MessageContentPart + sealed interface StreamEvent { data class ContentDelta( val chunk: String, diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ToolCallType.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ToolCallType.kt new file mode 100644 index 0000000..cd237bf --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/ToolCallType.kt @@ -0,0 +1,22 @@ +package com.garfiec.librechat.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class ToolCallType { + @SerialName("function") + FUNCTION, + + @SerialName("retrieval") + RETRIEVAL, + + @SerialName("file_search") + FILE_SEARCH, + + @SerialName("code_interpreter") + CODE_INTERPRETER, + + @SerialName("tool_call") + TOOL_CALL, +} diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/BalanceConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/BalanceConfig.kt new file mode 100644 index 0000000..225039b --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/BalanceConfig.kt @@ -0,0 +1,13 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class BalanceConfig( + val enabled: Boolean = false, + val startBalance: Long? = null, + val autoRefillEnabled: Boolean = false, + val refillIntervalValue: Int? = null, + val refillIntervalUnit: String? = null, + val refillAmount: Long? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/InterfaceConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/InterfaceConfig.kt new file mode 100644 index 0000000..5b30015 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/InterfaceConfig.kt @@ -0,0 +1,27 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement + +@Serializable +data class InterfaceConfig( + val privacyPolicy: PrivacyPolicyConfig? = null, + val termsOfService: TermsOfServiceConfig? = null, + val endpointsMenu: Boolean = true, + val modelSelect: Boolean = true, + val parameters: Boolean = true, + val presets: Boolean = true, + val sidePanel: Boolean = true, + val bookmarks: Boolean = true, + val prompts: JsonElement? = null, + val agents: JsonElement? = null, + val multiConvo: Boolean = true, + val memories: Boolean = true, + val temporaryChat: Boolean = true, + val runCode: Boolean = true, + val webSearch: Boolean = true, + val fileSearch: Boolean = true, + val fileCitations: Boolean = true, + val customWelcome: String? = null, + val remoteAgents: JsonElement? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/LdapConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/LdapConfig.kt new file mode 100644 index 0000000..0790c78 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/LdapConfig.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class LdapConfig( + val enabled: Boolean = false, + val username: Boolean? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpec.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpec.kt new file mode 100644 index 0000000..06c40e1 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpec.kt @@ -0,0 +1,13 @@ +package com.garfiec.librechat.core.model.config + +import com.garfiec.librechat.core.model.Preset +import kotlinx.serialization.Serializable + +@Serializable +data class ModelSpec( + val name: String, + val label: String? = null, + val preset: Preset? = null, + val iconURL: String? = null, + val description: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpecs.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpecs.kt new file mode 100644 index 0000000..81f4489 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/ModelSpecs.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class ModelSpecs( + val list: List = emptyList(), +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/PrivacyPolicyConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/PrivacyPolicyConfig.kt new file mode 100644 index 0000000..8bc7172 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/PrivacyPolicyConfig.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class PrivacyPolicyConfig( + val externalUrl: String? = null, + val openNewTab: Boolean? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StartupConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/StartupConfig.kt similarity index 52% rename from core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StartupConfig.kt rename to core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/StartupConfig.kt index 6045d14..59d6dd3 100644 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/StartupConfig.kt +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/StartupConfig.kt @@ -1,8 +1,8 @@ -package com.garfiec.librechat.core.model +package com.garfiec.librechat.core.model.config +import com.garfiec.librechat.core.model.Preset import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject @Serializable @@ -52,79 +52,3 @@ data class StartupConfig( /** Backend version, if the server includes it in the config response (not yet standard). */ val version: String? = null, ) - -@Serializable -data class ModelSpecs( - val list: List = emptyList(), -) - -@Serializable -data class ModelSpec( - val name: String, - val label: String? = null, - val preset: Preset? = null, - val iconURL: String? = null, - val description: String? = null, -) - -@Serializable -data class InterfaceConfig( - val privacyPolicy: PrivacyPolicyConfig? = null, - val termsOfService: TermsOfServiceConfig? = null, - val endpointsMenu: Boolean = true, - val modelSelect: Boolean = true, - val parameters: Boolean = true, - val presets: Boolean = true, - val sidePanel: Boolean = true, - val bookmarks: Boolean = true, - val prompts: JsonElement? = null, - val agents: JsonElement? = null, - val multiConvo: Boolean = true, - val memories: Boolean = true, - val temporaryChat: Boolean = true, - val runCode: Boolean = true, - val webSearch: Boolean = true, - val fileSearch: Boolean = true, - val fileCitations: Boolean = true, - val customWelcome: String? = null, - val remoteAgents: JsonElement? = null, -) - -@Serializable -data class PrivacyPolicyConfig( - val externalUrl: String? = null, - val openNewTab: Boolean? = null, -) - -@Serializable -data class TermsOfServiceConfig( - val externalUrl: String? = null, -) - -@Serializable -data class TurnstileConfig( - val siteKey: String? = null, - val options: TurnstileOptions? = null, -) - -@Serializable -data class TurnstileOptions( - val language: String? = null, - val size: String? = null, -) - -@Serializable -data class BalanceConfig( - val enabled: Boolean = false, - val startBalance: Long? = null, - val autoRefillEnabled: Boolean = false, - val refillIntervalValue: Int? = null, - val refillIntervalUnit: String? = null, - val refillAmount: Long? = null, -) - -@Serializable -data class LdapConfig( - val enabled: Boolean = false, - val username: Boolean? = null, -) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TermsOfServiceConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TermsOfServiceConfig.kt new file mode 100644 index 0000000..dade8fa --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TermsOfServiceConfig.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class TermsOfServiceConfig( + val externalUrl: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileConfig.kt new file mode 100644 index 0000000..95e1b5f --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileConfig.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class TurnstileConfig( + val siteKey: String? = null, + val options: TurnstileOptions? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileOptions.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileOptions.kt new file mode 100644 index 0000000..779e7d6 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/config/TurnstileOptions.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.model.config + +import kotlinx.serialization.Serializable + +@Serializable +data class TurnstileOptions( + val language: String? = null, + val size: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentToolCall.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentToolCall.kt new file mode 100644 index 0000000..5b75662 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentToolCall.kt @@ -0,0 +1,18 @@ +package com.garfiec.librechat.core.model.content + +import com.garfiec.librechat.core.model.ToolCallType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement + +@Serializable +data class AgentToolCall( + val type: ToolCallType? = null, + val name: String? = null, + val args: JsonElement? = null, + val id: String? = null, + val output: String? = null, + val auth: String? = null, + @SerialName("expires_at") val expiresAt: Long? = null, + val function: FunctionCall? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentUpdateContent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentUpdateContent.kt new file mode 100644 index 0000000..d5d6a05 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/AgentUpdateContent.kt @@ -0,0 +1,10 @@ +package com.garfiec.librechat.core.model.content + +import kotlinx.serialization.Serializable + +@Serializable +data class AgentUpdateContent( + val index: Int? = null, + val runId: String? = null, + val agentId: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/FunctionCall.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/FunctionCall.kt new file mode 100644 index 0000000..32ced75 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/FunctionCall.kt @@ -0,0 +1,10 @@ +package com.garfiec.librechat.core.model.content + +import kotlinx.serialization.Serializable + +@Serializable +data class FunctionCall( + val name: String? = null, + val arguments: String? = null, + val output: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageFileContent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageFileContent.kt new file mode 100644 index 0000000..81f88c7 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageFileContent.kt @@ -0,0 +1,13 @@ +package com.garfiec.librechat.core.model.content + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ImageFileContent( + @SerialName("file_id") val fileId: String? = null, + val filepath: String? = null, + val filename: String? = null, + val width: Int? = null, + val height: Int? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageUrlContent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageUrlContent.kt new file mode 100644 index 0000000..1e13cad --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/ImageUrlContent.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.model.content + +import kotlinx.serialization.Serializable + +@Serializable +data class ImageUrlContent( + val url: String? = null, + val detail: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/InputAudioContent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/InputAudioContent.kt new file mode 100644 index 0000000..c10fbcc --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/InputAudioContent.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.model.content + +import kotlinx.serialization.Serializable + +@Serializable +data class InputAudioContent( + val data: String? = null, + val format: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/MessageContentPart.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/MessageContentPart.kt new file mode 100644 index 0000000..44084b5 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/MessageContentPart.kt @@ -0,0 +1,24 @@ +package com.garfiec.librechat.core.model.content + +import com.garfiec.librechat.core.model.ContentType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MessageContentPart( + val type: ContentType, + val text: String? = null, + val think: String? = null, + val error: String? = null, + @SerialName("tool_call_ids") val toolCallIds: List? = null, + @SerialName("tool_call") val toolCall: AgentToolCall? = null, + @SerialName("image_file") val imageFile: ImageFileContent? = null, + @SerialName("image_url") val imageUrl: ImageUrlContent? = null, + @SerialName("video_url") val videoUrl: VideoUrlContent? = null, + @SerialName("input_audio") val inputAudio: InputAudioContent? = null, + @SerialName("agent_update") val agentUpdate: AgentUpdateContent? = null, + val agentId: String? = null, + val groupId: Int? = null, + val stepIndex: Int? = null, + val siblingIndex: Int? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/VideoUrlContent.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/VideoUrlContent.kt new file mode 100644 index 0000000..a128642 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/content/VideoUrlContent.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.core.model.content + +import kotlinx.serialization.Serializable + +@Serializable +data class VideoUrlContent( + val url: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthConfig.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthConfig.kt new file mode 100644 index 0000000..2a242f7 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthConfig.kt @@ -0,0 +1,44 @@ +package com.garfiec.librechat.core.model.mcp + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Maps to backend apiKey object: { source, authorization_type, key?, custom_header? }. */ +@Serializable +data class McpApiKeyConfig( + val source: McpApiKeySource = McpApiKeySource.USER, + @SerialName("authorization_type") val authorizationType: McpAuthorizationType = McpAuthorizationType.BEARER, + val key: String? = null, + @SerialName("custom_header") val customHeader: String? = null, +) + +@Serializable +enum class McpApiKeySource { + @SerialName("admin") + ADMIN, + + @SerialName("user") + USER, +} + +@Serializable +enum class McpAuthorizationType { + @SerialName("bearer") + BEARER, + + @SerialName("basic") + BASIC, + + @SerialName("custom") + CUSTOM, +} + +/** Maps to backend oauth object. Only the most common fields are exposed in the UI. */ +@Serializable +data class McpOAuthConfig( + @SerialName("authorization_url") val authorizationUrl: String? = null, + @SerialName("token_url") val tokenUrl: String? = null, + @SerialName("client_id") val clientId: String? = null, + @SerialName("client_secret") val clientSecret: String? = null, + val scope: String? = null, +) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthMode.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthMode.kt new file mode 100644 index 0000000..cf69002 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpAuthMode.kt @@ -0,0 +1,4 @@ +package com.garfiec.librechat.core.model.mcp + +/** Auth mode for the MCP server add/edit dialog. */ +enum class McpAuthMode { NONE, API_KEY, OAUTH } diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServer.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServer.kt index a0c334d..6cecde9 100644 --- a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServer.kt +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServer.kt @@ -1,8 +1,5 @@ package com.garfiec.librechat.core.model.mcp -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - /** * Represents an MCP server as shown in the UI. * The backend returns a map of server name -> config from GET /api/mcp/servers. @@ -20,64 +17,3 @@ data class McpServer( val apiKey: McpApiKeyConfig? = null, val oauth: McpOAuthConfig? = null, ) - -@Serializable -enum class McpServerType { - @SerialName("sse") - SSE, - - @SerialName("streamable-http") - STREAMABLE_HTTP, - - @SerialName("http") - HTTP, - - @SerialName("stdio") - STDIO, - - @SerialName("websocket") - WEBSOCKET, -} - -/** Auth mode for the MCP server add/edit dialog. */ -enum class McpAuthMode { NONE, API_KEY, OAUTH } - -/** Maps to backend apiKey object: { source, authorization_type, key?, custom_header? }. */ -@Serializable -data class McpApiKeyConfig( - val source: McpApiKeySource = McpApiKeySource.USER, - @SerialName("authorization_type") val authorizationType: McpAuthorizationType = McpAuthorizationType.BEARER, - val key: String? = null, - @SerialName("custom_header") val customHeader: String? = null, -) - -@Serializable -enum class McpApiKeySource { - @SerialName("admin") - ADMIN, - - @SerialName("user") - USER, -} - -@Serializable -enum class McpAuthorizationType { - @SerialName("bearer") - BEARER, - - @SerialName("basic") - BASIC, - - @SerialName("custom") - CUSTOM, -} - -/** Maps to backend oauth object. Only the most common fields are exposed in the UI. */ -@Serializable -data class McpOAuthConfig( - @SerialName("authorization_url") val authorizationUrl: String? = null, - @SerialName("token_url") val tokenUrl: String? = null, - @SerialName("client_id") val clientId: String? = null, - @SerialName("client_secret") val clientSecret: String? = null, - val scope: String? = null, -) diff --git a/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServerType.kt b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServerType.kt new file mode 100644 index 0000000..f1efaf4 --- /dev/null +++ b/core/model/src/commonMain/kotlin/com/garfiec/librechat/core/model/mcp/McpServerType.kt @@ -0,0 +1,22 @@ +package com.garfiec.librechat.core.model.mcp + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class McpServerType { + @SerialName("sse") + SSE, + + @SerialName("streamable-http") + STREAMABLE_HTTP, + + @SerialName("http") + HTTP, + + @SerialName("stdio") + STDIO, + + @SerialName("websocket") + WEBSOCKET, +} diff --git a/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/MessageSerializationTest.kt b/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/MessageSerializationTest.kt index eaffcf3..464885a 100644 --- a/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/MessageSerializationTest.kt +++ b/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/MessageSerializationTest.kt @@ -1,5 +1,6 @@ package com.garfiec.librechat.core.model +import com.garfiec.librechat.core.model.content.MessageContentPart import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive diff --git a/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/SseContentEventSerializationTest.kt b/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/SseContentEventSerializationTest.kt index f60c6d5..60f2882 100644 --- a/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/SseContentEventSerializationTest.kt +++ b/core/model/src/commonTest/kotlin/com/garfiec/librechat/core/model/SseContentEventSerializationTest.kt @@ -1,5 +1,7 @@ package com.garfiec.librechat.core.model +import com.garfiec.librechat.core.model.content.AgentToolCall +import com.garfiec.librechat.core.model.content.MessageContentPart import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/AuthApi.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/AuthApi.kt index ebd6b7a..935deea 100644 --- a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/AuthApi.kt +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/AuthApi.kt @@ -1,5 +1,8 @@ package com.garfiec.librechat.core.network.api +import com.garfiec.librechat.core.network.api.dto.LoginResult +import com.garfiec.librechat.core.network.api.dto.RefreshResult +import com.garfiec.librechat.core.network.api.dto.TwoFactorConfirmRequest import com.garfiec.librechat.core.model.request.LoginRequest import com.garfiec.librechat.core.model.request.OtpVerificationRequest import com.garfiec.librechat.core.model.request.PasswordResetRequest @@ -15,23 +18,10 @@ import com.garfiec.librechat.core.model.response.TwoFactorSetupResponse import com.garfiec.librechat.core.network.client.CookieHelper import io.ktor.client.HttpClient import io.ktor.client.call.body -import io.ktor.client.request.get import io.ktor.client.request.header import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.http.path -import kotlinx.serialization.Serializable - -data class LoginResult( - val response: LoginResponse, - val refreshToken: String?, -) - -data class RefreshResult( - val response: RefreshResponse, - /** New refresh token from Set-Cookie header, if the backend rotated it. */ - val newRefreshToken: String?, -) class AuthApi constructor( private val client: HttpClient, @@ -169,8 +159,3 @@ class AuthApi constructor( } } } - -@Serializable -data class TwoFactorConfirmRequest( - val token: String, -) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/ConfigApi.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/ConfigApi.kt index 9879934..c771fed 100644 --- a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/ConfigApi.kt +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/ConfigApi.kt @@ -1,7 +1,7 @@ package com.garfiec.librechat.core.network.api import com.garfiec.librechat.core.model.EndpointConfig -import com.garfiec.librechat.core.model.StartupConfig +import com.garfiec.librechat.core.model.config.StartupConfig import com.garfiec.librechat.core.model.response.Category import io.ktor.client.HttpClient import io.ktor.client.call.body diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/UserApi.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/UserApi.kt index fb69dfe..01d01ed 100644 --- a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/UserApi.kt +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/UserApi.kt @@ -1,5 +1,8 @@ package com.garfiec.librechat.core.network.api +import com.garfiec.librechat.core.network.api.dto.UpdateFavoritesRequest +import com.garfiec.librechat.core.network.api.dto.UpdatePluginsRequest +import com.garfiec.librechat.core.network.api.dto.UserUpdateRequest import com.garfiec.librechat.core.model.User import com.garfiec.librechat.core.model.UserFavorite import com.garfiec.librechat.core.model.request.OtpVerificationRequest @@ -17,23 +20,6 @@ import io.ktor.client.request.setBody import io.ktor.http.Headers import io.ktor.http.HttpHeaders import io.ktor.http.path -import kotlinx.serialization.Serializable - -@Serializable -data class UserUpdateRequest( - val name: String? = null, - val username: String? = null, -) - -@Serializable -data class UpdateFavoritesRequest( - val favorites: List, -) - -@Serializable -data class UpdatePluginsRequest( - val plugins: List, -) class UserApi constructor( private val client: HttpClient, diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/LoginResult.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/LoginResult.kt new file mode 100644 index 0000000..e9ff498 --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/LoginResult.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.core.network.api.dto + +import com.garfiec.librechat.core.model.response.LoginResponse + +data class LoginResult( + val response: LoginResponse, + val refreshToken: String?, +) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/RefreshResult.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/RefreshResult.kt new file mode 100644 index 0000000..65279c8 --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/RefreshResult.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.network.api.dto + +import com.garfiec.librechat.core.model.response.RefreshResponse + +data class RefreshResult( + val response: RefreshResponse, + /** New refresh token from Set-Cookie header, if the backend rotated it. */ + val newRefreshToken: String?, +) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/TwoFactorConfirmRequest.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/TwoFactorConfirmRequest.kt new file mode 100644 index 0000000..8850c5e --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/TwoFactorConfirmRequest.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.core.network.api.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class TwoFactorConfirmRequest( + val token: String, +) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdateFavoritesRequest.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdateFavoritesRequest.kt new file mode 100644 index 0000000..2d38c3b --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdateFavoritesRequest.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.network.api.dto + +import com.garfiec.librechat.core.model.UserFavorite +import kotlinx.serialization.Serializable + +@Serializable +data class UpdateFavoritesRequest( + val favorites: List, +) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdatePluginsRequest.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdatePluginsRequest.kt new file mode 100644 index 0000000..149bf7f --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UpdatePluginsRequest.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.core.network.api.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class UpdatePluginsRequest( + val plugins: List, +) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UserUpdateRequest.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UserUpdateRequest.kt new file mode 100644 index 0000000..2959ab2 --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/api/dto/UserUpdateRequest.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.core.network.api.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class UserUpdateRequest( + val name: String? = null, + val username: String? = null, +) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseEventMapper.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseEventMapper.kt index f579e8e..2ce269c 100644 --- a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseEventMapper.kt +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseEventMapper.kt @@ -210,7 +210,7 @@ class SseEventMapper(private val json: Json) { aggregatedContent.mapNotNull { element -> try { json.decodeFromJsonElement( - com.garfiec.librechat.core.model.MessageContentPart.serializer(), + com.garfiec.librechat.core.model.content.MessageContentPart.serializer(), element, ) } catch (e: Exception) { diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseLineParser.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseLineParser.kt index 5e8f7fb..39f50cc 100644 --- a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseLineParser.kt +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseLineParser.kt @@ -82,6 +82,3 @@ class SseLineParser( const val DEFAULT_LINE_READ_TIMEOUT_MS = 120_000L } } - -/** Cross-platform exception for SSE stream errors (replaces java.io.IOException). */ -class SseStreamException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseStreamException.kt b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseStreamException.kt new file mode 100644 index 0000000..babc269 --- /dev/null +++ b/core/network/src/commonMain/kotlin/com/garfiec/librechat/core/network/sse/SseStreamException.kt @@ -0,0 +1,4 @@ +package com.garfiec.librechat.core.network.sse + +/** Cross-platform exception for SSE stream errors (replaces java.io.IOException). */ +class SseStreamException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentAdvancedPanel.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentAdvancedPanel.kt index 019293a..d0a7997 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentAdvancedPanel.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentAdvancedPanel.kt @@ -32,12 +32,7 @@ import androidx.compose.ui.unit.dp import librechat_mobile.feature.agents.generated.resources.Res import librechat_mobile.feature.agents.generated.resources.* import kotlin.math.roundToInt - -data class AgentAdvancedSettings( - val temperature: Float? = null, - val topP: Float? = null, - val maxTokens: Int? = null, -) +import com.garfiec.librechat.feature.agents.components.model.AgentAdvancedSettings @Composable fun AgentAdvancedPanel( diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentCapabilitiesSection.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentCapabilitiesSection.kt index e8b2d5b..d64c251 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentCapabilitiesSection.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentCapabilitiesSection.kt @@ -20,13 +20,7 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import librechat_mobile.feature.agents.generated.resources.Res import librechat_mobile.feature.agents.generated.resources.* - -data class AgentCapabilities( - val artifacts: Boolean = false, - val endAfterTools: Boolean = false, - val hideSequentialOutputs: Boolean = false, - val recursionLimit: Int = 25, -) +import com.garfiec.librechat.feature.agents.components.model.AgentCapabilities @Composable fun AgentCapabilitiesSection( diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSharingSection.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSharingSection.kt index ae38750..1d09050 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSharingSection.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSharingSection.kt @@ -33,18 +33,8 @@ import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.unit.dp import librechat_mobile.feature.agents.generated.resources.Res import librechat_mobile.feature.agents.generated.resources.* - -enum class AgentVisibility(val label: String) { - PRIVATE("Private"), - TEAM("Team"), - PUBLIC("Public"), -} - -@androidx.compose.runtime.Immutable -data class AgentSharingState( - val visibility: AgentVisibility = AgentVisibility.PRIVATE, - val isCollaborative: Boolean = false, -) +import com.garfiec.librechat.feature.agents.components.model.AgentSharingState +import com.garfiec.librechat.feature.agents.components.model.AgentVisibility /** Visibility (Private/Team/Public) and collaborative toggle; maps to agent model isPublic/isCollaborative. */ @OptIn(ExperimentalMaterial3Api::class) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSupportContactSection.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSupportContactSection.kt index 5d631b0..4ed0b6a 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSupportContactSection.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentSupportContactSection.kt @@ -13,12 +13,7 @@ import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.unit.dp import librechat_mobile.feature.agents.generated.resources.Res import librechat_mobile.feature.agents.generated.resources.* - -@androidx.compose.runtime.Immutable -data class SupportContactState( - val name: String = "", - val email: String = "", -) +import com.garfiec.librechat.feature.agents.components.model.SupportContactState @Composable fun AgentSupportContactSection( diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentVersionHistory.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentVersionHistory.kt index d821e21..3bb1af8 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentVersionHistory.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/AgentVersionHistory.kt @@ -25,12 +25,7 @@ import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.unit.dp import librechat_mobile.feature.agents.generated.resources.Res import librechat_mobile.feature.agents.generated.resources.* - -data class AgentVersion( - val version: Int, - val updatedAt: String?, - val isCurrent: Boolean = false, -) +import com.garfiec.librechat.feature.agents.components.model.AgentVersion @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentAdvancedSettings.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentAdvancedSettings.kt new file mode 100644 index 0000000..3b8e97e --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentAdvancedSettings.kt @@ -0,0 +1,7 @@ +package com.garfiec.librechat.feature.agents.components.model + +data class AgentAdvancedSettings( + val temperature: Float? = null, + val topP: Float? = null, + val maxTokens: Int? = null, +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentCapabilities.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentCapabilities.kt new file mode 100644 index 0000000..ec6bfba --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentCapabilities.kt @@ -0,0 +1,8 @@ +package com.garfiec.librechat.feature.agents.components.model + +data class AgentCapabilities( + val artifacts: Boolean = false, + val endAfterTools: Boolean = false, + val hideSequentialOutputs: Boolean = false, + val recursionLimit: Int = 25, +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentSharingState.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentSharingState.kt new file mode 100644 index 0000000..7601b73 --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentSharingState.kt @@ -0,0 +1,7 @@ +package com.garfiec.librechat.feature.agents.components.model + +@androidx.compose.runtime.Immutable +data class AgentSharingState( + val visibility: AgentVisibility = AgentVisibility.PRIVATE, + val isCollaborative: Boolean = false, +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVersion.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVersion.kt new file mode 100644 index 0000000..7b438c4 --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVersion.kt @@ -0,0 +1,7 @@ +package com.garfiec.librechat.feature.agents.components.model + +data class AgentVersion( + val version: Int, + val updatedAt: String?, + val isCurrent: Boolean = false, +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVisibility.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVisibility.kt new file mode 100644 index 0000000..07f6794 --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/AgentVisibility.kt @@ -0,0 +1,7 @@ +package com.garfiec.librechat.feature.agents.components.model + +enum class AgentVisibility(val label: String) { + PRIVATE("Private"), + TEAM("Team"), + PUBLIC("Public"), +} diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/SupportContactState.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/SupportContactState.kt new file mode 100644 index 0000000..28b3cd9 --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/components/model/SupportContactState.kt @@ -0,0 +1,7 @@ +package com.garfiec.librechat.feature.agents.components.model + +@androidx.compose.runtime.Immutable +data class SupportContactState( + val name: String = "", + val email: String = "", +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiParseResult.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiParseResult.kt new file mode 100644 index 0000000..e198e40 --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiParseResult.kt @@ -0,0 +1,12 @@ +package com.garfiec.librechat.feature.agents.util + +import com.garfiec.librechat.core.model.request.FunctionTool + +/** + * Result of parsing an OpenAPI spec. + */ +data class OpenApiParseResult( + val domain: String, + val functions: List, + val errors: List = emptyList(), +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiSpecParser.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiSpecParser.kt index c11bcf5..2967b19 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiSpecParser.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/OpenApiSpecParser.kt @@ -12,25 +12,6 @@ import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -/** - * Result of parsing an OpenAPI spec. - */ -data class OpenApiParseResult( - val domain: String, - val functions: List, - val errors: List = emptyList(), -) - -/** - * Represents a parsed function for display in the available actions table. - */ -data class ParsedFunctionInfo( - val name: String, - val method: String, - val path: String, - val description: String, -) - /** * Parses an OpenAPI specification and extracts function definitions. * diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/ParsedFunctionInfo.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/ParsedFunctionInfo.kt new file mode 100644 index 0000000..e29d0a2 --- /dev/null +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/util/ParsedFunctionInfo.kt @@ -0,0 +1,11 @@ +package com.garfiec.librechat.feature.agents.util + +/** + * Represents a parsed function for display in the available actions table. + */ +data class ParsedFunctionInfo( + val name: String, + val method: String, + val path: String, + val description: String, +) diff --git a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/viewmodel/AgentEditorViewModel.kt b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/viewmodel/AgentEditorViewModel.kt index 0078e00..c5f0f63 100644 --- a/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/viewmodel/AgentEditorViewModel.kt +++ b/feature/agents/src/commonMain/kotlin/com/garfiec/librechat/feature/agents/viewmodel/AgentEditorViewModel.kt @@ -24,13 +24,13 @@ import com.garfiec.librechat.core.model.request.UpdateAgentRequest import com.garfiec.librechat.feature.agents.AgentActionDisplayData import com.garfiec.librechat.feature.agents.AgentHandoffDisplayData import com.garfiec.librechat.feature.agents.AgentToolDisplayData -import com.garfiec.librechat.feature.agents.components.AgentAdvancedSettings -import com.garfiec.librechat.feature.agents.components.AgentCapabilities -import com.garfiec.librechat.feature.agents.components.AgentSharingState -import com.garfiec.librechat.feature.agents.components.AgentVersion -import com.garfiec.librechat.feature.agents.components.AgentVisibility import com.garfiec.librechat.feature.agents.components.ModelOption -import com.garfiec.librechat.feature.agents.components.SupportContactState +import com.garfiec.librechat.feature.agents.components.model.AgentAdvancedSettings +import com.garfiec.librechat.feature.agents.components.model.AgentCapabilities +import com.garfiec.librechat.feature.agents.components.model.AgentSharingState +import com.garfiec.librechat.feature.agents.components.model.AgentVersion +import com.garfiec.librechat.feature.agents.components.model.AgentVisibility +import com.garfiec.librechat.feature.agents.components.model.SupportContactState import com.garfiec.librechat.feature.agents.util.OpenApiSpecParser import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/LoginViewModelTest.kt b/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/LoginViewModelTest.kt index de3895c..6c62fd4 100644 --- a/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/LoginViewModelTest.kt +++ b/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/LoginViewModelTest.kt @@ -6,7 +6,7 @@ import com.garfiec.librechat.core.data.datastore.ServerDataStore import com.garfiec.librechat.core.data.repository.AuthRepository import com.garfiec.librechat.core.data.repository.ConfigRepository import com.garfiec.librechat.core.model.LoginOutcome -import com.garfiec.librechat.core.model.StartupConfig +import com.garfiec.librechat.core.model.config.StartupConfig import com.garfiec.librechat.core.model.User import com.garfiec.librechat.feature.auth.oauth.OAuthLauncher import io.mockk.coEvery diff --git a/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/RegisterViewModelTest.kt b/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/RegisterViewModelTest.kt index b608b6c..2994d4c 100644 --- a/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/RegisterViewModelTest.kt +++ b/feature/auth/src/androidUnitTest/kotlin/com/garfiec/librechat/feature/auth/viewmodel/RegisterViewModelTest.kt @@ -4,7 +4,7 @@ import com.google.common.truth.Truth.assertThat import com.garfiec.librechat.core.common.result.Result import com.garfiec.librechat.core.data.repository.AuthRepository import com.garfiec.librechat.core.data.repository.ConfigRepository -import com.garfiec.librechat.core.model.StartupConfig +import com.garfiec.librechat.core.model.config.StartupConfig import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every diff --git a/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInput.kt b/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInput.kt index 138a39b..24cb775 100644 --- a/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInput.kt +++ b/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInput.kt @@ -51,8 +51,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.core.content.FileProvider -import com.garfiec.librechat.feature.chat.McpServerDisplayData -import com.garfiec.librechat.feature.chat.PromptMentionDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.PromptMentionDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.* import java.io.File diff --git a/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ContentPartRenderer.kt b/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ContentPartRenderer.kt index 82017f6..1f22845 100644 --- a/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ContentPartRenderer.kt +++ b/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/components/ContentPartRenderer.kt @@ -3,7 +3,7 @@ package com.garfiec.librechat.feature.chat.components import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.LayoutCoordinates -import com.garfiec.librechat.core.model.MessageContentPart +import com.garfiec.librechat.core.model.content.MessageContentPart @Composable actual fun ContentPartRenderer( diff --git a/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/screen/ChatScreen.kt b/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/screen/ChatScreen.kt index 4852754..371cbe1 100644 --- a/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/screen/ChatScreen.kt +++ b/feature/chat/src/androidMain/kotlin/com/garfiec/librechat/feature/chat/screen/ChatScreen.kt @@ -74,7 +74,7 @@ import com.garfiec.librechat.core.common.EndpointConstants import com.garfiec.librechat.core.data.datastore.ChatFontSize import com.garfiec.librechat.core.data.datastore.LatexRenderer import com.garfiec.librechat.core.model.ContentType -import com.garfiec.librechat.core.model.MessageContentPart +import com.garfiec.librechat.core.model.content.MessageContentPart import com.garfiec.librechat.core.ui.components.LoadingIndicator import com.garfiec.librechat.core.ui.components.ModelParameterSheet import librechat_mobile.feature.chat.generated.resources.Res diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/ChatDisplayData.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/ChatDisplayData.kt deleted file mode 100644 index c62c5f5..0000000 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/ChatDisplayData.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.garfiec.librechat.feature.chat - -import androidx.compose.runtime.Immutable - -@Immutable -data class PresetDisplayData( - val presetId: String?, - val title: String, - val endpointLabel: String?, - val model: String?, -) - -@Immutable -data class PromptMentionDisplayData( - val name: String, - val command: String?, - val oneliner: String?, -) - -@Immutable -data class McpServerDisplayData( - val name: String, - val title: String?, - val description: String?, - val isConnected: Boolean, -) diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/AttachmentChipsRow.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/AttachmentChipsRow.kt index 8a9de8e..09b62ff 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/AttachmentChipsRow.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/AttachmentChipsRow.kt @@ -52,7 +52,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import com.garfiec.librechat.core.common.ToolConstants -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.* diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputParsing.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputParsing.kt index b5c920c..245dfeb 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputParsing.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputParsing.kt @@ -1,6 +1,6 @@ package com.garfiec.librechat.feature.chat.components -import com.garfiec.librechat.feature.chat.PromptMentionDisplayData +import com.garfiec.librechat.feature.chat.model.PromptMentionDisplayData /** * Extracts the @mention query from the input text. diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputToolbar.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputToolbar.kt index 7f6c9e9..57ea795 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputToolbar.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatInputToolbar.kt @@ -35,7 +35,7 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import com.garfiec.librechat.core.common.ToolConstants -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.* diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatToolsBottomSheet.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatToolsBottomSheet.kt index 6f32b7b..195cb22 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatToolsBottomSheet.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ChatToolsBottomSheet.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.garfiec.librechat.core.common.ToolConstants -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.* diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/CommonChatInputCore.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/CommonChatInputCore.kt index 5c020a8..61814d4 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/CommonChatInputCore.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/CommonChatInputCore.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.cd_send_message import librechat_mobile.feature.chat.generated.resources.cd_start_voice_recording diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/McpServerSelector.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/McpServerSelector.kt index 1695895..85eea42 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/McpServerSelector.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/McpServerSelector.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.* diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.kt index d5f9b77..5b4d1eb 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.kt @@ -5,7 +5,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.layout.LayoutCoordinates import com.garfiec.librechat.core.common.ChatLayoutConstants import com.garfiec.librechat.core.model.Message -import com.garfiec.librechat.core.model.MessageContentPart +import com.garfiec.librechat.core.model.content.MessageContentPart /** Platform-specific message bubble. */ @Composable diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PresetPicker.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PresetPicker.kt index d59d5a5..6ee9f44 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PresetPicker.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/PresetPicker.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.Modifier import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.garfiec.librechat.feature.chat.PresetDisplayData +import com.garfiec.librechat.feature.chat.model.PresetDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.* diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SharedContentParts.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SharedContentParts.kt index 652bd48..12b9d26 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SharedContentParts.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SharedContentParts.kt @@ -48,7 +48,7 @@ import coil3.compose.SubcomposeAsyncImage import com.garfiec.librechat.core.common.ToolConstants import com.garfiec.librechat.core.model.Attachment import com.garfiec.librechat.core.model.ContentType -import com.garfiec.librechat.core.model.MessageContentPart +import com.garfiec.librechat.core.model.content.MessageContentPart import com.garfiec.librechat.feature.chat.components.artifact.Artifact import com.garfiec.librechat.feature.chat.components.artifact.ArtifactButton import com.garfiec.librechat.feature.chat.components.artifact.ArtifactPanel diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SlashCommandMenu.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SlashCommandMenu.kt index 7f17d50..89bf3bf 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SlashCommandMenu.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/SlashCommandMenu.kt @@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.garfiec.librechat.feature.chat.PromptMentionDisplayData +import com.garfiec.librechat.feature.chat.model.PromptMentionDisplayData /** * Dropdown menu showing slash command suggestions. diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ToolCallParsing.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ToolCallParsing.kt index edf08ad..2e15b36 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ToolCallParsing.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/ToolCallParsing.kt @@ -1,6 +1,6 @@ package com.garfiec.librechat.feature.chat.components -import com.garfiec.librechat.core.model.AgentToolCall +import com.garfiec.librechat.core.model.content.AgentToolCall import com.garfiec.librechat.core.model.Attachment import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/Artifact.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/Artifact.kt new file mode 100644 index 0000000..7bc87c5 --- /dev/null +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/Artifact.kt @@ -0,0 +1,26 @@ +package com.garfiec.librechat.feature.chat.components.artifact + +/** + * Parsed artifact extracted from message content. Artifacts are marked in LLM + * responses using the remark-directive markdown format: + * + * ``` + * :::artifact{identifier="id" type="mime-type" title="Title"} + * ```language + * ...content... + * ``` + * ::: + * ``` + * + * Supported types: text/html, image/svg+xml, application/vnd.react, + * application/vnd.mermaid, text/markdown, text/md, text/plain, + * application/vnd.code-html. + */ +data class Artifact( + val identifier: String, + val type: String, + val title: String, + val language: String?, + val content: String, + val version: Int = 1, +) diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactDetector.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactDetector.kt index d3cea06..d8394e6 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactDetector.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactDetector.kt @@ -1,38 +1,5 @@ package com.garfiec.librechat.feature.chat.components.artifact -/** - * Parsed artifact extracted from message content. Artifacts are marked in LLM - * responses using the remark-directive markdown format: - * - * ``` - * :::artifact{identifier="id" type="mime-type" title="Title"} - * ```language - * ...content... - * ``` - * ::: - * ``` - * - * Supported types: text/html, image/svg+xml, application/vnd.react, - * application/vnd.mermaid, text/markdown, text/md, text/plain, - * application/vnd.code-html. - */ -data class Artifact( - val identifier: String, - val type: String, - val title: String, - val language: String?, - val content: String, - val version: Int = 1, -) - -/** - * Segment of message text that is either plain content or an artifact. - */ -sealed interface ArtifactSegment { - data class Text(val text: String) : ArtifactSegment - data class ArtifactReference(val artifact: Artifact) : ArtifactSegment -} - /** * Matches the remark-directive artifact format: * :::artifact{key="value" ...} diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactSegment.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactSegment.kt new file mode 100644 index 0000000..7a500f0 --- /dev/null +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/components/artifact/ArtifactSegment.kt @@ -0,0 +1,9 @@ +package com.garfiec.librechat.feature.chat.components.artifact + +/** + * Segment of message text that is either plain content or an artifact. + */ +sealed interface ArtifactSegment { + data class Text(val text: String) : ArtifactSegment + data class ArtifactReference(val artifact: Artifact) : ArtifactSegment +} diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/McpServerDisplayData.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/McpServerDisplayData.kt new file mode 100644 index 0000000..3fb9eda --- /dev/null +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/McpServerDisplayData.kt @@ -0,0 +1,11 @@ +package com.garfiec.librechat.feature.chat.model + +import androidx.compose.runtime.Immutable + +@Immutable +data class McpServerDisplayData( + val name: String, + val title: String?, + val description: String?, + val isConnected: Boolean, +) diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PresetDisplayData.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PresetDisplayData.kt new file mode 100644 index 0000000..a92463c --- /dev/null +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PresetDisplayData.kt @@ -0,0 +1,11 @@ +package com.garfiec.librechat.feature.chat.model + +import androidx.compose.runtime.Immutable + +@Immutable +data class PresetDisplayData( + val presetId: String?, + val title: String, + val endpointLabel: String?, + val model: String?, +) diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PromptMentionDisplayData.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PromptMentionDisplayData.kt new file mode 100644 index 0000000..09a0823 --- /dev/null +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/model/PromptMentionDisplayData.kt @@ -0,0 +1,10 @@ +package com.garfiec.librechat.feature.chat.model + +import androidx.compose.runtime.Immutable + +@Immutable +data class PromptMentionDisplayData( + val name: String, + val command: String?, + val oneliner: String?, +) diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatUiState.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatUiState.kt index 5a87faf..82eabc6 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatUiState.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatUiState.kt @@ -8,9 +8,9 @@ import com.garfiec.librechat.core.data.datastore.LatexRenderer import com.garfiec.librechat.core.model.Agent import com.garfiec.librechat.core.model.EndpointConfig import com.garfiec.librechat.core.ui.components.ModelParameters -import com.garfiec.librechat.feature.chat.McpServerDisplayData -import com.garfiec.librechat.feature.chat.PresetDisplayData -import com.garfiec.librechat.feature.chat.PromptMentionDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.PresetDisplayData +import com.garfiec.librechat.feature.chat.model.PromptMentionDisplayData import com.garfiec.librechat.feature.chat.util.MessageNode enum class ChatScreenState { LANDING, LOADING, ACTIVE } diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatViewModel.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatViewModel.kt index 979818c..6310000 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatViewModel.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/ChatViewModel.kt @@ -27,8 +27,8 @@ import com.garfiec.librechat.core.model.Preset import com.garfiec.librechat.core.model.StreamEvent import com.garfiec.librechat.core.model.request.EphemeralAgent import com.garfiec.librechat.core.ui.components.ModelParameters -import com.garfiec.librechat.feature.chat.PresetDisplayData -import com.garfiec.librechat.feature.chat.PromptMentionDisplayData +import com.garfiec.librechat.feature.chat.model.PresetDisplayData +import com.garfiec.librechat.feature.chat.model.PromptMentionDisplayData import com.garfiec.librechat.feature.chat.components.AttachedFile import com.garfiec.librechat.feature.chat.util.NEW_CHAT_DRAFT_KEY import com.garfiec.librechat.feature.chat.util.buildActiveMessagePath diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/EModelEndpointExtensions.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/EModelEndpointExtensions.kt new file mode 100644 index 0000000..aa24bff --- /dev/null +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/EModelEndpointExtensions.kt @@ -0,0 +1,15 @@ +package com.garfiec.librechat.feature.chat.viewmodel.delegate + +import com.garfiec.librechat.core.model.EModelEndpoint + +internal fun EModelEndpoint.toSerialName(): String = when (this) { + EModelEndpoint.AZURE_OPENAI -> "azureOpenAI" + EModelEndpoint.OPENAI -> "openAI" + EModelEndpoint.GOOGLE -> "google" + EModelEndpoint.ANTHROPIC -> "anthropic" + EModelEndpoint.ASSISTANTS -> "assistants" + EModelEndpoint.AZURE_ASSISTANTS -> "azureAssistants" + EModelEndpoint.AGENTS -> "agents" + EModelEndpoint.CUSTOM -> "custom" + EModelEndpoint.BEDROCK -> "bedrock" +} diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/ModelSelectionDelegate.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/ModelSelectionDelegate.kt index 9664993..9306312 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/ModelSelectionDelegate.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/ModelSelectionDelegate.kt @@ -11,7 +11,7 @@ import com.garfiec.librechat.core.model.EModelEndpoint import com.garfiec.librechat.core.model.mcp.McpServer import com.garfiec.librechat.core.model.request.AddedConversation import com.garfiec.librechat.core.ui.components.ModelParameters -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import com.garfiec.librechat.feature.chat.viewmodel.ChatScreenState import com.garfiec.librechat.feature.chat.viewmodel.ChatStateHandle import com.garfiec.librechat.feature.chat.viewmodel.ComparisonState @@ -343,15 +343,3 @@ internal fun McpServer.toDisplayData() = McpServerDisplayData( description = description, isConnected = isConnected, ) - -internal fun EModelEndpoint.toSerialName(): String = when (this) { - EModelEndpoint.AZURE_OPENAI -> "azureOpenAI" - EModelEndpoint.OPENAI -> "openAI" - EModelEndpoint.GOOGLE -> "google" - EModelEndpoint.ANTHROPIC -> "anthropic" - EModelEndpoint.ASSISTANTS -> "assistants" - EModelEndpoint.AZURE_ASSISTANTS -> "azureAssistants" - EModelEndpoint.AGENTS -> "agents" - EModelEndpoint.CUSTOM -> "custom" - EModelEndpoint.BEDROCK -> "bedrock" -} diff --git a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/PresetPromptDelegate.kt b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/PresetPromptDelegate.kt index f9e557c..9f1a1a7 100644 --- a/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/PresetPromptDelegate.kt +++ b/feature/chat/src/commonMain/kotlin/com/garfiec/librechat/feature/chat/viewmodel/delegate/PresetPromptDelegate.kt @@ -6,8 +6,8 @@ import com.garfiec.librechat.core.data.repository.PromptRepository import com.garfiec.librechat.core.model.EModelEndpoint import com.garfiec.librechat.core.model.Preset import com.garfiec.librechat.core.model.PromptGroup -import com.garfiec.librechat.feature.chat.PresetDisplayData -import com.garfiec.librechat.feature.chat.PromptMentionDisplayData +import com.garfiec.librechat.feature.chat.model.PresetDisplayData +import com.garfiec.librechat.feature.chat.model.PromptMentionDisplayData import com.garfiec.librechat.feature.chat.viewmodel.ChatStateHandle import kotlinx.coroutines.launch import co.touchlab.kermit.Logger diff --git a/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/IosChatInput.kt b/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/IosChatInput.kt index 24a61ce..838ca67 100644 --- a/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/IosChatInput.kt +++ b/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/IosChatInput.kt @@ -26,7 +26,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.garfiec.librechat.feature.chat.McpServerDisplayData +import com.garfiec.librechat.feature.chat.model.McpServerDisplayData import librechat_mobile.feature.chat.generated.resources.Res import librechat_mobile.feature.chat.generated.resources.cd_attach_file import librechat_mobile.feature.chat.generated.resources.cd_paste_image diff --git a/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.ios.kt b/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.ios.kt index 75a839f..93e0a80 100644 --- a/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.ios.kt +++ b/feature/chat/src/iosMain/kotlin/com/garfiec/librechat/feature/chat/components/PlatformChatComponents.ios.kt @@ -59,7 +59,7 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.garfiec.librechat.core.common.ChatLayoutConstants import com.garfiec.librechat.core.model.Message -import com.garfiec.librechat.core.model.MessageContentPart +import com.garfiec.librechat.core.model.content.MessageContentPart import com.garfiec.librechat.core.ui.components.AvatarImage import com.garfiec.librechat.core.ui.components.endpointIconPainter import com.garfiec.librechat.core.ui.components.isMonochromeEndpointIcon diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/PresetManagerDisplayData.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/PresetManagerDisplayData.kt similarity index 78% rename from feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/PresetManagerDisplayData.kt rename to feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/PresetManagerDisplayData.kt index 64ff89d..f12eb87 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/PresetManagerDisplayData.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/PresetManagerDisplayData.kt @@ -1,4 +1,4 @@ -package com.garfiec.librechat.feature.settings +package com.garfiec.librechat.feature.settings.model import androidx.compose.runtime.Immutable diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/SettingsDisplayData.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/SharedLinkDisplayData.kt similarity index 51% rename from feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/SettingsDisplayData.kt rename to feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/SharedLinkDisplayData.kt index f381b13..9eb6321 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/SettingsDisplayData.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/SharedLinkDisplayData.kt @@ -1,15 +1,7 @@ -package com.garfiec.librechat.feature.settings +package com.garfiec.librechat.feature.settings.model import androidx.compose.runtime.Immutable -@Immutable -data class UserDisplayData( - val name: String, - val email: String, - val username: String, - val avatar: String?, -) - @Immutable data class SharedLinkDisplayData( val shareId: String, diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/UserDisplayData.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/UserDisplayData.kt new file mode 100644 index 0000000..a08ef64 --- /dev/null +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/model/UserDisplayData.kt @@ -0,0 +1,11 @@ +package com.garfiec.librechat.feature.settings.model + +import androidx.compose.runtime.Immutable + +@Immutable +data class UserDisplayData( + val name: String, + val email: String, + val username: String, + val avatar: String?, +) diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/PresetManagerScreen.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/PresetManagerScreen.kt index 0fa1ec0..d6b9242 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/PresetManagerScreen.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/PresetManagerScreen.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.garfiec.librechat.core.ui.components.EmptyState import com.garfiec.librechat.core.ui.components.LoadingIndicator -import com.garfiec.librechat.feature.settings.PresetManagerDisplayData +import com.garfiec.librechat.feature.settings.model.PresetManagerDisplayData import librechat_mobile.feature.settings.generated.resources.Res import librechat_mobile.feature.settings.generated.resources.* import com.garfiec.librechat.feature.settings.viewmodel.PresetManagerViewModel diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/SharedLinksScreen.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/SharedLinksScreen.kt index 609f04a..54d6142 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/SharedLinksScreen.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/screen/SharedLinksScreen.kt @@ -50,7 +50,7 @@ import androidx.compose.ui.unit.dp import com.garfiec.librechat.core.ui.components.EmptyState import librechat_mobile.feature.settings.generated.resources.Res import librechat_mobile.feature.settings.generated.resources.* -import com.garfiec.librechat.feature.settings.SharedLinkDisplayData +import com.garfiec.librechat.feature.settings.model.SharedLinkDisplayData @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/PresetManagerViewModel.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/PresetManagerViewModel.kt index f1e7fe4..5869949 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/PresetManagerViewModel.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/PresetManagerViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.viewModelScope import com.garfiec.librechat.core.common.result.Result import com.garfiec.librechat.core.data.repository.PresetRepository import com.garfiec.librechat.core.model.Preset -import com.garfiec.librechat.feature.settings.PresetManagerDisplayData +import com.garfiec.librechat.feature.settings.model.PresetManagerDisplayData import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/ResultExtensions.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/ResultExtensions.kt new file mode 100644 index 0000000..3201849 --- /dev/null +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/ResultExtensions.kt @@ -0,0 +1,11 @@ +package com.garfiec.librechat.feature.settings.viewmodel + +import com.garfiec.librechat.core.common.result.ApiException +import com.garfiec.librechat.core.common.result.Result + +/** + * Checks whether a [Result.Error] was caused by a specific HTTP status code. + * Shared across the settings module (e.g. 2FA delegate, account deletion). + */ +internal fun Result.Error.isHttpStatus(statusCode: Int): Boolean = + (exception as? ApiException)?.statusCode == statusCode diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/SettingsViewModel.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/SettingsViewModel.kt index 011d4cf..1b1b414 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/SettingsViewModel.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/SettingsViewModel.kt @@ -30,15 +30,14 @@ import com.garfiec.librechat.core.model.mcp.McpServer import com.garfiec.librechat.core.model.mcp.McpServerStatus import com.garfiec.librechat.core.model.mcp.McpServerType import com.garfiec.librechat.core.model.speech.TtsVoice -import com.garfiec.librechat.feature.settings.SharedLinkDisplayData -import com.garfiec.librechat.feature.settings.UserDisplayData +import com.garfiec.librechat.feature.settings.model.SharedLinkDisplayData +import com.garfiec.librechat.feature.settings.model.UserDisplayData import com.garfiec.librechat.feature.settings.screen.DeviceVoiceInfo import com.garfiec.librechat.feature.settings.viewmodel.delegate.DataManagementDelegate import com.garfiec.librechat.feature.settings.viewmodel.delegate.McpServerDelegate import com.garfiec.librechat.feature.settings.viewmodel.delegate.MemoryManagementDelegate import com.garfiec.librechat.feature.settings.viewmodel.delegate.SpeechSettingsFactory import com.garfiec.librechat.feature.settings.viewmodel.delegate.TwoFactorSecurityDelegate -import com.garfiec.librechat.feature.settings.viewmodel.delegate.isHttpStatus import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/DataManagementDelegate.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/DataManagementDelegate.kt index 211a171..7533235 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/DataManagementDelegate.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/DataManagementDelegate.kt @@ -6,7 +6,7 @@ import com.garfiec.librechat.core.data.repository.ConversationRepository import com.garfiec.librechat.core.data.repository.KeyRepository import com.garfiec.librechat.core.data.repository.ShareRepository import com.garfiec.librechat.core.model.SharedLink -import com.garfiec.librechat.feature.settings.SharedLinkDisplayData +import com.garfiec.librechat.feature.settings.model.SharedLinkDisplayData import com.garfiec.librechat.feature.settings.viewmodel.SettingsStateHandle import kotlinx.coroutines.launch diff --git a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/TwoFactorSecurityDelegate.kt b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/TwoFactorSecurityDelegate.kt index 0117c86..fcbb1b3 100644 --- a/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/TwoFactorSecurityDelegate.kt +++ b/feature/settings/src/commonMain/kotlin/com/garfiec/librechat/feature/settings/viewmodel/delegate/TwoFactorSecurityDelegate.kt @@ -1,7 +1,7 @@ package com.garfiec.librechat.feature.settings.viewmodel.delegate -import com.garfiec.librechat.core.common.result.ApiException import com.garfiec.librechat.core.common.result.Result +import com.garfiec.librechat.feature.settings.viewmodel.isHttpStatus import com.garfiec.librechat.core.data.repository.AuthRepository import com.garfiec.librechat.feature.settings.viewmodel.SettingsStateHandle import kotlinx.coroutines.launch @@ -164,10 +164,3 @@ class TwoFactorSecurityDelegate( stateHandle.update { copy(showBackupCodesOtpDialog = false) } } } - -/** - * Checks whether a [Result.Error] was caused by a specific HTTP status code. - * Shared across the settings module (e.g. 2FA delegate, account deletion). - */ -internal fun Result.Error.isHttpStatus(statusCode: Int): Boolean = - (exception as? ApiException)?.statusCode == statusCode diff --git a/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/LibreChatSDK.kt b/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/LibreChatSDK.kt index 64c5f8c..f847ffb 100644 --- a/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/LibreChatSDK.kt +++ b/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/LibreChatSDK.kt @@ -2,7 +2,7 @@ package com.garfiec.librechat.shared import com.garfiec.librechat.core.network.api.AuthApi import com.garfiec.librechat.core.network.api.ChatApi -import com.garfiec.librechat.core.network.api.LoginResult +import com.garfiec.librechat.core.network.api.dto.LoginResult import com.garfiec.librechat.core.network.client.TokenManager import com.garfiec.librechat.core.network.sse.SseClient diff --git a/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/LibreChatNavHost.kt b/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/LibreChatNavHost.kt index d9b945a..51725b9 100644 --- a/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/LibreChatNavHost.kt +++ b/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/LibreChatNavHost.kt @@ -48,11 +48,6 @@ import com.garfiec.librechat.feature.conversations.navigation.ArchivedConversati import com.garfiec.librechat.feature.conversations.navigation.conversationsEntries import com.garfiec.librechat.feature.files.navigation.Files import com.garfiec.librechat.feature.files.navigation.filesEntries -import com.garfiec.librechat.feature.settings.navigation.SettingsAccount -import com.garfiec.librechat.feature.settings.navigation.SettingsChat -import com.garfiec.librechat.feature.settings.navigation.SettingsData -import com.garfiec.librechat.feature.settings.navigation.SettingsGeneral -import com.garfiec.librechat.feature.settings.navigation.SettingsRoute import com.garfiec.librechat.feature.settings.navigation.SettingsTabbed import com.garfiec.librechat.feature.settings.navigation.memoriesEntry import com.garfiec.librechat.feature.settings.navigation.mcpServersEntry @@ -66,14 +61,6 @@ import librechat_mobile.shared.generated.resources.version_mismatch_title import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel -/** Maps a [SettingsCategory] to its corresponding typed navigation route. */ -fun SettingsCategory.toRoute(): SettingsRoute = when (this) { - SettingsCategory.GENERAL -> SettingsGeneral - SettingsCategory.CHAT -> SettingsChat - SettingsCategory.ACCOUNT -> SettingsAccount - SettingsCategory.DATA -> SettingsData -} - /** * Shared root composable for LibreChat navigation. * Uses ModalNavigationDrawer (phone layout) for the sidebar-first pattern. diff --git a/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/SettingsCategoryExtensions.kt b/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/SettingsCategoryExtensions.kt new file mode 100644 index 0000000..316adda --- /dev/null +++ b/shared/src/commonMain/kotlin/com/garfiec/librechat/shared/navigation/SettingsCategoryExtensions.kt @@ -0,0 +1,15 @@ +package com.garfiec.librechat.shared.navigation + +import com.garfiec.librechat.feature.settings.navigation.SettingsAccount +import com.garfiec.librechat.feature.settings.navigation.SettingsChat +import com.garfiec.librechat.feature.settings.navigation.SettingsData +import com.garfiec.librechat.feature.settings.navigation.SettingsGeneral +import com.garfiec.librechat.feature.settings.navigation.SettingsRoute + +/** Maps a [SettingsCategory] to its corresponding typed navigation route. */ +fun SettingsCategory.toRoute(): SettingsRoute = when (this) { + SettingsCategory.GENERAL -> SettingsGeneral + SettingsCategory.CHAT -> SettingsChat + SettingsCategory.ACCOUNT -> SettingsAccount + SettingsCategory.DATA -> SettingsData +}