feat: add conversation management, persistence, and mobile app spec

Major enhancements to voice assistant with conversation persistence
and mobile app planning:

- Add conversation management with multiple active conversations
- Implement conversation persistence (save/load from disk)
- Add conversation selector UI for switching between conversations
- Enhance agent prompt with per-conversation tmux sessions
- Add mobile app technical specification (React Native + Expo)
- Improve UI with active processes view and agent stream
- Add ACP (Agent Control Protocol) server implementation

Mobile spec details:
- React Native with Expo SDK 54+
- NativeWind v5 for styling
- Share Zod schemas/types from server
- Android in-call experience (InCallManager)
- Direct WebSocket connection via Tailscale
- Same audio quality as web prototype

🤖 Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
Mohamed Boudra
2025-10-21 14:50:07 +02:00
co-authored by Claude Happy
parent 37a363da6d
commit 4f2c2fc14a
34 changed files with 6963 additions and 420 deletions
@@ -153,10 +153,14 @@ const manualTools = {
/**
* Get all tools (MCP + manual) for LLM
* @param terminalTools - Optional custom terminal tools (per-session). If not provided, uses global singleton.
* @param agentTools - Optional agent tools (per-session).
*/
export async function getAllTools(terminalTools?: Record<string, any>): Promise<Record<string, any>> {
export async function getAllTools(
terminalTools?: Record<string, any>,
agentTools?: Record<string, any>
): Promise<Record<string, any>> {
if (terminalTools) {
// Use provided terminal tools (per-session) and merge with Playwright
// Use provided terminal tools (per-session) and merge with Playwright and agent tools
const playwrightClient = await getPlaywrightMcpClient().catch((error) => {
console.error("Failed to initialize Playwright MCP:", error);
return null;
@@ -169,6 +173,7 @@ export async function getAllTools(terminalTools?: Record<string, any>): Promise<
return {
...terminalTools,
...playwrightTools,
...(agentTools || {}),
...manualTools,
};
}
@@ -177,6 +182,7 @@ export async function getAllTools(terminalTools?: Record<string, any>): Promise<
const mcpTools = await getMcpTools();
return {
...mcpTools,
...(agentTools || {}),
...manualTools,
};
}