diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/KiloToolWindowFactory.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/KiloToolWindowFactory.kt
index 93c90aef76f..2356d2a41f0 100644
--- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/KiloToolWindowFactory.kt
+++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/KiloToolWindowFactory.kt
@@ -13,9 +13,9 @@ import ai.kilocode.client.agentManager.worktree.WorktreeController
import ai.kilocode.client.agentManager.AgentManagerPanel
import ai.kilocode.client.plugin.KiloBundle
import ai.kilocode.log.KiloLog
+import com.intellij.openapi.actionSystem.ActionGroup
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.DataProvider
-import com.intellij.openapi.actionSystem.Separator
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbAware
@@ -108,6 +108,8 @@ internal class KiloToolWindowSetupService(
chat.add(manager.component, BorderLayout.CENTER)
val agent = object : JPanel(BorderLayout()), DataProvider {
override fun getData(dataId: String): Any? {
+ // Expose the shared manager here too so History works from the Agent Manager tab.
+ if (SessionManager.KEY.`is`(dataId)) return manager
if (SessionManager.WORKSPACE_KEY.`is`(dataId)) return workspace
if (SidePanelKeys.MODE.`is`(dataId)) return SidePanelMode.AGENT_MANAGER
if (SidePanelKeys.WORKTREE_PANEL.`is`(dataId)) return agentManagerPanel
@@ -143,10 +145,13 @@ internal class KiloToolWindowSetupService(
ActionManager.getInstance().getAction("Kilo.NewSession"),
ActionManager.getInstance().getAction("Kilo.NewWorktree"),
ActionManager.getInstance().getAction("Kilo.History"),
- Separator.getInstance(),
- ActionManager.getInstance().getAction("Kilo.Settings"),
)
toolWindow.setTitleActions(actions)
+ // Settings moves off the toolbar into the header gear (options) menu: Open Settingsā¦,
+ // Config Files, and Core, inlined from the declarative Kilo.SettingsGroup.
+ (ActionManager.getInstance().getAction("Kilo.SettingsGroup") as? ActionGroup)?.let {
+ toolWindow.setAdditionalGearActions(it)
+ }
} catch (e: Exception) {
Telemetry.send("Tool Window Setup Failed", mapOf("stage" to "setup", "errorClass" to e::class.java.name))
LOG.error("Failed to set up Kilo tool window content", e)
diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/HistoryAction.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/HistoryAction.kt
index f4490febd99..04fb75046a4 100644
--- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/HistoryAction.kt
+++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/HistoryAction.kt
@@ -8,6 +8,8 @@ import ai.kilocode.client.agentManager.SidePanelMode
import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.actionSystem.DataProvider
+import com.intellij.openapi.actionSystem.PlatformDataKeys
import com.intellij.openapi.project.DumbAware
class HistoryAction : AnAction(
@@ -16,12 +18,23 @@ class HistoryAction : AnAction(
AllIcons.Vcs.History,
), DumbAware {
override fun actionPerformed(e: AnActionEvent) {
+ val manager = e.getData(SessionManager.KEY) ?: return
Telemetry.send("History Opened", mapOf("surface" to "tool_window"))
- e.getData(SessionManager.KEY)?.showHistory()
+ // History renders inside the chat content, which only lives on the AI Chat tab, so bring
+ // that tab forward first when invoked from the Agent Manager tab.
+ if (e.getData(SidePanelKeys.MODE) == SidePanelMode.AGENT_MANAGER) selectChat(e)
+ manager.showHistory()
}
override fun update(e: AnActionEvent) {
- e.presentation.isVisible = e.getData(SidePanelKeys.MODE) != SidePanelMode.AGENT_MANAGER
e.presentation.isEnabled = e.getData(SessionManager.KEY) != null
}
+
+ private fun selectChat(e: AnActionEvent) {
+ val manager = e.getData(PlatformDataKeys.TOOL_WINDOW)?.contentManager ?: return
+ val chat = manager.contents.firstOrNull {
+ (it.component as? DataProvider)?.getData(SidePanelKeys.MODE.name) == SidePanelMode.CHAT
+ } ?: return
+ manager.setSelectedContent(chat, true)
+ }
}
diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml b/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml
index 414ab991e0e..209d9d8aff1 100644
--- a/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml
+++ b/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml
@@ -147,7 +147,8 @@
class="ai.kilocode.client.actions.CoreInfoAction"/>
+ class="ai.kilocode.client.actions.OpenSettingsAction"
+ icon="AllIcons.General.GearPlain"/>