A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: auto server start + install script fixes

madclaws 1ac8cb49 2e913ad3

+48 -15
+4 -1
scripts/install.sh
··· 1 1 #!/usr/bin/env bash 2 2 set -euo pipefail 3 3 4 - ENV="prod" # prod is another env, try taking it from github env 4 + ENV="dev" # prod is another env, try taking it from github env 5 5 REPO="tilesprivacy/tilekit" 6 6 # VERSION="${TILES_VERSION:-latest}" 7 7 VERSION="0.1.0" ··· 56 56 install -m 755 "${TMPDIR}/tiles" "${INSTALL_DIR}/tiles" 57 57 58 58 log "📦 Installing Python server to ${SERVER_DIR}..." 59 + rm -rf "${SERVER_DIR}" 60 + 59 61 mkdir -p "${SERVER_DIR}" 62 + 60 63 cp -r "${TMPDIR}/server"/* "${SERVER_DIR}/" 61 64 62 65 log "🔧 Setting up Python environment..."
+44 -14
src/runner/mlx.rs
··· 4 4 use owo_colors::OwoColorize; 5 5 use reqwest::{Client, StatusCode}; 6 6 use serde_json::{Value, json}; 7 + use std::fs::File; 7 8 use std::io::Write; 8 9 use std::path::PathBuf; 9 10 use std::process::Stdio; 10 - use std::str::FromStr; 11 + use std::time::Duration; 11 12 use std::{env, fs}; 12 13 use std::{io, process::Command}; 14 + use tokio::time::sleep; 13 15 pub struct ChatResponse { 14 16 think: String, 15 17 reply: String, ··· 81 83 } 82 84 83 85 #[allow(clippy::zombie_processes)] 84 - pub fn start_server_daemon() -> Result<()> { 86 + pub async fn start_server_daemon() -> Result<()> { 85 87 // check if the server is running 86 88 // start server as a child process 87 89 // save the pid in a file under ~/.config/tiles/server_pid 90 + 91 + if let Ok(_) = ping().await { 92 + println!("server is already up"); 93 + return Ok(()); 94 + } 95 + 88 96 let config_dir = get_config_dir()?; 89 97 let server_dir = get_server_dir()?; 90 98 let pid_file = config_dir.join("server.pid"); 91 - if pid_file.exists() { 92 - eprintln!("Server is already running"); 93 - return Ok(()); 94 - } 99 + fs::create_dir_all(&config_dir).context("Failed to create config directory")?; 95 100 101 + let stdout_log = File::create(config_dir.join("server.out.log"))?; 102 + let stderr_log = File::create(config_dir.join("server.err.log"))?; 96 103 let child = Command::new("uv") 97 104 .args([ 98 105 "run", ··· 102 109 "-m", 103 110 "server.main", 104 111 ]) 105 - .stdout(Stdio::null()) 106 - .stderr(Stdio::null()) 112 + .stdin(Stdio::null()) 113 + .stdout(Stdio::from(stdout_log)) 114 + .stderr(Stdio::from(stderr_log)) 107 115 .spawn() 108 116 .expect("failed to start server"); 117 + 109 118 fs::create_dir_all(&config_dir).context("Failed to create config directory")?; 110 119 std::fs::write(pid_file, child.id().to_string()).unwrap(); 111 120 println!("Server started with PID {}", child.id()); ··· 127 136 Ok(()) 128 137 } 129 138 async fn run_model_with_server(modelfile: Modelfile) -> reqwest::Result<()> { 139 + if !cfg!(debug_assertions) { 140 + let _res = start_server_daemon().await; 141 + let _ = wait_until_server_is_up().await; 142 + } 130 143 let stdin = io::stdin(); 131 144 let mut stdout = io::stdout(); 132 145 // loading the model from mem-agent via daemon server ··· 182 195 Ok(()) 183 196 } 184 197 185 - // async fn ping() -> reqwest::Result<()> { 186 - // let client = Client::new(); 187 - // let res = client.get("http://127.0.0.1:6969/ping").send().await?; 188 - // println!("{}", res.text().await?); 189 - // Ok(()) 190 - // } 198 + async fn ping() -> Result<(), String> { 199 + let client = Client::new(); 200 + let res = client.get("http://127.0.0.1:6969/ping").send().await; 201 + 202 + match res { 203 + Err(_) => Err(String::from("Server is down")), 204 + _ => Ok(()), 205 + } 206 + } 191 207 192 208 async fn load_model(model_name: &str, memory_path: &str) -> Result<(), String> { 193 209 let client = Client::new(); ··· 411 427 Ok(data_dir.join("tiles")) 412 428 } 413 429 } 430 + 431 + async fn wait_until_server_is_up() { 432 + loop { 433 + match ping().await { 434 + Ok(()) => { 435 + break; 436 + } 437 + Err(_) => { 438 + println!("tiling..."); 439 + sleep(Duration::from_secs(5)).await; 440 + } 441 + } 442 + } 443 + }