Skip to content

feat(voice): unify realtime call panels and audio-reactive logo #6338

feat(voice): unify realtime call panels and audio-reactive logo

feat(voice): unify realtime call panels and audio-reactive logo #6338

Triggered via pull request September 10, 2026 02:30
Status Cancelled
Total duration 10m 38s
Artifacts –

ci.yml

on: pull_request
Build Impact
15s
Build Impact
Shell Deploy Scripts
10s
Shell Deploy Scripts
Matrix: cli-test
Matrix: Impact-selected Linux / Relay Contract / build
Waiting for pending jobs
Matrix: rust-build-check
DSH Profile Packaging (windows-latest)
0s
DSH Profile Packaging (windows-latest)
Frontend Build
6m 25s
Frontend Build
Rust / CLI Validation
3s
Rust / CLI Validation
Fit to window
Zoom out
Zoom in

Annotations

14 errors and 10 warnings
Frontend Build
Process completed with exit code 1.
src/app/components/NavPanel/unifiedSessionCreation.test.ts > unified project session creation > moves New Session from search to each workspace action strip and keeps Hello opening shared chat before voice: src/web-ui/src/app/components/NavPanel/unifiedSessionCreation.test.ts#L64
AssertionError: expected 'import { useCallback, type ReactNode …' to contain '<RealtimeVoiceCallPanel />' - Expected + Received - <RealtimeVoiceCallPanel /> + import { useCallback, type ReactNode } from 'react'; + import { Phone } from 'lucide-react'; + import { OverflowText } from '@openbitfun/ui'; + import { useI18n } from '@/infrastructure/i18n'; + + import { RealtimeVoiceCallPanel } from './RealtimeVoiceCallPanel'; + import { useRealtimeVoiceCall } from './RealtimeVoiceCallContext'; + import type { VoiceMiniAppCallTarget } from './voiceClientContext'; + import './ConversationModeSurface.scss'; + + interface ConversationModeSurfaceProps { + children: ReactNode; + className?: string; + /** Captured MiniApp route; absence keeps the existing workspace voice flow. */ + voiceTarget?: VoiceMiniAppCallTarget; + /** Prevents a MiniApp call from falling back to the workspace route while its session binds. */ + voiceStartDisabled?: boolean; + switchTestId?: string; + onCloseVoice?: () => void; + } + + /** + * Shared text/realtime-voice capability shell for compact conversation hosts. + * Window-specific components own only their chrome and provide the text + * surface; this component is the single owner of mode switching and voice UI. + */ + export function ConversationModeSurface({ + children, + className, + voiceTarget, + voiceStartDisabled = false, + switchTestId, + onCloseVoice, + }: ConversationModeSurfaceProps) { + const { t } = useI18n('settings/voice-input'); + const { + enabled, + phase, + start: startVoiceCall, + } = useRealtimeVoiceCall(); + const isVoiceMode = phase !== 'idle'; + const showModeSwitch = enabled && !isVoiceMode; + + const handleModeSwitch = useCallback(() => { + if (!enabled || voiceStartDisabled) return; + startVoiceCall(voiceTarget); + }, [enabled, startVoiceCall, voiceStartDisabled, voiceTarget]); + + return ( + <div + className={[ + 'openbitfun-conversation-mode-surface', + className, + ].filter(Boolean).join(' ')} + data-openbitfun-component="conversation-mode-surface" + data-openbitfun-part="root" + data-openbitfun-state={isVoiceMode ? 'voice' : 'chat'} + > + <div + className="openbitfun-conversation-mode-surface__body" + data-openbitfun-component="conversation-mode-surface" + data-openbitfun-part="body" + > + {isVoiceMode ? <RealtimeVoiceCallPanel onClose={onCloseVoice} /> : children} + </div> + + {showModeSwitch ? ( + <footer + className="openbitfun-conversation-mode-surface__switch" + data-openbitfun-component="conversation-mode-surface" + data-openbitfun-part="modeSwitch" + > + <button data-overflow-trigger + type="button" + className="openbitfun-conversation-mode-surface__switch-button" + data-testid={switchTestId} + data-openbitfun-component="conversation-mode-surface" + data-openbitfun-part="modeSwitchButton" + disabled={voiceStartDisabled} + onClick={handleModeSwitch} + > + <Phone size={15} aria-hidden="true" /> + <OverflowText> + {t('voiceCall.call.switchToVoice')} + </OverflowText> + </button> + </footer> + ) : null} + </div> + ); + } + ❯ src/app/components/NavPanel/unifiedSessionCreation.test.ts:64:34
Rust Build Check (windows-latest)
Canceling since a higher priority waiting request for ci-refs/pull/2938/merge exists
Rust Build Check (windows-latest)
The operation was canceled.
CLI Tests (windows-latest)
Canceling since a higher priority waiting request for ci-refs/pull/2938/merge exists
CLI Tests (windows-latest)
The operation was canceled.
Rust Build Check (ubuntu-latest)
Canceling since a higher priority waiting request for ci-refs/pull/2938/merge exists
Rust Build Check (ubuntu-latest)
The operation was canceled.
CLI Tests (ubuntu-latest)
Canceling since a higher priority waiting request for ci-refs/pull/2938/merge exists
CLI Tests (ubuntu-latest)
The operation was canceled.
Rust Build Check (macos-15)
Canceling since a higher priority waiting request for ci-refs/pull/2938/merge exists
Rust Build Check (macos-15)
The operation was canceled.
CI
Canceling since a higher priority waiting request for ci-refs/pull/2938/merge exists
Rust / CLI Validation
Process completed with exit code 1.
Frontend Build: src/web-ui/src/shared/announcement-system/components/ReleaseLetterModal.tsx#L22
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/tool-cards/AgentWaitToolCard.tsx#L17
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/voice/RealtimeVoiceCallContext.tsx#L32
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/voice/RealtimeVoiceCallContext.tsx#L23
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/modern/MessageReferenceCapsule.tsx#L29
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/modern/MessageReferenceCapsule.tsx#L7
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/ReasoningPresetSelector.tsx#L112
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/flow_chat/components/ReasoningPresetSelector.tsx#L36
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/app/components/SceneTopBar/SceneChrome.tsx#L121
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Frontend Build: src/web-ui/src/app/components/NavPanel/components/DeviceArtwork.tsx#L6
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components