diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b6f82e4a38..2c8d83b453 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: true matrix: - platform-version: [233, 241 ] + platform-version: [223, 233, 241 ] env: ORG_GRADLE_PROJECT_platformVersion: ${{ matrix.platform-version }} diff --git a/build.gradle.kts b/build.gradle.kts index 6dc8953f82..abfd576a83 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -177,6 +177,11 @@ configure( testOutput(sourceSets.test.get().output.classesDirs) + if (platformVersion == 223) { + // https://mvnrepository.com/artifact/org.jetbrains/annotations + implementation("org.jetbrains:annotations:26.0.1") + } + intellijPlatform { testFramework(TestFrameworkType.Bundled) } @@ -408,12 +413,13 @@ project(":core") { testFramework(TestFrameworkType.Bundled) } - implementation("com.theokanning.openai-gpt3-java:service:0.18.2") - implementation("com.squareup.okhttp3:okhttp:4.4.1") - implementation("com.squareup.okhttp3:okhttp-sse:4.4.1") + implementation("io.reactivex.rxjava3:rxjava:3.1.10") - implementation("com.squareup.retrofit2:converter-jackson:2.9.0") - implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:okhttp-sse:4.12.0") + + implementation("com.squareup.retrofit2:converter-jackson:2.11.0") + implementation("com.squareup.retrofit2:converter-gson:2.11.0") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.14.2") implementation("com.fasterxml.jackson.core:jackson-databind:2.14.2") @@ -424,31 +430,25 @@ project(":core") { implementation("com.nfeld.jsonpathkt:jsonpathkt:2.0.1") - implementation("org.jetbrains:markdown:0.6.1") + implementation("org.jetbrains:markdown:0.7.3") // chocolate factory // follow: https://onnxruntime.ai/docs/get-started/with-java.html // implementation("com.microsoft.onnxruntime:onnxruntime:1.18.0") // implementation("ai.djl.huggingface:tokenizers:0.29.0") - implementation("cc.unitmesh:cocoa-core:1.0.0") - implementation("cc.unitmesh:document:1.0.0") +// implementation("cc.unitmesh:document:1.0.0") // kanban - implementation("org.kohsuke:github-api:1.314") - implementation("org.gitlab4j:gitlab4j-api:5.3.0") + implementation("org.kohsuke:github-api:1.326") + implementation("org.gitlab4j:gitlab4j-api:5.8.0") // template engine implementation("org.apache.velocity:velocity-engine-core:2.3") - // http request/response - implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.14.2") - // token count implementation("com.knuddels:jtokkit:1.0.0") - implementation("org.apache.commons:commons-text:1.12.0") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") // junit testImplementation("io.kotest:kotest-assertions-core:5.7.2") diff --git a/core/src/222/main/kotlin/cc/unitmesh/devti/intentions/IntentionHelperUtil.kt b/core/src/223/main/kotlin/cc/unitmesh/devti/intentions/IntentionHelperUtil.kt similarity index 100% rename from core/src/222/main/kotlin/cc/unitmesh/devti/intentions/IntentionHelperUtil.kt rename to core/src/223/main/kotlin/cc/unitmesh/devti/intentions/IntentionHelperUtil.kt diff --git a/core/src/222/main/kotlin/cc/unitmesh/devti/ui.kt b/core/src/223/main/kotlin/cc/unitmesh/devti/ui.kt similarity index 100% rename from core/src/222/main/kotlin/cc/unitmesh/devti/ui.kt rename to core/src/223/main/kotlin/cc/unitmesh/devti/ui.kt diff --git a/core/src/222/main/kotlin/cc/unitmesh/devti/vcs/VcsUtil.kt b/core/src/223/main/kotlin/cc/unitmesh/devti/vcs/VcsUtil.kt similarity index 100% rename from core/src/222/main/kotlin/cc/unitmesh/devti/vcs/VcsUtil.kt rename to core/src/223/main/kotlin/cc/unitmesh/devti/vcs/VcsUtil.kt diff --git a/core/src/222/main/kotlin/com/intellij/temporary/gui/block/AutoDevCoolBorder.kt b/core/src/223/main/kotlin/com/intellij/temporary/gui/block/AutoDevCoolBorder.kt similarity index 100% rename from core/src/222/main/kotlin/com/intellij/temporary/gui/block/AutoDevCoolBorder.kt rename to core/src/223/main/kotlin/com/intellij/temporary/gui/block/AutoDevCoolBorder.kt diff --git a/core/src/222/main/kotlin/com/intellij/temporary/gui/block/TextBlockView.kt b/core/src/223/main/kotlin/com/intellij/temporary/gui/block/TextBlockView.kt similarity index 100% rename from core/src/222/main/kotlin/com/intellij/temporary/gui/block/TextBlockView.kt rename to core/src/223/main/kotlin/com/intellij/temporary/gui/block/TextBlockView.kt diff --git a/core/src/222/main/kotlin/com/intellij/temporary/inlay/presentation/LLMTextInlayPainter.kt b/core/src/223/main/kotlin/com/intellij/temporary/inlay/presentation/LLMTextInlayPainter.kt similarity index 100% rename from core/src/222/main/kotlin/com/intellij/temporary/inlay/presentation/LLMTextInlayPainter.kt rename to core/src/223/main/kotlin/com/intellij/temporary/inlay/presentation/LLMTextInlayPainter.kt diff --git a/core/src/222/main/kotlin/com/intellij/temporary/inlay/presentation/PresentationUtil.kt b/core/src/223/main/kotlin/com/intellij/temporary/inlay/presentation/PresentationUtil.kt similarity index 100% rename from core/src/222/main/kotlin/com/intellij/temporary/inlay/presentation/PresentationUtil.kt rename to core/src/223/main/kotlin/com/intellij/temporary/inlay/presentation/PresentationUtil.kt diff --git a/core/src/222/main/resources/META-INF/autodev-core.xml b/core/src/223/main/resources/META-INF/autodev-core.xml similarity index 100% rename from core/src/222/main/resources/META-INF/autodev-core.xml rename to core/src/223/main/resources/META-INF/autodev-core.xml diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/LlmFactory.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/LlmFactory.kt index 627872560c..7757b6b6c1 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/llms/LlmFactory.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/llms/LlmFactory.kt @@ -2,9 +2,6 @@ package cc.unitmesh.devti.llms import cc.unitmesh.devti.llms.custom.CustomLLMProvider import cc.unitmesh.devti.llms.custom.InlayCustomLLMProvider -import cc.unitmesh.devti.llms.openai.OpenAIProvider -import cc.unitmesh.devti.settings.AIEngines -import cc.unitmesh.devti.settings.AutoDevSettingsState import cc.unitmesh.devti.settings.coder.AutoDevCoderSettingService import com.intellij.openapi.components.Service import com.intellij.openapi.components.service @@ -13,15 +10,8 @@ import com.intellij.openapi.project.Project @Service class LlmFactory { - private val aiEngine: AIEngines - get() = AIEngines.values() - .find { it.name.lowercase() == AutoDevSettingsState.getInstance().aiEngine.lowercase() } ?: AIEngines.OpenAI - fun create(project: Project): LLMProvider { - return when (aiEngine) { - AIEngines.OpenAI -> project.getService(OpenAIProvider::class.java) - AIEngines.Custom -> project.getService(CustomLLMProvider::class.java) - } + return project.getService(CustomLLMProvider::class.java) } fun createForInlayCodeComplete(project: Project): LLMProvider { diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomLLMProvider.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomLLMProvider.kt index 52bceb4fcf..f898557ba1 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomLLMProvider.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomLLMProvider.kt @@ -24,8 +24,15 @@ class CustomLLMProvider(val project: Project) : LLMProvider, CustomSSEProcessor( private val url get() = autoDevSettingsState.customEngineServer private val key get() = autoDevSettingsState.customEngineToken - override val requestFormat: String get() = autoDevSettingsState.customEngineRequestFormat - override val responseFormat get() = autoDevSettingsState.customEngineResponseFormat + private val modelName: String + get() = AutoDevSettingsState.getInstance().customModel + + override val requestFormat: String get() = autoDevSettingsState.customEngineRequestFormat.ifEmpty { + """{ "customFields": {"model": "$modelName", "temperature": 0.0, "stream": true} }""" + } + override val responseFormat get() = autoDevSettingsState.customEngineResponseFormat.ifEmpty { + "\$.choices[0].delta.content" + } private var client = OkHttpClient() private val timeout = Duration.ofSeconds(defaultTimeout) @@ -69,11 +76,7 @@ class CustomLLMProvider(val project: Project) : LLMProvider, CustomSSEProcessor( clearMessage() } - return if (autoDevSettingsState.customEngineResponseType == ResponseType.SSE.name) { - streamSSE(call, promptText, keepHistory, messages) - } else { - streamJson(call, promptText, messages) - } + return streamSSE(call, promptText, keepHistory, messages) } fun prompt(instruction: String, input: String): String { diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomSSEProcessor.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomSSEProcessor.kt index c7309fa6c3..f3820e2571 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomSSEProcessor.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/CustomSSEProcessor.kt @@ -12,11 +12,9 @@ import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project import com.nfeld.jsonpathkt.JsonPath import com.nfeld.jsonpathkt.extension.read -import com.theokanning.openai.completion.chat.ChatCompletionResult -import com.theokanning.openai.service.SSE -import io.reactivex.BackpressureStrategy -import io.reactivex.Flowable -import io.reactivex.FlowableEmitter +import io.reactivex.rxjava3.core.BackpressureStrategy +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.FlowableEmitter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/OpenAIDto.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/OpenAIDto.kt new file mode 100644 index 0000000000..b63751e3fd --- /dev/null +++ b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/OpenAIDto.kt @@ -0,0 +1,46 @@ +package cc.unitmesh.devti.llms.custom + +import com.fasterxml.jackson.annotation.JsonAlias +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.databind.JsonNode + +data class ChatFunctionCall( + val name: String? = null, + val arguments: JsonNode? = null, +) + +data class ChatMessage( + val role: String, + @JsonInclude + val content: String? = null, + val name: String? = null, + @JsonProperty("function_call") + val functionCall: ChatFunctionCall? = null, +) + +data class ChatCompletionChoice( + val index: Int? = null, + @JsonAlias("delta") + val message: ChatMessage? = null, + @JsonProperty("finish_reason") + val finishReason: String? = null, +) + +data class Usage( + @JsonProperty("prompt_tokens") + val promptTokens: Long = 0, + @JsonProperty("completion_tokens") + val completionTokens: Long = 0, + @JsonProperty("total_tokens") + val totalTokens: Long = 0, +) + +data class ChatCompletionResult( + val id: String? = null, + val `object`: String? = null, + val created: Long = 0, + val model: String? = null, + val choices: List, + val usage: Usage? = null, +) \ No newline at end of file diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/ResponseBodyCallback.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/ResponseBodyCallback.kt index bf5d247f83..e6bb9e220e 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/ResponseBodyCallback.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/ResponseBodyCallback.kt @@ -22,10 +22,7 @@ package cc.unitmesh.devti.llms.custom import com.intellij.openapi.diagnostic.logger -import com.theokanning.openai.service.OpenAiService -import com.theokanning.openai.service.SSE -import com.theokanning.openai.service.SSEFormatException -import io.reactivex.FlowableEmitter +import io.reactivex.rxjava3.core.FlowableEmitter import okhttp3.Call import okhttp3.Callback import okhttp3.Response @@ -85,7 +82,7 @@ class ResponseBodyCallback(private val emitter: FlowableEmitter, private va val eventName = line!!.substring(6).trim { it <= ' ' } if (eventName == "ping") { // skip ping event and data - emitter.onNext(sse) + emitter.onNext(sse!!) emitter.onNext(sse) } @@ -111,7 +108,7 @@ class ResponseBodyCallback(private val emitter: FlowableEmitter, private va } else -> { - throw SSEFormatException("Invalid sse format! '$line'") + throw AutoDevHttpException("Invalid sse format! '$line'", response.code) } } } @@ -137,8 +134,4 @@ class ResponseBodyCallback(private val emitter: FlowableEmitter, private va override fun onFailure(call: Call, e: IOException) { emitter.onError(e) } - - companion object { - private val mapper = OpenAiService.defaultObjectMapper() - } } diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/SSE.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/SSE.kt new file mode 100644 index 0000000000..f9e17204e4 --- /dev/null +++ b/core/src/main/kotlin/cc/unitmesh/devti/llms/custom/SSE.kt @@ -0,0 +1,14 @@ +package cc.unitmesh.devti.llms.custom + +class SSE(val data: String) { + fun toBytes(): ByteArray { + return String.format("data: %s\n\n", this.data).toByteArray() + } + + val isDone: Boolean + get() = DONE_DATA.equals(this.data, ignoreCase = true) + + companion object { + private const val DONE_DATA = "[DONE]" + } +} diff --git a/core/src/main/kotlin/cc/unitmesh/devti/llms/openai/OpenAIProvider.kt b/core/src/main/kotlin/cc/unitmesh/devti/llms/openai/OpenAIProvider.kt deleted file mode 100644 index 90fd19fbc5..0000000000 --- a/core/src/main/kotlin/cc/unitmesh/devti/llms/openai/OpenAIProvider.kt +++ /dev/null @@ -1,177 +0,0 @@ -package cc.unitmesh.devti.llms.openai - -import cc.unitmesh.devti.gui.chat.ChatRole -import cc.unitmesh.devti.llms.LLMProvider -import cc.unitmesh.devti.coder.recording.EmptyRecording -import cc.unitmesh.devti.coder.recording.JsonlRecording -import cc.unitmesh.devti.coder.recording.Recording -import cc.unitmesh.devti.coder.recording.RecordingInstruction -import cc.unitmesh.devti.settings.AutoDevSettingsState -import cc.unitmesh.devti.settings.coder.coderSetting -import cc.unitmesh.devti.settings.SELECT_CUSTOM_MODEL -import com.intellij.openapi.components.Service -import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.diagnostic.logger -import com.intellij.openapi.project.Project -import com.theokanning.openai.client.OpenAiApi -import com.theokanning.openai.completion.chat.ChatCompletionRequest -import com.theokanning.openai.completion.chat.ChatMessage -import com.theokanning.openai.completion.chat.ChatMessageRole -import com.theokanning.openai.service.OpenAiService -import com.theokanning.openai.service.OpenAiService.defaultClient -import com.theokanning.openai.service.OpenAiService.defaultObjectMapper -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import retrofit2.Retrofit -import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory -import retrofit2.converter.jackson.JacksonConverterFactory -import java.time.Duration - - -@Service(Service.Level.PROJECT) -class OpenAIProvider(val project: Project) : LLMProvider { - private val timeout = Duration.ofSeconds(defaultTimeout) - private val openAiVersion: String - get() { - val model = AutoDevSettingsState.getInstance().openAiModel - if(model == SELECT_CUSTOM_MODEL) { - return AutoDevSettingsState.getInstance().customModel - } - return model - } - private val openAiKey: String - get() = AutoDevSettingsState.getInstance().openAiKey - - private val maxTokenLength: Int - get() = AutoDevSettingsState.getInstance().fetchMaxTokenLength() - - private val messages: MutableList = ArrayList() - private var historyMessageLength: Int = 0 - - private val service: OpenAiService - get() { - if (openAiKey.isEmpty()) { - throw IllegalStateException("You LLM server Key is empty") - } - - var openAiProxy = AutoDevSettingsState.getInstance().customOpenAiHost - return if (openAiProxy.isEmpty()) { - OpenAiService(openAiKey, timeout) - } else { - if (!openAiProxy.endsWith("/")) { - openAiProxy += "/" - } - - val mapper = defaultObjectMapper() - val client = defaultClient(openAiKey, timeout) - - val retrofit = Retrofit.Builder() - .baseUrl(openAiProxy) - .client(client) - .addConverterFactory(JacksonConverterFactory.create(mapper)) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .build() - - val api = retrofit.create(OpenAiApi::class.java) - OpenAiService(api) - } - } - - private val recording: Recording - get() { - if (project.coderSetting.state.recordingInLocal) { - return project.service() - } - - return EmptyRecording() - } - - override fun clearMessage() { - messages.clear() - historyMessageLength = 0 - } - - override fun appendLocalMessage(msg: String, role: ChatRole) { - val message = ChatMessage(role.roleName(), msg) - messages.add(message) - } - - override fun prompt(promptText: String): String { - val completionRequest = prepareRequest(promptText, "", true) - - val completion = service.createChatCompletion(completionRequest) - val output = completion - .choices[0].message.content - - return output - } - - @OptIn(ExperimentalCoroutinesApi::class) - override fun stream(promptText: String, systemPrompt: String, keepHistory: Boolean): Flow { - if ((!keepHistory) || project.coderSetting.state.noChatHistory) { - clearMessage() - } - - var output = "" - val completionRequest = prepareRequest(promptText, systemPrompt, keepHistory) - - return callbackFlow { - withContext(Dispatchers.IO) { - service.streamChatCompletion(completionRequest) - .doOnError { error -> - logger.error("Error in stream", error) - trySend(error.message ?: "Error occurs") - } - .blockingForEach { response -> - if (response.choices.isNotEmpty()) { - val completion = response.choices[0].message - if (completion != null && completion.content != null) { - output += completion.content - trySend(completion.content) - } - } - } - - recording.write(RecordingInstruction(promptText, output)) - messages.add(ChatMessage(ChatMessageRole.ASSISTANT.value(), output)) - - if ((!keepHistory) || project.coderSetting.state.noChatHistory) { - clearMessage() - } - - close() - } - } - } - - private fun prepareRequest(promptText: String, systemPrompt: String, keepHistory: Boolean): ChatCompletionRequest? { - if (systemPrompt.isNotEmpty()) { - val systemMessage = ChatMessage(ChatMessageRole.SYSTEM.value(), systemPrompt) - messages.add(systemMessage) - } - - val userMessage = ChatMessage(ChatMessageRole.USER.value(), promptText) - - historyMessageLength += promptText.length - if (historyMessageLength > maxTokenLength) { - messages.clear() - } - - messages.add(userMessage) - logger.info("messages length: ${messages.size}") - - val chatCompletionRequest = ChatCompletionRequest.builder() - .model(openAiVersion) - .temperature(0.0) - .messages(messages) - .build() - - return chatCompletionRequest - } - - companion object { - private val logger: Logger = logger() - } -} diff --git a/core/src/main/kotlin/cc/unitmesh/devti/runconfig/AutoDevRunProfileState.kt b/core/src/main/kotlin/cc/unitmesh/devti/runconfig/AutoDevRunProfileState.kt index 64691ae00e..7fa59f1f61 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/runconfig/AutoDevRunProfileState.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/runconfig/AutoDevRunProfileState.kt @@ -9,6 +9,7 @@ import cc.unitmesh.devti.llms.LlmFactory import cc.unitmesh.devti.provider.DevFlowProvider import cc.unitmesh.devti.runconfig.options.AutoCRUDConfigurationOptions import cc.unitmesh.devti.settings.AutoDevSettingsState +import cc.unitmesh.devti.settings.devops.devopsPromptsSettings import com.intellij.execution.ExecutionResult import com.intellij.execution.Executor import com.intellij.execution.configurations.RunProfileState @@ -24,18 +25,11 @@ class AutoDevRunProfileState( val project: Project, val options: AutoCRUDConfigurationOptions, ) : RunProfileState { - private val githubToken: String - private val gitlabToken: String - private val gitType: String - private val gitlabUrl: String - - init { - val instance = AutoDevSettingsState.getInstance() - githubToken = instance.githubToken - gitlabToken = instance.gitlabToken - gitType = instance.gitType - gitlabUrl = instance.gitlabUrl - } + val state = project.devopsPromptsSettings.state + private val githubToken: String = state.githubToken + private val gitlabToken: String = state.gitlabToken + private val gitType: String = state.gitType + private val gitlabUrl: String = state.gitlabUrl override fun execute(executor: Executor?, runner: ProgramRunner<*>): ExecutionResult? { val kanban: Kanban = when (gitType.lowercase()) { @@ -52,7 +46,6 @@ class AutoDevRunProfileState( } } - // TODO: support other language val flowProvider = DevFlowProvider.flowProvider("java") if (flowProvider == null) { diff --git a/core/src/main/kotlin/cc/unitmesh/devti/settings/AutoDevSettingsState.kt b/core/src/main/kotlin/cc/unitmesh/devti/settings/AutoDevSettingsState.kt index 3687d79745..9339bab303 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/settings/AutoDevSettingsState.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/settings/AutoDevSettingsState.kt @@ -14,26 +14,16 @@ import java.time.format.DateTimeFormatter @Service(Service.Level.APP) @State(name = "cc.unitmesh.devti.settings.DevtiSettingsState", storages = [Storage("DevtiSettings.xml")]) class AutoDevSettingsState : PersistentStateComponent { - var gitType = DEFAULT_GIT_TYPE - var githubToken = "" - var gitlabToken = "" - var gitlabUrl = "" var openAiKey = "" - var openAiModel = DEFAULT_AI_MODEL var delaySeconds = "" - var aiEngine = DEFAULT_AI_ENGINE var customOpenAiHost = "" var customEngineServer = "" var customEngineToken = "" var customPrompts = "" var customModel = "" - var customEngineResponseType = ResponseType.SSE.name - /** - * should be a json path - */ - var customEngineResponseFormat = "" + var customEngineResponseFormat = "\$.choices[0].delta.content" /** * should be a json * { @@ -44,11 +34,7 @@ class AutoDevSettingsState : PersistentStateComponent { * * @see docs/custom-llm-server.md */ - var customEngineRequestFormat = "" - - @OptionTag(value = "lastCheckTime", converter = ZonedDateTimeConverter::class) - var lastCheck: ZonedDateTime? = null - + var customEngineRequestFormat = """{ "customFields": {"model": "deepseek-chat", "temperature": 0.0, "stream": true} }""" var language = DEFAULT_HUMAN_LANGUAGE var maxTokenLength = MAX_TOKEN_LENGTH.toString() diff --git a/core/src/main/kotlin/cc/unitmesh/devti/settings/Constants.kt b/core/src/main/kotlin/cc/unitmesh/devti/settings/Constants.kt index 34b29a7b87..2e57c1be15 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/settings/Constants.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/settings/Constants.kt @@ -1,23 +1,13 @@ package cc.unitmesh.devti.settings -val OPENAI_MODEL = arrayOf("gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4", "custom") val AI_ENGINES = arrayOf("OpenAI", "Custom") -enum class AIEngines { - OpenAI, Custom -} - -val GIT_TYPE = arrayOf("Github" , "Gitlab") -val DEFAULT_GIT_TYPE = GIT_TYPE[0] - enum class ResponseType { SSE, JSON; } val DEFAULT_AI_ENGINE = AI_ENGINES[0] -val DEFAULT_AI_MODEL = OPENAI_MODEL[0] - @Suppress("unused") enum class HUMAN_LANGUAGES(val abbr: String, val display: String) { ENGLISH("en", "English"), diff --git a/core/src/main/kotlin/cc/unitmesh/devti/settings/LLMSettingComponent.kt b/core/src/main/kotlin/cc/unitmesh/devti/settings/LLMSettingComponent.kt index c2cf58a930..7b494ea66c 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/settings/LLMSettingComponent.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/settings/LLMSettingComponent.kt @@ -8,37 +8,28 @@ import com.intellij.ide.actions.RevealFileAction import com.intellij.idea.LoggerFactory import com.intellij.openapi.project.ProjectManager import com.intellij.ui.EditorTextField +import com.intellij.ui.JBColor import com.intellij.ui.dsl.builder.panel import com.intellij.util.ui.FormBuilder import javax.swing.JPanel class LLMSettingComponent(private val settings: AutoDevSettingsState) { // 以下 LLMParam 变量不要改名,因为这些变量名会被用作配置文件的 key - private val languageParam by LLMParam.creating({ LanguageChangedCallback.language = it}) { - ComboBox(settings.language, HUMAN_LANGUAGES.values().map { it.display }) } - private val aiEngineParam by LLMParam.creating(onChange = { onSelectedEngineChanged() }) { - ComboBox(settings.aiEngine, AIEngines.values().toList().map { it.name }) + private val languageParam by LLMParam.creating({ LanguageChangedCallback.language = it }) { + ComboBox(settings.language, HUMAN_LANGUAGES.values().map { it.display }) } + private val delaySecondsParam by LLMParam.creating { Editable(settings.delaySeconds) } private val maxTokenLengthParam by LLMParam.creating { Editable(settings.maxTokenLength) } - private val openAIModelsParam by LLMParam.creating { ComboBox(settings.openAiModel, OPENAI_MODEL.toList()) } - private val openAIKeyParam by LLMParam.creating { Password(settings.openAiKey) } private val customModelParam: LLMParam by LLMParam.creating { Editable(settings.customModel) } private val customOpenAIHostParam: LLMParam by LLMParam.creating { Editable(settings.customOpenAiHost) } - private val gitTypeParam: LLMParam by LLMParam.creating { ComboBox(settings.gitType, GIT_TYPE.toList()) } - private val gitLabUrlParam: LLMParam by LLMParam.creating { Editable(settings.gitlabUrl) } - private val gitLabTokenParam: LLMParam by LLMParam.creating { Password(settings.gitlabToken) } - - private val gitHubTokenParam by LLMParam.creating { Password(settings.githubToken) } private val customEngineServerParam by LLMParam.creating { Editable(settings.customEngineServer) } private val customEngineTokenParam by LLMParam.creating { Password(settings.customEngineToken) } - private val customEngineResponseTypeParam by LLMParam.creating { ComboBox(settings.customEngineResponseType, ResponseType.values().map { it.name }.toList()) } private val customEngineResponseFormatParam by LLMParam.creating { Editable(settings.customEngineResponseFormat) } private val customEngineRequestBodyFormatParam by LLMParam.creating { Editable(settings.customEngineRequestFormat) } - val project = ProjectManager.getInstance().openProjects.firstOrNull() private val customEnginePrompt: EditorTextField by lazy { JsonLanguageField( @@ -49,33 +40,14 @@ class LLMSettingComponent(private val settings: AutoDevSettingsState) { ).apply { LanguageChangedCallback.placeholder("autodev.custom.prompt.placeholder", this, 1) } } - private val llmGroups = mapOf>( - AIEngines.OpenAI to listOf( - openAIModelsParam, - openAIKeyParam, - customModelParam, - customOpenAIHostParam, - ), - AIEngines.Custom to listOf( - customEngineResponseTypeParam, - customEngineServerParam, - customEngineTokenParam, - customEngineResponseFormatParam, - customEngineRequestBodyFormatParam, - ), - ) - - - private val onSelectedEngineChanged: () -> Unit = { - applySettings(settings, updateParams = false) - } - private val _currentSelectedEngine: AIEngines - get() = AIEngines.values().firstOrNull { it.name.lowercase() == aiEngineParam.value.lowercase() } ?: AIEngines.OpenAI - private val currentLLMParams: List get() { - return llmGroups[_currentSelectedEngine] - ?: throw IllegalStateException("Unknown engine: ${aiEngineParam.value}") + return listOf( + customEngineServerParam, + customEngineTokenParam, + customEngineResponseFormatParam, + customEngineRequestBodyFormatParam, + ) } private fun FormBuilder.addLLMParams(llmParams: List): FormBuilder = apply { @@ -116,46 +88,31 @@ class LLMSettingComponent(private val settings: AutoDevSettingsState) { fun applySettings(settings: AutoDevSettingsState, updateParams: Boolean = false) { - - if (updateParams && engineChanged(settings).also { updateParams(settings) }) { - return - } panel.removeAll() formBuilder - .addLLMParam(languageParam) - .addSeparator() - .addTooltip("For Custom LLM, config Custom Engine Server & Custom Engine Token & Custom Response Format") - .addLLMParam(aiEngineParam) - .addLLMParam(maxTokenLengthParam) - .addLLMParam(delaySecondsParam) + .addLLMParam(languageParam) .addSeparator() - .addTooltip("Select Git Type") - .addLLMParam(gitTypeParam) - .addTooltip("GitHub Token is for AutoCRUD Model") - .addLLMParam(gitHubTokenParam) - .addTooltip("GitLab options is for AutoCRUD Model") - .addLLMParam(gitLabUrlParam) - .addLLMParam(gitLabTokenParam) - .addSeparator() - .addComponent(panel { - row { - comment("For OpenAI LLM, config OpenAI Key & OpenAI Model & Custom OpenAI Host Open Log for Debug") { - RevealFileAction.openFile(LoggerFactory.getLogFilePath()) - } - } - }) - .addLLMParams(currentLLMParams) - .addComponent(panel { - if (project != null) { - testLLMConnection(project) + .addLLMParams(currentLLMParams) + .addLLMParam(maxTokenLengthParam) + .addLLMParam(delaySecondsParam) + .addSeparator() + .addComponent(panel { + if (project != null) { + testLLMConnection(project) + } + + row { + text(AutoDevBundle.message("settings.autodev.coder.testConnectionButton.tips")).apply { + this.component.foreground = JBColor.RED } - }) - .addVerticalGap(2) - .addSeparator() - .addLabeledComponent(jBLabel("settings.autodev.coder.customEnginePrompt", 1), customEnginePrompt, 1, true) - .addComponentFillVertically(JPanel(), 0) - .panel + } + }) + .addVerticalGap(2) + .addSeparator() + .addLabeledComponent(jBLabel("settings.autodev.coder.customEnginePrompt", 1), customEnginePrompt, 1, true) + .addComponentFillVertically(JPanel(), 0) + .panel panel.invalidate() panel.repaint() @@ -164,19 +121,11 @@ class LLMSettingComponent(private val settings: AutoDevSettingsState) { private fun updateParams(settings: AutoDevSettingsState) { settings.apply { maxTokenLengthParam.value = maxTokenLength - gitTypeParam.value = gitType - gitHubTokenParam.value = githubToken - gitLabTokenParam.value = gitlabToken - gitLabUrlParam.value = gitlabUrl - openAIKeyParam.value = openAiKey customModelParam.value = customModel customOpenAIHostParam.value = customOpenAiHost customEngineServerParam.value = customEngineServer - customEngineResponseTypeParam.value = customEngineResponseType customEngineTokenParam.value = customEngineToken - openAIModelsParam.value = openAiModel languageParam.value = language - aiEngineParam.value = aiEngine customEnginePrompt.text = customPrompts customEngineResponseFormatParam.value = customEngineResponseFormat customEngineRequestBodyFormatParam.value = customEngineRequestFormat @@ -187,20 +136,12 @@ class LLMSettingComponent(private val settings: AutoDevSettingsState) { fun exportSettings(destination: AutoDevSettingsState) { destination.apply { maxTokenLength = maxTokenLengthParam.value - gitType = gitTypeParam.value - githubToken = gitHubTokenParam.value - gitlabUrl = gitLabUrlParam.value - gitlabToken = gitLabTokenParam.value - openAiKey = openAIKeyParam.value customModel = customModelParam.value customOpenAiHost = customOpenAIHostParam.value - aiEngine = aiEngineParam.value language = languageParam.value customEngineServer = customEngineServerParam.value - customEngineResponseType = customEngineResponseTypeParam.value customEngineToken = customEngineTokenParam.value customPrompts = customEnginePrompt.text - openAiModel = openAIModelsParam.value customEngineResponseFormat = customEngineResponseFormatParam.value customEngineRequestFormat = customEngineRequestBodyFormatParam.value delaySeconds = delaySecondsParam.value @@ -209,29 +150,17 @@ class LLMSettingComponent(private val settings: AutoDevSettingsState) { fun isModified(settings: AutoDevSettingsState): Boolean { return settings.maxTokenLength != maxTokenLengthParam.value || - settings.gitType != gitTypeParam.value || - settings.githubToken != gitHubTokenParam.value || - settings.gitlabUrl != gitLabUrlParam.value || - settings.gitlabToken != gitLabTokenParam.value || - settings.openAiKey != openAIKeyParam.value || settings.customModel != customModelParam.value || - settings.aiEngine != aiEngineParam.value || settings.language != languageParam.value || settings.customEngineServer != customEngineServerParam.value || - settings.customEngineResponseType != customEngineResponseTypeParam.value || settings.customEngineToken != customEngineTokenParam.value || settings.customPrompts != customEnginePrompt.text || - settings.openAiModel != openAIModelsParam.value || settings.customOpenAiHost != customOpenAIHostParam.value || settings.customEngineResponseFormat != customEngineResponseFormatParam.value || settings.customEngineRequestFormat != customEngineRequestBodyFormatParam.value || settings.delaySeconds != delaySecondsParam.value } - private fun engineChanged(settings: AutoDevSettingsState): Boolean { - return settings.aiEngine != aiEngineParam.value - } - init { applySettings(settings) LanguageChangedCallback.language = AutoDevSettingsState.getInstance().language diff --git a/core/src/main/kotlin/cc/unitmesh/devti/settings/LanguageChangedCallback.kt b/core/src/main/kotlin/cc/unitmesh/devti/settings/LanguageChangedCallback.kt index b7ced77cfe..be6fb3ef68 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/settings/LanguageChangedCallback.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/settings/LanguageChangedCallback.kt @@ -18,7 +18,6 @@ import javax.swing.JLabel * @author lk */ object LanguageChangedCallback : SelectionChangedCallback { - var language: String = AutoDevSettingsState.getInstance().language set(value) { if ((field != value).also { field = value }) { diff --git a/core/src/main/kotlin/cc/unitmesh/devti/settings/coder/AutoDevCoderConfigurable.kt b/core/src/main/kotlin/cc/unitmesh/devti/settings/coder/AutoDevCoderConfigurable.kt index 23588d5e37..91b3d0186f 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/settings/coder/AutoDevCoderConfigurable.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/settings/coder/AutoDevCoderConfigurable.kt @@ -14,6 +14,7 @@ import com.intellij.openapi.options.BoundConfigurable import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ComboBox import com.intellij.openapi.ui.DialogPanel +import com.intellij.ui.JBColor import com.intellij.ui.dsl.builder.panel import com.intellij.ui.dsl.builder.toMutableProperty import com.intellij.util.containers.toArray @@ -165,6 +166,11 @@ class AutoDevCoderConfigurable(private val project: Project) : BoundConfigurable if (project != null) { testLLMConnection(project) + row { + text(AutoDevBundle.message("settings.autodev.coder.testConnectionButton.tips")).apply { + this.component.foreground = JBColor.RED + } + } } row(jLabel("settings.autodev.coder.customEnginePrompt", 2)) {} diff --git a/core/src/main/kotlin/cc/unitmesh/devti/settings/devops/AutoDevDevOpsConfigurableProvider.kt b/core/src/main/kotlin/cc/unitmesh/devti/settings/devops/AutoDevDevOpsConfigurableProvider.kt index 5e47fd180d..5a67bfaf3a 100644 --- a/core/src/main/kotlin/cc/unitmesh/devti/settings/devops/AutoDevDevOpsConfigurableProvider.kt +++ b/core/src/main/kotlin/cc/unitmesh/devti/settings/devops/AutoDevDevOpsConfigurableProvider.kt @@ -1,12 +1,17 @@ package cc.unitmesh.devti.settings.devops import cc.unitmesh.devti.AutoDevBundle +import cc.unitmesh.devti.settings.custom.TeamPromptsProjectSettingsService +import com.intellij.openapi.components.* import com.intellij.openapi.options.BoundConfigurable import com.intellij.openapi.options.Configurable import com.intellij.openapi.options.ConfigurableProvider import com.intellij.openapi.project.Project import com.intellij.openapi.ui.DialogPanel import com.intellij.ui.dsl.builder.panel +import javax.swing.JComboBox +import javax.swing.JPasswordField +import javax.swing.JTextField class AutoDevDevOpsConfigurableProvider(private val project: Project) : ConfigurableProvider() { override fun createConfigurable(): Configurable { @@ -14,12 +19,90 @@ class AutoDevDevOpsConfigurableProvider(private val project: Project) : Configur } } +val GIT_TYPE = arrayOf("Github" , "Gitlab") +val DEFAULT_GIT_TYPE = GIT_TYPE[0] + class DevOpsConfigurable(project: Project) : BoundConfigurable(AutoDevBundle.message("settings.autodev.devops")) { + private val settings = AutoDevDevOpsSettingService.getInstance(project) + + private lateinit var gitTypeComboBox: JComboBox + private lateinit var githubTokenField: JPasswordField + private lateinit var gitlabUrlField: JTextField + private lateinit var gitlabTokenField: JPasswordField + override fun createPanel(): DialogPanel { return panel { - row { - text("Hello, AutoDev 2.0") + group("Git Configuration") { + row("Git Type:") { + gitTypeComboBox = comboBox(GIT_TYPE.toList()).component + } + row("GitHub Token:") { + githubTokenField = passwordField().component + } + row("GitLab URL:") { + gitlabUrlField = textField().component + } + row("GitLab Token:") { + gitlabTokenField = passwordField().component + } } } } + + override fun apply() { + settings.modify { state -> + state.githubToken = githubTokenField.password.toString() + state.gitlabUrl = gitlabUrlField.text + state.gitlabToken = gitlabTokenField.password.toString() + } + } + + override fun reset() { + githubTokenField.text = settings.state.githubToken + gitlabUrlField.text = settings.state.gitlabUrl + gitlabTokenField.text = settings.state.gitlabToken + } + + override fun isModified(): Boolean { + return settings.state.githubToken != githubTokenField.password.toString() || + settings.state.gitlabUrl != gitlabUrlField.text || + settings.state.gitlabToken != gitlabTokenField.password.toString() + } } + +val Project.devopsPromptsSettings: AutoDevDevOpsSettingService get() = service() + +@Service(Service.Level.PROJECT) +@State(name = "AutoDevDevOpsSettings", storages = [Storage("autodev-devops.xml")]) +class AutoDevDevOpsSettingService( + val project: Project, +) : SimplePersistentStateComponent(AutoDevCoderSettings()) { + fun modify(action: (AutoDevCoderSettings) -> Unit) { + action(state) + } + + companion object { + @JvmStatic + fun getInstance(project: Project): AutoDevDevOpsSettingService { + return project.getService(AutoDevDevOpsSettingService::class.java) + } + } + + abstract class AdProjectSettingsBase> : BaseState() { + abstract fun copy(): T + } + + class AutoDevCoderSettings : AdProjectSettingsBase() { + var recordingInLocal by property(false) + var gitType = DEFAULT_GIT_TYPE + var githubToken = "" + var gitlabToken = "" + var gitlabUrl = "" + + override fun copy(): AutoDevCoderSettings { + val state = AutoDevCoderSettings() + state.copyFrom(this) + return state + } + } +} \ No newline at end of file diff --git a/core/src/main/resources/messages/AutoDevBundle_en.properties b/core/src/main/resources/messages/AutoDevBundle_en.properties index bf8ec69648..a4d2ce4dc7 100644 --- a/core/src/main/resources/messages/AutoDevBundle_en.properties +++ b/core/src/main/resources/messages/AutoDevBundle_en.properties @@ -52,19 +52,14 @@ label.submit.issue=Want n # don't remove the following line and don't rename them unless change [LLMSettingCompoent] class settings.languageParam=Language -settings.customOpenAIHostParam=Custom OpenAI Host -settings.openAIKeyParam=OpenAI API key -settings.customEngineTokenParam=Custom Engine Token -settings.openAIModelsParam=OpenAI Models settings.gitTypeParam=Git Type settings.gitLabUrlParam=URL of Gitlab Server settings.gitLabTokenParam=Gitlab token settings.gitHubTokenParam=GitHub token settings.maxTokenLengthParam=Max token length -settings.customEngineServerParam=Custom Engine Server -settings.customAIKeyParam=Custom AI Engine Key -settings.aiEngineParam=AI Engine -settings.customModelParam= Custom Model +settings.customEngineServerParam=LLM Server Address +settings.customModelParam=Model Name +settings.customEngineTokenParam=LLM Key settings.delaySecondsParam=Quest Delay Seconds settings.customEngineResponseFormatParam=Custom Response Format (Json Path) @@ -201,3 +196,5 @@ shell.command.suggestion.action.default.text=How to checkout a branch? batch.nothing.to.testing=No thing to AutoTest intentions.chat.code.test.verify=Verify test open\ documents=Open Documents +settings.autodev.llm.key.not.set=You LLM server Key is empty +settings.autodev.coder.testConnectionButton.tips=Don't forget to APPLY change after test! diff --git a/core/src/main/resources/messages/AutoDevBundle_zh.properties b/core/src/main/resources/messages/AutoDevBundle_zh.properties index 309a852e7f..2d229a1d1c 100644 --- a/core/src/main/resources/messages/AutoDevBundle_zh.properties +++ b/core/src/main/resources/messages/AutoDevBundle_zh.properties @@ -52,19 +52,14 @@ label.submit.issue=想要 # 请勿删除以下行,也不要重命名它们,除非更改 [LLMSettingCompoent] 类 settings.languageParam=语言 -settings.customOpenAIHostParam=自定义 OpenAI Host -settings.openAIKeyParam=OpenAI API 密钥 -settings.customEngineTokenParam=自定义引擎令牌 -settings.openAIModelsParam=OpenAI 模型 settings.gitTypeParam=Git 类型 settings.gitLabUrlParam=Gitlab 服务器 URL settings.gitLabTokenParam=Gitlab 令牌 settings.gitHubTokenParam=GitHub 令牌 settings.maxTokenLengthParam=最大 token 长度 -settings.customEngineServerParam=自定义 LLM 服务器 -settings.customAIKeyParam=自定义 LLM 服务器密钥 -settings.aiEngineParam=LLM 服务器 -settings.customModelParam=自定义模型 +settings.customEngineServerParam=LLM 服务器 URL +settings.customModelParam=模型名称 +settings.customEngineTokenParam=LLM 服务器密钥 settings.delaySecondsParam=请求延迟秒数 settings.customEngineResponseFormatParam=自定义响应格式(Json 路径) @@ -200,3 +195,5 @@ shell.command.suggestion.action.default.text=如何创建一个新的分支? batch.nothing.to.testing=没有要 AutoTest 的内容 intentions.chat.code.test.verify=验证测试中 open\ documents=Open Documents +settings.autodev.llm.key.not.set=LLM 密钥未设置 +settings.autodev.coder.testConnectionButton.tips=请记得在修改后 OpenAI 点击应用,再进行测试! \ No newline at end of file diff --git a/exts/devins-lang/src/222/main/kotlin/cc/unitmesh/devti/language/git/GitUtil.kt b/exts/devins-lang/src/223/main/kotlin/cc/unitmesh/devti/language/git/GitUtil.kt similarity index 100% rename from exts/devins-lang/src/222/main/kotlin/cc/unitmesh/devti/language/git/GitUtil.kt rename to exts/devins-lang/src/223/main/kotlin/cc/unitmesh/devti/language/git/GitUtil.kt diff --git a/exts/ext-database/src/222/main/kotlin/cc/unitmesh/database/DbContextActionProvider.kt b/exts/ext-database/src/223/main/kotlin/cc/unitmesh/database/DbContextActionProvider.kt similarity index 100% rename from exts/ext-database/src/222/main/kotlin/cc/unitmesh/database/DbContextActionProvider.kt rename to exts/ext-database/src/223/main/kotlin/cc/unitmesh/database/DbContextActionProvider.kt diff --git a/exts/ext-database/src/222/main/kotlin/cc/unitmesh/database/util/SqlUtil.kt b/exts/ext-database/src/223/main/kotlin/cc/unitmesh/database/util/SqlUtil.kt similarity index 100% rename from exts/ext-database/src/222/main/kotlin/cc/unitmesh/database/util/SqlUtil.kt rename to exts/ext-database/src/223/main/kotlin/cc/unitmesh/database/util/SqlUtil.kt diff --git a/exts/ext-git/src/main/kotlin/cc/unitmesh/git/actions/vcs/CodeReviewAction.kt b/exts/ext-git/src/main/kotlin/cc/unitmesh/git/actions/vcs/CodeReviewAction.kt index 03a2de5a9d..55baafc3d0 100644 --- a/exts/ext-git/src/main/kotlin/cc/unitmesh/git/actions/vcs/CodeReviewAction.kt +++ b/exts/ext-git/src/main/kotlin/cc/unitmesh/git/actions/vcs/CodeReviewAction.kt @@ -10,8 +10,8 @@ import cc.unitmesh.devti.provider.context.ChatContextItem import cc.unitmesh.devti.provider.context.ChatContextProvider import cc.unitmesh.devti.provider.context.ChatCreationContext import cc.unitmesh.devti.provider.context.ChatOrigin -import cc.unitmesh.devti.settings.AutoDevSettingsState import cc.unitmesh.devti.settings.LanguageChangedCallback.presentationText +import cc.unitmesh.devti.settings.devops.devopsPromptsSettings import cc.unitmesh.devti.template.GENIUS_PRACTISES import cc.unitmesh.devti.template.TemplateRender import cc.unitmesh.devti.template.context.TemplateContext @@ -34,9 +34,10 @@ val githubUrlRegex: Regex = Regex("^(https?://|git://)?(www\\.)?github\\.com/[\\ open class CodeReviewAction : ChatBaseAction() { - init{ + init { presentationText("settings.autodev.others.codeReview", templatePresentation) } + override fun getActionType(): ChatActionType = ChatActionType.CODE_REVIEW private val commitParser: CommitParser = CommitParser() @@ -59,7 +60,7 @@ open class CodeReviewAction : ChatBaseAction() { return@Runnable } - stories = fetchKanbanByCommits(repository, details) + stories = fetchKanbanByCommits(repository, details, project) }, "Prepare Repository", true, project) doReviewWithChanges(project, details, selectList, stories) @@ -109,15 +110,21 @@ open class CodeReviewAction : ChatBaseAction() { } } - private fun fetchKanbanByCommits(repository: Repository, details: List): List { + private fun fetchKanbanByCommits( + repository: Repository, + details: List, + project: Project + ): List { val stories: MutableList = mutableListOf() + val githubToken = project.devopsPromptsSettings.state.githubToken + when (repository) { is GitRepository -> { val remote = repository.info.remotes.firstOrNull() ?: return stories val url = remote.firstUrl ?: return stories if (!url.matches(githubUrlRegex)) return stories - val github = GitHubIssue(url, AutoDevSettingsState.getInstance().githubToken) + val github = GitHubIssue(url, githubToken) details .map { commitParser.parse(it.subject).references diff --git a/exts/ext-terminal/src/222/main/kotlin/cc/unitmesh/terminal/TerminalUtil.kt b/exts/ext-terminal/src/223/main/kotlin/cc/unitmesh/terminal/TerminalUtil.kt similarity index 100% rename from exts/ext-terminal/src/222/main/kotlin/cc/unitmesh/terminal/TerminalUtil.kt rename to exts/ext-terminal/src/223/main/kotlin/cc/unitmesh/terminal/TerminalUtil.kt diff --git a/exts/ext-terminal/src/222/main/resources/cc.unitmesh.terminal.xml b/exts/ext-terminal/src/223/main/resources/cc.unitmesh.terminal.xml similarity index 100% rename from exts/ext-terminal/src/222/main/resources/cc.unitmesh.terminal.xml rename to exts/ext-terminal/src/223/main/resources/cc.unitmesh.terminal.xml diff --git a/gradle-222.properties b/gradle-223.properties similarity index 85% rename from gradle-222.properties rename to gradle-223.properties index 1c57d17e41..7619b20395 100644 --- a/gradle-222.properties +++ b/gradle-223.properties @@ -2,16 +2,16 @@ # https://www.jetbrains.com/intellij-repository/releases/ # https://www.jetbrains.com/intellij-repository/snapshots/ # IC version has Javadoc / Kotlin docs, but no bundle for plugins, JavaScript, etc. -ideaVersion=IU-2022.2.4 +ideaVersion=IU-2022.3 # please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description pluginSinceBuild=221.* pluginUntilBuild=232.* -pythonPlugin=PythonCore:222.4459.24 +pythonPlugin=PythonCore:223.7571.182 # check latest available version here https://plugins.jetbrains.com/plugin/8182--deprecated-rust rustPlugin=org.rust.lang:0.4.185.5086-222 # https://plugins.jetbrains.com/plugin/9568-go/versions -goPlugin=org.jetbrains.plugins.go:222.4459.24 +goPlugin=org.jetbrains.plugins.go:223.7571.182 diff --git a/gradle.properties b/gradle.properties index 774eb5495a..f425886a5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,13 @@ # IntelliJ Platform Artifacts Repositories -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html propertiesPluginEnvironmentNameProperty=platformVersion -# Supported platforms: 222, 233, 241 -platformVersion=241 +# Supported platforms: 223, 233, 241 +platformVersion=223 pluginGroup = com.phodal.autodev pluginName = AutoDev pluginRepositoryUrl = https://github.com/unit-mesh/auto-dev # SemVer format -> https://semver.org -pluginVersion = 2.0.0-SNAPSHOT +pluginVersion = 1.9.0 # Supported IDEs: idea, pycharm baseIDE=idea diff --git a/javascript/src/222/main/kotlin/cc/unitmesh/ide/javascript/util/JsUtil.kt b/javascript/src/223/main/kotlin/cc/unitmesh/ide/javascript/util/JsUtil.kt similarity index 100% rename from javascript/src/222/main/kotlin/cc/unitmesh/ide/javascript/util/JsUtil.kt rename to javascript/src/223/main/kotlin/cc/unitmesh/ide/javascript/util/JsUtil.kt diff --git a/kotlin/src/222/main/kotlin/cc/unitmesh/kotlin/provider/KotlinVersionProvider.kt b/kotlin/src/223/main/kotlin/cc/unitmesh/kotlin/provider/KotlinVersionProvider.kt similarity index 100% rename from kotlin/src/222/main/kotlin/cc/unitmesh/kotlin/provider/KotlinVersionProvider.kt rename to kotlin/src/223/main/kotlin/cc/unitmesh/kotlin/provider/KotlinVersionProvider.kt diff --git a/rust/src/222/main/kotlin/cc/unitmesh/rust/context/RustClassContextBuilder.kt b/rust/src/223/main/kotlin/cc/unitmesh/rust/context/RustClassContextBuilder.kt similarity index 100% rename from rust/src/222/main/kotlin/cc/unitmesh/rust/context/RustClassContextBuilder.kt rename to rust/src/223/main/kotlin/cc/unitmesh/rust/context/RustClassContextBuilder.kt diff --git a/rust/src/222/main/resources/cc.unitmesh.rust.xml b/rust/src/223/main/resources/cc.unitmesh.rust.xml similarity index 100% rename from rust/src/222/main/resources/cc.unitmesh.rust.xml rename to rust/src/223/main/resources/cc.unitmesh.rust.xml