chore(hardening): tighten security and footprint defaults
This commit is contained in:
@@ -2,6 +2,7 @@ use std::fmt;
|
||||
use std::io;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::str::FromStr;
|
||||
use std::sync::{LazyLock, Mutex};
|
||||
|
||||
use futures_util::StreamExt;
|
||||
use serde::{Deserialize, Serialize};
|
||||
@@ -158,6 +159,36 @@ const ALL_MODELS: &[LlmModelId] = &[
|
||||
LlmModelId::Qwen3_14BQ5,
|
||||
];
|
||||
|
||||
static ACTIVE_DOWNLOADS: LazyLock<Mutex<std::collections::HashSet<LlmModelId>>> =
|
||||
LazyLock::new(|| Mutex::new(std::collections::HashSet::new()));
|
||||
|
||||
struct DownloadReservation {
|
||||
id: LlmModelId,
|
||||
}
|
||||
|
||||
impl DownloadReservation {
|
||||
fn acquire(id: LlmModelId) -> Result<Self, DownloadError> {
|
||||
let mut active = ACTIVE_DOWNLOADS
|
||||
.lock()
|
||||
.map_err(|_| DownloadError::Http("download lock poisoned".into()))?;
|
||||
if !active.insert(id) {
|
||||
return Err(DownloadError::Http(format!(
|
||||
"download already in progress for {}",
|
||||
id.as_str()
|
||||
)));
|
||||
}
|
||||
Ok(Self { id })
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for DownloadReservation {
|
||||
fn drop(&mut self) {
|
||||
if let Ok(mut active) = ACTIVE_DOWNLOADS.lock() {
|
||||
active.remove(&self.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn all_models() -> &'static [LlmModelId] {
|
||||
ALL_MODELS
|
||||
}
|
||||
@@ -189,20 +220,7 @@ pub fn recommend_tier(total_ram_bytes: u64, total_vram_bytes: Option<u64>) -> Ll
|
||||
}
|
||||
|
||||
pub fn model_dir() -> PathBuf {
|
||||
if cfg!(target_os = "windows") {
|
||||
std::env::var("LOCALAPPDATA")
|
||||
.map(PathBuf::from)
|
||||
.unwrap_or_else(|_| PathBuf::from("."))
|
||||
.join("kon")
|
||||
.join("models")
|
||||
.join("llm")
|
||||
} else {
|
||||
dirs::home_dir()
|
||||
.unwrap_or_else(|| PathBuf::from("."))
|
||||
.join(".kon")
|
||||
.join("models")
|
||||
.join("llm")
|
||||
}
|
||||
kon_core::paths::app_paths().llm_models_dir()
|
||||
}
|
||||
|
||||
pub fn model_path(id: LlmModelId) -> PathBuf {
|
||||
@@ -235,6 +253,7 @@ pub async fn download_model<F>(id: LlmModelId, on_progress: F) -> Result<(), Dow
|
||||
where
|
||||
F: FnMut(u64, u64) + Send + 'static,
|
||||
{
|
||||
let _reservation = DownloadReservation::acquire(id)?;
|
||||
let dest = model_path(id);
|
||||
tokio::fs::create_dir_all(model_dir()).await?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user