refactor(jetbrains): rename backend classes to KiloBackend* prefix and move to backend package

Rename server package to ai.kilocode.backend and apply consistent
KiloBackend* prefix: KiloBackendAppService, KiloBackendCliManager,
KiloBackendConnectionService, KiloBackendHttpClients,
KiloBackendProjectService.
This commit is contained in:
kirillk
2026-04-12 13:57:24 -04:00
parent 4b41cbf0da
commit 49367eb351
6 changed files with 29 additions and 30 deletions
@@ -1,4 +1,4 @@
package ai.kilocode.server
package ai.kilocode.backend
import ai.kilocode.jetbrains.api.client.DefaultApi
import ai.kilocode.jetbrains.api.model.Config
@@ -19,20 +19,20 @@ import kotlinx.coroutines.launch
* loads project-independent data after the connection is established.
*
* This is the single entry point for the CLI backend. Both
* [KiloProjectService] and [KiloApiService][ai.kilocode.KiloApiService]
* [KiloBackendProjectService] and [KiloApiService][ai.kilocode.KiloApiService]
* (frontend) reach the CLI through this service.
*
* Data flows use the generated OpenAPI model types directly
* no intermediate DTOs needed at the backend layer.
*/
@Service(Service.Level.APP)
class KiloAppService(private val cs: CoroutineScope) : Disposable {
class KiloBackendAppService(private val cs: CoroutineScope) : Disposable {
companion object {
private val LOG = Logger.getInstance(KiloAppService::class.java)
private val LOG = Logger.getInstance(KiloBackendAppService::class.java)
}
private val server = ServerManager(cs)
private val server = KiloBackendCliManager(cs)
private val connection = KiloConnectionService(cs, server)
private var router: Job? = null
@@ -1,4 +1,4 @@
package ai.kilocode.server
package ai.kilocode.backend
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.diagnostic.Logger
@@ -27,9 +27,9 @@ import java.util.concurrent.TimeUnit
* All concurrent callers of [init] share the same startup flow only one
* CLI process is ever spawned.
*
* Not a service owned and instantiated by [KiloAppService].
* Not a service owned and instantiated by [KiloBackendAppService].
*/
class ServerManager(private val cs: CoroutineScope) {
class KiloBackendCliManager(private val cs: CoroutineScope) {
sealed class ServerState {
data class Ready(val port: Int, val password: String) : ServerState()
@@ -38,7 +38,7 @@ class ServerManager(private val cs: CoroutineScope) {
}
companion object {
private val LOG = Logger.getInstance(ServerManager::class.java)
private val LOG = Logger.getInstance(KiloBackendCliManager::class.java)
private const val STARTUP_TIMEOUT_MS = 30_000L
private const val KILL_TIMEOUT_SECONDS = 5L
private val PORT_REGEX = Regex("""listening on http://[\w.]+:(\d+)""")
@@ -1,4 +1,4 @@
package ai.kilocode.server
package ai.kilocode.backend
import ai.kilocode.jetbrains.api.client.DefaultApi
import com.intellij.openapi.diagnostic.Logger
@@ -44,11 +44,11 @@ data class SseEvent(val type: String, val data: String)
* The generated [DefaultApi] is configured with [apiClient] and exposed via [api]
* for typed access to all CLI server endpoints.
*
* Not a service owned and instantiated by [KiloAppService].
* Not a service owned and instantiated by [KiloBackendAppService].
*/
class KiloConnectionService(
private val cs: CoroutineScope,
private val server: ServerManager,
private val cs: CoroutineScope,
private val server: KiloBackendCliManager,
) {
companion object {
@@ -138,18 +138,18 @@ class KiloConnectionService(
val result = server.init()
if (result is ServerManager.ServerState.Error) {
if (result is KiloBackendCliManager.ServerState.Error) {
setState(ConnectionState.Error(result.message))
return
}
val ready = result as ServerManager.ServerState.Ready
val ready = result as KiloBackendCliManager.ServerState.Ready
port = ready.port
password = ready.password
// Create dual OkHttp clients (bundled — no IntelliJ platform deps)
val ac = KiloHttpClients.api(password)
val hc = KiloHttpClients.health(password)
val ac = KiloBackendHttpClients.api(password)
val hc = KiloBackendHttpClients.health(password)
apiClient = ac
healthClient = hc
@@ -285,9 +285,9 @@ class KiloConnectionService(
private fun close() {
api = null
apiClient?.let { KiloHttpClients.shutdown(it) }
apiClient?.let { KiloBackendHttpClients.shutdown(it) }
apiClient = null
healthClient?.let { KiloHttpClients.shutdown(it) }
healthClient?.let { KiloBackendHttpClients.shutdown(it) }
healthClient = null
}
@@ -1,4 +1,4 @@
package ai.kilocode.server
package ai.kilocode.backend
import okhttp3.ConnectionPool
import okhttp3.Interceptor
@@ -16,7 +16,7 @@ import java.util.concurrent.TimeUnit
* Both clients bundle Basic Auth via an interceptor and are fully independent
* of any IntelliJ-platform-provided HTTP stack.
*/
object KiloHttpClients {
object KiloBackendHttpClients {
private const val CONNECT_TIMEOUT_MS = 10_000L
private const val HEALTH_TIMEOUT_MS = 3_000L
@@ -1,4 +1,4 @@
package ai.kilocode.server
package ai.kilocode.backend
import ai.kilocode.jetbrains.api.client.DefaultApi
import ai.kilocode.rpc.dto.ConnectionStateDto
@@ -15,7 +15,7 @@ import kotlinx.coroutines.flow.map
/**
* Project-level backend service that delegates to the app-level
* [KiloAppService] and scopes CLI API calls to this project's
* [KiloBackendAppService] and scopes CLI API calls to this project's
* working directory.
*
* The VS Code extension likewise scopes calls via `x-kilo-directory`.
@@ -23,15 +23,15 @@ import kotlinx.coroutines.flow.map
* parameter to each generated API method.
*/
@Service(Service.Level.PROJECT)
class KiloProjectService(
class KiloBackendProjectService(
private val project: Project,
private val cs: CoroutineScope,
) {
companion object {
private val LOG = Logger.getInstance(KiloProjectService::class.java)
private val LOG = Logger.getInstance(KiloBackendProjectService::class.java)
}
private val app: KiloAppService
private val app: KiloBackendAppService
get() = service()
/** Project working directory sent as the `directory` parameter. */
@@ -4,22 +4,21 @@ package ai.kilocode.rpc
import ai.kilocode.rpc.dto.ConnectionStateDto
import ai.kilocode.rpc.dto.HealthDto
import ai.kilocode.server.KiloProjectService
import ai.kilocode.backend.KiloBackendProjectService
import com.intellij.openapi.components.service
import com.intellij.platform.project.ProjectId
import com.intellij.platform.project.findProjectOrNull
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
/**
* Backend implementation of [KiloProjectRpcApi].
*
* Resolves the project from the [ProjectId] passed by the frontend
* and delegates to the project-level [KiloProjectService].
* and delegates to the project-level [KiloBackendProjectService].
*/
class KiloProjectRpcApiImpl : KiloProjectRpcApi {
private fun resolve(id: ProjectId): KiloProjectService {
private fun resolve(id: ProjectId): KiloBackendProjectService {
val project = id.findProjectOrNull()
?: throw IllegalStateException("Project not found for id: $id")
return project.service()