feat: voice assistant integration, PiP window fixes, widget improvements and pixel art scrollbar
- Android voice assistant: RecognitionService, VoiceInteractionSession with startAssistantActivity, es-HN speech recognition - Voice transcript sent to first alive terminal via WebSocket, opens FloatingTranscriptDebug on correct session - PiP window: fix close button using getCurrentWebviewWindow(), add mini/restore toggle, remove alwaysOnTop - Add webview-close and window-destroy permissions to capabilities - Pixel art ocean scrollbar on /transcript-debug respecting scroll nav mode settings - Widget improvements: terminal list service, input widget provider, updated layouts
This commit is contained in:
@@ -32,6 +32,7 @@ const serverConfig = isTauri ? useServerConfig() : null
|
||||
const showServerConfig = ref(false)
|
||||
const needsServerConfig = computed(() => isTauri && serverConfig && !serverConfig.isConfigured)
|
||||
|
||||
const isPipWindow = computed(() => route.query.pip === '1')
|
||||
const showVoice = ref(false)
|
||||
const showTranscriptDebug = ref(false)
|
||||
const showDebugConsole = ref(false)
|
||||
@@ -229,23 +230,16 @@ onMounted(async () => {
|
||||
return true
|
||||
}
|
||||
|
||||
// Bridge for Android voice assistant — opens FloatingTranscriptDebug on the target terminal
|
||||
// Bridge for Android voice assistant — navigates to transcript-debug page on the target terminal
|
||||
;(window as any).__VOICE_OPEN_TERMINAL__ = (ephemeralSessionId: string) => {
|
||||
const entry = sessionState.terminalRegistry.find(
|
||||
t => t.ephemeralSessionId === ephemeralSessionId
|
||||
)
|
||||
if (entry && transcriptDebugRef.value) {
|
||||
transcriptDebugRef.value.switchToTerminal(entry.transcriptSessionId)
|
||||
showTranscriptDebug.value = true
|
||||
return true
|
||||
}
|
||||
// Fallback: open on first terminal
|
||||
if (sessionState.terminalRegistry.length && transcriptDebugRef.value) {
|
||||
transcriptDebugRef.value.switchToTerminal(sessionState.terminalRegistry[0].transcriptSessionId)
|
||||
showTranscriptDebug.value = true
|
||||
return true
|
||||
}
|
||||
return false
|
||||
const idx = entry
|
||||
? sessionState.terminalRegistry.indexOf(entry) + 1
|
||||
: 1
|
||||
router.push(`/transcript-debug/${idx}`)
|
||||
return true
|
||||
}
|
||||
|
||||
// Sync Windows titlebar color with CSS variable
|
||||
@@ -372,8 +366,8 @@ if (serverConfig) {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="app-container" :class="{ wco: forceWco }">
|
||||
<header class="app-header" :class="{ 'wco-header': forceWco }">
|
||||
<div class="app-container" :class="{ wco: forceWco, 'pip-window': isPipWindow }">
|
||||
<header v-if="!isPipWindow" class="app-header" :class="{ 'wco-header': forceWco }">
|
||||
<div class="header-left">
|
||||
<button
|
||||
class="toolbar-toggle"
|
||||
@@ -439,7 +433,7 @@ if (serverConfig) {
|
||||
</div>
|
||||
</header>
|
||||
<main class="app-main">
|
||||
<Toolbar :collapsed="!toolbarVisible" />
|
||||
<Toolbar v-if="!isPipWindow" :collapsed="!toolbarVisible" />
|
||||
<RouterView v-slot="{ Component }">
|
||||
<Transition name="page" mode="out-in">
|
||||
<component :is="Component" />
|
||||
@@ -447,8 +441,8 @@ if (serverConfig) {
|
||||
</RouterView>
|
||||
</main>
|
||||
|
||||
<!-- Transcript Debug FAB Button (pixel art ocean) -->
|
||||
<div class="transcript-fab-wrap" :class="{ 'sheet-open': showVoice || showTranscriptDebug, 'keyboard-visible': keyboardVisible }" @contextmenu.prevent>
|
||||
<!-- Transcript Debug FAB Button (pixel art ocean) — hidden in PiP -->
|
||||
<div v-if="!isPipWindow" class="transcript-fab-wrap" :class="{ 'sheet-open': showVoice || showTranscriptDebug, 'keyboard-visible': keyboardVisible }" @contextmenu.prevent>
|
||||
<TerminalFabStack
|
||||
:terminals="extraTerminals"
|
||||
:active-session-id="transcriptDebugRef?.activeTerminalSessionId ?? null"
|
||||
@@ -559,6 +553,16 @@ if (serverConfig) {
|
||||
background: var(--bg-primary);
|
||||
}
|
||||
|
||||
/* PiP window: no header, no chrome, full bleed */
|
||||
.app-container.pip-window {
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.app-container.pip-window .app-main {
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.app-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
Reference in New Issue
Block a user