Spaces:
Sleeping
Sleeping
Commit History
-
Clicking the header logo/wordmark returns to Home
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>743fe31
-
Scope onboarding-done state per account, not per browser
bm_onboarding_v1 was a single flat localStorage key with no user scoping — once any account finished onboarding on a browser, every other account signing in on that same browser (e.g. a friend testing on your machine, or you testing a second account) silently skipped it too. Now keyed as bm_onboarding_v1_<user.id> and re-checked whenever the signed-in user actually changes, not just once at mount.9d84a97
-
Rebuild History/session-detail into 3 CLAUDE.md-compliant tabs
Replaces the old Dimensions tab (numeric 1-5 trait scores) and the per-participant speaker-timeline chart (rule #8: persisted behavioral signals for every other room participant, indefinitely) with: - Session Spectrum: 7 composites (Speech Style, Vocal Arousal, Rapport, Power Balance, Turn-taking Courtesy, Fluency, Responsive Engagement), each a self-relative "more/less than your usual" read computed by z-scoring components against their own history at read-time, never a stored raw score. New evidence_gate.py layer, verified with 18 synthetic checks. - Overview: metrics-first ordering, Notable Pattern removed (redundant + violated rule #3), Behavioral Observations horizontal-scroll with the resonance-vote layout fixed (vote now sits against the observation, not the adjacent reflective question) and tips attached via existing coaching_suggestions[].dimension_key matching. - HistoryView: dropped the numeric score dots and the speaker-timeline chart, added one self-re…31abd7f
-
Complete the password reset flow; fix feedback email sender
AuthView gains an "update-password" mode (new password + confirm, calls supabase.auth.updateUser) and App.jsx now catches Supabase's PASSWORD_RECOVERY auth event to route there before the normal app/onboarding. The reset email's redirectTo now points at the extension's own fullpage URL (built dynamically via chrome.runtime.getURL, not hardcoded), since there's no hosted copy of the app to redirect to otherwise. manifest.json declares index.html as a web_accessible_resource — without it, Chrome silently blocks external navigation into the extension with ERR_BLOCKED_BY_CLIENT, which is what an actual end-to-end test surfaced. Also switches the feedback-notification email's sender to Resend's shared sandbox address (onboarding@resend.dev) so it works with any API key immediately, rather than requiring mirrorai.live's domain to be verified in Resend first. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>454186b -
Revert to the bar-graph logo
The Dome/Clarity mark didn't land well in practice — reverting App.jsx, AuthView, OnboardingView, HowItWorksView, ProfileView's empty state, favicon.svg, generate-icons.html, and the extension icon PNGs to their pre-dome-mark state, and removing the now-unused Logo.jsx. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>7dd0d81 -
Replace the bar-graph logo with the Dome/Clarity mark
Introduces a single shared Logo.jsx component (DomeMark + LogoLockup) and retires 5 independently hand-duplicated copies of the old equalizer-bar SVG across App.jsx, AuthView, OnboardingView, HowItWorksView, and ProfileView's empty state. The new mark matches docs/Mirror_Canonical_Vision.md's "Clarity" mark: a faint dashed dome above the mirror line, a solid dome below rendered with a radial gradient (bright center, deepening toward the edges). Also rewrites favicon.svg and generate-icons.html to match, and regenerates the extension's icon16/48/128.png against a dark background rather than the old near-black canvas default. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>f9393f8
-
Phase B3 second slice: replace Mirror Feed with evidence-gated Home feed
Retires the LLM free-form mirror_feed/recurring_coaching system (no dismissal awareness, session-count-gated patterns) in favor of five card types built from already-computed evidence and portrait data: strength, observation, how-it-may-land, progress, and still-forming. Cards are self-relative, carry their evidence, and are dismissable via a new dismissed_cards table — dismissing a growth_area/observation framing of a signal shares one key so it holds even if the portrait LLM later reclassifies it. Home is now the app's default landing tab. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>7d68132
-
Phase B1: quarantine pyannote/voiceprint off the live path, remove Upload UI
Per CLAUDE.md rule #1 (no diarization/voiceprint guessing on the live path), now that the mic-capture keystone means the user is identified by construction. Changes: - backend/main.py: removed the pyannote diarize() + voiceprint-matching fallback branch from _run_prepare_job entirely. When no WebRTC speaker timeline is available, the job now fails cleanly with a clear error instead of silently guessing the speaker. Also removed _update_voiceprint() (was unconditionally running pyannote embeddings on every session, including WebRTC-mode ones — a live-path violation this audit surfaced). diarizer.merge_transcript_with_speakers() stays; it's a transcript/timeline merge utility, not diarization itself, and the WebRTC path depends on it. pipeline/diarizer.py and pipeline/voiceprint.py are left in place (quarantined, not deleted) for a possible future upload-a-file feature. - Frontend: removed the Upload nav tab + UploadView, and the "Train your voice" account-menu entr…0507574 -
Self-heal a 401 mid-chunk by refreshing the auth token on demand
prepare and finalize can now be several minutes apart (2 transcriptions, diarization, signal extraction, scoring, an LLM call) — long enough for the Supabase token cached at recording-start to go stale before finalize runs, which surfaced as "Finalize failed (HTTP 401): Invalid or expired token" during mic-capture verification. background.js now retries once on a 401 by asking any open extension page to force-refresh its session via getSession() (which refreshes on demand if expired) and reports the fresh token back over runtime messaging. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>ae18cb8
-
Add job timeout watchdog, session pagination, feedback modal, and store assets
- Backend: 15-min per-job timeout using threading.Timer + _cancelled set; fires at every existing cancellation checkpoint in both prepare and finalize jobs - Backend: GET /api/sessions now paginated (page/page_size params, returns total + has_more) - Frontend: HistoryView loads 10 sessions at a time with a "Load more" button that appends - Frontend: FeedbackModal component wired into Account menu → Send feedback - Landing: CNAME for mirrorai.live custom domain - Store assets: listing copy, screenshots template, promo tile for CWS submission Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>0580b30
-
Fix backend round(dict) crash + tab capture permission + consent/results UX
- Fix TypeError in backend: logger was calling round() on dimension group dicts (dimensions values are nested dicts, not scalars) - Fix tab capture "Extension has not been invoked": moved getMediaStreamId to background SW action.onClicked (where activeTab grant lives); removed it from panel page which can never hold that grant - Switch openPanelOnActionClick to false + manual sidePanel.open() so activeTab grant reaches the SW correctly - Bump consent key to mirror_consent_v2 so existing users see the modal again - Remove 5-second auto-dismiss on analysis results; add persistent "View in History" button instead - Wire onViewHistory prop through App → MeetStatusBanner → history nav Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>886eaea -
Add open-as-full-page feature
- Small expand icon button in the header (side panel only) opens the extension as a full browser tab at index.html?fullpage=1 - Full page mode: wider layout (900px, 40px side padding vs 600px/24px), no MeetStatusBanner (recording belongs in the side panel) - Expand button hidden when already in full page or not in extension context - isExtension and isFullPage are module-level constants so they don't recompute on every render Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>1417226 -
Remove enrollment gate, add 15-session monthly cap
- App.jsx: enrollment no longer blocks access — removed the voiceprint status check and the blocking EnrollView screen. Voice training stays available in Account menu as an optional setting. - main.py: /api/prepare/start checks monthly session count before processing; returns 429 when >= 15 sessions used this month. New /api/usage endpoint returns used/limit/remaining/resets_on. - UploadView: shows a subtle session usage bar (turns orange at ≤3 remaining, red at 0) and disables the upload button when limit is hit. Refreshes usage count after each successful analysis. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>edee3c4
-
Major feature update: Google Meet recording, cumulative mirror feed, UX overhaul
Backend: - Fix talk ratio inflation for multi-speaker Google Meet calls (use all_other_segs) - Add user_perspective field to InsightGenerator — user now feels personally seen - Mirror feed is now cumulative: items persist, evolve, and grow across sessions (v4) - Expose per-speaker WPM timeline in /api/sessions for history chart - Bump _MF_VERSION to 4 to force feed regeneration with new cumulative logic Frontend: - Google Meet WebRTC recording: content-meet.js + meet-webrtc-injector.js + offscreen audio pipeline - Speaker timeline chart in History tab (who spoke when, WPM per participant) - ProfileView: Portrait section moved above Mirror Feed (it's the centrepiece) - ProfileView: Recurring Themes section added (coaching areas flagged across sessions) - ResultsView: Summary tab removed, summary_sentence block removed - ResultsView: "Your Perspective" section added (user_perspective from InsightGenerator) - ResultsView: Visual 3-segment talk split bar (You / Others / Silence) - Results…5748a9d
-
Rename to mirror., scroll reveal animations, waveform logo, deployment config
- Renamed app from Behavioral Mirror to mirror. throughout - Added waveform SVG logo (option 2A) to all pages replacing emoji placeholders - Added scroll reveal animations (Reveal/RevealItem) to all pages - Cleaned requirements.txt: removed unused anthropic, openai-whisper, whisperx, sqlalchemy - Added Dockerfile with CPU-only torch and ffmpeg for Railway deployment - Updated CORS to allow chrome-extension:// origins via regex + FRONTEND_URL env var - Added .env.example template Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>d1cde70
-
Profile intelligence, context-aware baselines, and Mirror Feed
Core additions: - Personality synthesis with paragraph + 5 scored dimensions (PersonalitySynthesizer) - Context-specific baselines: population norms per context type → personal context average once 3+ same-context sessions exist. Eliminates false-positive coaching (e.g. high talk ratio in evaluative contexts no longer flagged as domination) - Mirror Feed: per-session highlight feed on profile page, collapsed with peek effect - Reflect tab: pre-computed session Q&A (generate_reflection_questions) - Transcript quotes extracted and passed to profile synthesis for grounded narratives - Onboarding flow (3-step, localStorage gated) - Session delta: flags dimension score changes ≥8pts after each new session - Blind spots: top 3 context gaps the mirror hasn't seen - Profile completeness bar with depth label - Context detector pipeline stage (ContextDetector via Groq) - Voice enrollment UI (EnrollView) with 1–3 round recording - Auth UI (AuthView), Supabase client, API client - SSE-based pr…d4c6e81
-
Parallel transcription, SSE reliability fixes, HistoryView optimisation
- Parallelize Whisper + pyannote in prepare job using ThreadPoolExecutor (~4 min saved) - Add voiceprint.py speaker embedding module (pyannote/embedding, 70/30 blend) - Fix SSE done message dropped on stream close (asyncio.sleep flush before break) - Add onerror fallback: fetch result from DB if SSE drops after job completes - Reset UploadView to idle state after results delivered (no stuck finalizing screen) - Keep HistoryView always mounted; re-fetch only on tab activation (stops GET flooding) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>bd77e3e
-
Dimension scoring, expanded signals, and full results UI overhaul
- Add DimensionScorer with 4 behavioral dimensions (emotional state, relational dynamics, communication effectiveness, conversation arc), each with 5 sub-scores - Expand SignalExtractor with vocal energy, speech acceleration, questions, monologue detection, vocabulary richness, silence ratio, and notable signal detection - Add baseline comparison after 3+ sessions - Update InsightGenerator to include dimensions and transcript in LLM prompt, produce conversation summary and dimension narrative - Wire dimensions through main.py pipeline and database - Overhaul ResultsView to display all new signals and dimension scores Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>b18547f
-
MVP working - audio analysis pipeline with Whisper, MFCC diarization, Groq insights
b2eef7c