Commit Graph

95 Commits

Author SHA1 Message Date
hobokenchicken b06f20f9d8 chore: cleanup dead code and unused files
Deleted 7 unused frontend components (ChatBubble, PetZone, Live2DCat,
BackgroundScene, Clock, Toolbar, types/index.ts).
Deleted unused backend: whisper_stream.py, empty models/ and routers/ dirs.
Removed dead code: Message interface, messages/micError/sendText/addMessage,
conversation_text handler, 3 unused memory.py methods.
Fixed task persistence bug: added 'tasks' to DEFAULT_PREFERENCES.
Stale comment in Live2DStage updated.
2026-06-06 12:05:28 -04:00
hobokenchicken 1eaef8b6ab ui: remove bottom bar, make date/time more prominent
Date/time: text-sm, font-semibold, full opacity plum color.
Removed status bar (kira's here for you, reconnecting, etc).
Grid rows: auto_1fr (no bottom row).
2026-06-06 11:41:19 -04:00
hobokenchicken 8da7d0bd90 fix: single rounded-2xl overflow-hidden container clips all cells
Remove individual cell rounded corners. Parent grid has rounded-2xl + overflow-hidden
for unified frame shape. Each cell still has own bg-white/40 + backdrop-blur-xl.
Center cell stays transparent.
2026-06-06 01:11:45 -04:00
hobokenchicken a135ee5a34 fix: individual frosted glass per cell, only outer corners rounded
Top bar: rounded-t-2xl. Left: rounded-bl-2xl. Right: rounded-br-2xl.
Bottom: rounded-b-2xl. Center stays transparent. Frame look, no blur bleed.
2026-06-06 01:05:09 -04:00
hobokenchicken 2111b3ca9f fix: center cell transparent so bg scene is visible through frame 2026-06-06 01:00:38 -04:00
hobokenchicken 5abdccb113 ui: unified frosted glass frame around Live2D stage
Single bg-white/40 backdrop-blur-xl container as CSS grid.
Sidebars, top bar, bottom bar are grid cells sharing one rounded frame.
Center cell transparent for Live2D. Thin border-white/20 dividers.
2026-06-06 00:56:54 -04:00
hobokenchicken 09a6993af3 ui: frosted glass on top and bottom bars 2026-06-06 00:52:44 -04:00
hobokenchicken f4bf201e38 ui: remove PetZone sidebar box (Mochi lives next to Kira now) 2026-06-06 00:49:12 -04:00
hobokenchicken 5d7d1a3327 feat(pet): move Mochi next to Kira, size +50%
Positioned bottom-right of Kira's bounding box instead of sidebar overlay.
Target size increased from 100px to 150px.
2026-06-06 00:46:41 -04:00
hobokenchicken 2ffd5b2fa5 feat(animations): idle animations for Kira and Mochi
Kira: breathing, body sway, head tilt, eye wander, hair sway, periodic blink
Mochi: breathing, body sway, tail sway (6 segments), ear twitches, blink
Idle loop pauses during celebration animation then resumes.
2026-06-06 00:40:39 -04:00
hobokenchicken 358538299e chore: extend Mochi celebration to 3.5s 2026-06-06 00:35:40 -04:00
hobokenchicken 13de30f5b8 chore: update Kira system prompt with structured ADHD coaching guidelines 2026-06-06 00:34:31 -04:00
hobokenchicken 27ef371bc8 feat(pet): Mochi celebrates when tasks are completed
1.8s animation: tail wag (6 segments), ear wiggle (L/R), eye smile,
cheek blush, body bounce. Uses Cubism coreModel.setParameterValueById.
Triggered by detecting task.completed transition from false→true.
2026-06-06 00:26:22 -04:00
hobokenchicken d807eb0424 ui: remove conversation box, text input, ChatBubble (voice-only now) 2026-06-06 00:19:14 -04:00
hobokenchicken 8f56c44e56 chore: update login password 2026-06-06 00:13:00 -04:00
hobokenchicken a01eb1ed4f feat(auth): simple password login screen for Kayla
Girly-pop themed login with shake animation on wrong password.
Session-based auth (sessionStorage). Password: skibidi
2026-06-06 00:10:16 -04:00
hobokenchicken b097d58f13 feat(tasks): text input + Honcho persistence
Manual task input box in TaskList component.
Tasks persisted to Honcho as JSON preference on every mutation.
Tasks loaded from Honcho on identify (session reconnect).
2026-06-06 00:06:16 -04:00
hobokenchicken cbeec65637 feat(tasks): Gemini tool calling for task list management
5 tools: add_task, remove_task, complete_task, get_tasks, clear_completed_tasks
Backend stores tasks in-memory per session. Frontend TaskList component syncs via WS.
Kira can manage tasks via voice or text conversation.
2026-06-06 00:01:52 -04:00
hobokenchicken 3dd3032ffa chore: voice Aoede → Laomedeia 2026-06-05 23:54:54 -04:00
hobokenchicken 187c33637a fix(honcho): wrap all Honcho calls in try/except (401 key issue) 2026-06-05 23:46:35 -04:00
hobokenchicken 2da52fbc3c fix(gemini): AUDIO only modality (model doesn't support AUDIO+TEXT) 2026-06-05 23:45:33 -04:00
hobokenchicken 378cc153de fix(gemini): correct WebSocket URL path (GenerativeService.BidiGenerateContent) 2026-06-05 23:40:50 -04:00
hobokenchicken 83a990e838 feat(audio): Gemini Live API replaces Whisper+GPT+ElevenLabs
Single WebSocket proxy: frontend PCM16 16kHz → backend → Gemini Live API
Gemini returns PCM16 24kHz audio + text. Playback via Web Audio API queue.
Removed OpenAI/DeepSeek deps. Model: gemini-3.1-flash-live-preview.
Voice: Aoede. Streaming bidirectional audio with silence gating.
2026-06-05 23:36:29 -04:00
hobokenchicken d2bde65645 fix(outfit): PIXI BaseTexture.from() + GL cache invalidation
Uses PIXI.BaseTexture.from(url) for proper pipeline.
Deletes old texture's _glTextures entry before swap.
Deletes new texture's _glTextures after swap to force re-upload.
Render loop (line 4960) detects missing GL entry and re-binds.
2026-06-05 16:11:04 -04:00
hobokenchicken 235f049405 fix(outfit): direct GL texture injection into Cubism renderer
Bypasses PIXI texture pipeline entirely. Loads outfit PNG as Image,
creates raw WebGL texture, and calls cubismRenderer.bindTexture() directly.

Also updated lo-fi video IDs to confirmed working non-stream videos:
- 7ccH8u8fj8Y: Lofi Girl best of 2025
- HFQibg2OJkU: Chillhop Spring 2025
- udGvUx70Q3U: Lofi Chilled Beats 12hr
2026-06-05 16:07:42 -04:00
hobokenchicken 705792a4cb fix(lofi): update to working YouTube video IDs
Old Lofi Girl streams were taken down. Updated to active streams:
- 7NOSDKb0HlU: lofi hip hop radio
- MCkTebktHVc: Chill lofi (College Music)
- KMXZF-K2mus: 24/7 beats
2026-06-05 15:48:33 -04:00
hobokenchicken 45a1de936a fix(outfit+lofi): proper texture swap + YT Player API
Outfit swap: replace entire Texture object + invalidate GL cache
Lo-fi: visible 80px player with YT Player API, proper playVideo() on user gesture
2026-06-05 15:45:15 -04:00
hobokenchicken a3b5477524 feat(wardrobe): swap Live2D outfit textures via wardrobe buttons
Epsilon model has 3 texture sheets: body (00), hair (01), clothes (02).
Outfit PNGs in /outfits/ replace texture_02 at runtime via PIXI BaseTexture swap.
Live2DStage now accepts outfit prop and swaps on change.
App passes currentOutfit to Live2DStage.
2026-06-05 15:29:20 -04:00
hobokenchicken 8a50fef24b fix(live2d): canvas z-50 so cat renders above frosted glass sidebar 2026-06-05 15:23:40 -04:00
hobokenchicken ff6bf46724 fix(lofi): replace YT IFrame API with direct iframe embed
The YT Player API silently fails to autoplay in hidden iframes.
Replaced with a direct <iframe> embed with allow='autoplay; encrypted-media'.
- On 'Start Lo-Fi': creates iframe with autoplay=1
- Station change: remounts iframe with new videoId
- Volume: postMessage API to YT iframe (best effort)
- Much simpler, no external script dependency
2026-06-05 15:20:00 -04:00
hobokenchicken 5dbe30b43c feat(audio): Haus ambient sounds + YouTube player fix
WhiteNoise replaced with full ambient mixer:
- 6 categories: Noise, Rain, Nature, Places, Things, Animals
- 29 real ambient sounds from Haus (MIT licensed)
- Howler.js for playback with looping and per-sound volume
- Mix multiple sounds simultaneously
- Category tab navigation
- 300ms fade in/out for smooth toggling

MusicPlayer fixes:
- Removed origin param (causes issues behind reverse proxy)
- Added onError handler for YouTube errors
- Added onStateChange to track playing state
- Player container 1x1 opacity:0 instead of offscreen positioning
2026-06-05 15:12:51 -04:00
hobokenchicken 5131eb729f fix(audio): proper noise synthesis + YouTube player init
WhiteNoise:
- Paul Kellet pink noise filter (industry standard)
- Brownian motion for brown noise (proper integration)
- Rain: layered brown rumble + random droplet impulse pings
- Cafe: low hum + scattered clatter transients
- Stereo buffers for spatial depth
- Crossfade start/end for seamless loop (50ms fade)
- Proper cleanup on unmount

MusicPlayer:
- YouTube player container uses offscreen positioning instead of
  display:none (hidden divs prevent iframe API initialization)
- Ref-based closure fix: activeId and volume use refs so the
  onYouTubeIframeAPIReady callback reads current values
- Added playerReady state to guard loadVideoById calls
2026-06-05 15:03:02 -04:00
hobokenchicken 8543461195 style: frosted glass sidebars (backdrop-blur-xl, bg-white/40)
Both sidebars get glassmorphism treatment so they stand out against
the scene background images.
2026-06-05 14:57:12 -04:00
hobokenchicken 08932068fd feat(scenes): add 5 illustrated background scenes
Generated 5 scene illustrations via gpt-image-2:
- Cozy Room: golden hour bedroom workspace
- Rooftop Cafe: twilight cafe with city skyline
- Garden: indoor botanical reading nook
- Rainy Window: night rain with bokeh lights
- Stargazing: hilltop under stars and cherry blossoms

Scene interface now supports optional 'image' field.
Background shows full-bleed image when available, gradient as fallback.
Rainy window gets rain particles, stargazing gets stars.
2026-06-05 14:53:38 -04:00
hobokenchicken 37c06db6be fix(expressions): use full expression names with .exp3.json suffix
Epsilon model registers expressions as 'Smile.exp3.json' not 'Smile'.
Added EXPR_MAP to map friendly names to full registered names.
Fixes expression buttons and idle cycling.
2026-06-05 14:19:59 -04:00
hobokenchicken 73fe77f9aa fix(pets): dynamically position cat at PetZone DOM element
Cat position is now measured from the [data-petzone] DOM element's
getBoundingClientRect(), so it always aligns with the PetZone section
regardless of window size or sidebar content height.
Removed Live2DCat import from PetZone (cat renders on shared stage).
2026-06-05 13:51:50 -04:00
hobokenchicken 04ad706de6 fix(layout): pin PetZone to bottom of right sidebar, separate from scrollable content 2026-06-05 13:48:53 -04:00
hobokenchicken 7f11ff83f0 fix(cat): position cat at bottom-right above status bar, not overlapping wardrobe 2026-06-05 13:47:15 -04:00
hobokenchicken f76ae3faec fix(cat): use getLocalBounds for accurate scale calculation
Cat was rendering huge because scale was computed from current model.width
which included previous scale transforms. Now resets to scale(1) first,
reads natural bounds, then computes target scale for 100px rendered height.
2026-06-05 13:45:32 -04:00
hobokenchicken 9d2ba052f4 fix(live2d): precise cat positioning and sizing
- Extract layout constants matching Tailwind config (PAD, LEFT_W, GAP, RIGHT_W)
- positionModels() helper computes exact pixel positions from layout
- Kira: centered in center panel at 78% of available space
- Mochi: 120px tall, centered in right sidebar, above status bar
- Both models reposition on window resize
2026-06-05 13:42:21 -04:00
hobokenchicken 5f5127f4fa refactor(live2d): single shared stage for both Kira and Mochi
Live2DStage creates ONE full-viewport transparent canvas (z-0, pointer-events:none).
Both Kira and Mochi cat models render on the same Pixi stage and WebGL context.
KiraAvatar is now UI-only (no canvas), receives model ref from stage.
PetZone is label-only. Eliminates all WebGL context conflict errors.
2026-06-05 13:34:51 -04:00
hobokenchicken 43a392e5f5 fix(pets): use preferWebGLVersion:1 for cat canvas to avoid context conflicts
Cat gets its own canvas with WebGL1 context (Kira uses WebGL2 by default).
Different GL versions don't share buffers, so no bindBuffer spam.
Cat now renders in the PetZone section of the right sidebar where it belongs.
Removed all shared-context onAppReady plumbing.
2026-06-05 13:25:10 -04:00
hobokenchicken 1f8bcf6b4f fix(pets): cat renders on shared KiraAvatar canvas via onAppReady callback
Single WebGL context, no bindBuffer spam. Cat model loads onto
KiraAvatar's stage and positions itself at bottom-right corner.
PetZone passes app prop through to Live2DCat.
2026-06-05 13:19:32 -04:00
hobokenchicken 37f8bf59a0 fix(webgl): use forceCanvas for Live2DCat to avoid dual WebGL context conflicts
Reverts shared-context approach. Live2DCat gets its own canvas with
forceCanvas:true (Canvas2D renderer), which avoids the WebGL bindBuffer
spam entirely. Cleaned up onAppReady prop from KiraAvatar.
2026-06-05 13:08:18 -04:00
hobokenchicken be1e51cc9a fix(webgl): share single Pixi context between KiraAvatar and Live2DCat
Eliminates WebGL bindBuffer/bindTexture spam from dual Application contexts.
Cat model now loads onto KiraAvatar's shared stage via onAppReady callback.
2026-06-05 13:04:43 -04:00
hobokenchicken 017c81cffa feat(pets): replace static cats with Live2D LittleCat model (black texture)
- Copied LittleCat model files to frontend/public/live2d/models/little-cat/
- Using the black alternate texture as default
- Created Live2DCat component that renders the model in a small canvas
- PetZone now shows a single Live2D cat instead of two SVG cats
2026-06-05 12:55:24 -04:00
hobokenchicken 15199dfdee feat(layout): move avatar to center hero position; timer+notes+chat to left sidebar 2026-06-05 12:44:17 -04:00
hobokenchicken 95f97fa897 fix(avatar): declarative canvas element in JSX; remove manual DOM append
React was potentially clearing the canvas on re-render because we
appended it manually to a div. Now using a <canvas ref={canvasRef}>
element directly in JSX that React manages. Pixi app uses .
Scale set to 82% of container.
2026-06-05 10:10:03 -04:00
hobokenchicken e00dc37e68 fix(avatar): use Pixi resizeTo for native canvas sizing; remove all manual CSS/ResizeObserver
Previous approach set CSS width:100% on a low-res canvas, causing the browser
to stretch/pixelate the model. Now using Pixi's built-in resizeTo so the
canvas internal resolution always matches the container. Model scaled to 90%
of container with centered anchor.
2026-06-05 09:57:54 -04:00
hobokenchicken 3a6a1cd6c3 fix(avatar): reduce model margin to 45% to prevent clipping in narrow sidebar 2026-06-05 09:51:39 -04:00