Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
false
}

KeyboardCommands.isAcceptAiEvent(keyEvent) -> {
sendEvent(KeyboardEvent.ACCEPT_AI)
false
}

KeyboardCommands.isUndoKeyboardEvent(keyEvent) -> {
sendEvent(KeyboardEvent.UNDO)
false
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package io.writeopia.auth.core.repository

import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.persistence.daos.TokenCommonDao
import io.writeopia.common.utils.persistence.daos.UserCommonDao
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sdk.models.utils.ResultData

class RoomAuthRepository(
private val userDao: UserCommonDao,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import io.ktor.http.ContentType
import io.ktor.http.HttpHeaders
import io.ktor.http.contentType
import io.ktor.http.isSuccess
import io.writeopia.common.utils.ResultData
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.serialization.data.auth.AuthResponse
import io.writeopia.sdk.serialization.data.auth.DeleteAccountResponse
import io.writeopia.sdk.serialization.data.auth.LoginRequest
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.writeopia.auth.core.manager

import io.writeopia.common.utils.ResultData
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.repository.UserRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.writeopia.auth.core.manager

import io.writeopia.auth.core.utils.toModel
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.extensions.toLong
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sql.WriteopiaDb

internal class SqlDelightAuthRepository(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import io.ktor.client.request.setBody
import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.http.isSuccess
import io.writeopia.common.utils.ResultData
import io.writeopia.sdk.models.api.request.documents.FolderDiffRequest
import io.writeopia.sdk.models.document.Document
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.serialization.data.DocumentApi
import io.writeopia.sdk.serialization.extensions.toApi
import io.writeopia.sdk.serialization.extensions.toModel
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.writeopia.core.folders.sync

import io.writeopia.common.utils.ResultData
import io.writeopia.core.folders.api.DocumentsApi
import io.writeopia.core.folders.repository.FolderRepository
import io.writeopia.sdk.models.document.Folder
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.repository.DocumentRepository
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
Expand Down
2 changes: 2 additions & 0 deletions application/core/ollama/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ kotlin {
val commonMain by getting {
dependencies {
implementation(project(":common:endpoints"))
implementation(project(":writeopia_models"))
implementation(project(":writeopia"))

implementation(project(":application:core:connection"))
implementation(project(":application:core:utils"))
Expand Down
2 changes: 1 addition & 1 deletion application/core/ollama/config/ktlint/baseline.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<baseline version="1.0">
<file name="src/commonMain/kotlin/io/writeopia/api/OllamaApi.kt">
<error line="31" column="1" source="standard:max-line-length" />
<error line="33" column="1" source="standard:max-line-length" />
<error line="35" column="1" source="standard:max-line-length" />
<error line="37" column="1" source="standard:max-line-length" />
<error line="39" column="1" source="standard:max-line-length" />
<error line="41" column="1" source="standard:max-line-length" />
</file>
</baseline>
Original file line number Diff line number Diff line change
@@ -1,17 +1,55 @@
package io.writeopia

import io.writeopia.api.OllamaApi
import io.writeopia.common.utils.ResultData
import io.writeopia.persistence.OllamaDao
import io.writeopia.requests.ModelsResponse
import io.writeopia.responses.DownloadModelResponse
import io.writeopia.sdk.ai.AiClient
import io.writeopia.sdk.models.utils.ResultData
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow

private const val SUGGESTION_PROMPT =
"""
Generate a list of options. Start each options with a line break and "-". Generate at most 5 items. Use this context to generate the list:
"""

class OllamaRepository(
private val ollamaApi: OllamaApi,
private val ollamaDao: OllamaDao?
) {
) : AiClient {

private var generatingListItems = false

override suspend fun generateListItems(
model: String,
context: String,
url: String
): ResultData<List<String>> {
try {
if (generatingListItems) return ResultData.Loading()

generatingListItems = true
val result = ollamaApi.generateReply(model, "$SUGGESTION_PROMPT $context", url)

return if (result.done == true && result.response?.isNotEmpty() == true) {
result.response
.split("\n")
.filter { line -> line.trim().startsWith("-") }
.filter { line -> line.isNotEmpty() }
.map { line -> line.substring(1).trim() }
.let { list ->
ResultData.Complete(list)
}
} else {
ResultData.Error()
}
} catch (e: Exception) {
return ResultData.Error()
} finally {
generatingListItems = false
}
}

suspend fun generateReply(model: String, prompt: String, url: String): String {
return ollamaApi.generateReply(model, prompt, url).response ?: ""
Expand Down Expand Up @@ -53,7 +91,7 @@ class OllamaRepository(
refreshConfiguration(id)
}

suspend fun getOllamaSelectedModel(userId: String): String? =
override suspend fun getSelectedModel(userId: String): String? =
ollamaDao?.getConfiguration(userId)?.selectedModel

fun listenForConfiguration(id: String) =
Expand All @@ -63,7 +101,7 @@ class OllamaRepository(
ollamaDao?.refreshStateOfId(id)
}

suspend fun getConfiguredOllamaUrl(id: String = "disconnected_user"): String? =
override suspend fun getConfiguredUrl(id: String): String? =
ollamaDao?.getConfiguration(id)?.url

suspend fun deleteModel(model: String, url: String): ResultData<Boolean> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,19 @@ import io.ktor.http.isSuccess
import io.ktor.utils.io.ByteReadChannel
import io.ktor.utils.io.readUTF8Line
import io.writeopia.app.endpoints.EndPoints
import io.writeopia.common.utils.ResultData
import io.writeopia.requests.DeleteModelRequest
import io.writeopia.requests.DownloadModelRequest
import io.writeopia.requests.ModelsResponse
import io.writeopia.requests.OllamaGenerateRequest
import io.writeopia.responses.DownloadModelResponse
import io.writeopia.responses.OllamaResponse
import io.writeopia.sdk.models.utils.ResultData
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.isActive
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.serialization.json.Json

private const val SUMMARY_PROMPT =
Expand All @@ -46,15 +48,18 @@ class OllamaApi(
private val json: Json
) {

private val generateReplyMutex = Mutex()

suspend fun generateReply(
model: String,
prompt: String,
url: String
): OllamaResponse =
): OllamaResponse = generateReplyMutex.withLock {
client.post("$url/api/${EndPoints.ollamaGenerate()}") {
contentType(ContentType.Application.Json)
setBody(OllamaGenerateRequest(model, prompt, false))
}.body<OllamaResponse>()
}

fun downloadModel(
model: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.writeopia.controller

import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.download.DownloadState
import io.writeopia.sdk.models.utils.ResultData
import kotlinx.coroutines.flow.StateFlow

interface OllamaConfigController {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import kotlinx.coroutines.flow.StateFlow

interface OllamaDao {

suspend fun getConfiguration(id: String = "disconnected_user"): OllamaConfig?
suspend fun getConfiguration(id: String): OllamaConfig?

suspend fun saveConfiguration(id: String, ollamaConfig: OllamaConfig)

fun listenForConfiguration(id: String = "disconnected_user"): StateFlow<OllamaConfig?>
fun listenForConfiguration(id: String): StateFlow<OllamaConfig?>

suspend fun refreshStateOfId(id: String)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class UiConfigurationPreferenceDao(

override suspend fun getConfigurationByUserId(userId: String): UiConfigurationEntity =
UiConfigurationEntity(
userId = "disconnected_user",
userId = userId,
sharedPreferences.getString(
COLOR_THEME_OPTION,
ColorThemeOption.LIGHT.theme
Expand All @@ -44,7 +44,7 @@ class UiConfigurationPreferenceDao(

override fun listenForConfigurationByUserId(userId: String): Flow<UiConfigurationEntity?> {
runBlocking {
getConfigurationByUserId("disconnected_user").let {
getConfigurationByUserId(userId).let {
themeState.value = it
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,8 @@ object KeyboardCommands {
fun isCancelEvent(keyEvent: KeyEvent) =
keyEvent.key.keyCode == Key.Escape.keyCode &&
keyEvent.type == KeyEventType.KeyUp

fun isAcceptAiEvent(keyEvent: KeyEvent) =
keyEvent.key.keyCode == Key.Tab.keyCode &&
keyEvent.type == KeyEventType.KeyUp
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import io.writeopia.account.viewmodel.AccountMenuViewModel
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.toBoolean
import io.writeopia.sdk.models.utils.toBoolean
import io.writeopia.commonui.buttons.AccentButton
import io.writeopia.model.ColorThemeOption
import io.writeopia.resources.WrStrings
import io.writeopia.sdk.models.utils.ResultData
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.download.DownloadState
import io.writeopia.common.utils.icons.WrIcons
import io.writeopia.commonui.SettingsPanel
Expand All @@ -65,6 +64,7 @@ import io.writeopia.commonui.workplace.WorkspaceConfigurationDialog
import io.writeopia.model.ColorThemeOption
import io.writeopia.resources.WrStrings
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.theme.WriteopiaTheme
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package io.writeopia.account.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.toBoolean
import io.writeopia.sdk.models.utils.toBoolean
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sdk.models.utils.ResultData
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.writeopia.account.viewmodel

import io.writeopia.common.utils.ResultData
import io.writeopia.sdk.models.utils.ResultData
import kotlinx.coroutines.flow.StateFlow

interface AccountMenuViewModel {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import io.writeopia.auth.utils.loginScreen
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.icons.WrIcons
import io.writeopia.resources.WrStrings
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.theme.WriteopiaTheme
import kotlinx.coroutines.flow.StateFlow

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.writeopia.auth.core.data.AuthApi
import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.map
import io.writeopia.sdk.models.utils.map
import io.writeopia.di.AppConnectionInjection
import io.writeopia.sdk.models.user.Tier
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.serialization.data.toModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import io.writeopia.auth.utils.loginScreen
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.icons.WrIcons
import io.writeopia.resources.WrStrings
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.theme.WriteopiaTheme
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.auth.core.data.AuthApi
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.map
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.models.utils.map
import io.writeopia.sdk.serialization.data.toModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import io.writeopia.auth.utils.loginScreen
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.icons.WrIcons
import io.writeopia.resources.WrStrings
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.theme.WriteopiaTheme
import kotlinx.coroutines.flow.StateFlow

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.writeopia.auth.core.data.AuthApi
import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.map
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.sdk.models.utils.map
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ class EditorKmpInjector private constructor(
private fun provideDocumentRepository(): DocumentRepository =
repositoryInjection.provideDocumentRepository()

private fun provideWriteopiaManager(): WriteopiaManager = WriteopiaManager()
private fun provideWriteopiaManager(): WriteopiaManager = WriteopiaManager(
aiClient = ollamaInjection?.provideRepository()
)

private fun provideWriteopiaStateManager(
authRepository: AuthRepository = authCoreInjection.provideAuthRepository(),
Expand Down
Loading