Repository navigation
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
Shell Deploy Scripts
10s
Matrix: cli-test
Matrix: Impact-selected Linux / Relay Contract / build
Waiting for pending jobs
Matrix: rust-build-check
DSH Profile Packaging (windows-latest)
0s
Frontend Build
6m 25s
Rust / CLI Validation
3s
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
|