feat(jetbrains): show Core runtime info

This commit is contained in:
kirillk
2026-07-06 15:44:16 -04:00
parent 2746e69a13
commit 891a7a5847
31 changed files with 245 additions and 198 deletions
+1 -1
View File
@@ -2,4 +2,4 @@
"@kilocode/kilo-jetbrains": patch
---
Download the pinned Kilo CLI release at connect time instead of bundling CLI binaries in the plugin.
Download the pinned Kilo Core release at connect time instead of bundling Core binaries in the plugin.
@@ -9,6 +9,7 @@ import ai.kilocode.backend.app.ConfigWarning
import ai.kilocode.backend.app.LoadError
import ai.kilocode.backend.app.LoadProgress
import ai.kilocode.backend.app.ProfileResult
import ai.kilocode.backend.cli.KiloCliPlatform
import ai.kilocode.backend.cli.KiloProps
import ai.kilocode.jetbrains.api.model.KiloProfile200Response
import ai.kilocode.rpc.dto.ConfigPatchDto
@@ -54,6 +55,8 @@ class KiloAppRpcApiImpl : KiloAppRpcApi {
override suspend fun cliVersion(): String = KiloProps.cliVersion()
override suspend fun cliPlatform(): String = KiloCliPlatform.current()
override suspend fun retry() = app.retry()
override suspend fun restart() = app.restart()
@@ -0,0 +1,27 @@
package ai.kilocode.client.actions
import ai.kilocode.client.app.KiloAppService
import ai.kilocode.client.plugin.KiloBundle
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbAware
class CoreInfoAction : AnAction(), DumbAware {
override fun actionPerformed(e: AnActionEvent) = Unit
override fun update(e: AnActionEvent) {
val app = service<KiloAppService>()
val info = app.core
if (info == null) app.fetchCoreInfoAsync()
e.presentation.text = info?.let {
KiloBundle.message("action.Kilo.CoreInfo.text", it.version, it.platform)
} ?: KiloBundle.message("action.Kilo.CoreInfo.loading")
e.presentation.description = KiloBundle.message("action.Kilo.CoreInfo.description")
e.presentation.isEnabled = false
e.presentation.isVisible = true
}
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
}
@@ -27,7 +27,7 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
/**
* App-level frontend service for Kilo CLI interaction.
* App-level frontend service for Kilo Core interaction.
*
* Communicates with the backend via [KiloAppRpcApi]. All operations
* are app-scoped — no project context is needed.
@@ -47,10 +47,13 @@ class KiloAppService internal constructor(
private val started = AtomicBoolean(false)
/** CLI version string from the last successful health check, or null if unknown. */
/** Core version and platform from the backend, or null if unknown. */
@Volatile
var version: String? = null
private set
private var info: CoreInfo? = null
val core: CoreInfo? get() = info
val version: String? get() = info?.version
internal val _state = MutableStateFlow(init)
val state: StateFlow<KiloAppStateDto> = _state.asStateFlow()
@@ -80,6 +83,9 @@ class KiloAppService internal constructor(
private fun onState(state: KiloAppStateDto) {
_state.value = state
val version = state.downloadVersion
val platform = state.downloadPlatform
if (version != null && platform != null) info = CoreInfo(version, platform)
if (state.status == KiloAppStatusDto.READY) refreshModelFavoritesAsync()
}
@@ -96,20 +102,20 @@ class KiloAppService internal constructor(
call { retry() }
}
/** Kill the CLI process and restart it. */
/** Kill the Core process and restart it. */
suspend fun restart() {
LOG.info("restart: resetting state and sending RPC")
started.set(false)
version = null
info = null
call { restart() }
LOG.info("restart: RPC returned — backend restart complete")
}
/** Kill the CLI process, re-extract the binary, and restart. */
/** Kill the Core process, re-download the binary, and restart. */
suspend fun reinstall() {
LOG.info("reinstall: resetting state and sending RPC")
started.set(false)
version = null
info = null
call { reinstall() }
LOG.info("reinstall: RPC returned — backend reinstall complete")
}
@@ -131,32 +137,41 @@ class KiloAppService internal constructor(
cs.launch { reinstall() }
}
suspend fun cliVersion(): String? = try {
call { cliVersion() }
suspend fun coreInfo(): CoreInfo? = try {
val next = CoreInfo(
version = call { cliVersion() },
platform = call { cliPlatform() },
)
info = next
next
} catch (e: Exception) {
LOG.warn("cliVersion failed", e)
LOG.warn("core info failed", e)
null
}
/** Fetch the pinned CLI version and cache it. */
fun fetchVersionAsync(done: (String?) -> Unit = {}) {
version?.let {
/** Fetch the pinned Core version and platform and cache it. */
fun fetchCoreInfoAsync(done: (CoreInfo?) -> Unit = {}) {
info?.let {
done(it)
return
}
cs.launch {
LOG.info("fetchVersion: requesting CLI version")
val text = cliVersion()
if (text == null) {
LOG.info("fetchCoreInfo: requesting Core version and platform")
val next = coreInfo()
if (next == null) {
done(null)
return@launch
}
version = text
done(text)
LOG.info("fetchVersion: CLI version is $text")
done(next)
LOG.info("fetchCoreInfo: Core version is ${next.version} (${next.platform})")
}
}
/** Fetch the pinned Core version and cache it. */
fun fetchVersionAsync(done: (String?) -> Unit = {}) {
fetchCoreInfoAsync { done(it?.version) }
}
fun refreshModelFavoritesAsync() {
cs.launch {
try {
@@ -310,7 +325,7 @@ class KiloAppService internal constructor(
fun watch(fn: (KiloAppStateDto) -> Unit): Job {
return cs.launch {
state.collect { next ->
if (next.status == KiloAppStatusDto.READY) fetchVersionAsync()
if (next.status == KiloAppStatusDto.READY) fetchCoreInfoAsync()
fn(next)
}
}
@@ -325,6 +340,8 @@ class KiloAppService internal constructor(
}
}
data class CoreInfo(val version: String, val platform: String)
private fun summary(patch: ConfigPatchDto): String {
val values = patch.values.keys.sorted().joinToString(",").ifEmpty { "none" }
return "values=$values agents=${patch.agents.size}"
@@ -485,14 +485,8 @@ class SessionUi(
activity = { manager?.activity() ?: sessions.activity() },
titles = { manager?.titles().orEmpty() },
timers = timers,
cliVersion = app.version,
)
empty = panel
app.fetchVersionAsync { version ->
ApplicationManager.getApplication().invokeLater {
if (!disposed && empty === panel) panel.setCliVersion(version)
}
}
scroll.show(panel.view)
}
@@ -503,7 +497,6 @@ class SessionUi(
is SessionControllerEvent.AppChanged -> {
prompt.setReady(controller.model.isReady())
empty?.setCliVersion(app.version)
}
is SessionControllerEvent.WorkspaceChanged -> {
@@ -55,7 +55,6 @@ class EmptySessionPanel(
private val titles: () -> Map<String, String> = { emptyMap() },
private val browse: (String) -> Unit = BrowserUtil::browse,
private val timers: UiTimerSource = UiTimers,
cliVersion: String? = null,
) : BorderLayoutPanel(), Disposable, SessionEditorStyleTarget {
val view: Align = align(HAlign.CENTER, VAlign.CENTER)
@@ -74,13 +73,6 @@ class EmptySessionPanel(
setAllowAutoWrapping(true)
}
private val versionLabel = JBLabel().apply {
foreground = UIUtil.getContextHelpForeground()
font = com.intellij.util.ui.JBFont.small()
horizontalAlignment = JBLabel.CENTER
isVisible = false
}
private val description = object : BorderLayoutPanel() {
override fun getPreferredSize(): Dimension {
val size = super.getPreferredSize()
@@ -120,15 +112,11 @@ class EmptySessionPanel(
).apply {
horizontalAlignment = JBLabel.CENTER
}
val logoBlock = Stack.vertical(gap = UiStyle.Gap.xs())
.next(logo)
.next(versionLabel)
val header = BorderLayoutPanel(0, gap).apply {
isOpaque = false
add(logoBlock, BorderLayout.NORTH)
add(logo, BorderLayout.NORTH)
add(description.align(HAlign.CENTER, VAlign.CENTER), BorderLayout.CENTER)
}
setCliVersion(cliVersion)
val south = BorderLayoutPanel().apply {
isOpaque = false
@@ -170,15 +158,6 @@ class EmptySessionPanel(
internal fun feedbackContent(open: (String) -> Unit = {}): JComponent = EmptySessionFeedback.content(open)
@RequiresEdt
fun setCliVersion(version: String?) {
val text = version?.takeIf { it.isNotBlank() }
versionLabel.text = text?.let { KiloBundle.message("session.empty.cliVersion", it) }.orEmpty()
versionLabel.isVisible = text != null
revalidate()
repaint()
}
internal fun feedbackUrls() = EmptySessionFeedback.urls()
internal fun showHistoryBorderPainted() = historyButton.isBorderPainted
@@ -105,6 +105,9 @@
<action id="Kilo.Reinstall"
class="ai.kilocode.client.actions.ReinstallKiloAction"/>
<action id="Kilo.CoreInfo"
class="ai.kilocode.client.actions.CoreInfoAction"/>
<action id="Kilo.OpenSettings"
class="ai.kilocode.client.actions.OpenSettingsAction"/>
@@ -114,9 +117,11 @@
<action id="Kilo.OpenGlobalConfig"
class="ai.kilocode.client.actions.OpenGlobalConfigAction"/>
<group id="Kilo.CliGroup" text="CLI" popup="true">
<group id="Kilo.CliGroup" text="Core" popup="true">
<reference ref="Kilo.Restart"/>
<reference ref="Kilo.Reinstall"/>
<separator/>
<reference ref="Kilo.CoreInfo"/>
</group>
<group id="Kilo.OpenConfigGroup" text="Config Files" popup="true">
@@ -1,8 +1,8 @@
common.delete=Delete
session.connection.connecting=Loading...
session.connection.downloading=Downloading Kilo CLI… {0}%
session.connection.downloading.version=Downloading Kilo CLI v{0} ({1})… {2}%
session.connection.downloading=Downloading Kilo Core… {0}%
session.connection.downloading.version=Downloading Kilo Core v{0} ({1})… {2}%
session.connection.error.app=Connection failed
session.connection.error.workspace=Workspace loading failed
session.connection.error.unknown=Unknown error
@@ -12,7 +12,6 @@ session.connection.warning.config=Configuration warnings
notification.group.kilo=Kilo Code
session.empty.welcome=Kilo Code is an AI coding assistant. Ask it to build features, fix bugs, or explain your codebase.
session.empty.cliVersion=Kilo CLI v{0}
session.account.balance=Balance: {0}
session.account.switcher=Switch account
session.empty.loading=Loading...
@@ -282,7 +281,7 @@ action.Kilo.ToolWindowToolbar.text=Kilo Toolbar
settings.kilo.displayName=Kilo Code
settings.kilo.description=Configure Kilo Code AI coding assistant features and account settings.
settings.cli.unavailable.title=Kilo Code is not connected
settings.cli.unavailable.message=Settings are available after Kilo Code connects to the CLI. If this does not resolve, restart the IDE or the Kilo CLI and try again.
settings.cli.unavailable.message=Settings are available after Kilo Code connects to Core. If this does not resolve, restart the IDE or Kilo Core and try again.
settings.models.displayName=Models
settings.providers.displayName=Providers
settings.agentBehavior.displayName=Agent Behavior
@@ -539,14 +538,17 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
action.Kilo.Restart.text=Restart
action.Kilo.Restart.cli.text=Restart CLI
action.Kilo.Restart.description=Kill and restart the CLI process
action.Kilo.Restart.cli.text=Restart Core
action.Kilo.Restart.description=Kill and restart the Core process
action.Kilo.Reinstall.text=Reinstall
action.Kilo.Reinstall.cli.text=Reinstall CLI
action.Kilo.Reinstall.description=Re-extract the CLI binary and restart
action.Kilo.Reinstall.cli.text=Reinstall Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.CoreInfo.text=Core v{0} • Architecture: {1}
action.Kilo.CoreInfo.loading=Core details loading...
action.Kilo.CoreInfo.description=Kilo Core version and architecture
action.Kilo.Session.Open.text=Open
action.Kilo.Session.Open.description=Open the selected session
action.Kilo.Session.Rename.text=Rename
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=إيقاف جلسة Kilo الحالية
action.Kilo.SettingsGroup.text=الإعدادات
action.Kilo.SettingsGroup.description=إعدادات Kilo Code
action.Kilo.Restart.text=إعادة تشغيل Kilo
action.Kilo.Restart.cli.text=إعادة تشغيل CLI
action.Kilo.Restart.description=إنهاء عملية CLI وإعادة تشغيلها
action.Kilo.Restart.cli.text=إعادة تشغيل Core
action.Kilo.Restart.description=إنهاء عملية Core وإعادة تشغيلها
action.Kilo.Reinstall.text=إعادة تثبيت Kilo
action.Kilo.Reinstall.cli.text=إعادة تثبيت CLI
action.Kilo.Reinstall.description=استخراج CLI مجدداً وإعادة التشغيل
action.Kilo.Reinstall.cli.text=إعادة تثبيت Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=فتح
action.Kilo.Session.Open.description=فتح الجلسة المحددة
action.Kilo.Session.Rename.text=إعادة تسمية
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Zaustavi trenutnu Kilo sesiju
action.Kilo.SettingsGroup.text=Postavke
action.Kilo.SettingsGroup.description=Postavke Kilo Code
action.Kilo.Restart.text=Ponovo pokrenite Kilo
action.Kilo.Restart.cli.text=Ponovo pokrenite CLI
action.Kilo.Restart.description=Ugasite i ponovo pokrenite CLI proces
action.Kilo.Restart.cli.text=Ponovo pokrenite Core
action.Kilo.Restart.description=Ugasite i ponovo pokrenite Core proces
action.Kilo.Reinstall.text=Ponovo instalirajte Kilo
action.Kilo.Reinstall.cli.text=Ponovo instalirajte CLI
action.Kilo.Reinstall.description=Ponovo raspakirajte CLI binarnu datoteku i ponovo pokrenite
action.Kilo.Reinstall.cli.text=Ponovo instalirajte Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Otvori
action.Kilo.Session.Open.description=Otvorite odabranu sesiju
action.Kilo.Session.Rename.text=Preimenuj
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Stop den aktuelle Kilo-session
action.Kilo.SettingsGroup.text=Indstillinger
action.Kilo.SettingsGroup.description=Kilo Code-indstillinger
action.Kilo.Restart.text=Genstart Kilo
action.Kilo.Restart.cli.text=Genstart CLI
action.Kilo.Restart.description=Afslut og genstart CLI-processen
action.Kilo.Restart.cli.text=Genstart Core
action.Kilo.Restart.description=Afslut og genstart Core-processen
action.Kilo.Reinstall.text=Geninstaller Kilo
action.Kilo.Reinstall.cli.text=Geninstaller CLI
action.Kilo.Reinstall.description=Udpak CLI-binærfilen igen og genstart
action.Kilo.Reinstall.cli.text=Geninstaller Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Åbn
action.Kilo.Session.Open.description=Åbn den valgte session
action.Kilo.Session.Rename.text=Omdøb
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Aktuelle Kilo-Sitzung stoppen
action.Kilo.SettingsGroup.text=Einstellungen
action.Kilo.SettingsGroup.description=Kilo Code Einstellungen
action.Kilo.Restart.text=Kilo neu starten
action.Kilo.Restart.cli.text=CLI neu starten
action.Kilo.Restart.description=CLI-Prozess beenden und neu starten
action.Kilo.Restart.cli.text=Core neu starten
action.Kilo.Restart.description=Core-Prozess beenden und neu starten
action.Kilo.Reinstall.text=Kilo neu installieren
action.Kilo.Reinstall.cli.text=CLI neu installieren
action.Kilo.Reinstall.description=CLI-Binärdatei neu extrahieren und neu starten
action.Kilo.Reinstall.cli.text=Core neu installieren
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Öffnen
action.Kilo.Session.Open.description=Ausgewählte Sitzung öffnen
action.Kilo.Session.Rename.text=Umbenennen
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Detener la sesión actual de Kilo
action.Kilo.SettingsGroup.text=Configuración
action.Kilo.SettingsGroup.description=Configuración de Kilo Code
action.Kilo.Restart.text=Reiniciar Kilo
action.Kilo.Restart.cli.text=Reiniciar CLI
action.Kilo.Restart.description=Terminar y reiniciar el proceso CLI
action.Kilo.Restart.cli.text=Reiniciar Core
action.Kilo.Restart.description=Terminar y reiniciar el proceso Core
action.Kilo.Reinstall.text=Reinstalar Kilo
action.Kilo.Reinstall.cli.text=Reinstalar CLI
action.Kilo.Reinstall.description=Reextraer el binario CLI y reiniciar
action.Kilo.Reinstall.cli.text=Reinstalar Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Abrir
action.Kilo.Session.Open.description=Abrir la sesión seleccionada
action.Kilo.Session.Rename.text=Renombrar
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Arrêter la session Kilo actuelle
action.Kilo.SettingsGroup.text=Paramètres
action.Kilo.SettingsGroup.description=Paramètres de Kilo Code
action.Kilo.Restart.text=Redémarrer Kilo
action.Kilo.Restart.cli.text=Redémarrer CLI
action.Kilo.Restart.description=Tuer et redémarrer le processus CLI
action.Kilo.Restart.cli.text=Redémarrer Core
action.Kilo.Restart.description=Tuer et redémarrer le processus Core
action.Kilo.Reinstall.text=Réinstaller Kilo
action.Kilo.Reinstall.cli.text=Réinstaller CLI
action.Kilo.Reinstall.description=Réextraire le binaire CLI et redémarrer
action.Kilo.Reinstall.cli.text=Réinstaller Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Ouvrir
action.Kilo.Session.Open.description=Ouvrir la session sélectionnée
action.Kilo.Session.Rename.text=Renommer
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=現在のKiloセッションを停止
action.Kilo.SettingsGroup.text=設定
action.Kilo.SettingsGroup.description=Kilo Codeの設定
action.Kilo.Restart.text=Kiloを再起動
action.Kilo.Restart.cli.text=CLIを再起動
action.Kilo.Restart.description=CLIプロセスを終了して再起動
action.Kilo.Restart.cli.text=Coreを再起動
action.Kilo.Restart.description=Coreプロセスを終了して再起動
action.Kilo.Reinstall.text=Kiloを再インストール
action.Kilo.Reinstall.cli.text=CLIを再インストール
action.Kilo.Reinstall.description=CLIバイナリを再展開して再起動
action.Kilo.Reinstall.cli.text=Coreを再インストール
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=開く
action.Kilo.Session.Open.description=選択したセッションを開く
action.Kilo.Session.Rename.text=変名
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=현재 Kilo 세션 정지
action.Kilo.SettingsGroup.text=설정
action.Kilo.SettingsGroup.description=Kilo Code 설정
action.Kilo.Restart.text=Kilo 재시작
action.Kilo.Restart.cli.text=CLI 재시작
action.Kilo.Restart.description=CLI 프로세스 종료 후 재시작
action.Kilo.Restart.cli.text=Core 재시작
action.Kilo.Restart.description=Core 프로세스 종료 후 재시작
action.Kilo.Reinstall.text=Kilo 재설치
action.Kilo.Reinstall.cli.text=CLI 재설치
action.Kilo.Reinstall.description=CLI 바이너리 재추출 후 재시작
action.Kilo.Reinstall.cli.text=Core 재설치
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=열기
action.Kilo.Session.Open.description=선택한 세션 열기
action.Kilo.Session.Rename.text=이름 바꾸기
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Huidige Kilo-sessie stoppen
action.Kilo.SettingsGroup.text=Instellingen
action.Kilo.SettingsGroup.description=Kilo Code-instellingen
action.Kilo.Restart.text=Kilo herstarten
action.Kilo.Restart.cli.text=CLI herstarten
action.Kilo.Restart.description=CLI-proces beëindigen en herstarten
action.Kilo.Restart.cli.text=Core herstarten
action.Kilo.Restart.description=Core-proces beëindigen en herstarten
action.Kilo.Reinstall.text=Kilo herinstalleren
action.Kilo.Reinstall.cli.text=CLI herinstalleren
action.Kilo.Reinstall.description=CLI-binair opnieuw uitpakken en herstarten
action.Kilo.Reinstall.cli.text=Core herinstalleren
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Openen
action.Kilo.Session.Open.description=Geselecteerde sessie openen
action.Kilo.Session.Rename.text=Hernoemen
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -139,11 +139,11 @@ action.Kilo.StopSession.description=Stopp gjeldende Kilo-økt
action.Kilo.SettingsGroup.text=Innstillinger
action.Kilo.SettingsGroup.description=Kilo Code-innstillinger
action.Kilo.Restart.text=Start Kilo på nytt
action.Kilo.Restart.cli.text=Start CLI på nytt
action.Kilo.Restart.description=Avslutt og start CLI-prosessen på nytt
action.Kilo.Restart.cli.text=Start Core på nytt
action.Kilo.Restart.description=Avslutt og start Core-prosessen på nytt
action.Kilo.Reinstall.text=Installer Kilo på nytt
action.Kilo.Reinstall.cli.text=Installer CLI på nytt
action.Kilo.Reinstall.description=Pakk ut CLI-binærfilen på nytt og start på nytt
action.Kilo.Reinstall.cli.text=Installer Core på nytt
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Åpne
action.Kilo.Session.Open.description=Åpne valgt økt
action.Kilo.Session.Rename.text=Gi nytt navn
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -139,11 +139,11 @@ action.Kilo.StopSession.description=Zatrzymaj bieżącą sesję Kilo
action.Kilo.SettingsGroup.text=Ustawienia
action.Kilo.SettingsGroup.description=Ustawienia Kilo Code
action.Kilo.Restart.text=Uruchom ponownie Kilo
action.Kilo.Restart.cli.text=Uruchom ponownie CLI
action.Kilo.Restart.description=Zakończ i uruchom ponownie proces CLI
action.Kilo.Restart.cli.text=Uruchom ponownie Core
action.Kilo.Restart.description=Zakończ i uruchom ponownie proces Core
action.Kilo.Reinstall.text=Zainstaluj ponownie Kilo
action.Kilo.Reinstall.cli.text=Zainstaluj ponownie CLI
action.Kilo.Reinstall.description=Ponownie wyodrębnij plik binarny CLI i uruchom ponownie
action.Kilo.Reinstall.cli.text=Zainstaluj ponownie Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Otwórz
action.Kilo.Session.Open.description=Otwórz wybraną sesję
action.Kilo.Session.Rename.text=Zmień nazwę
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -139,11 +139,11 @@ action.Kilo.StopSession.description=Parar a sessão atual do Kilo
action.Kilo.SettingsGroup.text=Configurações
action.Kilo.SettingsGroup.description=Configurações do Kilo Code
action.Kilo.Restart.text=Reiniciar Kilo
action.Kilo.Restart.cli.text=Reiniciar CLI
action.Kilo.Restart.description=Encerrar e reiniciar o processo CLI
action.Kilo.Restart.cli.text=Reiniciar Core
action.Kilo.Restart.description=Encerrar e reiniciar o processo Core
action.Kilo.Reinstall.text=Reinstalar Kilo
action.Kilo.Reinstall.cli.text=Reinstalar CLI
action.Kilo.Reinstall.description=Reextrair o binário CLI e reiniciar
action.Kilo.Reinstall.cli.text=Reinstalar Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Abrir
action.Kilo.Session.Open.description=Abrir a sessão selecionada
action.Kilo.Session.Rename.text=Renomear
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -139,11 +139,11 @@ action.Kilo.StopSession.description=Остановить текущую сесс
action.Kilo.SettingsGroup.text=Настройки
action.Kilo.SettingsGroup.description=Настройки Kilo Code
action.Kilo.Restart.text=Перезапустить Kilo
action.Kilo.Restart.cli.text=Перезапустить CLI
action.Kilo.Restart.description=Завершить и перезапустить CLI-процесс
action.Kilo.Restart.cli.text=Перезапустить Core
action.Kilo.Restart.description=Завершить и перезапустить Core-процесс
action.Kilo.Reinstall.text=Переустановить Kilo
action.Kilo.Reinstall.cli.text=Переустановить CLI
action.Kilo.Reinstall.description=Переизвлечь CLI-бинарник и перезапустить
action.Kilo.Reinstall.cli.text=Переустановить Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Открыть
action.Kilo.Session.Open.description=Открыть выбранную сессию
action.Kilo.Session.Rename.text=Переименовать
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -139,11 +139,11 @@ action.Kilo.StopSession.description=หยุดเซสชัน Kilo ปั
action.Kilo.SettingsGroup.text=การตั้งค่า
action.Kilo.SettingsGroup.description=การตั้งค่า Kilo Code
action.Kilo.Restart.text=รีสตาร์ต Kilo
action.Kilo.Restart.cli.text=รีสตาร์ต CLI
action.Kilo.Restart.description=สิ้นสุดและรีสตาร์ตกระบวนการ CLI
action.Kilo.Restart.cli.text=รีสตาร์ต Core
action.Kilo.Restart.description=สิ้นสุดและรีสตาร์ตกระบวนการ Core
action.Kilo.Reinstall.text=ติดตั้ง Kilo ใหม่
action.Kilo.Reinstall.cli.text=ติดตั้ง CLI ใหม่
action.Kilo.Reinstall.description=แตกไฟล์ไบนารี CLI อีกครั้งและรีสตาร์ต
action.Kilo.Reinstall.cli.text=ติดตั้ง Core ใหม่
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=เปิด
action.Kilo.Session.Open.description=เปิดเซสชันที่เลือก
action.Kilo.Session.Rename.text=เปลี่ยนชื่อ
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -139,11 +139,11 @@ action.Kilo.StopSession.description=Geçerli Kilo oturumunu durdur
action.Kilo.SettingsGroup.text=Ayarlar
action.Kilo.SettingsGroup.description=Kilo Code ayarları
action.Kilo.Restart.text=Kiloyu yeniden başlat
action.Kilo.Restart.cli.text=CLIyi yeniden başlat
action.Kilo.Restart.description=CLI sürecini sonlandır ve yeniden başlat
action.Kilo.Restart.cli.text=Coreyi yeniden başlat
action.Kilo.Restart.description=Core sürecini sonlandır ve yeniden başlat
action.Kilo.Reinstall.text=Kiloyu yeniden yükle
action.Kilo.Reinstall.cli.text=CLIyi yeniden yükle
action.Kilo.Reinstall.description=CLI ikili dosyasını yeniden çıkar ve yeniden başlat
action.Kilo.Reinstall.cli.text=Coreyi yeniden yükle
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=
action.Kilo.Session.Open.description=Seçilen oturumu aç
action.Kilo.Session.Rename.text=Yeniden adlandır
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=Зупинити поточну сесію K
action.Kilo.SettingsGroup.text=Налаштування
action.Kilo.SettingsGroup.description=Налаштування Kilo Code
action.Kilo.Restart.text=Перезапустити Kilo
action.Kilo.Restart.cli.text=Перезапустити CLI
action.Kilo.Restart.description=Завершити і перезапустити CLI-процес
action.Kilo.Restart.cli.text=Перезапустити Core
action.Kilo.Restart.description=Завершити і перезапустити Core-процес
action.Kilo.Reinstall.text=Перевстановити Kilo
action.Kilo.Reinstall.cli.text=Перевстановити CLI
action.Kilo.Reinstall.description=Перерозпакувати CLI-бінарний файл і перезапустити
action.Kilo.Reinstall.cli.text=Перевстановити Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=Відкрити
action.Kilo.Session.Open.description=Відкрити вибрану сесію
action.Kilo.Session.Rename.text=Перейменувати
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=停止当前 Kilo 会话
action.Kilo.SettingsGroup.text=设置
action.Kilo.SettingsGroup.description=Kilo Code 设置
action.Kilo.Restart.text=重启 Kilo
action.Kilo.Restart.cli.text=重启 CLI
action.Kilo.Restart.description=终止并重启 CLI 进程
action.Kilo.Restart.cli.text=重启 Core
action.Kilo.Restart.description=终止并重启 Core 进程
action.Kilo.Reinstall.text=重新安装 Kilo
action.Kilo.Reinstall.cli.text=重新安装 CLI
action.Kilo.Reinstall.description=重新解压 CLI 二进制文件并重启
action.Kilo.Reinstall.cli.text=重新安装 Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=打开
action.Kilo.Session.Open.description=打开所选会话
action.Kilo.Session.Rename.text=重命名
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -134,11 +134,11 @@ action.Kilo.StopSession.description=停止目前的 Kilo 工作階段
action.Kilo.SettingsGroup.text=設定
action.Kilo.SettingsGroup.description=Kilo Code 設定
action.Kilo.Restart.text=重啟 Kilo
action.Kilo.Restart.cli.text=重啟 CLI
action.Kilo.Restart.description=終止並重啟 CLI 程序
action.Kilo.Restart.cli.text=重啟 Core
action.Kilo.Restart.description=終止並重啟 Core 程序
action.Kilo.Reinstall.text=重新安裝 Kilo
action.Kilo.Reinstall.cli.text=重新安裝 CLI
action.Kilo.Reinstall.description=重新解壓縮 CLI 二進位檔案並重啟
action.Kilo.Reinstall.cli.text=重新安裝 Core
action.Kilo.Reinstall.description=Download a fresh Core binary and restart
action.Kilo.Session.Open.text=開啟
action.Kilo.Session.Open.description=開啟所選工作階段
action.Kilo.Session.Rename.text=重命名
@@ -310,8 +310,8 @@ action.Kilo.OpenGlobalConfig.text=Open: global {0}
action.Kilo.CreateGlobalConfig.text=Create: global {0}
action.Kilo.OpenGlobalConfig.description=Open or create the global Kilo config file
action.Kilo.OpenConfig.failed=Failed to open Kilo config file
action.Kilo.CliGroup.text=CLI
action.Kilo.CliGroup.description=Kilo CLI actions
action.Kilo.CliGroup.text=Core
action.Kilo.CliGroup.description=Kilo Core actions
settings.agentBehavior.agents.import.title=Import Agent Definition
settings.agentBehavior.agents.import.description=Choose a .agent.json file exported from Kilo Code.
settings.agentBehavior.agents.import.progress=Importing agent definition...
@@ -1,8 +1,10 @@
package ai.kilocode.client.actions
import ai.kilocode.client.app.KiloAppService
import ai.kilocode.client.app.KiloWorkspaceService
import ai.kilocode.client.app.Workspace
import ai.kilocode.client.session.SessionManager
import ai.kilocode.client.testing.FakeAppRpcApi
import ai.kilocode.client.testing.FakeWorkspaceRpcApi
import ai.kilocode.rpc.dto.ConfigTargetDto
import ai.kilocode.rpc.dto.KiloWorkspaceStateDto
@@ -30,11 +32,18 @@ import kotlinx.coroutines.withTimeout
class KiloRecoveryActionsTest : BasePlatformTestCase() {
private lateinit var scope: CoroutineScope
private lateinit var rpc: FakeWorkspaceRpcApi
private lateinit var appRpc: FakeAppRpcApi
override fun setUp() {
super.setUp()
scope = CoroutineScope(SupervisorJob())
rpc = FakeWorkspaceRpcApi()
appRpc = FakeAppRpcApi()
ApplicationManager.getApplication().replaceService(
KiloAppService::class.java,
KiloAppService(scope, appRpc),
testRootDisposable,
)
ApplicationManager.getApplication().replaceService(
KiloWorkspaceService::class.java,
KiloWorkspaceService(scope, rpc),
@@ -68,38 +77,55 @@ class KiloRecoveryActionsTest : BasePlatformTestCase() {
assertTrue("Reinstall should force-enable recovery action", event.presentation.isEnabled)
}
fun `test restart action adds cli suffix in connection retry popup`() {
fun `test restart action adds core suffix in connection retry popup`() {
val action = RestartKiloAction()
val event = event(action, place = KiloActionPlaces.connectionRetryPopup())
update(action, event)
assertEquals("Restart CLI", event.presentation.text)
assertEquals("Restart Core", event.presentation.text)
}
fun `test reinstall action adds cli suffix in connection retry popup`() {
fun `test reinstall action adds core suffix in connection retry popup`() {
val action = ReinstallKiloAction()
val event = event(action, place = KiloActionPlaces.connectionRetryPopup())
update(action, event)
assertEquals("Reinstall CLI", event.presentation.text)
assertEquals("Reinstall Core", event.presentation.text)
}
fun `test cli group has visible menu text`() {
fun `test core group has visible menu text and info action`() {
val xml = requireNotNull(javaClass.classLoader.getResourceAsStream("kilo.jetbrains.frontend.xml"))
.bufferedReader()
.use { it.readText() }
assertTrue(xml.contains("<group id=\"Kilo.CliGroup\" text=\"CLI\" popup=\"true\">"))
assertTrue(xml.contains("<group id=\"Kilo.CliGroup\" text=\"Core\" popup=\"true\">"))
assertTrue(xml.contains("<reference ref=\"Kilo.Restart\"/>"))
assertTrue(xml.contains("<reference ref=\"Kilo.Reinstall\"/>"))
assertTrue(xml.contains("<reference ref=\"Kilo.CoreInfo\"/>"))
assertTrue(xml.contains("<group id=\"Kilo.OpenConfigGroup\" text=\"Config Files\" popup=\"true\">"))
assertTrue(xml.contains("<reference ref=\"Kilo.OpenConfigGroup\"/>"))
assertFalse(xml.contains("<action id=\"Kilo.ShowProfile\""))
assertFalse(xml.contains("<reference ref=\"Kilo.ShowProfile\"/>"))
}
fun `test core info action shows version and architecture`() {
appRpc.cliVersion = "1.2.3"
appRpc.cliPlatform = "darwin-arm64"
ApplicationManager.getApplication().executeOnPooledThread {
runBlocking { app().coreInfo() }
}.get()
val action = CoreInfoAction()
val event = event(action)
update(action, event)
assertFalse(event.presentation.isEnabled)
assertTrue(event.presentation.isVisible)
assertEquals("Core v1.2.3 • Architecture: darwin-arm64", event.presentation.text)
}
fun `test local config action says open when target exists`() {
rpc.localConfigPath = "/test/.kilo/kilo.jsonc"
rpc.localConfigDisplayPath = "~/.kilo/kilo.jsonc"
@@ -311,6 +337,8 @@ class KiloRecoveryActionsTest : BasePlatformTestCase() {
private fun service(): KiloWorkspaceService = ApplicationManager.getApplication().getService(KiloWorkspaceService::class.java)
private fun app(): KiloAppService = ApplicationManager.getApplication().getService(KiloAppService::class.java)
private fun cacheGlobal(target: ConfigTargetDto) {
val field = KiloWorkspaceService::class.java.getDeclaredField("globalConfig")
field.isAccessible = true
@@ -94,7 +94,7 @@ class ConnectionPanelTest : SessionControllerTestBase() {
assertEquals("Try again", panel.retryText())
}
fun `test retry popup group uses cli recovery actions`() {
fun `test retry popup group uses core recovery actions`() {
edt {
panel.onEvent(SessionControllerEvent.ConnectionChanged.ShowError("CLI startup failed", null))
}
@@ -104,9 +104,10 @@ class ConnectionPanelTest : SessionControllerTestBase() {
assertTrue(panel.retryVisible())
assertEquals("Kilo.CliGroup", ConnectionPanel.CLI_GROUP_ID)
assertTrue(xml.contains("<group id=\"Kilo.CliGroup\" text=\"CLI\" popup=\"true\">"))
assertTrue(xml.contains("<group id=\"Kilo.CliGroup\" text=\"Core\" popup=\"true\">"))
assertTrue(xml.contains("<reference ref=\"Kilo.Restart\"/>"))
assertTrue(xml.contains("<reference ref=\"Kilo.Reinstall\"/>"))
assertTrue(xml.contains("<reference ref=\"Kilo.CoreInfo\"/>"))
}
fun `test ready warnings show collapsed banner with retry`() {
@@ -138,23 +138,6 @@ class EmptySessionPanelTest : BasePlatformTestCase() {
)
}
fun `test cli version line updates`() {
val panel = panel()
val text = KiloBundle.message("session.empty.cliVersion", "1.2.3")
panel.setCliVersion("1.2.3")
val label = UIUtil.uiTraverser(panel)
.filter(JBLabel::class.java)
.first { it.text == text }
assertTrue(label.isVisible)
panel.setCliVersion(null)
assertEquals("", label.text)
assertFalse(label.isVisible)
}
fun `test selecting recent session does not open it`() {
val panel = panel(listOf(session("ses_1"), session("ses_2")))
@@ -32,6 +32,7 @@ class FakeAppRpcApi : KiloAppRpcApi {
val state = MutableStateFlow(KiloAppStateDto(KiloAppStatusDto.DISCONNECTED))
var health = HealthDto(healthy = true, version = "1.0.0")
var cliVersion = "1.0.0"
var cliPlatform = "darwin-arm64"
var models = ModelStateDto()
val selections = mutableListOf<ModelSelectionUpdateDto>()
val cleared = mutableListOf<String>()
@@ -73,6 +74,11 @@ class FakeAppRpcApi : KiloAppRpcApi {
return cliVersion
}
override suspend fun cliPlatform(): String {
assertNotEdt("cliPlatform")
return cliPlatform
}
override suspend fun retry() {
assertNotEdt("retry")
retries += 1
@@ -39,16 +39,19 @@ interface KiloAppRpcApi : RemoteApi<Unit> {
/** One-shot health check against /global/health. */
suspend fun health(): HealthDto
/** Pinned CLI version bundled in backend resources. */
/** Pinned Core version bundled in backend resources. */
suspend fun cliVersion(): String
/** Core platform downloaded by the backend process. */
suspend fun cliPlatform(): String
/** Retry app connection or loading after a failure. */
suspend fun retry()
/** Kill the CLI process and restart it. */
/** Kill the Core process and restart it. */
suspend fun restart()
/** Kill the CLI process, re-extract the binary, and restart. */
/** Kill the Core process, re-download the binary, and restart. */
suspend fun reinstall()
/** Load persisted CLI model state such as favorites. */