diff --git a/apps/desktop/src/app/chat/composer/controls.tsx b/apps/desktop/src/app/chat/composer/controls.tsx
index 7fbe9efa4a25..5933beab4831 100644
--- a/apps/desktop/src/app/chat/composer/controls.tsx
+++ b/apps/desktop/src/app/chat/composer/controls.tsx
@@ -1,11 +1,14 @@
import { Button } from '@/components/ui/button'
import { Codicon } from '@/components/ui/codicon'
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'
import { Tip } from '@/components/ui/tooltip'
import { useI18n } from '@/i18n'
import { triggerHaptic } from '@/lib/haptics'
-import { AudioLines, Layers3, Loader2, Square, SteeringWheel } from '@/lib/icons'
+import { AudioLines, Layers3, Loader2, Mic, Square, SteeringWheel } from '@/lib/icons'
import { cn } from '@/lib/utils'
+import { useMemo } from 'react'
+import type { MicrophoneDevice } from './hooks/use-mic-device'
import type { ConversationStatus } from './hooks/use-voice-conversation'
import type { ChatBarState, VoiceStatus } from './types'
@@ -43,10 +46,13 @@ export function ComposerControls({
conversation,
disabled,
hasComposerPayload,
+ selectedVoiceDeviceId,
state,
+ voiceDevices,
voiceStatus,
onDictate,
- onSteer
+ onSteer,
+ onChangeVoiceDevice
}: {
busy: boolean
busyAction: 'queue' | 'stop'
@@ -55,10 +61,13 @@ export function ComposerControls({
conversation: ConversationProps
disabled: boolean
hasComposerPayload: boolean
+ selectedVoiceDeviceId?: string | null
state: ChatBarState
+ voiceDevices?: MicrophoneDevice[]
voiceStatus: VoiceStatus
onDictate: () => void
onSteer: () => void
+ onChangeVoiceDevice?: (deviceId: string | null) => void
}) {
const { t } = useI18n()
const c = t.composer
@@ -69,9 +78,24 @@ export function ComposerControls({
const showVoicePrimary = !busy && !hasComposerPayload
+ const selectedLabel = useMemo(() => {
+ const match = voiceDevices?.find(device => device.deviceId === selectedVoiceDeviceId)
+
+ return match?.label ?? ''
+ }, [selectedVoiceDeviceId, voiceDevices])
+
return (
+ {(selectedLabel || voiceDevices?.length) && (
+
+ )}
{canSteer && (