aidaemon 0.11.10

A personal AI agent that runs as a background daemon, accessible via Telegram, Slack, or Discord, with tool use, MCP integration, and persistent memory
Documentation
use super::*;

#[async_trait]
impl crate::traits::DynamicMcpServerStore for SqliteStateStore {
    async fn save_dynamic_mcp_server(
        &self,
        server: &crate::traits::DynamicMcpServer,
    ) -> anyhow::Result<i64> {
        let result = sqlx::query(
            "INSERT INTO dynamic_mcp_servers (name, command, args_json, env_keys_json, triggers_json, enabled, created_at)
             VALUES (?, ?, ?, ?, ?, ?, datetime('now'))
             ON CONFLICT(name) DO UPDATE SET command=excluded.command, args_json=excluded.args_json,
             env_keys_json=excluded.env_keys_json, triggers_json=excluded.triggers_json, enabled=excluded.enabled"
        )
        .bind(&server.name)
        .bind(&server.command)
        .bind(&server.args_json)
        .bind(&server.env_keys_json)
        .bind(&server.triggers_json)
        .bind(server.enabled)
        .execute(&self.pool)
        .await?;
        Ok(result.last_insert_rowid())
    }

    async fn list_dynamic_mcp_servers(
        &self,
    ) -> anyhow::Result<Vec<crate::traits::DynamicMcpServer>> {
        let rows = sqlx::query(
            "SELECT id, name, command, args_json, env_keys_json, triggers_json, enabled, created_at
             FROM dynamic_mcp_servers ORDER BY created_at ASC",
        )
        .fetch_all(&self.pool)
        .await?;

        let mut servers = Vec::new();
        for row in rows {
            servers.push(crate::traits::DynamicMcpServer {
                id: row.get::<i64, _>("id"),
                name: row.get::<String, _>("name"),
                command: row.get::<String, _>("command"),
                args_json: row.get::<String, _>("args_json"),
                env_keys_json: row.get::<String, _>("env_keys_json"),
                triggers_json: row.get::<String, _>("triggers_json"),
                enabled: row.get::<bool, _>("enabled"),
                created_at: row.get::<String, _>("created_at"),
            });
        }
        Ok(servers)
    }

    async fn delete_dynamic_mcp_server(&self, id: i64) -> anyhow::Result<()> {
        sqlx::query("DELETE FROM dynamic_mcp_servers WHERE id = ?")
            .bind(id)
            .execute(&self.pool)
            .await?;
        Ok(())
    }

    async fn update_dynamic_mcp_server(
        &self,
        server: &crate::traits::DynamicMcpServer,
    ) -> anyhow::Result<()> {
        sqlx::query(
            "UPDATE dynamic_mcp_servers SET command = ?, args_json = ?, env_keys_json = ?, triggers_json = ?, enabled = ? WHERE id = ?"
        )
        .bind(&server.command)
        .bind(&server.args_json)
        .bind(&server.env_keys_json)
        .bind(&server.triggers_json)
        .bind(server.enabled)
        .bind(server.id)
        .execute(&self.pool)
        .await?;
        Ok(())
    }
}