Remove quick agent selection repair effect

This commit is contained in:
Neil
2026-05-31 06:56:36 -07:00
parent 75c9f496f1
commit d305ca0cf9
3 changed files with 119 additions and 21 deletions
@@ -4,8 +4,10 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/u
import NewWorkspaceComposerCard from '@/components/NewWorkspaceComposerCard'
import AgentSettingsDialog from '@/components/agent/AgentSettingsDialog'
import { useComposerState } from '@/hooks/useComposerState'
import { isTuiAgentEnabled } from '../../../shared/tui-agent-selection'
import { pickQuickWorkspaceAgent } from '@/lib/quick-workspace-agent-selection'
import {
pickQuickWorkspaceAgent,
resolveQuickWorkspaceAgentSelection
} from '@/lib/quick-workspace-agent-selection'
import type { LinkedWorkItemSummary } from '@/lib/new-workspace'
import { shouldAllowComposerEnterSubmitTarget } from '@/lib/new-workspace-enter-guard'
import { isScreenSubmitShortcut } from '@/lib/screen-submit-shortcut'
@@ -143,24 +145,18 @@ function QuickTabBody({
// prior catalog fallback while filtering disabled agents out of that choice.
return pickQuickWorkspaceAgent(pref, cardProps.detectedAgentIds, settings?.disabledTuiAgents)
}, [cardProps.detectedAgentIds, settings?.defaultTuiAgent, settings?.disabledTuiAgents])
const quickAgent = quickAgentOverride === undefined ? preferredQuickAgent : quickAgentOverride
useEffect(() => {
if (
quickAgentOverride === undefined ||
quickAgentOverride === null ||
(isTuiAgentEnabled(quickAgentOverride, settings?.disabledTuiAgents) &&
(cardProps.detectedAgentIds === null || cardProps.detectedAgentIds.has(quickAgentOverride)))
) {
return
}
setQuickAgentOverride(preferredQuickAgent)
}, [
cardProps.detectedAgentIds,
preferredQuickAgent,
const resolvedQuickAgentSelection = resolveQuickWorkspaceAgentSelection({
quickAgentOverride,
settings?.disabledTuiAgents
])
preferredQuickAgent,
detectedAgentIds: cardProps.detectedAgentIds,
disabledTuiAgents: settings?.disabledTuiAgents
})
if (resolvedQuickAgentSelection.quickAgentOverride !== quickAgentOverride) {
// Why: detection/settings changes can invalidate a user-picked agent; repair
// before the child selector renders an unavailable option for one commit.
setQuickAgentOverride(resolvedQuickAgentSelection.quickAgentOverride)
}
const quickAgent = resolvedQuickAgentSelection.quickAgent
const handleQuickAgentChange = useCallback((agent: TuiAgent | null) => {
setQuickAgentOverride(agent)
@@ -1,7 +1,10 @@
import { describe, expect, it } from 'vitest'
import { TUI_AGENT_AUTO_PICK_ORDER } from '../../../shared/tui-agent-selection'
import { AGENT_CATALOG } from './agent-catalog'
import { pickQuickWorkspaceAgent } from './quick-workspace-agent-selection'
import {
pickQuickWorkspaceAgent,
resolveQuickWorkspaceAgentSelection
} from './quick-workspace-agent-selection'
describe('pickQuickWorkspaceAgent', () => {
it('keeps the fallback order in sync with the desktop agent catalog', () => {
@@ -25,3 +28,49 @@ describe('pickQuickWorkspaceAgent', () => {
expect(pickQuickWorkspaceAgent('codex', ['claude', 'codex'], ['codex'])).toBe('claude')
})
})
describe('resolveQuickWorkspaceAgentSelection', () => {
it('uses the preferred quick agent until the user picks an override', () => {
expect(
resolveQuickWorkspaceAgentSelection({
quickAgentOverride: undefined,
preferredQuickAgent: 'claude',
detectedAgentIds: ['claude', 'codex'],
disabledTuiAgents: []
})
).toEqual({ quickAgent: 'claude', quickAgentOverride: undefined })
})
it('keeps explicit blank overrides stable', () => {
expect(
resolveQuickWorkspaceAgentSelection({
quickAgentOverride: null,
preferredQuickAgent: 'claude',
detectedAgentIds: ['claude'],
disabledTuiAgents: []
})
).toEqual({ quickAgent: null, quickAgentOverride: null })
})
it('keeps an available user override', () => {
expect(
resolveQuickWorkspaceAgentSelection({
quickAgentOverride: 'codex',
preferredQuickAgent: 'claude',
detectedAgentIds: new Set(['claude', 'codex']),
disabledTuiAgents: []
})
).toEqual({ quickAgent: 'codex', quickAgentOverride: 'codex' })
})
it('replaces an unavailable override with the preferred quick agent', () => {
expect(
resolveQuickWorkspaceAgentSelection({
quickAgentOverride: 'codex',
preferredQuickAgent: 'claude',
detectedAgentIds: ['claude'],
disabledTuiAgents: []
})
).toEqual({ quickAgent: 'claude', quickAgentOverride: 'claude' })
})
})
@@ -1,5 +1,9 @@
import type { TuiAgent } from '../../../shared/types'
import { pickTuiAgent, TUI_AGENT_AUTO_PICK_ORDER } from '../../../shared/tui-agent-selection'
import {
isTuiAgentEnabled,
pickTuiAgent,
TUI_AGENT_AUTO_PICK_ORDER
} from '../../../shared/tui-agent-selection'
export function pickQuickWorkspaceAgent(
preferred: TuiAgent | 'blank' | null | undefined,
@@ -9,3 +13,52 @@ export function pickQuickWorkspaceAgent(
const candidates = detectedAgentIds ?? TUI_AGENT_AUTO_PICK_ORDER
return pickTuiAgent(preferred, candidates, disabledTuiAgents)
}
function hasDetectedAgent(detectedAgentIds: Iterable<TuiAgent>, agent: TuiAgent): boolean {
if (detectedAgentIds instanceof Set) {
return detectedAgentIds.has(agent)
}
for (const detectedAgentId of detectedAgentIds) {
if (detectedAgentId === agent) {
return true
}
}
return false
}
function isQuickWorkspaceAgentAvailable(
agent: TuiAgent,
detectedAgentIds: Iterable<TuiAgent> | null,
disabledTuiAgents?: Iterable<unknown> | null
): boolean {
if (!isTuiAgentEnabled(agent, disabledTuiAgents)) {
return false
}
return detectedAgentIds === null || hasDetectedAgent(detectedAgentIds, agent)
}
export function resolveQuickWorkspaceAgentSelection({
quickAgentOverride,
preferredQuickAgent,
detectedAgentIds,
disabledTuiAgents
}: {
quickAgentOverride: TuiAgent | null | undefined
preferredQuickAgent: TuiAgent | null
detectedAgentIds: Iterable<TuiAgent> | null
disabledTuiAgents?: Iterable<unknown> | null
}): {
quickAgent: TuiAgent | null
quickAgentOverride: TuiAgent | null | undefined
} {
if (quickAgentOverride === undefined || quickAgentOverride === null) {
return {
quickAgent: quickAgentOverride === undefined ? preferredQuickAgent : null,
quickAgentOverride
}
}
if (isQuickWorkspaceAgentAvailable(quickAgentOverride, detectedAgentIds, disabledTuiAgents)) {
return { quickAgent: quickAgentOverride, quickAgentOverride }
}
return { quickAgent: preferredQuickAgent, quickAgentOverride: preferredQuickAgent }
}