feat: user personalization with Honcho-backed preferences
- WelcomeScreen: first-time name entry with cute onboarding - identify WS message: sets user_id, loads saved prefs from Honcho - set_preference WS message: saves scene/outfit/accessory to Honcho metadata - Preferences auto-load on return visits via localStorage + Honcho peer meta - Kira uses the user's name in greeting and prompts - Backend: get/set preference methods in KiraMemory service - Frontend: optimistic preference updates, synced to backend on change
This commit is contained in:
@@ -178,6 +178,54 @@ class KiraMemory:
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to store Kira message: {e}")
|
||||
|
||||
# ─── User preferences (stored in Honcho peer metadata) ───
|
||||
|
||||
DEFAULT_PREFERENCES: dict[str, str] = {
|
||||
"name": "",
|
||||
"scene": "cozy-room",
|
||||
"outfit": "cozy-hoodie",
|
||||
"accessory": "",
|
||||
}
|
||||
|
||||
def get_user_preferences(self, user_id: str) -> dict[str, str]:
|
||||
"""Load user preferences from Honcho peer metadata."""
|
||||
if not self.enabled:
|
||||
return dict(self.DEFAULT_PREFERENCES)
|
||||
|
||||
try:
|
||||
peer = self._honcho.peer(user_id)
|
||||
meta = peer.metadata or {}
|
||||
prefs = dict(self.DEFAULT_PREFERENCES)
|
||||
for key in prefs:
|
||||
val = meta.get(key)
|
||||
if val is not None:
|
||||
prefs[key] = str(val)
|
||||
logger.info(f"Loaded preferences for {user_id}: {prefs}")
|
||||
return prefs
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to load preferences: {e}")
|
||||
return dict(self.DEFAULT_PREFERENCES)
|
||||
|
||||
def set_user_preference(
|
||||
self, user_id: str, key: str, value: str
|
||||
) -> bool:
|
||||
"""Save a single user preference to Honcho peer metadata."""
|
||||
if key not in self.DEFAULT_PREFERENCES:
|
||||
logger.warning(f"Unknown preference key: {key}")
|
||||
return False
|
||||
|
||||
try:
|
||||
peer = self._honcho.peer(user_id)
|
||||
# Merge with existing metadata
|
||||
meta = dict(peer.metadata or {})
|
||||
meta[key] = value
|
||||
peer.set_metadata(meta)
|
||||
logger.info(f"Saved preference {user_id}.{key} = {value}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to save preference: {e}")
|
||||
return False
|
||||
|
||||
|
||||
# Singleton instance for the app
|
||||
kira_memory = KiraMemory()
|
||||
|
||||
Reference in New Issue
Block a user