From d153b1bb0cfeedc8232c9055b8198e068370e29b Mon Sep 17 00:00:00 2001
From: Neil <4138956+nwparker@users.noreply.github.com>
Date: Wed, 29 Jul 2026 17:27:13 -0700
Subject: [PATCH] feat(new-workspace): set selected agent as default
---
.../components/agent/AgentCombobox.test.tsx | 84 +++++++++++-
.../src/components/agent/AgentCombobox.tsx | 123 +++++++++++-------
2 files changed, 156 insertions(+), 51 deletions(-)
diff --git a/src/renderer/src/components/agent/AgentCombobox.test.tsx b/src/renderer/src/components/agent/AgentCombobox.test.tsx
index 4ef8f7a6521..b205a4e23db 100644
--- a/src/renderer/src/components/agent/AgentCombobox.test.tsx
+++ b/src/renderer/src/components/agent/AgentCombobox.test.tsx
@@ -1,11 +1,93 @@
+// @vitest-environment happy-dom
+
+import { cleanup, fireEvent, render, screen } from '@testing-library/react'
import { renderToStaticMarkup } from 'react-dom/server'
-import { describe, expect, it, vi } from 'vitest'
+import { afterEach, describe, expect, it, vi } from 'vitest'
import type { TuiAgent } from '../../../../shared/types'
import { AGENT_CATALOG, AgentIcon } from '@/lib/agent-catalog'
import { AGENT_FAVICON_ASSETS } from '@/lib/agent-favicon-assets'
import AgentCombobox from './AgentCombobox'
+afterEach(cleanup)
+
describe('AgentCombobox', () => {
+ it('sets the closed trigger selection as the default agent', () => {
+ const onSetDefault = vi.fn()
+ render(
+
+ )
+
+ const trigger = screen.getByRole('combobox')
+ fireEvent.contextMenu(trigger)
+
+ expect(trigger.getAttribute('aria-expanded')).toBe('false')
+ fireEvent.click(screen.getByRole('menuitem', { name: 'Set as default' }))
+ expect(onSetDefault).toHaveBeenCalledWith('codex')
+ })
+
+ it('maps the closed Blank Terminal selection to the blank default preference', () => {
+ const onSetDefault = vi.fn()
+ render(
+
+ )
+
+ fireEvent.contextMenu(screen.getByRole('combobox'))
+ fireEvent.click(screen.getByRole('menuitem', { name: 'Set as default' }))
+
+ expect(onSetDefault).toHaveBeenCalledWith('blank')
+ })
+
+ it('marks the closed trigger when its selection is already the default', () => {
+ const onSetDefault = vi.fn()
+ render(
+
+ )
+
+ fireEvent.contextMenu(screen.getByRole('combobox'))
+ const menuItem = screen.getByRole('menuitem', { name: 'Current default' })
+
+ expect(menuItem.hasAttribute('data-disabled')).toBe(true)
+ fireEvent.click(menuItem)
+ expect(onSetDefault).not.toHaveBeenCalled()
+ })
+
+ it('keeps the expanded agent-row default action available', () => {
+ const onSetDefault = vi.fn()
+ render(
+
+ )
+
+ fireEvent.click(screen.getByRole('combobox'))
+ fireEvent.contextMenu(screen.getByRole('option', { name: 'Claude' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: 'Set as default' }))
+
+ expect(onSetDefault).toHaveBeenCalledWith('claude')
+ })
+
it('keeps enough trigger width for GitHub Copilot when callers pass min-w-0', () => {
const markup = renderToStaticMarkup(
void
triggerClassName?: string
/** When set, pressing Enter on the closed combobox trigger invokes this
@@ -69,6 +69,12 @@ type ItemRenderArgs = {
label: string
}
+type AgentDefaultContextMenuProps = {
+ children: React.ReactNode
+ isDefault: boolean
+ onSetDefault?: () => void
+}
+
function AgentIconLabel({
icon,
label
@@ -86,6 +92,29 @@ function AgentIconLabel({
)
}
+function AgentDefaultContextMenu({
+ children,
+ isDefault,
+ onSetDefault
+}: AgentDefaultContextMenuProps): React.ReactNode {
+ if (!onSetDefault) {
+ return children
+ }
+ return (
+
+ {children}
+
+
+
+ {isDefault
+ ? translate('auto.components.agent.AgentCombobox.1b0d6965fa', 'Current default')
+ : translate('auto.components.agent.AgentCombobox.9c6b59fe58', 'Set as default')}
+
+
+
+ )
+}
+
function renderItem({
key,
itemValue,
@@ -109,23 +138,12 @@ function renderItem({
)
- if (!onSetDefault) {
- return row
- }
return (
// Why: z-[70] sits above PopoverContent's z-[60] so the right-click menu
// renders in front of the still-open combobox popover instead of behind it.
-
- {row}
-
-
-
- {isDefault
- ? translate('auto.components.agent.AgentCombobox.1b0d6965fa', 'Current default')
- : translate('auto.components.agent.AgentCombobox.9c6b59fe58', 'Set as default')}
-
-
-
+
+ {row}
+
)
}
@@ -288,41 +306,46 @@ export default function AgentCombobox({
// trigger free to overflow its dialog column and look misaligned with Project/Name.
-
-
-
+ onSetDefault(value ?? 'blank') : undefined}
+ >
+
+
+
+