feat(ui): redesign voice cockpit with clinical companion drawer, Svelte 5 migration, and Gemini 3.8 voice

- Re-architect VoiceSession into full-bleed studio cockpit with overlay slide-over companion drawer
- Eliminate width squishing defect on LiveInsightPanel and add native dark/light theme support
- Integrate authentic Google Gemini 3.8 Flash TTS with Fenrir persona and fallback audio pipeline
- Implement comprehensive Playwright E2E visual regression suite across Desktop, iPad, and iPhone (21 tests, 45 snapshots)
- Migrate core application to Svelte 5 runes (, , ) with reactive stores
- Maintain .NET 8 Azure Functions serverless endpoints and clean build hygiene
This commit is contained in:
jpremill committed 2026-09-29 23:35:05 -04:00
1 parent c82b112624
commit 1feea40684
148 files changed
+11230 -1706

No files matched your search

+24 -2
View File
@@ -1,6 +1,8 @@
/// <reference types="vitest" />
import path from 'path';
import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import { VitePWA } from 'vite-plugin-pwa';
import pkg from './package.json';
@@ -13,6 +15,7 @@ export default defineConfig(({ mode }) => {
},
plugins: [
react(),
svelte(),
VitePWA({
strategies: 'injectManifest',
srcDir: '.',
@@ -51,15 +54,34 @@ export default defineConfig(({ mode }) => {
})
],
define: {
'process.env.API_KEY': JSON.stringify(env.VITE_GEMINI_API_KEY),
'process.env.GEMINI_API_KEY': JSON.stringify(env.VITE_GEMINI_API_KEY),
'process.env.OPENROUTER_API_KEY': JSON.stringify(env.VITE_OPENROUTER_API_KEY || env.OPENROUTER_API_KEY || ''),
'process.env.GEMINI_API_KEY': JSON.stringify(env.VITE_GEMINI_API_KEY || env.GEMINI_API_KEY || ''),
'process.env.API_KEY': JSON.stringify(env.VITE_GEMINI_API_KEY || env.GEMINI_API_KEY || ''),
'__APP_VERSION__': JSON.stringify(pkg.version),
'__BUILD_TIMESTAMP__': JSON.stringify(new Date().toISOString()),
},
build: {
chunkSizeWarningLimit: 600,
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('@lucide/svelte') || id.includes('lucide-react')) return 'vendor-icons';
if (id.includes('svelte')) return 'vendor-svelte';
if (id.includes('workbox')) return 'vendor-workbox';
}
}
}
}
},
resolve: {
alias: {
'@': path.resolve(__dirname, '.'),
}
},
test: {
include: ['test/**/*.test.ts'],
environment: 'node'
}
};
});