-- OpenManus Database Schema for Cloudflare D1 -- Users table to store user information CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, mobile_number TEXT UNIQUE NOT NULL, full_name TEXT NOT NULL, password_hash TEXT NOT NULL, avatar_url TEXT, preferences TEXT, -- JSON string for user preferences is_active BOOLEAN DEFAULT TRUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- Sessions table to store user sessions CREATE TABLE IF NOT EXISTS sessions ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, title TEXT, metadata TEXT, -- JSON string for session metadata created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, expires_at DATETIME, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Conversations table to store chat messages CREATE TABLE IF NOT EXISTS conversations ( id TEXT PRIMARY KEY, session_id TEXT NOT NULL, role TEXT NOT NULL, -- 'user', 'assistant', 'system' content TEXT NOT NULL, metadata TEXT, -- JSON string for message metadata (files, tools used, etc.) created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE ); -- Files table to store uploaded file information CREATE TABLE IF NOT EXISTS files ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, session_id TEXT, filename TEXT NOT NULL, content_type TEXT, size INTEGER, r2_key TEXT NOT NULL, -- Key in R2 storage bucket TEXT NOT NULL, -- Which R2 bucket metadata TEXT, -- JSON string for file metadata created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE SET NULL ); -- Agents table to store agent configurations CREATE TABLE IF NOT EXISTS agents ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, name TEXT NOT NULL, description TEXT, system_prompt TEXT, model TEXT, tools TEXT, -- JSON array of enabled tools config TEXT, -- JSON configuration object is_active BOOLEAN DEFAULT TRUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Agent sessions table for durable object session tracking CREATE TABLE IF NOT EXISTS agent_sessions ( id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, user_id TEXT NOT NULL, session_id TEXT NOT NULL, durable_object_id TEXT, -- ID of the corresponding durable object status TEXT DEFAULT 'active', -- 'active', 'paused', 'completed', 'error' metadata TEXT, -- JSON string for session state created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE ); -- Usage tracking table for monitoring and analytics CREATE TABLE IF NOT EXISTS usage_logs ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, session_id TEXT, agent_id TEXT, action TEXT NOT NULL, -- 'chat', 'upload', 'tool_use', etc. resource_type TEXT, -- 'd1', 'r2', 'kv', 'durable_object' resource_id TEXT, tokens_used INTEGER DEFAULT 0, duration_ms INTEGER DEFAULT 0, cost_cents INTEGER DEFAULT 0, metadata TEXT, -- JSON string for additional details created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE SET NULL, FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE SET NULL ); -- Create indexes for better performance CREATE INDEX IF NOT EXISTS idx_users_mobile_number ON users(mobile_number); CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id); CREATE INDEX IF NOT EXISTS idx_sessions_created_at ON sessions(created_at); CREATE INDEX IF NOT EXISTS idx_conversations_session_id ON conversations(session_id); CREATE INDEX IF NOT EXISTS idx_conversations_created_at ON conversations(created_at); CREATE INDEX IF NOT EXISTS idx_files_user_id ON files(user_id); CREATE INDEX IF NOT EXISTS idx_files_session_id ON files(session_id); CREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at); CREATE INDEX IF NOT EXISTS idx_agents_user_id ON agents(user_id); CREATE INDEX IF NOT EXISTS idx_agent_sessions_user_id ON agent_sessions(user_id); CREATE INDEX IF NOT EXISTS idx_agent_sessions_session_id ON agent_sessions(session_id); CREATE INDEX IF NOT EXISTS idx_usage_logs_user_id ON usage_logs(user_id); CREATE INDEX IF NOT EXISTS idx_usage_logs_created_at ON usage_logs(created_at); -- Insert a default system user for system-level operations INSERT OR IGNORE INTO users (id, mobile_number, full_name, password_hash) VALUES ('system', '0000000000', 'OpenManus System', 'system_hash'); -- Insert a default agent configuration INSERT OR IGNORE INTO agents (id, user_id, name, description, system_prompt, model, tools) VALUES ( 'default-agent', 'system', 'OpenManus Assistant', 'Default OpenManus AI assistant with full capabilities', 'You are OpenManus, an intelligent AI assistant with access to various tools and services. You help users with a wide range of tasks including file management, data analysis, web browsing, and more. Always be helpful, accurate, and concise in your responses.', 'gpt-4-turbo-preview', '["file_operations", "web_search", "data_analysis", "browser_use", "python_execute"]' );