Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 80 additions & 80 deletions apps/desktop/src/app/settings/model-settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -888,86 +888,86 @@ export function ModelSettings({ onMainModelChanged }: ModelSettingsProps) {
return (
<div className="scroll-mt-6 rounded-lg" id={`aux-task-${meta.key}`} key={meta.key}>
<ListRow
action={
!isEditing && (
<div className="flex shrink-0 items-center gap-1.5">
<Button
disabled={!mainModel || applying}
onClick={() => void setAuxiliaryToMain(meta.key)}
size="sm"
variant="text"
>
{m.setToMain}
</Button>
<Button
disabled={!providers.length || applying}
onClick={() => beginAuxiliaryEdit(meta.key)}
size="sm"
variant="textStrong"
>
{m.change}
</Button>
</div>
)
}
below={
isEditing && (
<div className="mt-2 flex flex-wrap items-center gap-2 pt-1">
<Select
onValueChange={value => setAuxDraft(prev => ({ ...prev, provider: value, model: '' }))}
value={auxDraft.provider}
>
<SelectTrigger className={cn('min-w-32', CONTROL_TEXT)}>
<SelectValue placeholder={m.provider} />
</SelectTrigger>
<SelectContent>
{providerOptions.map(provider => (
<SelectItem key={provider.slug || 'none'} value={provider.slug || 'none'}>
{provider.name}
</SelectItem>
))}
</SelectContent>
</Select>
<Select
onValueChange={value => setAuxDraft(prev => ({ ...prev, model: value }))}
value={auxDraft.model}
>
<SelectTrigger className={cn('min-w-48', CONTROL_TEXT)}>
<SelectValue placeholder={m.model} />
</SelectTrigger>
<SelectContent>
{withActive(auxDraftProviderModels, auxDraft.model).map(model => (
<SelectItem key={model} value={model}>
{model}
</SelectItem>
))}
</SelectContent>
</Select>
<Button
disabled={!auxDraft.provider || !auxDraft.model || applying}
onClick={() => void applyAuxiliaryDraft(meta.key)}
size="sm"
>
{applying ? m.applying : t.common.apply}
</Button>
<Button onClick={() => setEditingAuxTask(null)} size="sm" variant="ghost">
{t.common.cancel}
</Button>
</div>
)
}
description={
<span className="font-mono text-[0.68rem]">
{isAuto ? m.autoUseMain : `${current.provider} · ${current.model || m.providerDefault}`}
</span>
}
title={
<span className="flex items-baseline gap-2">
{copy.label}
<Pill>{copy.hint}</Pill>
</span>
}
/>
action={
!isEditing && (
<div className="flex shrink-0 items-center gap-1.5">
<Button
disabled={!mainModel || applying}
onClick={() => void setAuxiliaryToMain(meta.key)}
size="sm"
variant="text"
>
{m.setToMain}
</Button>
<Button
disabled={!providers.length || applying}
onClick={() => beginAuxiliaryEdit(meta.key)}
size="sm"
variant="textStrong"
>
{m.change}
</Button>
</div>
)
}
below={
isEditing && (
<div className="mt-2 flex flex-wrap items-center gap-2 pt-1">
<Select
onValueChange={value => setAuxDraft(prev => ({ ...prev, provider: value, model: '' }))}
value={auxDraft.provider}
>
<SelectTrigger className={cn('min-w-32', CONTROL_TEXT)}>
<SelectValue placeholder={m.provider} />
</SelectTrigger>
<SelectContent>
{providerOptions.map(provider => (
<SelectItem key={provider.slug || 'none'} value={provider.slug || 'none'}>
{provider.name}
</SelectItem>
))}
</SelectContent>
</Select>
<Select
onValueChange={value => setAuxDraft(prev => ({ ...prev, model: value }))}
value={auxDraft.model}
>
<SelectTrigger className={cn('min-w-48', CONTROL_TEXT)}>
<SelectValue placeholder={m.model} />
</SelectTrigger>
<SelectContent>
{withActive(auxDraftProviderModels, auxDraft.model).map(model => (
<SelectItem key={model} value={model}>
{model}
</SelectItem>
))}
</SelectContent>
</Select>
<Button
disabled={!auxDraft.provider || !auxDraft.model || applying}
onClick={() => void applyAuxiliaryDraft(meta.key)}
size="sm"
>
{applying ? m.applying : t.common.apply}
</Button>
<Button onClick={() => setEditingAuxTask(null)} size="sm" variant="ghost">
{t.common.cancel}
</Button>
</div>
)
}
description={
<span className="font-mono text-[0.68rem]">
{isAuto ? m.autoUseMain : `${current.provider} · ${current.model || m.providerDefault}`}
</span>
}
title={
<span className="flex items-baseline gap-2">
{copy.label}
<Pill>{copy.hint}</Pill>
</span>
}
/>
</div>
)
})}
Expand Down
9 changes: 4 additions & 5 deletions apps/desktop/src/app/settings/toolset-config-panel.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ vi.mock('@/hermes', () => ({
getToolsetModels: (name: string, provider?: string) => getToolsetModels(name, provider),
selectToolsetModel: (name: string, model: string, provider?: string) => selectToolsetModel(name, model, provider),
selectToolsetProvider: (name: string, provider: string, capability?: string) =>
capability === undefined ? selectToolsetProvider(name, provider) : selectToolsetProvider(name, provider, capability),
capability === undefined
? selectToolsetProvider(name, provider)
: selectToolsetProvider(name, provider, capability),
setEnvVar: (key: string, value: string) => setEnvVar(key, value),
deleteEnvVar: (key: string) => deleteEnvVar(key),
revealEnvVar: (key: string) => revealEnvVar(key),
Expand Down Expand Up @@ -378,7 +380,6 @@ describe('ToolsetConfigPanel', () => {
})
})


it('swaps the install hint for the installed one-liner when the provider is ready', async () => {
// Server says the post_setup install is already satisfied (status ready) —
// the "needs a one-time install" copy would contradict the Ready pill.
Expand Down Expand Up @@ -825,9 +826,7 @@ describe('ToolsetConfigPanel', () => {
fireEvent.pointerDown(trigger, { button: 0, ctrlKey: false, pointerType: 'mouse' })
fireEvent.click(await screen.findByRole('menuitem', { name: 'Manage in API Keys' }))

await waitFor(() =>
expect(navigateSpy).toHaveBeenCalledWith('/settings?tab=keys&key=ELEVENLABS_API_KEY')
)
await waitFor(() => expect(navigateSpy).toHaveBeenCalledWith('/settings?tab=keys&key=ELEVENLABS_API_KEY'))
})

it('hides "Manage in API Keys" while the key is unset', async () => {
Expand Down
Loading