diff --git a/backend/main.py b/backend/main.py index b3845a4..ef765d2 100644 --- a/backend/main.py +++ b/backend/main.py @@ -284,6 +284,12 @@ async def gemini_voice_ws(websocket: WebSocket): # Push updated task list to frontend after any mutation if fn_name in ("add_task", "remove_task", "complete_task", "clear_completed_tasks"): await send_tasks_to_frontend() + # Persist to Honcho + try: + if kira_memory.enabled: + kira_memory.set_user_preference(user_id, "tasks", json.dumps(tasks)) + except Exception: + pass # Send tool response back to Gemini if tool_results: @@ -332,6 +338,14 @@ async def gemini_voice_ws(websocket: WebSocket): except Exception as e: logger.warning(f"Honcho error during identify: {e}") prefs = {} + # Load tasks from Honcho + try: + saved_tasks = prefs.get("tasks", "") + if saved_tasks: + tasks.clear() + tasks.extend(json.loads(saved_tasks)) + except Exception: + pass await websocket.send_json({ "type": "identified", "user_id": user_id, @@ -392,6 +406,19 @@ async def gemini_voice_ws(websocket: WebSocket): if msg_type == "ping": await websocket.send_json({"type": "pong"}) + if msg_type == "add_task": + text = msg.get("text", "").strip() + if text: + result = execute_tool("add_task", {"text": text}, tasks) + await send_tasks_to_frontend() + # Persist to Honcho + try: + if kira_memory.enabled: + kira_memory.set_user_preference(user_id, "tasks", json.dumps(tasks)) + except Exception: + pass + continue + except WebSocketDisconnect: pass except Exception as e: diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index bd2f797..a59ee7d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -29,6 +29,7 @@ export default function App() { startRecording, stopRecording, tasks, + addTask, } = useConversation(); const [currentSceneId, setCurrentSceneId] = useState('cozy-room'); @@ -144,7 +145,7 @@ export default function App() {