Conversation
There was a problem hiding this comment.
Pull request overview
Implements a “séance” themed redesign for the landing + session experiences, rewrites push-to-talk to share the VAD pipeline, and extends the personas/session APIs to support richer UI (portrait + quotes) and a generated “featured quote” on session end.
Changes:
- Refactors
session.vueinto a new seance layout and new UI components (portrait, controls, overlays). - Reworks PTT to accumulate VAD segments and send a single WAV on release.
- Adds personas fields (image/quote) and a new session API endpoint for quote generation; updates generated API bindings.
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| web-application/frontend/pages/session.vue | Seance UI refactor + sources drawer + new components wiring |
| web-application/frontend/pages/index.vue | New landing page design + persona grid rework |
| web-application/frontend/layouts/seance.vue | New shared seance layout (header + cookie control) |
| web-application/frontend/i18n/locales/en.json | Adds/removes translation keys for new UI copy |
| web-application/frontend/i18n/locales/es.json | Adds/removes Spanish translations for new UI copy |
| web-application/frontend/composables/useVoiceInput.ts | PTT rewrite to use VAD accumulation/flush |
| web-application/frontend/composables/useOrchestratorSocket.ts | Adds WS send/receive logging |
| web-application/frontend/components/session/SessionTranscriptOverlay.vue | New transcript overlay component |
| web-application/frontend/components/session/SessionPortrait.vue | New audio-reactive portrait/glow component |
| web-application/frontend/components/session/SessionEndedOverlay.vue | New end-of-session overlay + quote generation call |
| web-application/frontend/components/session/SessionControls.vue | New stable controls bar + PTT interaction |
| web-application/frontend/components/seance/SeanceHeader.vue | New shared header for seance layout |
| web-application/frontend/assets/css/seance-effects.css | Adds atmospheric CSS effects + shared glassmorphism styles |
| web-application/frontend/api/definitions.ts | Generated API types updated (persona image/quote fields) |
| web-application/backend/test/mocha/test-tools/api-bindings/definitions.ts | Test API bindings updated to match new persona fields |
| web-application/backend/src/services/conversation-engine-service.ts | Adds production-visible logging + transcript privacy adjustments |
| web-application/backend/src/controllers/websocket/websocket.ts | Adds WS logging and message size diagnostics |
| web-application/backend/src/controllers/api/api-session.ts | New session endpoint for generating a featured quote |
| web-application/backend/src/controllers/api/api-personas.ts | Personas API response extended with image/quote fields |
| web-application/backend/src/config/personas.ts | Persona config extended with image/quote fields |
| mobile-application/src/api/definitions.ts | Mobile generated API types updated (persona image/quote fields) |
web-application/frontend/components/session/SessionTranscriptOverlay.vue
Outdated
Show resolved
Hide resolved
| console.log("[SESSION] onPushStart called, micMode:", micMode.value, "isListening:", _isListening.value); | ||
| console.log("[SESSION] startManualRecording is:", typeof startManualRecording); | ||
| try { | ||
| startManualRecording(); | ||
| console.log("[SESSION] startManualRecording returned OK"); | ||
| } catch (err) { | ||
| console.error("[SESSION] startManualRecording THREW:", err); | ||
| } | ||
| } | ||
|
|
||
| function onPushEnd() { | ||
| stopManualRecording(); | ||
| console.log("[SESSION] onPushEnd called"); | ||
| try { | ||
| stopManualRecording(); | ||
| console.log("[SESSION] stopManualRecording returned OK"); | ||
| } catch (err) { | ||
| console.error("[SESSION] stopManualRecording THREW:", err); | ||
| } |
There was a problem hiding this comment.
Remove or guard the debug console logging added to the push-to-talk handlers (console.log/console.error). Leaving these in production will spam the browser console and can leak implementation details; if you still need them, wrap behind a dev flag (e.g. import.meta.env.DEV).
| function send(message: any) { | ||
| wsSend(JSON.stringify(message)); | ||
| const json = JSON.stringify(message); | ||
| console.log("[WS] send:", message.type, "payload size:", json.length, "ws status:", status.value); |
There was a problem hiding this comment.
Avoid unconditional console logging for all WS traffic (both received events and send payload sizes). This will be very noisy in production; either remove it or gate it behind a dev-only flag.
| console.log("[WS] send:", message.type, "payload size:", json.length, "ws status:", status.value); | |
| if (import.meta.env.DEV) { | |
| console.log("[WS] send:", message.type, "payload size:", json.length, "ws status:", status.value); | |
| } |
| console.log("[PTT] pointerdown fired, pttActive:", pttActive); | ||
| if (pttActive) return; | ||
| pttActive = true; | ||
| console.log("[PTT] emitting push-start"); | ||
| emit("push-start"); | ||
| window.addEventListener("pointerup", onPttUp, { once: true }); | ||
| window.addEventListener("pointercancel", onPttUp, { once: true }); | ||
| } | ||
|
|
||
| function onPttUp() { | ||
| console.log("[PTT] pointerup/cancel fired, pttActive:", pttActive); | ||
| if (!pttActive) return; | ||
| pttActive = false; | ||
| console.log("[PTT] emitting push-end"); |
There was a problem hiding this comment.
The PTT control currently logs multiple debug statements to console on pointerdown/up. Please remove these (or gate them behind a dev-only flag) to avoid noisy production logs.
| console.log("[PTT] pointerdown fired, pttActive:", pttActive); | |
| if (pttActive) return; | |
| pttActive = true; | |
| console.log("[PTT] emitting push-start"); | |
| emit("push-start"); | |
| window.addEventListener("pointerup", onPttUp, { once: true }); | |
| window.addEventListener("pointercancel", onPttUp, { once: true }); | |
| } | |
| function onPttUp() { | |
| console.log("[PTT] pointerup/cancel fired, pttActive:", pttActive); | |
| if (!pttActive) return; | |
| pttActive = false; | |
| console.log("[PTT] emitting push-end"); | |
| if (pttActive) return; | |
| pttActive = true; | |
| emit("push-start"); | |
| window.addEventListener("pointerup", onPttUp, { once: true }); | |
| window.addEventListener("pointercancel", onPttUp, { once: true }); | |
| } | |
| function onPttUp() { | |
| if (!pttActive) return; | |
| pttActive = false; |
Session experience redesign + PTT fix + emotion system
Full visual redesign
Landing page (
index.vue)seance-effects.css(+190 lines): fog animations, glow, ectoplasm, slow pulseSession page (
session.vue)landingtoseance— inherits sharedSeanceHeader(gold logo, "Archive Verified" badge)New components
SeanceHeader.vue— Fixed shared header between landing and session (logo + navigation)SessionPortrait.vue— Persona portrait with audio-reactive circular glow (ectoplasm blobs driven by frequency data)SessionControls.vue— Session controls (mic, stop, PTT) with fixed layout that doesn't shift on state changesSessionEndedOverlay.vue— End-of-session modal with transcript, featured quote, and share buttonsSessionTranscriptOverlay.vue— Real-time transcript overlayShareButtons.vue— Social media share buttonsNew layout
seance.vue— Layout wrapper with CookieControl + SeanceHeaderEmotion color system with real differentiation
Emotion colors completely redesigned — previously everything was indistinguishable gold/amber variations:
#d94a2b#c05a3a#f5c842#f0e060#6a7a8a#8aaa9a#7a6a4a#9a8a6a#f2c36bVariable intensity per emotion: angry (×1.8), excited (×1.5), serious (×1.5) amplify blob size and brightness. Whispers (×0.6), pause (×0.4) dim them down.
Push-to-Talk — Complete rewrite
onSpeechEndwith a 3-second fallback that force-pauses VAD before giving uppttWaitingForSpeechEnd: keeps accumulation window open after button release so late VAD segments aren't lostredemptionMs: 150: lowered from 700ms default so VAD firesonSpeechEndfaster after natural silence gapsBackend
Monitor.infologs foraudio-chunkandspeech-endreception (previously debug-only, invisible in production)writeFileSynccalls that were saving user audio to disk. User transcript content is no longer logged (only length)imageUrlfield in personas endpointi18n
en.jsonandes.jsonfor all session texts, controls, overlays, and statesFiles changed (14 modified + 7 new)
New:
frontend/components/seance/SeanceHeader.vuefrontend/components/session/SessionControls.vuefrontend/components/session/SessionEndedOverlay.vuefrontend/components/session/SessionPortrait.vuefrontend/components/session/SessionTranscriptOverlay.vuefrontend/layouts/seance.vuebackend/src/controllers/api/api-session.tsModified:
frontend/pages/session.vue— Full refactor (+497 changes)frontend/pages/index.vue— New landing designfrontend/assets/css/seance-effects.css— Visual effects (+190 lines)frontend/composables/useVoiceInput.ts— PTT rewritefrontend/composables/useOrchestratorSocket.ts— WS loggingbackend/src/services/conversation-engine-service.ts— STT + privacybackend/src/controllers/websocket/websocket.ts— maxPayload + loggingbackend/src/config/personas.ts— imageUrlbackend/src/controllers/api/api-personas.ts— imageUrl in responsefrontend/i18n/locales/en.json+es.json— Session translationsfrontend/api/definitions.ts+ mobile + test bindings — Updated API