From 5841b04fe73dae63ff18714a22e19804f029e87c Mon Sep 17 00:00:00 2001 From: Simon Klee Date: Wed, 22 Jul 2026 15:42:12 +0200 Subject: [PATCH] tui: resolve default mini footer agent (#38315) --- packages/tui/src/mini/footer.ts | 17 ++++++++++++----- packages/tui/test/mini/footer.test.ts | 17 +++++++++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/tui/src/mini/footer.ts b/packages/tui/src/mini/footer.ts index 54b50953bf2..a403542219c 100644 --- a/packages/tui/src/mini/footer.ts +++ b/packages/tui/src/mini/footer.ts @@ -102,6 +102,11 @@ type RunFooterOptions = { subscribeThemeSignal: (listener: () => void) => () => void } +export function resolveRunAgent(agents: RunAgent[], current: string | undefined) { + const selectable = agents.filter((agent) => agent.mode !== "subagent" && !agent.hidden) + return selectable.find((agent) => agent.id === current) ?? selectable.at(0) +} + const PERMISSION_ROWS = 12 const FORM_ROWS = 14 const SUBAGENT_ROWS = RUN_SUBAGENT_PANEL_ROWS @@ -252,13 +257,15 @@ export class RunFooter implements FooterApi { const [providers, setProviders] = createSignal() this.providers = providers this.setProviders = setProviders - const [currentAgentID, setCurrentAgentID] = createSignal(options.agent) - this.currentAgentID = currentAgentID + const [selectedAgentID, setCurrentAgentID] = createSignal(options.agent) + const currentAgent = () => resolveRunAgent(this.agents(), selectedAgentID()) + this.currentAgentID = () => currentAgent()?.id ?? selectedAgentID() this.setCurrentAgentID = setCurrentAgentID this.currentAgent = () => { - const agent = currentAgentID() - if (!agent) return "Default" - return this.agents().find((item) => item.id === agent)?.name ?? Locale.titlecase(agent) + const agent = currentAgent() + if (agent) return agent.name + const selected = selectedAgentID() + return selected ? Locale.titlecase(selected) : "Default" } const [currentModel, setCurrentModel] = createSignal(options.model) this.currentModel = currentModel diff --git a/packages/tui/test/mini/footer.test.ts b/packages/tui/test/mini/footer.test.ts index e59813f9f7f..8fbf7fc686b 100644 --- a/packages/tui/test/mini/footer.test.ts +++ b/packages/tui/test/mini/footer.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test" -import { coalesceProgressCommit } from "../../src/mini/footer" -import type { StreamCommit } from "../../src/mini/types" +import { coalesceProgressCommit, resolveRunAgent } from "../../src/mini/footer" +import type { RunAgent, StreamCommit } from "../../src/mini/types" function progress(input: Partial = {}): StreamCommit { return { @@ -23,3 +23,16 @@ test("coalesces progress only within the same message and tool state", () => { progress({ text: "onetwo", directory: "/latest" }), ) }) + +test("resolves the first selectable agent when none is selected", () => { + const agents: RunAgent[] = [ + { id: "task", name: "Task", mode: "subagent", hidden: false }, + { id: "secret", name: "Secret", mode: "primary", hidden: true }, + { id: "build", name: "Build", mode: "primary", hidden: false }, + { id: "plan", name: "Plan", mode: "primary", hidden: false }, + ] + + expect(resolveRunAgent(agents, undefined)?.id).toBe("build") + expect(resolveRunAgent(agents, "plan")?.id).toBe("plan") + expect(resolveRunAgent(agents, "missing")?.id).toBe("build") +})